GitHub Packages
この章では、GitHub Packagesを使ったnpm、Docker等のパッケージホスティングについて学びます。
GitHub Packagesとは
Section titled “GitHub Packagesとは”GitHub Packagesは、GitHubが提供するパッケージレジストリです。npm、Docker、Maven等のパッケージをGitHubで一元管理できます。
対応レジストリ
Section titled “対応レジストリ”| レジストリ | 対応形式 |
|---|---|
| npm | Node.jsパッケージ |
| Container | Dockerイメージ |
| Maven | Javaパッケージ |
| Gradle | Java/Kotlinパッケージ |
| NuGet | .NETパッケージ |
| RubyGems | Rubyパッケージ |
パブリックリポジトリ: ストレージ: 無料 転送量: 無料
プライベートリポジトリ: Free: 500MB / 1GB転送 Pro: 2GB / 10GB転送 Team: 2GB / 10GB転送 Enterprise: 50GB / 100GB転送npm パッケージ
Section titled “npm パッケージ”パッケージの公開
Section titled “パッケージの公開”- package.json の設定:
{ "name": "@username/my-package", "version": "1.0.0", "publishConfig": { "registry": "https://npm.pkg.github.com" }, "repository": { "type": "git", "url": "https://github.com/username/my-package.git" }}- 認証設定:
//npm.pkg.github.com/:_authToken=${GITHUB_TOKEN}@username:registry=https://npm.pkg.github.com- 公開:
npm publishGitHub Actionsでの自動公開
Section titled “GitHub Actionsでの自動公開”name: Publish Package
on: release: types: [published]
jobs: publish: runs-on: ubuntu-latest permissions: contents: read packages: write steps: - uses: actions/checkout@v4
- uses: actions/setup-node@v4 with: node-version: '20' registry-url: 'https://npm.pkg.github.com'
- run: npm ci - run: npm publish env: NODE_AUTH_TOKEN: ${{ secrets.GITHUB_TOKEN }}パッケージのインストール
Section titled “パッケージのインストール”# .npmrc の設定@username:registry=https://npm.pkg.github.com//npm.pkg.github.com/:_authToken=YOUR_TOKEN
# インストールnpm install @username/my-packageDocker コンテナ
Section titled “Docker コンテナ”GitHub Container Registry(ghcr.io)
Section titled “GitHub Container Registry(ghcr.io)”特徴:- ghcr.io ドメイン- パブリックイメージは無料- 匿名プル可能(パブリック)- 細かいアクセス制御イメージのビルドとプッシュ
Section titled “イメージのビルドとプッシュ”# ログインecho $GITHUB_TOKEN | docker login ghcr.io -u USERNAME --password-stdin
# ビルドdocker build -t ghcr.io/username/my-app:latest .
# プッシュdocker push ghcr.io/username/my-app:latestGitHub Actionsでの自動ビルド
Section titled “GitHub Actionsでの自動ビルド”name: Build and Push Docker
on: push: tags: ['v*']
env: REGISTRY: ghcr.io IMAGE_NAME: ${{ github.repository }}
jobs: build: runs-on: ubuntu-latest permissions: contents: read packages: write
steps: - uses: actions/checkout@v4
- name: Log in to Container registry uses: docker/login-action@v3 with: registry: ${{ env.REGISTRY }} username: ${{ github.actor }} password: ${{ secrets.GITHUB_TOKEN }}
- name: Extract metadata id: meta uses: docker/metadata-action@v5 with: images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }} tags: | type=semver,pattern={{version}} type=semver,pattern={{major}}.{{minor}} type=sha
- name: Build and push uses: docker/build-push-action@v5 with: context: . push: true tags: ${{ steps.meta.outputs.tags }} labels: ${{ steps.meta.outputs.labels }}マルチプラットフォームビルド
Section titled “マルチプラットフォームビルド”- name: Set up QEMU uses: docker/setup-qemu-action@v3
- name: Set up Docker Buildx uses: docker/setup-buildx-action@v3
- name: Build and push uses: docker/build-push-action@v5 with: context: . platforms: linux/amd64,linux/arm64 push: true tags: ${{ steps.meta.outputs.tags }} cache-from: type=gha cache-to: type=gha,mode=maxイメージのプル
Section titled “イメージのプル”# パブリックイメージ(認証不要)docker pull ghcr.io/username/my-app:latest
# プライベートイメージdocker login ghcr.io -u USERNAME -p TOKENdocker pull ghcr.io/username/private-app:latestパッケージの管理
Section titled “パッケージの管理”可視性の設定
Section titled “可視性の設定”パッケージの設定ページ: Visibility: ☐ Public(誰でもアクセス可能) ☑ Private(権限のあるユーザーのみ)
Inherit access from source repository: ☑ リポジトリの権限を継承バージョン管理
Section titled “バージョン管理”# パッケージページで確認できる情報- 全バージョン一覧- ダウンロード数- 依存リポジトリ- 公開日時
# 古いバージョンの削除Settings → Packages → 対象パッケージ → Delete versionアクセス制御
Section titled “アクセス制御”# パッケージの権限設定Manage access: - チーム: Read / Write / Admin - ユーザー: Read / Write / Admin - リポジトリ: 連携
# Organization での設定Settings → Packages: Default visibility: Private Inherit from repository: YesPersonal Access Token(PAT)
Section titled “Personal Access Token(PAT)”# 必要なスコープread:packages # パッケージの読み取りwrite:packages # パッケージの書き込みdelete:packages # パッケージの削除
# 使用例export GITHUB_TOKEN=ghp_xxxxxxxxxxxx
# npmecho "//npm.pkg.github.com/:_authToken=${GITHUB_TOKEN}" >> ~/.npmrc
# Dockerecho $GITHUB_TOKEN | docker login ghcr.io -u USERNAME --password-stdinGITHUB_TOKEN(Actions)
Section titled “GITHUB_TOKEN(Actions)”# ワークフローでの使用jobs: publish: runs-on: ubuntu-latest permissions: packages: write # 書き込み権限 steps: - name: Publish env: NODE_AUTH_TOKEN: ${{ secrets.GITHUB_TOKEN }}Maven / Gradle
Section titled “Maven / Gradle”Maven設定
Section titled “Maven設定”<distributionManagement> <repository> <id>github</id> <name>GitHub Packages</name> <url>https://maven.pkg.github.com/OWNER/REPOSITORY</url> </repository></distributionManagement><servers> <server> <id>github</id> <username>USERNAME</username> <password>TOKEN</password> </server></servers>Gradle設定
Section titled “Gradle設定”publishing { repositories { maven { name = "GitHubPackages" url = uri("https://maven.pkg.github.com/OWNER/REPOSITORY") credentials { username = System.getenv("GITHUB_ACTOR") password = System.getenv("GITHUB_TOKEN") } } }}中級者向けTips
Section titled “中級者向けTips”モノレポでの複数パッケージ公開
Section titled “モノレポでの複数パッケージ公開”name: Publish Packages
on: push: tags: ['v*']
jobs: publish: runs-on: ubuntu-latest strategy: matrix: package: [core, utils, cli] steps: - uses: actions/checkout@v4
- uses: actions/setup-node@v4 with: node-version: '20' registry-url: 'https://npm.pkg.github.com'
- name: Publish ${{ matrix.package }} run: | cd packages/${{ matrix.package }} npm publish env: NODE_AUTH_TOKEN: ${{ secrets.GITHUB_TOKEN }}パッケージの自動クリーンアップ
Section titled “パッケージの自動クリーンアップ”name: Cleanup old packages
on: schedule: - cron: '0 0 * * 0' # 毎週日曜日
jobs: cleanup: runs-on: ubuntu-latest steps: - name: Delete old versions uses: actions/delete-package-versions@v4 with: package-name: 'my-package' package-type: 'npm' min-versions-to-keep: 10 delete-only-pre-release-versions: trueプライベートレジストリとの併用
Section titled “プライベートレジストリとの併用”# GitHub Packages(自社パッケージ)@mycompany:registry=https://npm.pkg.github.com
# npmjs.org(公開パッケージ)registry=https://registry.npmjs.org
# 認証//npm.pkg.github.com/:_authToken=${GITHUB_TOKEN}Dependabotとの連携
Section titled “Dependabotとの連携”version: 2registries: github-npm: type: npm-registry url: https://npm.pkg.github.com token: ${{ secrets.PACKAGES_TOKEN }}
updates: - package-ecosystem: "npm" directory: "/" registries: - github-npm schedule: interval: "weekly"| レジストリ | URL | 用途 |
|---|---|---|
| npm | npm.pkg.github.com | Node.jsパッケージ |
| Container | ghcr.io | Dockerイメージ |
| Maven | maven.pkg.github.com | Javaパッケージ |
GitHub Packagesのベストプラクティス
Section titled “GitHub Packagesのベストプラクティス”- GitHub Actionsで自動化: 手動公開を避ける
- セマンティックバージョニング: 明確なバージョン管理
- README整備: パッケージの使い方を明記
- 古いバージョン削除: ストレージ節約
- スコープ付き名前:
@org/package形式を使用
GitHub Packages を使うべき場合:- プライベートパッケージ- 組織内での共有- GitHubワークフローとの統合- 一元管理したい
公開レジストリを使うべき場合:- オープンソースパッケージ- 広く配布したい- 既存のエコシステム活用次の章では、GitHub Releasesについて学びます。
Q1. GitHub Packagesがサポートするパッケージ形式は?
Q2. GitHub PackagesのContainer Registryのホスト名は?
Q3. GitHub Packagesのストレージ無料枠はFreeプランでいくらですか?