乐趣区

关于go:现代化-protobuf-包管理-七个步骤使用cicd生成第三方包

本教程应用的是二进制的 gitlab-runner 配合 docker 生成 protobuf 的第三方包,并在分支 merge 时主动公布 tag 版本。

  • 筹备一台 Linux 机器,能链接到 gitlab 服务器即可
  • 筹备 gitlab 对应版本的 runner 文件,能够去官网找

我司的 gitlab 太古老,是 10.5.6,配套的 runer 最多只能到 10.0.2 版本,下载地址是:
https://gitlab-runner-downloads.s3.amazonaws.com/v10.0.2/bina…
地址是猜出来的。版本对应关系在官网有一个表格,能够参考找表格到本人须要的版本。

一. 装置配置 gitlab-runner:

1. 在 linux 服务上配置帐号:

prepare user for gitlab-runner. We need it run gitlab-runner on Linux system.

sudo passwd gitlab-runner
sudo gpasswd -a gitlab-runner root
su gitlab-runner

2. 配置 gitlab-runner 用户的 git 权限

在 gitlab 上注册一个帐号,记住用户名和邮箱地址,这里假如:

用户名:cicdops
邮箱:cicd@mycompany.com

应用上述帐号生成一个 Personal access token,给与读写权限。
为该用户赋予仓库的读写权限。

在服务器上进入 gitlab-runner 用户的家目录,也就是 /home/gitlab-runner/,创立两个文件并写入配置

1. 文件 .netrc

保障 gitlab-runner 能够拜访 gitlab,内容如下:

machine gitlab.companyname.com
login cicdops
passwod {token}

token 就是后面生成的 Personal access token

2. 文件 .gitconfig

这个文件保障能够应用 ciciops 用户打 tag 并推送

[user]
    name = cicdops
    email = cicdops@mycompany.com

3. 查找 git 仓库的 runner 配置

4. 在服务器上配置并启动 runner

sudo ./gitlab-runner-linux-amd64-10_0_2.bin install --user=gitlab-runner --working-directory=/home/gitlab-runner
sudo ./gitlab-runner-linux-amd64-10_0_2.bin register
sudo ./gitlab-runner-linux-amd64-10_0_2.bin status
sudo ./gitlab-runner-linux-amd64-10_0_2.bin start

顺次执行上述命令并填入参数,其中地址和 token 能够从后面步骤的 git 仓库配置中找到。

配置胜利之后会在 gitlab 页面看到 runner 有绿色的标记。

二. 配置自动化流程

1. 初始化代码仓库

保障下图红框标记的文件和目录存在

2. 应用 ci 文件定义流程

我的 .gitlab-ci.yml 文件内容如下

variables:
  GIT_STRATEGY: clone
stages:
  - gen-go-SNAPSHOT
  - gen-go-PRODUCTION
generate_go_SNAPSHOT: 
  variables:
    build_branch: dev
  stage: gen-go-SNAPSHOT
  only:
    - dev
    - merge_requests
  image:
    name: rvolosatovs/protoc:v4.1.0-rc1
    entrypoint: [""]
  script:
    - echo $build_branch
    - echo $CI_JOB_ID
    - bash ./gen-proto.sh $build_branch $CI_JOB_ID

generate_go_PRODUCTION: 
  stage: gen-go-PRODUCTION
  variables:
    build_branch: prod
  only:
    - master
    - merge_requests
  image:
    name: rvolosatovs/protoc:v4.1.0-rc1
    entrypoint: [""]
  script:
    - echo $build_branch
    - echo $CI_JOB_ID
    - bash ./gen-proto.sh $build_branch $CI_JOB_ID

这个文件不多解释,能够参考 gitlab 官网文档的语法。这里的 ci 文件定义了两个流程,散布在合并到 dev、master 分支时触发。具体操作是带参数执行 gen-proto.sh 脚本

3. 应用 shell 脚本实现生成和推送

脚本应用 docker 来生成 protobuf 文件对应的 go 文件,并推送到 git 仓库的 tag。其中 dev 分支的 tag 带后缀 -dev 以示辨别。

#/bin/bash
if [$# -ne 2]; then 
  echo "Usage: ./gen-proto.sh dev|prod 421"
else 
  packEnv=$1
  num=$2
fi
versionNum=$(date +"1.%y%m%d.")
if ["$packEnv" = "prod"] ; then 
  packEnv="prod"
  versionNum=$versionNum$num
else
  packEnv="dev"
  versionNum=$versionNum$num"-dev"
fi
echo "Package ENV :" $packEnv
echo "Version   :" $versionNum
docker run --rm -v $(pwd):/opt/pbdir/ rvolosatovs/protoc:v4.1.0-rc1 \
    --proto_path=/opt/pbdir/proto \
    --go_out=paths=source_relative:/opt/pbdir/package-go/ \
    --go-grpc_out=paths=source_relative:/opt/pbdir/package-go/ \
        /opt/pbdir/proto/*.proto
cmsg=`git log --pretty=format:'%s - %an' | head -n 2 | tail -n 1`
rm -rf package-go/go.mod
cp go.mod.tpl go.mod
rm -rf ./*.go
cp package-go/*.go ./
git add .
git commit -m "$cmsg"
git tag -a $versionNum -m ""
git push origin $versionNum

go.mod.tpl 文件本人依照本人的需要写一个即可。

退出移动版