Golang 使用 Gitlab 作为私有库
Gitlab 搭建
在 CentOS 上使用 docker-compose 快速构建一个测试环境,请先安装 docker
及 docker-compose
工具。
创建部署目录
shell 1
mkdir -p /data/gitlab/cert
创建自签证书,
go get
下载包时可以使用-insecure
参数访问不受信任的http
仓库。但是go mod
只能访问https
的仓库。(至少我按网上的各种教程都试过了还是不行😭)如果已有证书可跳过本步骤(如果有可信 CA 机构颁发的证书最好,可以少折腾自签证书的认证问题)
进入
/data/gitlab/cert
创建 cert.sh 文件,并复制如下脚本内容到文件中cert.sh >folded 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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
PERIOD_OF_VALIDITY=3650
read -p "Enter your domain [*.example.com]: " SAN_DOMAIN
SAN_DOMAIN=${SAN_DOMAIN:-"*.example.com"}
read -p "Enter your root domain [example.com]: " DOMAIN
DOMAIN=${DOMAIN:-"example.com"}
read -s -p "Enter your password: " CA_PASSWD
CA_PASSWD=${CA_PASSWD:-"CA_PASSWD"}
SUBJECT="/C=CN/ST=SiChuan/L=ChengDu/O=akiya/OU=akiya/CN=${DOMAIN}"
echo "Create server key..."
# 生成CA密钥
openssl genrsa -des3 -passout pass:${CA_PASSWD} -out ${DOMAIN}.key 2048
echo "Create server certificate signing request..."
# 生成CA根证书
openssl req -sha256 -passin pass:${CA_PASSWD} -new -x509 -days ${PERIOD_OF_VALIDITY} -key ${DOMAIN}.key -out ${DOMAIN}.crt -subj ${SUBJECT}
# 生成服务器RSA密钥
openssl genrsa -des3 -passout pass:${CA_PASSWD} -out ${SAN_DOMAIN}.key 2048
echo "Remove password..."
mv $DOMAIN.key $DOMAIN.origin.key
openssl rsa -passin pass:${CA_PASSWD} -in $DOMAIN.origin.key -out $DOMAIN.key
mv ${SAN_DOMAIN}.key ${SAN_DOMAIN}.origin.key
openssl rsa -passin pass:${CA_PASSWD} -in ${SAN_DOMAIN}.origin.key -out ${SAN_DOMAIN}.key
echo "Sign SSL certificate..."
# 生成服务器证书请求文件
openssl req -new -sha256 -key ${SAN_DOMAIN}.key -subj $SUBJECT -reqexts \
SAN -config <(cat /etc/pki/tls/openssl.cnf <(printf "[SAN]\nsubjectAltName=DNS:${SAN_DOMAIN}")) -out ${SAN_DOMAIN}.csr
# 自己签发证书
openssl x509 -req -days ${PERIOD_OF_VALIDITY} -in ${SAN_DOMAIN}.csr -out ${SAN_DOMAIN}.crt \
-CA $DOMAIN.crt -CAkey $DOMAIN.key -CAcreateserial -extensions SAN \
-extfile <(cat /etc/pki/tls/openssl.cnf <(printf "[SAN]\nsubjectAltName=DNS:${SAN_DOMAIN}"))
echo "======================================================="
echo "CA_CERT: ${DOMAIN}.crt"
echo "SAN_CERT: ${SAN_DOMAIN}.crt"
echo "PRIVET_KEY ${SAN_DOMAIN}.key"保存后,使用命令
chmod +x cert.sh
为脚本添加可执行权限。然后启动脚本./cert.sh
按提示输入泛域名
与根域名
以及密码,等待脚本创建证书。证书创建完成后,需要重命名泛域名证书,如果证书中有
*
,在启动 GitLab 时,chef 脚本
会检测不通过。在
/data/gitlab
目录下添加 GitLab 的 compose 编排脚本,内容如下:docker-compose.yml 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
34
35
36
37
38version: "3.3"
volumes:
gitlab_config: {}
gitlab_logs: {}
gitlab_data: {}
networks:
gitlab:
driver: bridge
services:
gitlab:
image: gitlab/gitlab-ce:12.9.8-ce.0
container_name: gitlab-server
restart: always
hostname: git.akiya.cn
environment:
TZ: Asia/Shanghai
GITLAB_OMNIBUS_CONFIG: |
external_url 'https://git.akiya.cn' # 访问域名
gitlab_rails['gitlab_shell_ssh_port'] = 22
# 如果证书放在 /etc/gitlab/ssl/ 目录下,建议加上如下配置
# letsencrypt['enable'] = false
nginx['ssl_certificate'] = '/opt/cert/git.akiya.cn.crt'
nginx['ssl_certificate_key'] = '/opt/cert/git.akiya.cn.key'
nginx['redirect_http_to_https'] = true
networks:
- gitlab
ports:
- '80:80'
- '443:443'
- '22:22' # 如果 git clone 需要使用 ssh 协议,请确保该端口未占用
volumes:
- gitlab_config:/etc/gitlab
- gitlab_logs:/var/log/gitlab
- gitlab_data:/var/opt/gitlab
- $PWD/cert/:/opt/cert启动 Gitlab-server,并确保防火墙已开放相关端口。
shell 1
docker-compose up -d
使用命令
docker logs -f gitlab-server
查看日志,等待 Gitlab 首次启动自动化安装完成修改本地电脑 hosts 文件,在其中添加 Gitlab 访问域名
git.akiya.cn
并映射至服务器 IP通过浏览器访问 Gitlab 服务的域名,并初始化管理员密码
Golang 私有库配置
在自建 Gitlab 上新建仓库,并 push 相关代码作为
Golang
项目的库配置本地 Golang 环境变量,添加 GOPRIVATE 环境变量
Linux 下可添加至
/etc/profile.d/
目录下go.sh 1
2
3
4
5
6
7export GOPATH=/opt/gopath/
export PATH=$PATH:$GOPATH/bin:/usr/share/go/bin
export GO111MODULE=on
# 加速仓库
export GOPROXY=https://mirrors.aliyun.com/goproxy/
# 内网 Gitlab 私有库,跳过 GOPROXY 获取
export GOPRIVATE=git.akiya.cn在 Golang 项目的
go.mod
文件中引用私有库例如,我这儿克隆有 github 上的项目并修改后,由于一些原因无法 PR,就放本地 Gitlab 作为私有库使用
部分
go.mod
文件内容示例如下go.mod 1
2
3
4
5
6
7
8...
replace (
> git.akiya.cn/hyperledeger/ccs-gm v0.1.1 =
> git.akiya.cn/hyperledeger/fabric-chaincode-go v0.0.0-20200805090236-6a98b24131bd =
> git.akiya.cn/hyperledeger/fabric-config v0.0.7 =
> git.akiya.cn/hyperledeger/fabric-protos-go v0.0.0-20201113041125-8ea972620037 =
)使用
go mod tidy
先拉取包试试shell 1
2go mod tidy
go: github.com/Hyperledger-TWGC/ccs-gm@v0.0.0-00010101000000-000000000000: unrecognized import path "git.akiya.cn/hyperledeger/ccs-gm": https fetch: Get "https://git.akiya.cn/hyperledeger/ccs-gm?go-get=1": x509: certificate signed by unknown authority可以看到直接使用
go mod
拉取使用自签证书的私有库会提示x509: certificate signed by unknown authority
要解决这个问题,需要把我们的自签证书的根证书导入到系统中去。
CentOS 下做法为拷贝根证书到
/etc/pki/ca-trust/source/anchors/
目录下shell 1
cp /data/gitlab/cert/akiya.cn.crt /etc/pki/ca-trust/source/anchors/
更新
shell 1
update-ca-trust extract
完成后再次请求,发现找不到指定版本
shell 1
2# go mod tidy
go: github.com/Hyperledger-TWGC/ccs-gm@v0.0.0-00010101000000-000000000000: reading git.akiya.cn/hyperledeger/ccs-gm/go.mod at revision v0.1.1: unknown revision v0.1.1这是由于我们使用的自签证书 git 验证证书不通过导致的,需添加环境变量
export GIT_SSL_NO_VERIFY=true
忽略证书验证,并且配置 git 的免密登录。完成后再次拉取包就可以了
最后吐槽下,还是建议大家有条件的情况下尽量使用可信机构签发的 TLS 证书,现在各大云厂都提供有免费 SSL 证书签发的服务,或者使用 https://freessl.cn/ 去签发也行,可以省去很多配置烦恼(~ ̄▽ ̄)~。内网使用的时候直接在内部 DNS 上行解析下域名到对应服务器就行了,真的没必要搞的所有人及相关 CI/CD 服务器全部折腾一波。
- 本文标题:Golang 使用 Gitlab 作为私有库
- 本文作者:akiya
- 本文链接:https://little-star.love/posts/a34fe3c1/
- 版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明出处!