GitLab-CI

引子

最近入职了新公司一段时间了,做了一个项目。 用到很多之前了解过,但一直没机会实战的技术。接下来用几篇文章来总结一下使用到的技术和遇到的一些问题。

目前会包括 2 个部分

  • gitLab-ci 自动构建
  • k8s 自动发布集群

整体的发布流程

接下来就先从 gitlab-ci 开始

GitLab-CI

基本条件

  • 拥有 gitLab 官方账号,或者有私有的 gitLab 仓库。
  • 会使用 GIT
  • 如果以上都不会,那面壁去吧。
  • 最后先熟悉一下 官方文档,虽然不是必须,但是有助于接下来的操作。

构建流程

步骤

  • 首先开开心心的去 gitLab 创建一个新项目。以我的为例 http://gitlab.**.com/skylee/my_test_ci
  • 在服务器上安装 gitLab-runner 服务
  • 注册 runner
  • 在项目根目录下新增文件 .gitlab-ci.yml

Usage

把代码打包成镜像并推送到远程仓库

项目代码 只有一个 index.php 文件

1
2
3
4
my_test_ci git:(master) tree
.
├── Dockerfile
└── index.php

其中 Dockerfile 文件为构建镜像,主要作用就是把 index.php 打包进镜像中。Dockerfile 的内容

1
2
3
4
5
FROM php:7.2-fpm
VOLUME /data
ADD . /data/www
WORKDIR /data/www
EXPOSE 9000

配置 .gitlab-ci.yml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
image: docker.io/skylee:docker

stages:
- package

docker-build:
stage: package
before_script:
- source /etc/profile.d/docker
script:

- echo 'Building...'
- docker login -u $REPOSITORY_USER -p $REPOSITORY_PASSWORD hub.docker.com
- docker build -t skylee/phptest:latest .
- docker push skylee/phptest:latest

docker.io/skylee:docker 是基于 docker:git 镜像,添加了一些环境变量。

git push 之后会触发构建过程
1
2
3
4
5
6
7
8
9
10
Running with gitlab-runner 10.8.0 (079aad9e)
on 192-168-53-35 337b5bc7
Using Docker executor with image docker.io/skylee:docker ...
Pulling docker image docker.io/skylee:docker ...
Using docker image sha256:58cf969aeca7f67649540fb60b1853a153dc3660bbb2e0b7ba33cdb752723cc7 for docker.io/skylee:docker ...
Running on runner-337b5bc7-project-34-concurrent-0 via 192-168-53-35...
Cloning repository...

Cloning into '/builds/likai15/my_test_ci'...

...
  • 使用 image: docker.io/skylee:docker 启动一个容器。之后所有的命令都是在容器内操作的。
  • 启动 docker:dind 服务。也就是 docker 的进程。
  • gitlab-runner 克隆代码到容器目录 /builds/likai15/my_test_ci。 由于没有指定挂载目录,可以在宿主机的默认挂载目录看到 /var/lib/docker/xxxx/_data/my_test_ci
  • 开始执行 docker-build 阶段的 job。

FAQ

  • mount: permission denied (are you root?) 答: 这里

  • docker:dind 是啥东西? 答 :这里

  • 构建过程耗时过长 ? 答:一般我们都会自己搭建一个私有的内网仓库。

搭建私有 docker 仓库

1
docker run -d -p 5000:5000 -v /registry:/tmp/registry registry

只是简单搭建了一个用 docker.images 的私有仓库。也可以使用 [Harbor] 。(https://github.com/vmware/harbor/)
参考 搭建 Harbor