Skip to main content

GitHub Actionsでのパッケージの公開とインストール

GitHub Actionsでのワークフローを、自動的にパッケージをに公開もしくはGitHub Packagesからインストールするように設定できます。

GitHub ActionsとのGitHub Packagesについて

GitHub Actionsは、コードを保存するのと同じ場所でソフトウェア開発のワークフローを自動化し、プルリクエストやIssueで協力することを支援します。 個々のタスクを書き、アクションを呼び出し、それらを組み合わせてカスタムのワークフローを作成できます。 GitHub Actions では、エンドツーエンドの継続的インテグレーション (CI) と継続的デプロイメント (CD) 機能をリポジトリに直接ビルドすることができます。 詳しい情報については「GitHub Actions について」を参照してください。

ワークフローの一部としてパッケージの公開やインストールを行うことで、リポジトリのCI及びCDの機能を拡張できます。

GitHub 上のパッケージレジストリを認証する

GitHub Enterprise Server 上のパッケージ レジストリに対して認証を行いたい場合は、、認証用の個人用アクセス トークンではなく、GitHub Actions を有効化する際に GitHub Enterprise Server でリポジトリに対して自動的に作成される、GITHUB_TOKEN を使用することをお勧めします。 ワークフロー ファイルでこのアクセス トークンにアクセス許可を設定して、contents スコープに対する読み取りアクセス権と、packages スコープに対する書き込みアクセス権を付与する必要があります。 フォークの場合、GITHUB_TOKEN には親リポジトリの読み取りアクセス権が付与されます。 詳細については、「GITHUB_TOKEN を使用した認証」を参照してください。

ワークフロー ファイル内の GITHUB_TOKEN は、{{secrets.GITHUB_TOKEN}} コンテキストを使って参照できます。 詳細については、「GITHUB_TOKEN を使用した認証」を参照してください。

リポジトリが所有するパッケージに対する権限とパッケージアクセスについて

注: RubyGems、npm、Apache Maven、NuGet、Gradle、名前空間 docker.pkg.github.com を使用する Docker パッケージなどの一部のレジストリでは、レポジトリ所有のパッケージのみが許可されます。 Container registry (ghcr.io) を使用すると、ユーザーまたは Organization がパッケージを所有できるようにするか、リポジトリにリンクできるようにするかを選択できます。

GitHub Actionsを有効化すると、GitHubはリポジトリにGitHub Appをインストールします。 GITHUB_TOKEN シークレットは、GitHub App インストール アクセス トークンです。 このインストールアクセストークンは、リポジトリにインストールされたGitHub Appの代わりに認証を受けるために使うことができます。 このトークンの権限は、ワークフローを含むリポジトリに限定されます。 詳細については、「GITHUB_TOKEN のアクセス許可」を参照してください。

GitHub Packages を使用すると、GitHub Actions ワークフローで利用できる GITHUB_TOKEN を通じてパッケージをプッシュしたりプルしたりできます。

アクションを使ったパッケージの公開

継続的インテグレーション (CI) フローの一環として、GitHub Actionsを使用してパッケージを自動的に公開できます。 この継続的デプロイメント (CD) に対するアプローチにより、コードが品質基準を満たしている場合に新しいパッケージの作成を自動化できます。 たとえば、開発者が特定のブランチにプッシュするたびに CI テストを実行するワークフローを作成してはいかがでしょう。 テストにパスすると、このワークフローは新しいパッケージバージョンをGitHub Packagesに公開できます。

パッケージのクライアントによって、設定のステップは様々です。 GitHub Actions のワークフローの構成に関する一般的な情報については、「ワークフローの構成」を参照してください。

以下の例では、GitHub Actionsを使用してアプリケーションのビルドとテストを行い、それから自動的にDockerイメージを作成してGitHub Packagesに公開する方法を示しています。

リポジトリに新しいワークフロー ファイル (.github/workflows/deploy-image.yml など) を作成し、以下の YAML を追加します。

YAML
# このワークフローはGitHubによって認定されていないアクションを使用します。
# それらはサードパーティによって提供され、
# 別個の利用規約、プライバシーポリシー、
# ドキュメントを参照してください。

# GitHub では、コミット SHA にアクションをピン留めすることが推奨されます。
# 新しいバージョンを取得するには、SHA を更新する必要があります。
# タグまたはブランチを参照することもできますが、アクションは警告なしに変更される可能性があります。

name: Create and publish a Docker image

on:
  push:
    branches: ['release']

