CICD是一整套的流程,只依赖docker是不够的,比如说代码管理,ci服务器。

在本地通过github做代码的管理,然后将要打包的代码通过docker镜像传递到docker hub, docker hub和docker cloud, 然后在云上自动创建或更新服务。

对于公司来讲,是不希望将项目发布到github的,而且github的私有项目是收费的,所以公司内部一般使用搭建一套gitlab。他是开源免费的。

gitlab

搭建gitlab服务,搭建的服务器至少内存要是4G,因为gitlab比较吃内存。下面以CentOS7为例。

  1. 安装依赖软件
yum install -y git vim gcc glibc-static telnet
yum install -y curl policycoreutils-python openssh-server
systemctl enable sshd
systemctl start sshd

yum install postfix
systemctl enable postfix
systemctl start postfix
  1. 设置gitlab安装源

如果是国内的话,可以尝试使用清华大学的源,新建/etc/yum.repos.d/gitlab-ce.repo

[gitlab-ce]
name=Gitlab CE Reposiory
baseurl=http://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7
gpgcheck=0
enabled=1

如果在国外的话可以使用

curl https://packages.gitlab.com/install/repositories/gitlab/gitlab-ee/script.rpm.sh | sudo bash
  1. 安装GitLab

关于域名,如果要是设置域名,则如下,这个域名可以是真实购买的域名,如果你要把gitlab安装到公网比如阿里云上的话。

EXTERNAL_URL="http://gitlab.example.com" yum install -y gitlab-ce

如果不想设置域名,或者将来再考虑,可以直接

yum install -y gitlab-ce

gitlab-ctl reconfigure
  1. 登录和修改密码

安装完成直接运行下面命令查看状态。

# 查看gitlab状态
gitlab-ctl status

然后可以使用ip或者设置的域名在浏览器访问这个地址,第一次进入会要求设置root密码,设置之后就可以使用root用户名和密码登录了。

登录之后我们就可以使用了,可以创建组也可以创建项目。可以像使用github一样使用这个项目。

gitlab的配置文件,修改之后要gitlab-ctl reconfigure 重新配置一下,否则不生效。

vim /etc/gitlab/gitlab.rb

gitlab-ctl reconfigure

gitlab ci

gitlab ci最好是单独与gitlab服务器的一台linux机器。

  1. 安装Docker
curl -sSl https://get.docker.com/ | sh
  1. 安装gitlab ci runner
curl -L https://packages.gitlab.com/install/repositories/runner/gitlab-ci-runner/script.rpm.sh | bash

yum install gitlab-ci-mmulti-runner -y

查看是否正常运行

gitlab-ci-multi-runner status
# 注册gitlab runner
gitlab-ci-multi-runner register

需要设置域名和token。token在项目的settings -> ci/cd -> runner setting -> Use the following registration token。描述可以不用输入。

  1. 设置docker权限

为了能让gitlab-runner正确的执行docker命令,需要把gitlab-runner用户添加到docker group里,然后重启docker和gitlab ci runner

usermod -aG docker gitlab-runner
service docker restart
gitlab-ci-multi-runner restart
  1. ci/cd

pipelines是一个构件的过程,想要使用的话需要有一个.gitlab-ci.yml文件。

这个文件里面定义了两个阶段,比如这里定义了build和test,然后test里面定义了script。

# 定义stages
stages:
    - build
    - test
# 定义job
job1:
    stage: test
    script:
        - echo "I am job1"
        - echo "I am in test stage"
# 定义job
job2:
    stage: build
    script:
        - echo "I am job2"
        - echo "I am in build stage"

我们可以再加一个deploy

# 定义stages
stages:
    - build
    - test
    - deploy
# 定义job
job1:
    stage: test
    script:
        - echo "I am job1"
        - echo "I am in test stage"
# 定义job
job2:
    stage: build
    script:
        - echo "I am job2"
        - echo "I am in build stage"
job3:
    stage: deploy
    script:
        - echo "I am job3"
        - echo "I am in deploy stage"

这个时候我们点开pipelines菜单可以发现他现在是一个pending状态,而且有三个阶段,每个阶段都有一个job。为什么是pending呢,是因为这里我们并没有告诉这个任务使用哪个docker,所以我们需要再次编辑这个文件,告诉他使用那个docker容器。

需要在job里面添加tags,在tags里面指定容器的名字。

# 定义stages
stages:
    - build
    - test
    - deploy
# 定义job
job1:
    stage: test
    tags:
        - demo
    script:
        - echo "I am job1"
        - echo "I am in test stage"
# 定义job
job2:
    stage: build
    tags:
        - demo
    script:
        - echo "I am job2"
        - echo "I am in build stage"
job3:
    stage: deploy
    tags:
        - demo
    script:
        - echo "I am job3"
        - echo "I am in deploy stage"

这样他就可以开始执行了,这里的stage是有状态的,而且会按顺序执行,前面如果失败后面就不会继续执行。