补充: 解决 go get (github) private repos 权限问题

将私人代码库迁移到 github private repos 后, 除了 CI 持续集成的问题,还有一个问题就是私有库的 go get 问题。一篇短文,记录一下设置过程。

本地开发

本地开发过程中,git 在获取 github private repo 的过程是通过 ssh 协议进行拉取,通常本地的 ssh 密钥已经配置到 github 账号中。所以在 go get 过程中,不会碰到 private repo 无法访问的问题。如果,开发中遇到问题则可以通过,以下配置,重新设置 github.com 域名下的 repo 的访问协议。

$: git config --global url."git@github.com:".insteadOf "https://github.com/"

容器构建

私有仓库在 CI 过程中,使用多阶段构建,在构建过程中会使用全新的容器镜像,新的容器镜像中如果构建过程需要用到私有仓库,就需要提前准备好相应的访问权限。

默认情况下,go get 直接访问 https://github.com/ 获取版本发布包,为了使用私有仓库,则可以通过提前申请 GITHUB_TOKEN 的方式, 再利用 git config 的替换功能,设置权限访问。主要实现命令如下:

$: git config --global url."https://${GITHUB_TOKEN}:x-oauth-basic@github.com/".insteadOf "https://github.com/"

升级样例

了解了以上原理,就之前的golang github action 样例进行升级。

添加新的 GITHUB_TOKEN

新增 GITHUB_TOKEN 请,直接访问该链接.

完成创建后,请 GITHUB_TOKEN 添加到本机的的环境变量中。export TOKEN='your github token'.

更新 Dockerfile

更新 Dockerfile 的构建过程,增加 TOKEN 参数。

FROM golang:1.14-alpine AS builder
# 新增 TOKEN 参数
ARG TOKEN 
ARG VERSION
ARG COMMIT
ARG BUILDTIME
WORKDIR /app
COPY . .
# 设置 git config
RUN  apk --update --no-cache add git ca-certificates \
    && git config --global url."https://${TOKEN}:x-oauth-basic@github.com/".insteadOf "https://github.com/"
RUN GOOS=linux go build -o main -ldflags "-X github.com/x-mod/build.version=${VERSION} -X github.com/x-mod/build.commit=${COMMIT} -X github.com/x-mod/build.date=${BUILDTIME}"

# 第二阶段
FROM  alpine
# 安装必要的工具包
RUN  apk --update --no-cache add tzdata ca-certificates \
    && cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
COPY --from=builder /app/main /usr/local/bin
ENTRYPOINT [ "main" ]

更新 Makefile

增加 docker 构建参数 TOKEN。

image:
	docker build --build-arg TOKEN=${TOKEN} --build-arg VERSION=${GITTAG} --build-arg COMMIT=${COMMIT} --build-arg BUILDTIME=${BUILD_TIME} -t ${DOCKER_USER}/${PROJECT}:latest .

make image本地测试通过后,相应的增加 Github Action 的配置。

更新 Github Action

...

-   name: docker build
    run: docker build --build-arg TOKEN=${TOKEN} --build-arg VERSION=${VERSION} --build-arg COMMIT=${COMMIT} --build-arg BUILDTIME=${BUILDTIME} -t ${DOCKER_USERNAME}/${PROJECT}:${IMAGE_TAG} .
    env:
        DOCKER_USERNAME: ${{ secrets.DOCKER_USERNAME }}
        TOKEN: ${{ secrets.TOKEN }}
...

在具体 github 项目中增加 secret.TOKEN, 设置值就是新增加的 GITHUB_TOKEN 值。增加相应的环境变量与构建参数即可。

小结

以上过程即可解决 go get (github) private repos 多阶段构建过程中的权限问题。欢迎指正。