使用Gitlab-CI自动化构建内网Go应用程序,将面临以下的挑战:

  • 大型项目中通常使用 go modules 进行管理
  • go.xin****ech.cn 表示内部的GO包管理地址,类似于 http://go.uber.org/ 的站点
  • gitlab.x**i.cn 表示内部的gitlab仓库地址
  • go.xin****ech.cn/xws**/**-service-mgr 表示内部gitlab的其中的project地址

其中,一个比较大的麻烦在于,如何让被编译的应用程序,安全的访问到gitlab,下载处于内网环境的go modules依赖。

其中的诀窍在于把"https://gitlab.x**i.cn"替换为"https://gitlab-ci-token:${CI_JOB_TOKEN}@gitlab.x**i.cn",其中CI_JOB_TOKEN为gitlab-ci临时生成的访问token,仅在编译过程中可以使用。

 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
image: golang:1.14

variables:
  GOPROXY: https://goproxy.cn
  REPO_NAME: go.xin****ech.cn/xws**/**-service-mgr

before_script:
  - go env -w GOPRIVATE=go.xin****ech.cn
  - git config --global url."https://gitlab-ci-token:${CI_JOB_TOKEN}@gitlab.x**i.cn".insteadOf "https://gitlab.x**i.cn"

stages:
  - build

compile:
  stage: build
  tags:
    - xws**
  script:
    - make linux
  artifacts:
    paths:
      - bin
      - conf
      - sbin
      - doc

参考链接:https://docs.gitlab.com/ce/user/project/new_ci_build_permissions_model.html