Golang 使用 Gitlab 作为私有库

Golang 使用 Gitlab 作为私有库

在企业内部使用 Gitlab 作为 Golang 的内部仓库,存储公司内部 Golang 公共库

Gitlab 搭建

在 CentOS 上使用 docker-compose 快速构建一个测试环境,请先安装 dockerdocker-compose 工具。


  1. 创建部署目录

    shell
    1
    mkdir -p /data/gitlab/cert
  2. 创建自签证书,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
    #!/usr/bin/env bash

    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 脚本 会检测不通过。

  3. /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
    38
    version: "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
  4. 启动 Gitlab-server,并确保防火墙已开放相关端口。

    shell
    1
    docker-compose up -d

    使用命令 docker logs -f gitlab-server 查看日志,等待 Gitlab 首次启动自动化安装完成

  5. 修改本地电脑 hosts 文件,在其中添加 Gitlab 访问域名 git.akiya.cn 并映射至服务器 IP

  6. 通过浏览器访问 Gitlab 服务的域名,并初始化管理员密码

Golang 私有库配置

  1. 在自建 Gitlab 上新建仓库,并 push 相关代码作为 Golang 项目的库

  2. 配置本地 Golang 环境变量,添加 GOPRIVATE 环境变量

    Linux 下可添加至 /etc/profile.d/ 目录下

    go.sh
    1
    2
    3
    4
    5
    6
    7
    export 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
  3. 在 Golang 项目的 go.mod 文件中引用私有库

    例如,我这儿克隆有 github 上的项目并修改后,由于一些原因无法 PR,就放本地 Gitlab 作为私有库使用

    部分 go.mod 文件内容示例如下

    go.mod
    1
    2
    3
    4
    5
    6
    7
    8
    ...

    replace (
    github.com/Hyperledger-TWGC/ccs-gm => git.akiya.cn/hyperledeger/ccs-gm v0.1.1
    github.com/hyperledger/fabric-chaincode-go => git.akiya.cn/hyperledeger/fabric-chaincode-go v0.0.0-20200805090236-6a98b24131bd
    github.com/hyperledger/fabric-config => git.akiya.cn/hyperledeger/fabric-config v0.0.7
    github.com/hyperledger/fabric-protos-go => git.akiya.cn/hyperledeger/fabric-protos-go v0.0.0-20201113041125-8ea972620037
    )
  4. 使用 go mod tidy 先拉取包试试

    shell
    1
    2
    # go 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 服务器全部折腾一波。

评论

:D 一言句子获取中...

加载中,最新评论有1分钟缓存...