趁热打铁,根据之前我们自己搭建的gitlab-ci环境,我们来跑一个demo项目,爽一下~

我们的目的是,程序员提交代码到gitlab,会触发自动创建镜像,并上传到公共的镜像仓库(目前先这么搞)

根据官方的文档,我们先在gitlab上搭建一个项目,结构如下:

1
2
3
4
5
6
7
/.
|->.dockerignore
|->.gitignore
|->.gitlab-ci.yml
|->Dockerfile
|->app.js
|->package.json

其中,.dockerignore文件内容:

1
2
3
.git
.gitlab-ci.yml
README.md

.gitignore :

1
node_modules

.gitlab-ci.yml:

1
2
3
4
5
6
7
8
9
10
11
12
13
image: docker:latest
services:
- docker:dind
build:image:
stage: build
script:
- docker build -t index.alauda.cn/kazaff/hello-kazaff .
- docker login -u kazaff -p 我的密码 index.alauda.cn
- docker push index.alauda.cn/kazaff/hello-kazaff
tags:
- docker

Dockerfile:

1
2
3
4
5
6
7
8
9
FROM node:slim
COPY . /myapp/
WORKDIR /myapp/
RUN npm install
CMD ["node", "app"]
EXPOSE 80

app.js:

1
2
3
4
5
6
7
8
var koa = require('koa');
var app = koa();
app.use(function *(){
this.body = 'Hello, Kazff';
});
app.listen(80);

package.json:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
{
"name": "docker-gitlab-node-demo",
"version": "1.0.0",
"description": "test for gitlab-ci",
"main": "app.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [
"demo",
"gitlab-ci"
],
"author": "kazaff",
"license": "MIT",
"dependencies": {
"koa": "^1.2.0"
}
}

好了,把上面这个项目提交到我们的gitlab环境下,就会触发自动的“build”了(确保你的gitlab配置开启了”build”)!

不过怎么可能顺利呢?第一次一般都是失败的,查看错误日志:

1
2
3
4
5
6
7
8
9
10
gitlab-ci-multi-runner 1.1.2 (78b3f82)
Using Docker executor with image node:argon ...
Pulling docker image node:argon ...
Running on runner-e02dcb0d-project-1-concurrent-0 via 21f65ebc58fa...
Cloning repository...
Cloning into '/builds/root/welcome'...
fatal: unable to access 'http://gitlab-ci-token:xxxxxx@localhost:10080/root/nodeDemo.git/': Failed to connect to localhost port 10080: Connection refused
ERROR: Build failed: exit code 1

你的错误信息可能和我的不完全一样,不过问题是一样的:Runner启动的docker容器里无法访问到localhost:10080这个地址(能访问到才怪)。这一般是由于我们的测试环境没有使用域名导致的,gitlab论坛里也不少人讨论这个问题,如果你是在部署正式的gitlab环境,那你自然会有一个域名来使用。不过我这里只是搭建测试环境,所以我使用了一种投机的方法:

修改Runner的/etc/gitlab-runner/config.toml文件,在其中的[runner.docker]下增加:

1
extra_hosts = ["localhost:172.17.0.1"]

意思是,让runner启动的容器中将”localhost”域映射到我的ubuntu宿主机,这样runner请求”localhost:10080”时就会被路由到正确的地址,不推荐正式环境下这么做~

然后再次触发build,这次看看还会碰到什么问题么:

1
write /var/lib/docker/tmp/xxx: no space left on device

这次悲剧了,我的ubuntu虚拟主机分配的磁盘空间太小,结果现在提示硬盘控件不足……(这里我发现其实我分配的磁盘控件(8G)才使用了2G多一点,不明白VirtualBox为什么不给虚拟机扩展容量了!)

我只能删除掉一些不使用的镜像和容器来腾出一些地儿,再次build,好家伙,虚拟机直接死掉了。

[直播]
对,目前还处于无响应状态,不知道为啥,我只能等。。。
已经快二十分钟,妈蛋!
我方了,咋办?
……

我强行重启虚拟机后一切都归零了,gitlab container无法正常启动了,娃哈哈哈哈~玩我呢是吧?也没有任何错误日志给我参考,得了,重新装一次环境得了~

重新安装环境很快的其实,我们只需要停止所有的容器,然后删除重建一下/srv/docker/gitlab/这个目录即可,该目录就是之前我们搭建环境时往相关容器中加载的本地卷,重建它们以为这之前在gitlab上的操作都不要了,再次start相关容器,一个干净的gitlabCI环境就好了(docker的魔力)~~

除此之外由于我们的gitlabCI重建后Runner的token也更新了,所以要重新register一下我们的Runner,一切又和好如初!

不怕死的我再一次尝试build,这次会成功么?(有了这次教训,建议你再重新开始build之前先对虚拟机做一个快照,这样再失败就可以直接回滚了~)

由于之前碰到了磁盘空间不足的问题,所以这里就建议使用微容器,可以省下来一笔相当可观的空间和流量啊,Dockerfile的第一行改成:

1
FROM iron/node:dev

好了,漫长的等待后(全看网速)就可以看到灵雀云中已经成功创建好镜像了!

这里需要 强烈提醒:在测试该镜像时:

1
docker run -it --name hello-kazaff -p 10081:80 index.alauda.cn/kazaff/hello-kazaff

一定要加-it,不然你就傻逼了,像我一样无法退出该docker容器了。。。。草!有知道如何解决这个问题的朋友请一定要给我留言啊!