アクトインディ開発者ブログ

子供とお出かけ情報「いこーよ」を運営する、アクトインディ株式会社の開発者ブログです

GitHub Actionsを利用してgemをGitHub Packagesに公開する

f:id:shime_actindi:20200610154120p:plain

はじめに

こんにちは!!こんにちは!!Webエンジニアのshimeです。
最近、GitHub Actionsを利用してGitHub Packagesにgemを公開する機会があったので、その方法をご紹介いたします!!

GitHub Actionsとは

f:id:shime_actindi:20200610163301p:plain

改めて説明する必要は無いと思いますが、GitHub Actionsはワークフローの実行を自動化できるサービスです。

GitHubで任意のコードプロジェクトをビルド、テスト、パッケージ、リリース、
またはデプロイするためにリポジトリで設定できる、カスタムの自動プロセスです。

(引用元:GitHubヘルプ)

とあるように、CI、CD機能をリポジトリに直接ビルドし、特定のイベントをトリガーにワークフローファイルを実行するように設定することができます。
詳しくはGitHubヘルプをご確認ください。

GitHub Packagesとは

f:id:shime_actindi:20200610163644p:plain

GitHub Packagesはパッケージホスティングサービスで、GitHubと完全に統合されています。
パッケージをパブリックリポジトリに公開(パブリックパッケージ)して、GitHubの全員と共有したり、
プライベートリポジトリに公開(プライベートパッケージ)してコラボレータやOrganizationと共有したりできます。

(引用元:GithuHubヘルプ)

とあるように、ソフトウェアパッケージホスティングサービスで npm gem といったパッケージをサポートしています。

gemをホスティングする場合は、 RubyGems.org に公開することが一般的ですが、今回は社内で利用するprivateなgemなため、GitHub Packagesにホスティングする方法を選択しました。
RubyGems.orgに公開するほどでも無い時、障害の発生を考慮してGitHub Packagesにも公開しておきたい時、privateなgemをホスティングしたい時にGitHub Packagesが選択肢に上がるのではないでしょうか。

今回やったこと

今回はGitHub Actionsを利用してgemをGitHub Packagesに公開しました。

ワークフローの設定例がこちらです。
(社内で利用しているものはprivateなため、個人のリポジトリのものです。また、一部設定も変更しています。)

name: Publish Gem

on:
  push:
    tags:
      - 'v*'

今回はvから始まるタグがpushされた際にワークフローを実行しています。gemの公開という用途を考えると特定のタグやブランチがpushされた時が主な利用ケースになると思います。
また、タグの名前を?*などのパターンマッチを用いてワークフローを実行することもできます。
詳しくはこちらをご参照ください。

    - name: Setup Release Credentials
      env:
        GITHUB_TOKEN: ${{secrets.GITHUB_TOKEN}}
      run: |
        mkdir -p $HOME/.gem
        touch $HOME/.gem/credentials
        chmod 600 $HOME/.gem/credentials
        echo "---" >$HOME/.gem/credentials
        echo ":github: Bearer ${GITHUB_TOKEN}" >> $HOME/.gem/credentials

ここではcredentialsファイルを作成し、アクセストークンを記載しています。
通常であれば、write:packagesスコープを持ったアクセストーンを記載する必要がありますが、GitHub Actionsのワークフローでは、そのリポジトリに対するアクセストークンを利用できるので、個人のアクセストークンの設定や管理の手間を省くことができます。

    - name: Publish Gem to GitHub Packages
      run: |
        export OWNER=$( echo ${{ github.repository }} | cut -d "/" -f 1 )
        gem build *.gemspec
        gem push --KEY github --host https://rubygems.pkg.github.com/${OWNER} *.gem

gem build *.gemspecでリポジトリ直下のGEMNAME.gemspecファイルに基づいてgemをビルドし、
gem push --KEY github --host https://rubygems.pkg.github.com/${OWNER} *.gemでGitHub Packagesに公開しています。詳しくはこちら

上記のワークフローを設定している状態でv0.1.3などのタグを付与するとワークフローが実行されGitHub Packagesに公開されます。
公開するとリポジトリやユーザーのページから確認することができます

f:id:shime_actindi:20200610161337p:plain

インストール方法やダウンロード状況なども確認することができます。
また、パッケージの説明を記載することもできるため、リリースノートチェンジログとして使うこともできそうです。

f:id:shime_actindi:20200611093543p:plain

さいごに

GitHub Actionsを利用してGitHub Packagesにgemを公開する方法について記載しました。
GitHub Packagesへの公開の一部を自動化したい場合やprivateなgemをホスティングしたい場合などに是非利用してみてください!!