在本文中,将探讨如何使用GitHub Actions来自动化Jekyll网站的构建和部署过程。这个过程包括将Jekyll站点构建为静态文件,并通过SSH将这些文件部署到远程服务器。将从已有的Bitbucket Pipelines迁移到GitHub Actions,并详细说明每一步。
在迁移到GitHub Actions之前,构建和部署逻辑主要通过两个shell脚本来实现:
这些脚本的存在使得在切换CI提供商时,不需要修改它们,只需要替换特定于提供商的设置文件即可。
迁移到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工作流配置文件(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和构建号的信息。这可以通过在Jekyll的配置文件中添加一个新的站点变量来实现。以下是实现这一功能的步骤: