發佈至 GitHub Packages 和 GitHub Container Registry

已完成

在這裡,您將瞭解使用工作流程發佈至 GitHub 套件的基本概念,以及建置、驗證、標記 Docker 映像並將 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 可讓您設定誰可以使用更細緻的許可權來管理和存取套件。

透過容器登錄,您可以:

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

在建置映像並經過驗證並登入 GitHub ghcr.ioContainer 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 的容器登錄。