Skip to content
Leo的技术分享
Go back

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 文件如下:

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 容器中拷贝出来,例如:

concurrent = 1
check_interval = 0

[session_server]
  session_timeout = 1800

启动 gitlab runner:

docker-compose up -d

注册 runner

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

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

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:

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 问候语:

#include <iostream>

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

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

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

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

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

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 分钟入门教程

cmake_minimum_required (VERSION 2.8)

project(gitops)

add_executable(gitops main.cpp)

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

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

参考资料


Share this post on:

Previous Post
CMake 入门教程
Next Post
CMake 语言 15 分钟入门教程