發佈至 GitHub Packages 和 GitHub Container Registry

已完成

在此,您將了解使用工作流程發佈至 GitHub Packages 的基本概念,以及組建、驗證、標記 Docker 映像並將其推送至 GitHub Container Registry 的必要步驟。

使用工作流程發佈至 GitHub Packages

GitHub Packages 可讓您安全地發佈和取用套件、將套件與您的程式碼一起儲存,以及私下與您的小組共用您的套件,或與開放原始碼社群共用。 您也可以使用 GitHub Actions 自動化封裝。

以下是在存放庫中建立新版本時的基本工作流程執行範例。 如果測試通過,則會將套件發佈至 GitHub Packages。

name: Node.js Package

on:
  release:
    types: [created]

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
        with:
          node-version: 12
      - run: npm ci
      - run: npm test

  publish-gpr:
    needs: build
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
        with:
          node-version: 12
          registry-url: https://npm.pkg.github.com/
      - run: npm ci
      - run: npm publish
        env:
          NODE_AUTH_TOKEN: ${{secrets.GITHUB_TOKEN}}

首先,工作流程檔案必須存在於 .github/workflows 目錄中。 在建立新版本時,常見的做法是將發佈新套件的工作流程命名為 release-package.yml,讓專案共同作業者不需瀏覽至工作流程檔案,便能輕易地了解其目的。

上述工作流程會在建立新版本之後執行幾項操作:

  1. 名為 build 的作業會執行 npm ci ("ci" 代表持續整合) 以直接從 package-lock.json 檔案安裝相依性,以及專案的測試。
  2. build 作業成功後,名為 publish-gpr 的作業會發佈套件。
  3. 工作流程會使用存取權杖進行驗證,將封裝發佈至 registry-url: https://npm.pkg.github.com/

使用 GitHub Container Registry 來裝載和管理 Docker 容器映像

GitHub Packages 支援容器、Kubernetes 和其他雲端原生技術的使用,以管理整個應用程式生命週期,包括生產作業、開發、發行和部署。 GitHub Packages 也提供容器登錄,其設計目的是為了支援容器映像的獨特需求。 您可以使用 GitHub Container Registry,在您的 GitHub 組織或個人使用者帳戶中順暢地裝載和管理 Docker 容器映像。 GitHub Container Registry 可讓您使用細部權限,設定能夠管理及存取套件的人員。

使用容器登錄,您可以:

  • 將容器映像儲存在您的組織和使用者帳戶中,而不是存放庫。
  • 為容器映像設定細部權限。
  • 匿名存取公用容器映像。

在您組建映像、驗證並於 ghcr.io 登入 GitHub Container Registry 服務後,您便可以使用這些命令標記及將最新版本的映像推送至容器登錄:

echo $GITHUB_TOKEN | docker login ghcr.io -u USERNAME --password-stdin

docker tag IMAGE_ID ghcr.io/OWNER/IMAGE_NAME:latest

docker push ghcr.io/OWNER/IMAGE_NAME:latest

注意

若要使用 GitHub Actions 工作流程進行驗證,您可以使用 GITHUB_TOKEN:

  • 針對位於 PACKAGE-REGISTRY.pkg.github.com 的封裝登錄。
  • 針對位於 ghcr.io/OWNER/IMAGE-NAME 的容器登錄。