jobs:
  run-npm-build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - name: npm install and build webpack
        run: |
          npm install
          npm run build
      - uses: actions/upload-artifact@v3
        with:
          name: webpack artifacts
          path: public/

  run-npm-test:
    runs-on: ubuntu-latest
    needs: run-npm-build
    strategy:
      matrix:
        os: [ubuntu-latest]
        node-version: [12.x, 14.x]
    steps:
      - uses: actions/checkout@v3
      - name: Use Node.js ${{ matrix.node-version }}
        uses: actions/setup-node@v3
        with:
          node-version: ${{ matrix.node-version }}
      - uses: actions/download-artifact@v3
        with:
          name: webpack artifacts
          path: public
      - name: npm install, and test
        run: |
          npm install
          npm test
        env:
          CI: true

  build-and-push-image:
    runs-on: ubuntu-latest
    needs: run-npm-test 
    permissions: 
      contents: read
      packages: write 
    steps:
      - name: Checkout
        uses: actions/checkout@v3
      - name: Log in to GitHub Docker Registry
        uses: docker/login-action@f054a8b539a109f9f41c372932f1ae047eff08c9
        with:
          registry: docker.pkg.github.com
          username: ${{ github.actor }}
          password: ${{ secrets.GITHUB_TOKEN }}
      - name: Build and push Docker image
        uses: docker/build-push-action@ad44023a93711e3deb337508980b4b5e9bcdc5dc
        with:
          push: true
          tags: |
            docker.pkg.github.com/${{ github.repository }}/octo-image:${{ github.sha }}

上記に関連する設定については、次の表で説明しています。 ワークフロー内の各要素の詳細については、「GitHub Actions のワークフロー構文」を参照してください。

```yaml on: push: branches: ['release'] ``` release というブランチに変更をプッシュするたびに、Create and publish a Docker image ワークフローを実行するよう設定します。
run-npm-build:
  runs-on: ubuntu-latest
  steps:
    - uses: actions/checkout@v3
    - name: npm install and build webpack
      run: |
        npm install
        npm run build
    - uses: actions/upload-artifact@v3
      with:
        name: webpack artifacts
        path: public/
このジョブではNPMをインストールし、それをアプリケーションのビルドに使用します。
run-npm-test:
  runs-on: ubuntu-latest
  needs: run-npm-build
  strategy:
    matrix:
      os: [ubuntu-latest]
      node-version: [12.x, 14.x]
  steps:
    - uses: actions/checkout@v3
    - name: Use Node.js ${{ matrix.node-version }}
      uses: actions/setup-node@v3
      with:
        node-version: ${{ matrix.node-version }}
    - uses: actions/download-artifact@v3
      with:
        name: webpack artifacts
        path: public
    - name: npm install, and test
      run: |
        npm install
        npm test
      env:
        CI: true
このジョブでは npm test を使用してコードをテストします。 needs: run-npm-build コマンドにより、このジョブは run-npm-build ジョブに依存するようになります。
```yaml build-and-push-image: runs-on: ubuntu-latest needs: run-npm-test ``` このジョブはパッケージを公開します。 needs: run-npm-test コマンドにより、このジョブは run-npm-test ジョブに依存するようになります。
```yaml permissions: contents: read packages: write ``` GITHUB_TOKEN に付与されているアクセス許可をこのジョブ内のアクション用に設定します。
```yaml - name: Log in to GitHub Docker Registry uses: docker/login-action@f054a8b539a109f9f41c372932f1ae047eff08c9 with: registry: docker.pkg.github.com username: ${{ github.actor }} password: ${{ secrets.GITHUB_TOKEN }} ``` パッケージを公開するアカウントとパスワードを使ってレジストリにログインする Log in to GitHub Docker Registry という新しいステップを作成します。 いったん公開されると、パッケージはここで定めたアカウントが所有することになります。
```yaml - name: Build and push Docker image ``` Build and push Docker image という新しいステップを作成します。 このステップは、build-and-push-image ジョブの一部として実行されます。
```yaml uses: docker/build-push-action@ad44023a93711e3deb337508980b4b5e9bcdc5dc ``` Docker の build-push-action アクションを使用して、リポジトリの Dockerfile を元にイメージをビルドします。 ビルドが成功すると、イメージをGitHub Packagesにプッシュします。
```yaml with: ``` 必要なパラメーターを build-push-action アクションに送信します。 これらは以降の行で定義されます。
```yaml push: true ``` ビルドに成功したら、このイメージをレジストリにプッシュします。
```yaml tags: | docker.pkg.github.com/${{ github.repository }}/octo-image:${{ github.sha }} ``` ワークフローをトリガーしたコミットのSHAでイメージにタグ付けします。

この新しいワークフローは、リポジトリの release という名前のブランチに変更をプッシュするたびに自動的に実行されます。 [アクション] タブで、この進捗を表示できます。

ワークフローが完成すると、その数分後にリポジトリで新しいパッケージが表示されます。 使用可能なパッケージを見つけるには、「リポジトリのパッケージを表示する」を参照してください。

アクションを使ったパッケージのインストール

GitHub Actionsを使い、CIフローの一部としてパッケージをインストールできます。 たとえば、開発者がコードをプルリクエストにプッシュすると、いつでもワークフローがGitHub Packagesによってホストされているパッケージをダウンロードしてインストールすることで、依存関係を解決するようにワークフローを設定できます。 そして、ワークフローはその依存関係を必要とするCIテストを実行できます。

GitHub Actions を通じて GitHub Packages がホストするパッケージをインストールするには、GITHUB_TOKEN を使う際に最小限の設定もしくは追加の認証が必要です。

パッケージのクライアントによって、設定のステップは様々です。 GitHub Actions のワークフローの構成に関する一般的な情報については、「ワークフローの構成」を参照してください。