首页 > 其他分享 >Golang 项目使用 Gitlab CI/CD 自动化持续集成

Golang 项目使用 Gitlab CI/CD 自动化持续集成

时间:2022-12-27 13:23:46浏览次数:52  
标签:CI coverage Gitlab CD go && test DIR

Gitlab CI/CD 自动化持续集成
该功能主要是代码提交到 gitlab 后,gitlab 能按照指定的脚本,去运行诸如测试、构建、发布

自动化,避免手工操作

本文将演示以下集成项目:

 

测试(Test),包含:
覆盖测试(code_coverage)
检查代码风格/错误(lint_code)
竞态检查(race_detector),只能检查单元测试中的竞态检查
单元测试(unit_tests)
构建(Build)
测试、构建全部成功了,主页上(README.md)会显示 build success
构建失败时,会邮件通知相关开发人员
集成步骤
1. 编写上述各项功能脚本
举例如下面脚本, ci.sh :
(没其他需求可直接拿来用~)

#!/bin/bash

set -e

CUR_DIR=$PWD
SRC_DIR=$PWD
cmd=$1

export GOPROXY=https://goproxy.io
export GOPATH=~/go
export GOBIN=~/go/bin

PKG_LIST=$(go list ./... | grep -v /vendor/)
LINT_VER=v0.0.0-20190409202823-959b441ac422

