docker运行gitlab runner且指定shell executor后使用scp ssh完成一个静态网站的ci 过程记录
所谓executor就是执行者的意思,即gitlab-runner执行任务时候的具体承载媒介,我们的gitlab上可能会有很多项目,不同项目会使用不同语言开发,不可能把构建所有项目用到的环境都配置在gitlab-runner运行的机器之上,所以才会有executor。
gitlab-runner executor的类型以及每种类型的适用范围可以在官方文档上查看 https://docs.gitlab.com/runner/executors/
这里简单记录一下shell executor的配置和适用过程,并用其配合ssh scp实现一个静态web网站的ci,如果使用shell executor的话,那么意味着所有任务都在gitlab-runner运行的机器上运行,这里shell也就是gitlab-runner机器上的shell。
1.我使用docker运行gitlab runner,所以首先需要创建一个gitlab runner的docker容器
#!/bin/bash docker run \ -d \ --name xxx-gitlab-runner \ --restart always \ -v /xxx/config:/etc/gitlab-runner \ -v /var/run/docker.sock:/var/run/docker.sock \ -v /xxx/gitlab-runner:/home/gitlab-runner \ gitlab/gitlab-runner:latest
此命令创建了一个gitlab runner容器,并且把/etc/gitlab-runner里的配置文件挂载到了宿主机,另外把gitlab-runner用户(具体执行ci任务的时候使用的用户)主目录也挂载到了宿主机,这样便于我们修改配置。
这里需要注意的一点是,如果你使用的executor是docker的话,那么-v /var/run/docker.sock:/var/run/docker.sock这一行是必须的,只有添加了此目录挂载,docker之中的gitlab runner才能访问到外部宿主机的docker功能。
2.使用root进入容器,这里建议把root用户主目录下的.bashrc文件复制到gitlab-runner用户主目录,这样等下切换到该用户操作的时候ll命令,终端彩色什么的就都会支持了,看起来舒服一些。因为我们把gitlab-runner用户的主目录挂载到了宿主机,所以在默认情况下此目录是root用户创建的,如果不修改此默认权限的话在接下来的步骤中我们将不能在gitlab-runner里面创建ssh需要使用到的证书。这里修改/home/gitlab-runner目录的权限。
chown -R gitlab-runner:gitlab-runner /home/gitlab-runner
3.然后从root用户切换到gitlab-runner用户,并且进入用户主目录。因为需要使用ssh scp发布网站,所以需要设置好ssh的证书。
ssh-keygen -t ed25519 -C "你的邮箱"
这里生成ed25519证书,推荐使用ed25519,在生成证书的过程中会提示输入证书密码,这里可以不用输入,否则之后ssh的时候还会提示输入证书密码,不能实现免密登录的效果。
4.完成了上一步之后用户主目录应该已经生成了.ssh文件夹,进入该文件夹。
ssh-copy-id -i ./id_ed25519.pub name@address
使用此命令复制公钥到目标服务器之上,此操作过程之中需要输入目标服务器的用户登录密码。
5.退出容器,编辑gitlab-runner注册脚本,此脚本用于向gitlab-runner容器注册runner。
#!/bin/bash docker run \ --rm \ -it \ --name xxx-gitlab-runner-tmp \ -v /xxx/config:/etc/gitlab-runner \ gitlab/gitlab-runner:latest register
此脚本运行了一个临时的gitlab-runner容器,并且把之前正式的gitlab-runner容器的配置目录挂载到此容器之中,这样就可以通过临时的容器配置之前运行的正式容器。
运行此脚本,会在交互式的方式下配置一个runner,关于项目的配置信息可以在gitlab具体项目页面寻找到,填写即可。另外在这里我们还要输入executor的类型,这里我们输入shell。
这里延伸一下,实际上gitlab的runner有三种类型,共享类型,特别类型,以及群组类型,上述配置下我们创建的是一个特殊类型的runner,即为了某一个项目特别配置的runner。关于runner类型的说明,可以参考gitlab runner的官方文档 https://docs.gitlab.com/ee/ci/runners/
6.完成上一步之后,不需要重启gitlab runner容器应该就可以让runner生效,刷新gitlab项目页面应该就可以看到我们刚刚配置的runner已经成功连接到项目了,这里需要编译一下这个runner的配置,在配置页面之中勾选 Indicates whether this runner can pick jobs without tags,这样就算是我们不在分支上打tag也会触发ci任务执行。
7.接下来就是配置我们项目之中的.gitlab-ci.yml文件了,.gitlab-ci.yml文件使用的是yaml语法,关于此语法的详细可以学习 https://www.runoob.com/w3cnote/yaml-intro.html yaml很简单,和json差不了多少,但是看起来更好看,而且支持锚点,五分钟差不多就能学习好。这里分享一下我的.gitlab-ci.yml文件,此文件的功能是通过ssh scp发布一个静态网站到服务器。
# xxx gitlab-ci # 尝试修改一下yml文件 before_script: - echo "🐈 持续集成开始" after_script: - echo "🐈 持续集成完成" deploy: stage: deploy script: - PKG_NAME='xxx.tar.gz' - echo "📦 开始打包" - tar zcvf ${PKG_NAME} ./* - echo "🚚 开始发送包" - scp ./${PKG_NAME} xxx@xxxxxx:/xxx/www - echo "🚴♂️ 开始部署包" - ssh xxx@xxxxxx " rm -rf \`ls -d /xxx/www/* | grep -v -E '\.tar\.gz$'\` && cd /xxx/www && tar xvzf ${PKG_NAME} && rm ${PKG_NAME}" - echo "😄 部署完成"
只有一个stage,打包之后scp,ssh发布到目标服务器。
8.其实gitlab-runner还有一个ssh executor,此executor直接以ssh登录到目标服务器,并且也会在目标服务器上拉取git项目,然后运行yml文件之中的脚本,但是官方不是很推荐使用这种executor,具体可以看文档 https://docs.gitlab.com/runner/executors/ssh.html