日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

使用athens部署企业内部Gitlab go mod包的Go私服代理

發布時間:2025/1/21 编程问答 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 使用athens部署企业内部Gitlab go mod包的Go私服代理 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

# 1,前言

當前 go 開發,已經全面投入到 mod 的懷抱,國內也有一些優秀的代理,例如 https://goproxy.io,https://goproxy.cn等,但是企業內網的 gitlab 上的包如何也能想公網包那樣引用拉取呢,這是一個問題,我曾體驗過如上 goproxy 這個項目的開源版本,但是內網拉包仍舊是一個沒有完美解決的問題,公司在用的是 athens,還不甚熟悉,但是為了能對它胸有成竹,今天打算鉆研一番。

之前的文檔云里霧里,自己跑了一遍也沒有跑通,網上的文章也都是沒有能夠參考的。今天再次自己研究,果然功夫不負有心人,重要的還是要靜下心認真看人家的官方文檔才行。

之前生產在跑的鏡像是 latest 版本,以至于很多內容不好控制,進到容器里看了下用的是 0.3.0 版本的,目前官方已經更新到了 0.10.0,相差很遠了,今天就來固定版本,并且完美跑通。

部分信息內容已經脫敏處理,如果讀者有迷惑的地方,歡迎留言交流。本文偏向于構建內部私服代理,如果想要構建一個包容性更強的大私服,可以參考這篇文章。

# 2,配置

下載對應鏡像,這不多說:

docker pull gomods/athens:v0.10.0 # 如果太慢,可以用如下鏡像 registry.cn-hangzhou.aliyuncs.com/eryajf/athens:v0.10.0

這里需要用到官方對應版本的配置文件,可以下載對應 release 的配置文件解壓拿到,還有其他一些配置文件,目錄詳情如下:

$ pwd /data/athens $ tree -a . |-- config | |-- config.toml --------# 主配置文件 | |-- FilterForGoCenter --# 一個過濾配置 | `-- .netrc ------------# 拉取gitlab時配置轉換信息 |-- gitconfig | `-- ssh-keys --------# 拉取gitlab包時認證信息 | |-- config --------# 認證gitlab的信息 | |-- id_rsa --------# 私鑰 | |-- id_rsa.pub ----# 公鑰 | `-- known_hosts `-- storage ----------------# 緩存目錄 4 directories, 7 files config.toml: $ cat config.toml | egrep -v '^$|^#|^.*#' GoBinary = "go" GoEnv = "development" GoProxy = "direct" GoBinaryEnvVars = ["GOPROXY=direct"] GoGetWorkers = 10 GoGetDir = "/data/athens/storage" # go get 時的目錄 ProtocolWorkers = 30 LogLevel = "debug" CloudRuntime = "none" EnablePprof = false PprofPort = ":3001" FilterFile = "" RobotsFile = "robots.txt" Timeout = 300 StorageType = "disk" Port = ":3000" GlobalEndpoint = "http://localhost:3001" BasicAuthUser = "" BasicAuthPass = "" ForceSSL = false ValidatorHook = "" PathPrefix = "" NETRCPath = "" GithubToken = "" HGRCPath = "" TraceExporter = "" TraceExporterURL = "http://localhost:14268" StatsExporter = "prometheus" SumDBs = ["https://sum.golang.google.cn"] NoSumPatterns = [] DownloadMode = "sync" DownloadURL = "" SingleFlightType = "memory" IndexType = "none" [SingleFlight][SingleFlight.Etcd]Endpoints = "localhost:2379,localhost:22379,localhost:32379"[SingleFlight.Redis]Endpoint = "127.0.0.1:6379"Password = ""[SingleFlight.RedisSentinel]Endpoints = ["127.0.0.1:26379"]MasterName = "redis-1"SentinelPassword = "sekret" [Storage][Storage.CDN]Endpoint = "cdn.example.com"[Storage.Disk]RootPath = "/data/athens/storage"[Storage.GCP]ProjectID = "MY_GCP_PROJECT_ID"Bucket = "MY_GCP_BUCKET"JSONKey = ""[Storage.Minio]Endpoint = "127.0.0.1:9001"Key = "minio"Secret = "minio123"EnableSSL = falseBucket = "gomods"Region = ""[Storage.Mongo]URL = "mongodb://127.0.0.1:27017"DefaultDBName = "athens"CertPath = ""Insecure = false[Storage.S3]Region = "MY_AWS_REGION"Key = "MY_AWS_ACCESS_KEY_ID"Secret = "MY_AWS_SECRET_ACCESS_KEY"Token = ""Bucket = "MY_S3_BUCKET_NAME"ForcePathStyle = falseUseDefaultConfiguration = falseCredentialsEndpoint = ""AwsContainerCredentialsRelativeURI = ""Endpoint = ""[Storage.AzureBlob]AccountName = "MY_AZURE_BLOB_ACCOUNT_NAME"AccountKey = "MY_AZURE_BLOB_ACCOUNT_KEY"ContainerName = "MY_AZURE_BLOB_CONTAINER_NAME"[Storage.External]URL = "" [Index][Index.MySQL]Protocol = "tcp"Host = "localhost"Port = 3306User = "root"Password = ""Database = "athens"[Index.MySQL.Params]parseTime = "true"timeout = "30s"[Index.Postgres]Host = "localhost"Port = 5432User = "postgres"Password = ""Database = "athens"[Index.Postgres.Params]connect_timeout = "30s"sslmode = "disable" FilterForGoCenter: $ cat FilterForGoCenter + D golang.org D k8s.io D cloud.google.com D google.golang.org D github.com D sigs.k8s.io D sourcegraph.com D gopkg.in config: $ cat config Host gitlab.test.com Hostname gitlab.test.com StrictHostKeyChecking no IdentityFile /root/.ssh/id_rsa

