背景: 一次偶然的机会看到了其它项目组强大的GitLab流水线, 想起自己每天还要手动打镜像做一些重复性工作,瞬间眼红. 这不就是我想要的流水线吗.凑巧项目组决定把代码迁移到公司的机器上, 那就借着这个机会把gitlab弄完整吧.
名词:
- .gitlab-ci.yml
.gitlab-ci.yml
)进行项目配置。它放置在存储库的根目录中,并包含如何构建项目的定义。关于YAML文件的书写格式, 这里不展开叙述,附上阮一峰老师的 YAML教程。详细.gitlab-ci.yml文件的书写可以参考 官方教程,以下是我在项目中所用到的简单配置。
image: docker:stable
before_script:
- echo http://mirrors.ustc.edu.cn/alpine/v3.6/main > /etc/apk/repositories; echo http://mirrors.ustc.edu.cn/alpine/v3.6/community >> /etc/apk/repositories
- apk update
- apk add --update git bash
- docker login -u yourName -p yourPas yourDockerIp
stages:
- test
- build_docker
- cleanup_build
test:
stage: test
allow_failure: true
cache:
paths:
- node_modules/
script:
- apk add --update nodejs nodejs-npm
- npm install --registry=http://192.168.130.131:9090
- npm test
only:
- branches
build_docker:
stage: build_docker
retry: 2
script:
- apk add bash
- bash build-docker.sh
only:
- dev
- master
- release
- /^hotfixes-\d.\d.\d$/
cache:
paths:
- node_modules/
cleanup_build_dicker:
stage: cleanup_build
retry: 2
when: on_failure
script:
- CI_COMMIT_REF_NAME=${CI_COMMIT_REF_NAME} bash build-docker.sh
only:
- branches
- dev
- master
- release
复制代码
Gitlab-runner
.gitlab-ci.yml
脚本的运行器,Gitlab-runner是基于Gitlab-CI的API进行构建的相互隔离的机器(或虚拟机)。GitLab Runner 不需要和Gitlab安装在同一台机器上,但是考虑到GitLab Runner的资源消耗问题和安全问题,也不建议这两者安装在同一台机器上。
Pipelines
.gitlab-ci.yml
中的不同阶段的不同任务。
我把 Pipelines理解为流水线,流水线包含有多个阶段( stages),每个阶段包含有一个或多个工序( jobs),比如先购料、组装、测试、包装再上线销售,每一次push或者MR都要经过流水线之后才可以合格出厂。而
.gitlab-ci.yml
正是定义了这条流水线有哪些阶段,每个阶段要做什么事。
下面我们开始正式安装
1. 搭建私有GitLab:在这次搭建过程中, 我使用的是ubuntu虚拟机, 进入虚拟机一套命令下来之后,也就安装得差不多了,大部分时间还是在谷歌以及尝试各种方法 。比较几个教程之后, 也找到了比较适合我的方法。
for ubuntu
添加 GitLab 镜像源并安装curl -sS http://packages.gitlab.com.cn/install/gitlab-ce/script.rpm.sh | sudo bash
sudo yum install gitlab-ce
配置并启动 GitLab
sudo gitlab-ctl reconfigure复制代码
接下来通过域名就可以访问我们的GitLab了, 第一次访问会要求初始化管理员密码, 设置完成之后, 系统会重定向到登录页面, 默认管理员账号为root, 登录之后, 就可以修改管理员账号为自己喜欢的账号了
2.安装gitlab-runner
最初安装时,我选用了官方提供的安装方法, 一顿操作之后, 发现并不好用(一定是我打开的方式不对).于是我默默打开了万能的谷歌, 最后选择了安装gitlab-ci-multi-runner.这里依然还是一堆命令,默默等待它下载吧.详细介绍参考这位网友的文章
1.添加Gitlab的官方源:
curl -L https://packages.gitlab.com/install/repositories/runner/gitlab-ci-multi-runner/script.deb.sh | sudo bash
2.安装
sudo apt-get install gitlab-ci-multi-runner
3.注册
sudo gitlab-ci-multi-runner register
Please enter the gitlab-ci coordinator URL (e.g. https://gitlab.com )
https://mygitlab.com/ci
Please enter the gitlab-ci token for this runner
xxx-xxx-xxx
Please enter the gitlab-ci description for this runner
my-runner
INFO[0034] fcf5c619 Registering runner... succeeded
Please enter the executor: shell, docker, docker-ssh, ssh?
docker
Please enter the Docker image (eg. ruby:2.1):
node:4.5.0
INFO[0037] Runner registered successfully. Feel free to start it, but if it's
running already the config should be automatically reloaded!
复制代码
在第3步注册过程中, 会填一些信息,按提示一直往下走就行了,其中toker可以在我们的gitlab管理员主页获得 ip/admin/runners.
配置完成之后, 还需要在页面底部编辑runner, 将runner 与项目关联,关联之后才能运行流水线.
至此, 我们离配置runner还差最后一步:为项目设置runner.进入项目的CI/CD设置界面(Settings => CI/CD => Runners), 找到刚刚关联好的runner, 激活即可.
完成这步之后, 项目就可以顺利开始跑流水线啦.当项目分支有代码更新时, 就能看到我们在.gitlab-ci-yml中定义好的任务当前所处状态.
遇到的坑:
安装GitLab时, 遇到错误
There was an error running gitlab-ctl reconfigure:
execute[/opt/gitlab/embedded/bin/initdb -D /var/opt/gitlab/postgresql/data -E UTF8] (postgresql::enable line 80) had an error: Mixlib::ShellOut::ShellCommandFailed: Expected process to exit with [0], but received '1'
---- Begin output of /opt/gitlab/embedded/bin/initdb -D /var/opt/gitlab/postgresql/data -E UTF8 ----
STDOUT: The files belonging to this database system will be owned by user "gitlab-psql".
This user must also own the server process.
STDERR: initdb: invalid locale settings; check LANG and LC_* environment variables
---- End output of /opt/gitlab/embedded/bin/initdb -D /var/opt/gitlab/postgresql/data -E UTF8 ----
Ran /opt/gitlab/embedded/bin/initdb -D /var/opt/gitlab/postgresql/data -E UTF8 returned 1复制代码
在全栈leader的指导下, 修改/etc/default/locale文件, 添加以下两行配置重启之后果然很香.
LC_CTYPE="en_US.UTF-8"
LC_ALL="en_US.UTF-8"复制代码
还有就是docker in docker 的问题, 在runner中每次都安装一个docker显然不太现实, 所以我们用了外部docker的方式, GitLab官方也给出了相应教程.
在安装过程中, 下载部分资源非常慢, 一定要切换到国内镜像源!!!附上中国科技大学的镜像源
echo http://mirrors.ustc.edu.cn/alpine/v3.6/main > /etc/apk/repositories; echo http://mirrors.ustc.edu.cn/alpine/v3.6/community >> /etc/apk/repositories
复制代码
运行一段时间后, runner会生成非常多image占满内存, 可以使用docker images查看当前镜像情况.需要清理移除不必要镜像.建议增加定时任务,定期清理镜像
- 移除镜像
docker rmi $(docker images | grep 'dev.k2data.com.cn:5001')复制代码
- 定时任务脚本
#!/bin/sh p=`df / | awk '{print $5}' | grep -Eo '[0-9]+' ` if p > 85; then docker rmi $(docker images | grep 'dev.k2data.com.cn:5001') fi 复制代码
备份
gitlab-rake gitlab:backup:create
复制代码
总结:
这次的gitlab流水线搭建之旅, 在leader以及几位运维同事的帮助下, 也算是基本能用了,由于知识面太窄, 过程中大部分时间都在查资料看文档,不断测试.确实是开卷有益, 想起了高中物理老师说的那句话:"多读点书总不可能把人读坏吧".
整个流程弄下来发现并不是太难,命令也不多.但在安装之前,需要靠自己网上去搜各种教程, 中途也会出现千奇百怪的错误,每个步骤都可以单独出一个教程.我们需要一篇篇看完教程,甄选出最适合自己的.这是最花费时间的地方.另一个比较费时间的点就是测试和安装依赖, 有时可能会花费1个小时的时间去等待下载, 最后发现,下载失败,啊哈哈哈哈.