[初心者向け] GitHub Packagesでパッケージを公開する

GitHub Packagesを試してみたので手順をまとめました。
2020.03.24

GitHub Packagesを使ってみたくて、試してみました。基本的にはドキュメントどおりにやれば良いのですが、せっかくなので自分のように初めてやる人向けに手順をまとめました。

なお、実際に試してみたコードは以下にあります。

https://github.com/ktsmy/study-github-packages

前提: GitHub Packagesへの認証

ドキュメント

GitHub Packagesへパッケージをアップロードするには、書き込み権限を持ったトークンによる認証が必要です。 以下のトークンを利用することができます。

  • 個人用アクセストークン
    • コマンドラインからパッケージをアップロードする場合に必要です
    • 作り方はこちら
    • read:package, write:packageの権限が必要です
  • GITHUB_TOKENGitHub Actionsからアップロードする場合)
    • GitHub Actionsのワークフローでは、自動的に生成されるGITHUB_TOKENシークレットが認証に使えますので、個人用アクセストークンを使う必要はありません
    • 詳細はこちら

npmの場合

ドキュメント

設定

package.json にrepositoryの設定を追加します。

package.json

{
  "name": "@ktsmy/hello-world",
  "version": "1.0.3",
  "description": "",
  "main": "index.js",
  "scripts": {
    "build": "tsc"
  },
  "repository": {
    "type": "git",
    "url": "git://github.com/ktsmy/study-github-packages.git"
  },
  "author": "Katsumi Yamashita",
  "license": "ISC",
  "devDependencies": {
    "typescript": "^3.8.3"
  }
}

また、パッケージをアップロードするレジストリの設定が必要です。 .npmrc で設定する場合は以下のようになります。

.npmrc

registry=https://npm.pkg.github.com/ktsmy

または package.json の publishConfig で指定することもできます。

package.json

"publishConfig": {
    "registry":"https://npm.pkg.github.com/"
  },

アップロード

npm publishでアップロードできます。

アップロードには認証用のトークンが必要です。手動でnpm publishを実行する場合は、npmの設定ファイル ~/.npmrc に以下のようにレジストリと個人用アクセストークンを書きます。

~/.npmrc

//npm.pkg.github.com/:_authToken=xxxxxxxxxx

GitHub Actionsからアップロードする場合はGITHUB_TOKENシークレットを使います。以下はワークフローの例です。npm publishを実行するところで環境変数にGITHUB_TOKENシークレットの値を設定します。

name: Node.js Package
on:
  release:
    types: [created]
jobs:
  build:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v2
    # GitHub Packagesへの公開のために.npmrcファイルをセットアップ
    - uses: actions/setup-node@v1
      with:
        node-version: '12.x'
        registry-url: 'https://npm.pkg.github.com'
    - run: |
        npm ci
        npm run build
        npm publish
      env:
        NODE_AUTH_TOKEN: ${{ secrets.GITHUB_TOKEN }}

Java (Gradle) の場合

ドキュメント

設定

Gradleでパッケージをアップロードするには maven-publish プラグインを利用します。 以下はbuild.gradleの例です。pluginsにmaven-publishを追加し、またpublishingの設定を追加しています。publishingの中のcredentialsでGitHubの認証情報を設定します。

build.gradle

plugins {
    id 'java'
    id 'maven-publish'
}

group 'com.ktsmy'
version '1.0.0'

sourceCompatibility = 1.8

repositories {
    mavenCentral()
}

publishing {
    repositories {
        maven {
            name = "GitHubPackages"
            url = uri("https://maven.pkg.github.com/ktsmy/study-github-packages")
            credentials {
                // GitHubのユーザー名を指定する
                username = project.findProperty("gpr.user") ?: System.getenv("GITHUB_ACTOR")
                // GitHubの認証用トークンを指定する
                password = project.findProperty("gpr.key") ?: System.getenv("GITHUB_TOKEN")
            }
        }
    }
    publications {
        gpr(MavenPublication) {
            from(components.java)
        }
    }
}

アップロード

gradle publishでアップロードできます。

アップロード実行時にusernamepasswordを指定する必要があります。手動で実行する場合は例えば以下のようになります。

$ gradle publish -Pgpr.user=ktsmy -Pgpr.key=xxxxxxxx

GitHub Actionsから行う場合、ユーザ名は環境変数GITHUB_ACTORに入っています(参考)。また認証にはGITHUB_TOKENシークレットを使うことができます。例えば以下のようなワークフローになります。

name: Publish Java package to GitHub Packages
on:
  release:
    types: [created]
jobs:
  publish:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - uses: actions/setup-java@v1
        with:
          java-version: 1.8
      - name: Publish package
        run: gradle publish
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

その他の言語

自分は試してはいませんが、現時点でGitHub Packagesは上記のnpmとJava以外にも以下のパッケージに対応しています。

  • gem (Ruby)
  • Dockerイメージ
  • .NET