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

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

在集成前,确保手动执行脚本是正常的

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'
  • 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. 提供 1 主机作为 runner
  2. 该主机上安装好项目所需的编译、运行环境, golang 基本上安装好 golang 1.12 即可 (用 docker 的,需安装 docker)
  3. 向 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 ,并简化脚本

发布了129 篇原创文章 · 获赞 73 · 访问量 16万+

猜你喜欢

转载自blog.csdn.net/u013272009/article/details/97374307