在现代软件开发中,持续集成和持续部署(CI/CD)是提高开发效率和减少人为错误的重要实践。本文将介绍如何使用GitLab的CI/CD功能来自动化部署静态网站,包括使用Jekyll和Hugo作为构建工具。
之前,已经将静态网站从Subversion迁移到了Git,并将其推送到了GitLab。同时,也尝试了Hugo作为Jekyll的替代方案,主要是因为Hugo的构建速度更快。在这篇文章中,将专注于GitLab特有的一些事项。
类似于Bitbucket Pipelines,GitLab CI允许指定一个Docker镜像,该镜像将执行实际的构建过程。以下是.gitlab-ci.yml
文件中与构建Jekyll网站相关的部分:
build:
only:
- master
stage: build
image: jekyll/builder
script:
- chmod +x ci-build.sh
- ./ci-build.sh
artifacts:
paths:
- build
expire_in: 1 week
构建脚本ci-build.sh
如下:
#!/bin/bash
jekyll build
if [ $? -ne 0 ]; then
exit 1
fi
mkdir build
tar -czvf build/build.tar.gz -C _site .
构建目录由GitLab CI作为构建产物保存(因为它在部署步骤中需要),但会在一周后过期(因为一旦部署完成,就不再需要它了)。
构建Hugo网站的过程与Jekyll类似,只是使用的是monachus/hugo
镜像,它类似于jekyll/builder
,但是为Hugo准备的:
build:
only:
- master
stage: build
image: monachus/hugo
script:
- chmod +x ci-build.sh
- ./ci-build.sh
artifacts:
paths:
- build
expire_in: 1 week
构建脚本ci-build.sh
如下:
#!/bin/bash
cd web
rm -r _site
hugo
if [ $? -ne 0 ]; then
exit 1
fi
cd ..
mkdir build
tar -czvf build/build.tar.gz -C ./web/_site .
从实现难度的角度来看,GitLab介于Bitbucket和GitHub Actions之间。它不像Bitbucket那样简单,只需要将SSH密钥粘贴到Web界面中,SSH的魔法就会在后台自动发生。与GitHub Actions类似,GitLab CI需要在.yml
文件中添加几行脚本来设置SSH,但至少他们在文档中提供了一个完整的工作示例,只需要复制粘贴即可。
以下是.gitlab-ci.yml
文件中与部署相关的部分:
deploy:
only:
- master
stage: deploy
image: alpine
before_script:
- apk update && apk add openssh-client git openssh rsync
- eval $(ssh-agent -s)
- echo "$SSH_PRIVATE_KEY" | tr -d '\r' | ssh-add -
- mkdir -p ~/.ssh
- chmod 700 ~/.ssh
- ssh-keyscan $DOMAIN >> ~/.ssh/known_hosts
- chmod 644 ~/.ssh/known_hosts
script:
- rsync -rSlh --stats build/ ssh-$WEB_USER@$DOMAIN:$WEBPATH
- ssh -o StrictHostKeyChecking=yes ssh-$WEB_USER@$DOMAIN 'bash -s' -- < ci-deploy.sh $WEBPATH
变量来自于GitLab仓库的CI设置:
variables:
DOMAIN: example.com
#!/bin/bash
rm -rf $1/tmp
mkdir $1/tmp
tar -xzvf $1/build/build.tar.gz -C $1/tmp
rsync -Pav --delete $1/tmp/ $1/web