使用 GitLab + Docker 搭建持续交付系统
环境要求
- GitLab CE > 8.0
- Docker > 1.0
步骤一,开启 Runner
Runner 是 GitLab CI 的任务执行单位,GitLab 以服务发现的方式来将 Runner 分布在不同的主机上。根据官方文档的说明,你可以选择任何系统的主机来部署 Runner。这里我为了图方便就直接采用 Debian 源来安装了。
由于我们需要让 Runner 在 Docker 中运行,所有首先安装 Docker
curl -sSL https://get.docker.com/ | sh
然后安装 Runner
1 2 |
|
然后我们需要启动 Runner 并提交它的服务信息给自己的 GitLab 站点
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
|
步骤二,分配 Runner
然后下一步我们就可以在 http://{your.gitlab.domain}/admin/runners
下找到刚刚注册的 Runner 了,这时候 Runner 处于共享状态,我们可以通过编辑来指派 Runner 的特定项目,或者给 Runner 加标签来方便以后更灵活的分配这些 Runner。
然后再看一下项目的配置,将 Build 选项开启,这样每次提交时 GitLab 机会自动调用 Runner 来执行任务了。
步骤三,编写 .gitlab-ci.yml
.gitlab-ci.yml 是 GitLab 提供的一种配置文件,对于熟悉 travis 这类 SaaS 型持续集成服务的开发者来说这种配置是相当亲切的了,而且文件跟着代码库,编辑起来非常方便。
下面就这个简单的配置文件说明一下各部分的作用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
|
这样,我们就实现了在每次代码提交时自动测试,通过后将代码发布到服务器环境的目的。
遇到的问题
- 使用 Docker runner 时,
git clone
或npm install
有时候会遇到「检测到未知的 host key」提示,而中断 build 进程
这个问题有两种方法可以解决,一种是用 ssh -o "StrictHostKeyChecking no" user@host
关闭指定用户和域名的检测。另一种是 ssh-keyscan host >> /root/.ssh/known_hosts
将检测结果写入。上面在 Dockerfile 中用了第二种方式:
RUN ssh-keyscan github.com >> /root/.ssh/known_hosts
- Container 遇到
Couldn't resolve host
问题
这个问题我没有找到真正的解决办法,因为它是个偶发的问题,可能你什么都没干,过段时间再试试它就自己恢复了,可能与 Host 主机的 DNS 设置有关。我的解决方案之一是删除所有由 GitLab 创建的运行状态或等待状态的 Container,再重新开始任务。这里提供一个便捷的命令来删除所有由 GitLab 创建的 Container
docker ps -a | grep gitlab | awk '{print $1}' | xargs docker rm