在这篇文章中,我们将介绍如何在 GitLab 服务上构建 Go 项目的私有化包,以及如何在另一个Go项目中使用这个私有包。以下是详细的步骤和注意事项。

1. 准备工作

  • Gitlab 服务:https://gitlab.domain.com
  • 项目:titan
  • 私有包:ga-omni

以我司为例,有 ToB、ToC 业务,又有内部项目,这些业务有些是重合的,那么这部分代码的重用,使用私有化包就可以解决。

私有化包的好处:

  • 代码保密性: 私有化包可以包含敏感信息或专有算法,防止未经授权的访问。
  • 版本控制: 可以通过私有化包实现对项目中代码的精确版本控制。
  • 团队协作: 通过私有化包,可以更轻松地在团队内部分享和重用代码。

2. 创建私有化包

以 ga-omni 为例,创建私有化包 ga-omni 的步骤如下:

2.1 创建私有化包项目 在GitLab上创建一个新的仓库,命名为 ga-omni

1
2
mkdir ga-omni && cd ga-omni
go mod init gitlab.domain.com/backend/ga-omni

注意:ga-omni 包的深度不可以为三级,错误示例如下: gitlab.domain.com/backend/package/ga-omni

2.2 编写 ga-omni 包代码

编写你的Go包代码,并确保包含go.mod文件用于管理依赖。

1
2
3
4
5
6
// ga-omni/main.go
package gaomni

func Hello() string {
    return "Hello from ga-omni!"
}

2.3 提交并推送ga-omni包代码

将代码提交到GitLab仓库,并推送。

1
2
3
git add .
git commit -m "Initial commit"
git push origin master

2.4 设置Go环境 在titan项目中执行以下步骤设置Go环境:

1
go env -w GOPRIVATE="gitlab.domain.com"

设置后,go env 查看配置项中,GOPRIVATE、GOINSECURE、GONOPROXY、GONOSUMDB 四个配置值是否都已变更为目标值。

1
2
3
4
5
6
...
...
GOPRIVATE='gitlab.domain.com'
GOINSECURE='gitlab.domain.com'
GONOPROXY='gitlab.domain.com'
GONOSUMDB='gitlab.domain.com'

3. 测试 ga-omni 包

在任何Go项目中,你可以通过以下方式测试 ga-omni 包是否正常工作:

1
go get gitlab.domain.com/backend/ga-omni

直接这样拉取需私有包要输入 gitlab 认证账号和密码,为避免 https 协议每次需要认证的麻烦,可以配置 git host 为 gitlab.domain.com 时,走 ssh 协议,通过 key 的方式认证。

3.1 配置 Git SSH认证,方式一

确保你的GitLab帐户配置了SSH密钥,并且Go使用SSH进行包拉取。在~/.ssh/config文件中添加以下内容:

1
2
3
Host gitlab.domain.com
  PreferredAuthentications publickey
  IdentityFile ~/.ssh/your_private_key

3.2 配置 Git SSH认证,方式二

1
2
3
4
5
## 语法 
git config --global url."git@gitlab_url:groupName/projectName.git".insteadOf "https://gitlab_url/groupName/projectName.git"

## 示例
git config --global url."git@gitlab.domain.com:backend/ga-omni.git".insteadOf "https://gitlab.domain.com/backend/ga-omni.git"

配置后,查看 git 配置文件会增加一条如下配置行

1
2
3
4
5
6
cat ~/.gitconfig 
# This is Git's per-user configuration file.
...
...
[url "git@gitlab.domain.com:backend/ga-omni.git"]
        insteadOf = https://gitlab.domain.com/backend/ga-omni.git

再次拉取 ga-omni 包测试,以项目 titan 为例,创建 main.go 文件

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
// main.go
package main

import (
    "fmt"
    "gitlab.domain.com/backend/ga-omni"
)

func main() {
    fmt.Println(gaomni.Hello())
}

输出:Hello from ga-omni!,恭喜你搞定了 👏🏻👏🏻 🎉🎉

4. 私有包开发

开发机,titan 项目和私有包 ga-omni 目录位置:

1
2
3
- titan
- package
-- ga-omni

开发阶段为了在 IDE 可跳转到私有包 ga-omni,编辑 titan 项目 go.mod 文件,追加如下内容

1
replace (gitlab.shenjumiaosuan.com/backend/ga-omni => ../package/ga-omni)  

go.mod 增加 replace 后,再回到代码中,在 IDE 中点击私有包的代码,已经可使代码直接跳转到私有包了,我使用的是 goland ,如果没有你可以在主项目下额外再打开一个窗口,选择 Attch 方式,如下图所示

  1. titanga-omni 项目在 goland IDE 所在位置

images

  1. 如果没有 ga-omni,手动打开 ga-omni 项目,选择(Attch)附加到已经打开的项目,如示

images

开发结束后,代码推送的 Gitlab 版本库,CI/CD自动测试至服部署,参考这篇文章 [[gitlab-devops-go]]Gitlab Go 项目CICD 集成

参考文章