September 19, 2020 更新: 配置Gitlab CI和私有Go模块
我已经有几年没有分享过与Gitlab和GitlabCI相关的真正有用的提示了。这次是关于使用Docker、Docker中的Docker、Gitlab CI以及更重要的、恰好代表Go二进制文件或/和Go软件包的私有git仓库构建Go程序时需要考虑的一些事情。
前提条件
要做到这一点,有两个要求。
- 你以前有使用Docker构建Go程序的经验,并使用多阶段构建,以及
- 你已经有一个使用Docker的GitlabCI Docker管道。
让它发挥作用
在使用Docker和依赖Go的私有仓库时,最棘手的部分是权限,有几种方法可以解决这个问题,比如定义一个新的私有密钥,从而定义一个相应的部署密钥,复制实际的SSH密钥,甚至定义个人访问令牌;然而我们更喜欢的解决方法是在go getting仓库时使用CI_JOB_TOKEN环境变量。
这可以通过设置insteadOf git配置(在构建过程中)来使用gitlab-co-token 用户名和https,而不是ssh,基本上在你的Dockerfile 中加入以下命令。
ARG CI_JOB_TOKEN
ENV CI_JOB_TOKEN=$CI_JOB_TOKEN
RUN git config \
--global url."https://gitlab-ci-token:${CI_JOB_TOKEN}@gitlab.private/group".insteadOf \
"git@gitlab.private:group"
注意我还使用了名为CI_JOB_TOKEN 的ARG,它是通过--build-arg 来填充的,所以实际上如果你要构建这个Docker文件,你需要使用。
docker build --build-arg CI_JOB_TOKEN=$CI_JOB_TOKEN -f Dockerfile -t $some_tag .
最后,最后一件重要的事情是,在使用这种模式时,一定要使用多阶段构建,否则你的最终镜像会保存在CI_JOB_TOKEN ,而我们真的不希望这样。