剩下兩個秘鑰文件就不展示了,不過需要注意的一點是,通過秘鑰認證的話,要注意這個秘鑰在 gitlab 當中的權限,是否能夠拉取依賴的 go 項目。

使用如下命令啟動服務:

docker run -d --net=host \-v /data/athens/storage:/data/athens \-v /data/athens/config:/config \-v /data/athens/gitconfig/.gitconfig:/root/.gitconfig \-v /data/athens/gitconfig/ssh-keys:/root/.ssh \-v /etc/nsswitch.conf:/etc/nsswitch.conf \-e ATHENS_DISK_STORAGE_ROOT=/data/athens \-e ATHENS_NETRC_PATH=/config/.netrc \-e ATHENS_STORAGE_TYPE=disk \-e ATHENS_DOWNLOAD_MODE=sync \-e ATHENS_GONOSUM_PATTERNS='gitlab.test.com/*' \-e GOSUMDB="sum.golang.google.cn" \--name athens-proxy --add-host gitlab.test.com:192.168.0.1 \--restart always -p 0.0.0.0:3000:3000 gomods/athens:v0.10.0

這樣基本上就能提供服務了,不過這個時候可能拉外網的包還會有問題,所以在 github 看到有同學用如下方案曲線救國了一下,在 NGINX 配置中添加如下內容:

upstream my-athens {server 127.0.0.1:3000; } server {listen 4000;location / {proxy_pass https://goproxy.io;proxy_cache_valid 30d;}location ~ /(gitlab\.test\.com)/ {proxy_pass http://my-athens;} }

# 3,驗證

然后即可投入使用了,簡單驗證一下,在客戶端配置如下內容,我在 go1.12 環境下測試的:

export GO111MODULE=on export GOPROXY="http://192.168.0.2:4000"

接著下一兩個包試試效果:

go get -u github.com/gin-gonic/gin

先拉外部的包,此時發現速度杠杠的,通過 NGINX 日志也能對應的請求:

192.168.0.3 - - [21/Jul/2020:22:20:51 +0800] "GET /github.com/gin-gonic/gin/@v/v1.6.3.info HTTP/1.1" 200 50 "-" "Go-http-client/1.1" "-" "-" "10.3.6.27" "##0.136##" "##0.136##"

然后再測試內網包:

go get gitlab.test.com/micro-service/sale-srv@v0.1.21

也可以看到正常下載下來了,然后也能在私服緩存當中看到這個包了。

$ ls /data/athens/storage/gitlab.test.com/micro-service/sale-srv v0.1.21

非常完美!

# 4,踩坑

關于拉取內部包失敗的一些原因:

  • 容器報錯 通過 docker logs -f athens看日志, 說 /data/athens/storage目錄不存在,此時可以進入到容器中,創建這個目錄,即可成功。
  • 認證問題 這個問題比較好驗證以及處理,要知道,私服想要從內部 gitlab 拉包成功,要么通過用戶名密碼,要么通過秘鑰,這里當然推薦使用秘鑰,那么,只要上邊配置沒有毛病,我們只需拷貝一個項目地址,來到容器內部克隆一下,看能否成功,如果失敗,則說明是認證的問題,如果成功,則說明這塊兒沒問題。
  • 其他錯誤 如果配置過程中沒有按我上邊的內容,則可能會出現其他奇怪的錯誤,歡迎大家一起提出交流。
  • 最后再次感謝 athens 的開源分享,讓我們的工作顯得更加輕巧便捷。

    # 5,參考

    原文鏈接

    官方文檔

    官方鏡像 - Dockerfile

    下載方式的介紹

    https://github.com/gomods/athens/issues/1471

    總結

    以上是生活随笔為你收集整理的使用athens部署企业内部Gitlab go mod包的Go私服代理的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。