GitLab 实现 C++ 项目持续集成

Gitlab 集成了 CI / CD (Continuous Integration,持续集成 /
Continuous Delivery,持续交付)功能。下图是 gitlab 官网上有关 ci / cd 各阶段的图示:

本文重点讲述如何利用 gitlab 实现 c++ 项目的持续集成。

安装 gitlab runner

为了利用 gitlab 实现 ci / cd,需要安装 gitlab runner,gitlat runner 用于执行 ci / cd 任务。Gitlab runner 可以部署在与 gitlab 不同的机器,本文采用 docker 方式安装 gitlab runner。

Gitlab runner 的 docker-compose.yml 文件如下:

1
2
3
4
5
6
7
8
9
version: '3'
services:
gitlab-runner:
image: gitlab/gitlab-runner:latest
container_name: gitlab-runner
restart: always
volumes:
- /srv/gitlab-runner/config:/etc/gitlab-runner
- /var/run/docker.sock:/var/run/docker.sock

为保存 gitlab runner 容器已注册的 runner 数据,将 gitlab runner 的配置文件 config.toml 保存在宿主机。config.toml 可以从 gitlab runner 容器中拷贝出来,例如:

1
2
3
4
5
concurrent = 1
check_interval = 0

[session_server]
session_timeout = 1800

启动 gitlab runner:

1
docker-compose up -d

注册 runner

在 gitlab 上创建一个新的项目,例如 gitops,进行 runner 的注册页面: Settings - CI / CD - Runners settings。如下图所示,重点关注第 2 步的 url 以及第 3 步的 token 值。

回到已安装好 gitlab runner 的机器,执行命令注册 runner:

1
docker exec -it gitlab-runner gitlab-runner register

出现提示:

Please enter the gitlab-ci coordinator URL (e.g. https://gitlab.com/):

输入上图第 2 步的 url。

接着,出现提示:

Please enter the gitlab-ci token for this runner:

输入上图第 3 步的 token。其他各提示根据实际填写,重点关注执行器的选择:

Please enter the executor: custom, docker, parallels, ssh, virtualbox, docker-ssh, shell, docker+machine, docker-ssh+machine, kubernetes:

本文选择 ssh 执行器,填写 C++ 项目所在机器 ssh 的 ip ,端口,用户,密码,完成 runner 的注册。

完成注册后,项目的 Runners settings 显示已成功注册的 runner:

这时,打开 gitlab runner 的配置 config.toml,也可以看到新注册的 runner:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
concurrent = 1
check_interval = 0

[session_server]
session_timeout = 1800

[[runners]]
name = "gitlab ci / cd"
url = "http://"********"/"
token = ""********""
executor = "ssh"
[runners.custom_build_dir]
[runners.cache]
[runners.cache.s3]
[runners.cache.gcs]
[runners.cache.azure]
[runners.ssh]
user = "root"
password = "****************"
host = "********"
port = "22"

c++ 项目持续集成

需要编译的 c++ 源代码如下,该源代码会在控制台打印出一行 hello 问候语:

1
2
3
4
5
6
#include <iostream>

int main() {
std::cout << "Hello, leehao.me!!!" << std::endl;
return 0;
}

正常来说,为了得到 c++ 可执行文件,需要经过编译联接过程,可以通过手工执行命令来进行编译联接操作。这里我们采用 gitlab ci 功能,当向 gitlab push 源码时,自动实现 c++ 源代码的编译构建。

完整的源代码可以在 github 获取:链接,其中各源代码的作用:

  • .gitignore: 用于告诉 git 忽略的文件
  • .gitlab-ci.yml: 告诉 gitlab 如何进行编译构建部署
  • CMakeLists.txt: cmake 用于描述编译构建过程
  • main.cpp: 需要编译构建的源代码,在控制台输出 hello 问候
  • README.md: 项目简介文件

gitlab 使用 .gitlab-ci.yml 文件来实现 ci / cd。这个文件需要位置 gitlab 仓库的根目录。当用户进行源代码的 push 操作后,gitlab 会查找 .gitlab-ci.yml 文件,由 gitlab runner 执行里面定义的任务 (job)。

本文使用的 .gitlab-ci.yml 如下,stages 用于定义包含的任务阶段,这里为方便演示,仅定义了一个 build stage。有关 stages 的使用,可以参考官方文档 stages

1
2
3
4
5
6
7
8
9
10
11
12
stages:
- build

build:
stage: build
script:
- echo "Building the executable file"
- mkdir build
- cd build
- cmake ..
- make
- cp gitops /root/

script 用于定义需要执行的命令,先创建 build 目录,然后在 build 目录进行 cmake 操作,最后使用 make 生成可执行文件,并将该可执行文件复制至 /root 目录。

cmake 使用的 CMakeLists.txt 文件如下,有关 cmake 语法细节,可以参考:
cmake 语言 15 分钟入门教程

1
2
3
4
5
cmake_minimum_required (VERSION 2.8)

project(gitops)

add_executable(gitops main.cpp)

对项目源代码进行 push 操作,可以看到触发了 .gitlab-ci.yml 定义的任务:

还可以查看构建过程中输出的日志:

参考资料