# Code coverage generation
function coverage_test(){
COVERAGE_DIR="${COVERAGE_DIR:-coverage}"
mkdir -p "$COVERAGE_DIR";
for package in ${PKG_LIST}; do
go test -covermode=count -coverprofile "${COVERAGE_DIR}/${package##*/}.temp" "$package" ;
done ;
echo 'mode: count' > "${COVERAGE_DIR}"/coverage.cov ;
tail -q -n +2 "${COVERAGE_DIR}"/*.temp >> "${COVERAGE_DIR}"/coverage.cov ;
go tool cover -func="${COVERAGE_DIR}"/coverage.cov ;
if [ "$1" == "html" ]; then
go tool cover -html="${COVERAGE_DIR}"/coverage.cov -o coverage.html ;
fi
rm -rf "$COVERAGE_DIR";
}

case $cmd in
lint) $0 dep && $GOBIN/golint -set_exit_status ${PKG_LIST} ;;
test) go test -short ${PKG_LIST} ;;
race) $0 dep && go test -race -short ${PKG_LIST} ;;
coverage) coverage_test ;;
coverhtml) coverage_test html ;;
dep) go get -v golang.org/x/lint@$LINT_VER && cd $GOPATH/pkg/mod/golang.org/x/lint@$LINT_VER/ && go install ./... && cd $CUR_DIR ;;
build) $0 dep && go build ./... ;;
clean) rm -rf ${PKG_LIST} && git checkout . ;;
esac

cd $CUR_DIR

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
在集成前,确保手动执行脚本是正常的

2. 提供 .gitlab-ci.yml 文件
举例如下面 .gitlab-ci.yml 文件:

(没其他需求可直接拿来用~)

before_script:
- export PATH=$PATH:/usr/local/go/bin
- export GOPROXY=https://goproxy.io
- export GOPATH=~/go
- export GOBIN=~/go/bin

stages:
- test
- build

unit_tests:
stage: test
script:
- bash -c 'echo $CI_PROJECT_DIR && cd $CI_PROJECT_DIR && ./ci.sh test'

race_detector:
stage: test
script:
- bash -c 'echo $CI_PROJECT_DIR && cd $CI_PROJECT_DIR && ./ci.sh race'

code_coverage:
stage: test
script:
- bash -c 'echo $CI_PROJECT_DIR && cd $CI_PROJECT_DIR && ./ci.sh coverage'

code_coverage_report:
stage: test
script:
- bash -c 'echo $CI_PROJECT_DIR && cd $CI_PROJECT_DIR && ./ci.sh coverhtml'
only:
- master

lint_code:
stage: test
script:
- bash -c 'echo $CI_PROJECT_DIR && cd $CI_PROJECT_DIR && ./ci.sh lint'

build:
stage: build
script:
- bash -c 'echo $CI_PROJECT_DIR && cd $CI_PROJECT_DIR && ./ci.sh build'

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
stages
本例子包含 2 个阶段: 测试(test)、构建(build)
before_script
github 自动执行个阶段内容前,会去执行这些命令
通常会是写准备工作,如设置环境变量,拷贝文件,下载依赖等等
unit_tests / race_detector 等等,都是定义要执行的内容,随便定义,包括名称
.gitlab-ci.yml 文件格式官方参考: https://docs.gitlab.com/ee/ci/yaml/README.html

3. 安装注册 gitlab runner
gitlab 通过 .gitlab-ci.yml 脚本驱动 runner 去执行这些内容

runner 就是真正执行测试、构建等步骤的机器,准备工作如下:

提供 1 主机作为 runner
该主机上安装好项目所需的编译、运行环境, golang 基本上安装好 golang 1.12 即可 (用 docker 的,需安装 docker)
向 gitlab 注册该 runner
安装 runner:

官方文档: https://docs.gitlab.com/runner/install/linux-repository.html#installing-the-runner
如何安装,文中已经很详细,不在复述
注册 runner:

官方文档: https://docs.gitlab.com/ee/ci/runners/ 。 介绍 3 种类型 runner
官方文档: https://docs.gitlab.com/runner/register/index.html 。
3 种类型 runner 注册步骤一样,唯一区别 token 取至特定项目、特定组、全局共享的
如何注册,文中已经很详细,不在复述
以上集成完毕

查看持续集成状态

都是页面上操作

主页显示持续集成状态
类似下图:


操作步骤如下:

1. 复制 项目-设置-流水线 页面的以下内容到 README.md :


2. 代码覆盖率,需要告知 gitlab 如何获得
项目-设置-流水线 页面的以下内容填写 total:\s+\(statements\)\s+(\d+.\d+\%):

 

要填写什么正则表达式,取决你代码覆盖率测试时输出结果的格式
本文中上面的脚本,代码覆盖率测试输出内容是:

因此,正则表达式为: total:\s+\(statements\)\s+(\d+.\d+\%)

以上

参考文档
本文主要参考至 https://blog.csdn.net/dev_csdn/article/details/78582011 ,并简化脚本
Golang 项目使用 Gitlab CI/CD 自动化持续集成

标签:CI,coverage,Gitlab,CD,go,&&,test,DIR
From: https://www.cnblogs.com/python9090/p/17007869.html

相关文章

  • m基于matlab的wcdma软切换算法的研究分析和仿真
    1.算法概述        软切换是WCDMA系统的关键技术之一,软切换算法和相关参数的设置直接影响着系统的容量和服务质量。通过WCDMA系统的软切换技术可以提高小区覆盖率......
  • 【221227-1】正方形ABCD中,E为BC边上三等分点,F为DC中点。求证:角DAE=角FEA
    ......
  • m基于matlab的wcdma软切换算法的研究分析和仿真
    1.算法概述软切换是WCDMA系统的关键技术之一,软切换算法和相关参数的设置直接影响着系统的容量和服务质量。通过WCDMA系统的软切换技术可以提高小区覆盖率和系统容量。所以......
  • 揭秘:CIO走向成功的十二条秘笈
    本人与众多成功的CIO进行了交流,并分析其成功之处,得出了共性的十二条成功秘笈,供大家参考。1、管理好IT供应商一个企业经过大规模的信息化建设后,企业对IT的投入将会减少,在......
  • Centos7下单节点部署etcd服务
    一台Centos7的服务器,我的IP:172.16.4.67登陆到服务器,切换到root用户#cd/tmp下载安装包,下载地址:https://github.com/etcd-io/etcd/releases#wget https://github.com/......
  • redis保存AtomicInteger对象踩坑及解决详解
    这篇文章主要介绍了redis保存AtomicInteger对象踩坑及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教redis保存AtomicInteger对象踩......
  • [虚树记录] CF613D Kingdom and its Cities
    这只蒟蒻看完题完全不会做,但是这只蒟蒻是通过百度搜索虚树找到这题的,发现这道CF*2800的题居然是许多人介绍虚树的第一道例题!我大概可以退役力!不过看完题解觉得真的还挺可......
  • hcie rs论述题 IGP部分(二) 13 isis网络割接
    13isis网络割接   这道题的本意就是在现网环境中,更换isis设备时,又要求避免业务中断。答:在割接前,先分析经过要替换设备AR3的流量,然后保存设备配置,记录路由信息等......
  • 基础_cifar10_model
    今天进一步在cifar10数据集上解决几个问题:1、比较一下序贯和model,为什么要分成两块;2、同样的条件下,我去比较一下序贯和model。这个例子作为今天的晚间运行。1、比较一......
  • 尝试解决cifar10问题
    注意事项:1、我要用kaggle的数据集,而不是用其它的数据集;2、最终得到的结果要以test为导向;1、先打开jupyter,并且把数据集传到dl_machine上去。想办......