ð¥LOAD golang项目中的私人模块
#devops #go #backend

目录

I.如何开始工作?

在我们深入研究获得私有GO模块的过程之前,让我们首先看一下go get命令在GO生态系统中的功能。为了说明这一点,我们将执行一个简单的测试:

1。创建自己的私人模块:
假设您在版本控制系统(VCS)存储库中托管了一个私有模块,例如gitlab.com。此私人模块包含您要在GO项目中使用的代码。

2。试图在计算机上获取此模块:
在典型的情况下,您可能希望能够使用go get命令来获取私有模块,因为您的计算机具有必要的权限。但是,您可能会遇到意外的挑战。

Image description

Image description

运行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_USERGIT_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_USERGIT_TOKEN,以在图像构建过程中提供所需的身份验证。

iv。在gitlab-ci上运行

那么,如何将凭据传递到使用gitlab-ci时的构建时间?

1。在回购/组变量中配置凭据:

您可以在CI/CD变量中配置GIT_USERGIT_TOKEN

您的回购或组>设置> CI/CD>变量>添加变量

Image description

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

vi。参考