0%

给Gitea配置govanityurls,让私有代码仓库中的go包支持go get

前置知识

Kubernetes部署Gitea+Drone+Registry

因为作者的Gitea是部署在k8s上,所以这次配置的 govanityurls 也是在k8s上构建,前置的环境不做多说。

构建govanityurls镜像

源代码:https://github.com/GoogleCloudPlatform/govanityurls

拉取源代码后,执行 go build 即可。

然后配置 Dockerfile 构建镜像,推送的自己的代码仓库中。

1
2
3
4
5
FROM alpine:3.13.5
WORKDIR /app
COPY ./govanityurls .
EXPOSE 8080
CMD /app/govanityurls

如果不想自己构建,可以直接使用其他人构建好的,例如下面的

1
garukun/govanityurls:latest

在k8s配置 govanityurls

创建 deployment.yaml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
apiVersion: apps/v1
kind: Deployment
metadata:
name: govanityurls
spec:
replicas: 1
selector:
matchLabels:
app: govanityurls
template:
metadata:
labels:
app: govanityurls
spec:
imagePullSecrets:
- name: regcred
containers:
- name: govanityurls
image: code-registry.domain/govanityurls:v0.1
# 因为我的镜像程序是在 /app/govanityurls , 配置挂载在 /app/config/vanity.yaml
command: [ "/app/govanityurls", "/app/config/vanity.yaml" ]
ports:
- containerPort: 8080
name: http
volumeMounts:
- name: static-pvc
mountPath: "/app/config"
subPath: "govanityurls"
restartPolicy: "Always"
volumes:
- name: static-pvc
persistentVolumeClaim:
claimName: static-pvc

创建 ingress.yaml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
apiVersion: v1
kind: Service
metadata:
name: govanityurls
labels:
app: govanityurls
spec:
selector:
app: govanityurls
ports:
- port: 8080
targetPort: 8080
protocol: TCP
name: http
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: govanityurls-ingress
spec:
rules:
- host: pkg.domain
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: govanityurls
port:
number: 8080

配置包路径 vanity.yaml

1
2
3
4
5
6
host: pkg.domain

paths:
/libcomm:
repo: https://gitcode.domain/user/libcomm
vcs: git

参数解说

  1. host,包的域名。例如创建的一个libcomm的包,go引用的路径就是 pkg.domain/libcomm
  2. paths中的repo,git的仓库路径,可以是 https:

例如在gitea中,使用user,创建一个libcomm的仓库,git的https连接为

1
https://gitcode.domain/user/libcomm.git

测试go包

创建仓库 libcomm

1
go mod init pkg.domain/libcomm

编写包代码

1
2
3
package libcomm

const TEST = 1

将代码提交到仓库中。

创建新的项目,测试引用包

1
2
3
4
5
6
7
8
9
package main
import (
"fmt"
"pkg.domain/libcomm"
)

func main() {
fmt.Println(libcomm.TEST)
}

通过 go get 拉取包

1
GIT_TERMINAL_PROMPT=1 go get -v pkg.domain/libcomm

注意:首次必须要追加 GIT_TERMINAL_PROMPT=1,因为私有代码仓库有用户密码验证,不添加这参数,会出现用户密码错误。

如果服务器不支持https ,可以追加 -insecure 参数。

1
go get -v -insecure pkg.domain/libcomm

最后,go build ,一切正常~

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# updated: Mar 4 2022
# 上面 go get -insecure 方式已经废弃,会有报错信息
# fatal: could not read Username for xxx terminal prompts disabled
# 解决方法
# 编辑 .gitconfig 替换https访问方式,改成git方式访问私有库
# 将git的 https://git.host 访问地址改成 ssh访问方式
# 第一步
[url "ssh://[email protected]<git.host>:"]
insteadOf = https://git.host
# 第二步
# 配置客户端ssh认证 ~/.ssh/config
# 第三步
# 将仓库标记为私有库
go env -w GOPRIVATE=pkg.domain/libcomm
# 解决,然后直接运行 go get pkg.domain/libcomm ~

参考资料
https://tonybai.com/2017/06/30/go-get-go-packages-in-private-code-repo-by-govanityurls/

https://github.com/GoogleCloudPlatform/govanityurls

https://erwinvaneyk.nl/private-repositories-with-go-mod/