使用GitLab CI/CD自动化部署静态网站

在现代软件开发中,持续集成和持续部署(CI/CD)是提高开发效率和减少人为错误的重要实践。本文将介绍如何使用GitLab的CI/CD功能来自动化部署静态网站,包括使用Jekyll和Hugo作为构建工具。

之前,已经将静态网站从Subversion迁移到了Git,并将其推送到了GitLab。同时,也尝试了Hugo作为Jekyll的替代方案,主要是因为Hugo的构建速度更快。在这篇文章中,将专注于GitLab特有的一些事项。

构建Jekyll网站

类似于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网站

构建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 .

通过SSH部署到Web服务器

从实现难度的角度来看,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
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485