使用GitHub Actions自动化部署Jekyll网站

在本文中,将探讨如何使用GitHub Actions来自动化Jekyll网站的构建和部署过程。这个过程包括将Jekyll站点构建为静态文件,并通过SSH将这些文件部署到远程服务器。将从已有的Bitbucket Pipelines迁移到GitHub Actions,并详细说明每一步。

已有的构建和部署逻辑

在迁移到GitHub Actions之前,构建和部署逻辑主要通过两个shell脚本来实现:

  • ci-build.sh:在CI服务器上运行,使用Jekyll构建站点,并将结果保存为.tar.gz归档文件。
  • ci-deploy.sh:由CI服务器通过SSH直接在远程服务器上执行,将归档文件解压并使用rsync部署到指向域名的文件夹。

这些脚本的存在使得在切换CI提供商时,不需要修改它们,只需要替换特定于提供商的设置文件即可。

迁移到GitHub Actions

迁移到GitHub Actions后,需要重新设置构建和部署流程。与Bitbucket Pipelines相比,GitHub Actions在某些方面感觉不够完善,但最终还是成功实现了目标。

在GitHub Actions中构建Jekyll站点相对直接。不需要手动在虚拟机上安装Jekyll,而是可以使用jekyll/builder Docker镜像来执行构建。以下是构建步骤的代码示例:

steps: - uses: actions/checkout@v2 - name: Build the site in the jekyll/builder container run: | docker run \ -v $GITHUB_WORKSPACE:/srv/jekyll -v $GITHUB_WORKSPACE/_site:/srv/jekyll/_site \ jekyll/builder:latest /bin/bash -c "chmod 777 /srv/jekyll && jekyll build --future"

这里,添加了对ci-build.sh的调用,并指定了正确的Jekyll版本。

这一步比较复杂,因为需要正确设置SSH密钥。GitHub Actions提供了许多社区制作的SSH操作,但需要找到适合需求的解决方案。以下是最终使用的步骤:

- name: "Prepare SSH key and known hosts" run: | mkdir -p ~/.ssh echo "${{ secrets.SSH_KEY }}" > ~/.ssh/id_rsa chmod 600 ~/.ssh/id_rsa ssh-keyscan ${{ secrets.HOST }} >> ~/.ssh/known_hosts - name: Run deploy script run: | rsync -rSlh --stats build/ ${{ secrets.USERNAME }}@${{ secrets.HOST }}:${{ secrets.WEBPATH }} ssh -o StrictHostKeyChecking=no ${{ secrets.USERNAME }}@${{ secrets.HOST }} 'bash -s' < build/ci-deploy.sh

这里,使用了GitHub Actions的secrets功能来存储SSH密钥、主机、用户名和Web路径等敏感信息。

完整的GitHub Actions工作流

以下是完整的GitHub Actions工作流配置文件(ci.yml):

name: Jekyll site CI on: push: branches: - master jobs: build_job: runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - name: Build site run: | docker run \ -v $GITHUB_WORKSPACE:/srv/jekyll -v $GITHUB_WORKSPACE/_site:/srv/jekyll/_site \ jekyll/builder:3.2.1 /bin/bash -c "chmod +x ci-build.sh && ./ci-build.sh" - name: Upload artifact uses: actions/upload-artifact@v1 with: name: build path: build deploy: runs-on: ubuntu-latest needs: build_job steps: - uses: actions/download-artifact@v1 with: name: build - name: "Prepare SSH key and known hosts" run: | mkdir -p ~/.ssh echo "${{ secrets.SSH_KEY }}" > ~/.ssh/id_rsa chmod 600 ~/.ssh/id_rsa ssh-keyscan ${{ secrets.HOST }} >> ~/.ssh/known_hosts - name: Run deploy script run: | rsync -rSlh --stats build/ ${{ secrets.USERNAME }}@${{ secrets.HOST }}:${{ secrets.WEBPATH }} ssh -o StrictHostKeyChecking=no ${{ secrets.USERNAME }}@${{ secrets.HOST }} 'bash -s' < build/ci-deploy.sh

在网站底部显示提交ID/构建号

在部署成功后,决定在网站的页脚添加一行显示提交ID和构建号的信息。这可以通过在Jekyll的配置文件中添加一个新的站点变量来实现。以下是实现这一功能的步骤:

  1. 在主_config.yml文件中添加一个新的站点变量(初始值为占位符)。
  2. 在构建时创建一个_config-github.yml文件,其中包含实际的提交ID,并将其传递给Jekyll构建调用。
  3. 提交ID来自构建运行器设置的环境变量,对于GitHub Actions,它是$GITHUB_SHA,包含提交ID。
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485