📢 [文章新增公告] 新增 為 Kubernetes 而生的 GitOps 工具 - ArgoCD 介紹與說明統一機密、身份與加密的管理系統 - HashiCorp Vault 介紹與說明 文章,歡迎點擊前方連結前往查看 💙
目前 Blog 頁籤支援折疊側邊欄功能,在閱讀文章會更方便,歡迎多加利用 💪
如何啟用 GitLab 的 Package Registry 以及將儲存位置從伺服器改到 GCS 上

如何啟用 GitLab 的 Package Registry 以及將儲存位置從伺服器改到 GCS 上

發布於 2022-12-29 · 最後更新於 2025-07-06

今天接到一個案子,RD 部門之後想要使用 GitLab 的 Package Registry 功能來發布套件,且不想把它存在 GitLab 伺服器上,希望可以直接存到 GCP 的 Google Cloud Storage 上,所以才會有了此篇筆記來記錄一下整個過程。


版本資訊

  • GitLab 14.10 (有部分設定會於新版本棄用,請記得確認好自己的版本是否支援)

先說一下,我們的 GitLab 是使用 docker-compose 來建置,所以後續的實作內容都會以 docker-compose 的方式來介紹。


啟動 GitLab 的 Package Registry

首先,我們當然要先啟動這項 Package Registry 功能,才可以再之後使用它,我們先看一下 GitLab 啟動的 docker-compose.yml 檔案:

version: '3'

services:
  gitlab:
    image: 'gitlab/gitlab-ee:14.10.5-ee.0'
    restart: always
    container_name: gitlab
    hostname: gitlab-pid
    logging:
      driver: "json-file"
      options:
        max-size: "100m"
        max-file: "50"
    environment:
      GITLAB_OMNIBUS_CONFIG: |
        external_url '${GITLAB_DOMAIN}'
        letsencrypt['enable'] = false
        gitlab_rails['initial_root_password'] = '${GITLAB_ROOT_PASSWORD}'
        gitlab_rails['gitlab_shell_ssh_port'] = '${GITLAB_HOST_SSH_PORT}'
        gitlab_rails['backup_keep_time'] = 79200
        gitlab_rails['omniauth_allow_single_sign_on'] = ['google_oauth2']
        gitlab_rails['omniauth_block_auto_created_users'] = false
        gitlab_rails['omniauth_sync_profile_from_provider'] = ['google_oauth2']
        gitlab_rails['omniauth_sync_profile_attributes'] = ['name', 'email']
        gitlab_rails['omniauth_providers'] = [
          {
		略過...
          }
        ]
    ports:
      - '${GITLAB_HOST_SSH_PORT}:22'
      - '${GITLAB_HOST_HTTP_PORT}:80'
      - '${GITLAB_HOST_HTTPS_PORT}:443'
    volumes:
    - './config:/etc/gitlab'
    - './logs:/var/log/gitlab'
    - './data:/var/opt/gitlab'

有些設定有略過或是省略不寫,大家就依照自己的設定來看就好~


新增 Package Registry 設定

我們在上方的 gitlab_rails['omniauth_providers'] = [ ... 略 ... ] 之後加上新增 Package Registry 設定內容:

gitlab_rails['packages_enabled'] = true
gitlab_rails['packages_object_store_enabled'] = true
gitlab_rails['packages_object_store_remote_directory'] = "GCS 名稱"
gitlab_rails['packages_object_store_direct_upload'] = true
gitlab_rails['packages_object_store_background_upload'] = true
gitlab_rails['packages_object_store_proxy_download'] = true
gitlab_rails['packages_object_store_connection'] = {
'provider' => 'Google',
'google_project' => '專案 ID',
'google_json_key_location' => '/etc/gitlab/google_key.json'
}
  • packages_enabled:啟動 packages
  • packages_object_store_enabled:啟動 packages 對象存儲
  • packages_object_store_remote_directory:設定 packages 對象存儲位置,這邊要輸入 GCS 的名稱
  • packages_object_store_direct_upload:設定是否可以直接上傳到對象存儲位置
  • packages_object_store_background_upload:設定是否以後台方式上傳到對象存儲位置
  • packages_object_store_proxy_download:設定是否可以透過代理伺服器進行套件下載
  • packages_object_store_connection:設定連接到對象存儲,由於我們要存到 GCS 上面,需要有這三項 provider、google_project、google_json_key_location 才可以將 packages 存到 GCS 上。如果想用其他的儲存位置,例如 Amazon S3、Azure Blob storage 可以參考 Object storage 詳細設定 ( 其中的 google_json_key_location 是要放可以讀寫 GCS 的 SA SECRET 檔案 )

先查看尚未重啟的 GitLab Package

由於公司 GitLab 預設有先開啟 packages_enabled,所以我就拿同事用 Helm 寫的 CI,來做測試。當更新 value.yaml 後會自動打包 Package 放到 Package Registry 中,我們直接進入到預設 Package Registry 的儲存位置,是在 /var/opt/gitlab/gitlab-rails/shared/packages/,用指令發現打包的 Package 的確存放於此 ,如下:


檢查是否還有 Package 在預設儲存位置 (尚未遷移)

檢查是否還有 Package 在預設儲存位置 (尚未遷移)


重啟設定後再次檢查 GitLab Package

當我們重啟設定後,也有建立好可供我們權限 SA 的 GCS 後,會發現原本存在預設 /var/opt/gitlab/gitlab-rails/shared/packages/ 沒有自動跑到 GCS 上,是因為我們還需要手動下指令將他遷移過去,指令是 gitlab-rake "gitlab:packages:migrate",最後等他跑完我們在檢查一下預設儲存位置就發現已經沒有 Package 了


檢查是否還有 Package 在預設儲存位置  (已遷移)

檢查是否還有 Package 在預設儲存位置 (已遷移)


開 GCS 網站來看會發現原先在預設儲存位置的 Package 都可以跑到 GCS 上:


查看已遷移到 Google Cloud Storage 的 Package

查看已遷移到 Google Cloud Storage 的 Package


參考資料

GitLab Package Registry administration:https://docs.gitlab.com/14.10/ee/administration/packages/