目录
- I. How Does go get Work?
- II. How to Load Private Modules
- III. Build Docker Image
- IV. Run it on gitlab-ci
- V. Additional Resources
- VI. References
I.如何开始工作?
在我们深入研究获得私有GO模块的过程之前,让我们首先看一下go get
命令在GO生态系统中的功能。为了说明这一点,我们将执行一个简单的测试:
1。创建自己的私人模块:
假设您在版本控制系统(VCS)存储库中托管了一个私有模块,例如gitlab.com
。此私人模块包含您要在GO项目中使用的代码。
2。试图在计算机上获取此模块:
在典型的情况下,您可能希望能够使用go get
命令来获取私有模块,因为您的计算机具有必要的权限。但是,您可能会遇到意外的挑战。
运行go get {module}
时,默认情况下,GO工具会尝试从公共GO代理中获取模块。如果在那里找不到模块,它将落后于尝试从与模块相关的公共存储库中提取。如果仍然找不到模块,或者您没有访问私有模块的必要权限,则会遇到错误。
ii。如何加载私人模块
要加载特定环境中的私人模块,您可以按照以下步骤操作:
1.指定私人模块
请告诉哪些模块是私人的。
要解决此问题,GO提供了GOPRIVATE
环境变量。该变量允许您指定应该被视为私有的模块路径模式。当模块路径与GOPRIVATE
中指定的模式匹配时,GO工具将尝试直接从源存储库中获取模块,而不是仅依靠公共代理。
例如,要将gitlab.com
域标记为私有,您可以将GOPRIVATE
变量设置为So:
go env -w GOPRIVATE='gitlab.com/*'
要验证结果,您可以运行:
go env | grep GOPRIVATE
2.配置凭据
要访问私人模块,您可能需要配置凭据以进行身份验证。有几种实现这一目标的方法:
使用SSH:
您可以在获取私人模块时配置Git以使用SSH进行身份验证。为此,运行以下命令:
git config --global url."ssh://git@gitlab.com".insteadOf "https://gitlab.com"
配置HTTPS的基本身份验证:
-
。
.netrc
文件用于为各种应用程序存储凭据。要配置用于访问私人模块的基本身份验证,请创建或更新.netrc
文件:
echo "machine gitlab.com login $GITLAB_USERNAME password $GITLAB_TOKEN" > ~/.netrc
Note: You should create an Access token for it instead of using your password
iii。构建Docker图像
如果您需要为导入私人模块的项目构建一个docker映像,请让我看看我的dockerfile示例:
# Stage 1: Building the Application
FROM golang:1.21 as builder
# Pass build-time arguments for Git credentials
ARG GIT_USER
ARG GIT_TOKEN
# Set GOPRIVATE to specify private module pattern
RUN go env -w GOPRIVATE='gitlab.com/*'
# Set up authentication credentials using .netrc
RUN echo "machine gitlab.com login $GIT_USER password $GIT_TOKEN" > ~/.netrc
# Set the working directory
WORKDIR /app
# Copy go.mod and go.sum to enable efficient dependency fetching
COPY go.mod .
COPY go.sum .
# Download project dependencies
RUN go mod download
# Copy the rest of the application code
COPY . .
# Build the application binary
RUN go build -o app
# Stage 2: Creating the Final Minimal Image
FROM ubuntu:20.04
# Set the working directory
WORKDIR /app
# Copy the binary from the builder stage
COPY --from=builder /app/app .
# Define the command to run the application
CMD ["./app"]
在此Dockerfile示例中,我们将过程分为两个阶段,以清晰和优化:
** 1.构建应用程序(builder
阶段):**
此阶段负责获取依赖关系,编译应用程序并准备执行。它利用构建时间参数(GIT_USER
和GIT_TOKEN
)来配置用于访问私人模块的身份验证凭证。设置GOPRIVATE
环境变量以确保正确获取私有模块。 ~/.netrc
文件用于安全地存储身份验证凭证。
** 2.创建最终最小图像:**
在此阶段,我们将编译的二进制(app
)从builder
阶段复制到最终图像中。此图像不具有凭据。
构建Docker图像:
要使用提供的Dockerfile构建Docker映像,您可以使用以下命令:
docker build \
--build-arg GIT_USER=jack \
--build-arg GIT_TOKEN='{YOUR_TOKEN}' \
-t my-golang-app .
用您的实际git令牌替换{YOUR_TOKEN}
。此命令设置构建时间参数GIT_USER
和GIT_TOKEN
,以在图像构建过程中提供所需的身份验证。
iv。在gitlab-ci上运行
那么,如何将凭据传递到使用gitlab-ci
时的构建时间?
1。在回购/组变量中配置凭据:
您可以在CI/CD变量中配置GIT_USER
和GIT_TOKEN
:
您的回购或组>设置> CI/CD>变量>添加变量
2。写gitlab-ci.yml:
现在,您可以在gitlab-ci中访问这些变量:
stages:
- build
build-docker:
stage: build
script:
- docker build --build-arg GIT_USER=$GIT_USER --build-arg GIT_TOKEN=$GIT_TOKEN -t gitlab.com/jack/my-app .
- docker push gitlab.com/jack/my-app
V.其他资源
根据您的目标和公司规模,考虑合适的模型是谨慎的。探索本文中描述的一系列选项:Link