23
14

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

team-lab-engineeringAdvent Calendar 2019

Day 17

[GithubActions]プライベートリポジトリにあるアクションを他のリポジトリで使う

Last updated at Posted at 2019-12-16

この記事はチームラボエンジニアリングアドベントカレンダー17日目の記事です。

はじめに

組織内でGithubActionsを使いまわしたいけど、外部に公開したくない!と言う要件は結構あるかと思います。
現在、残念ながらGitHubActionsではプライベートリポジトリに作成したアクションは他のリポジトリから参照できません。
https://help.github.com/ja/actions/automating-your-workflow-with-github-actions/configuring-a-workflow

プライベートリポジトリで定義されているアクションを使用するには、ワークフローファイルとそのアクションが同じリポジトリになければなりません。 同じOrganizationにある場合でも、他のリポジトリで定義されているアクションは、ワークフローで使用できません。

なんとかしてプライベートのリポジトリにあるアクションを使いまわしたい。。。

サブモジュールとしてアクションを取り込む

なんとかならないものかと頭を捻らせていると、同じリポジトリ内にあれば使えると言うことを思い出しました。

プライベートリポジトリで定義されているアクションを使用するには、ワークフローファイルとそのアクションが同じリポジトリになければなりません。

ならば、アクションが入ってるリポジトリをサブモジュールとして取り込めば、ワークフローファイルと同じリポジトリにアクションファイルが置けますね!

GithubActions.png

早速やってみます。。。
あ、アクションの入っているリポジトリと、そのアクションを使いたいプロジェクトを作成したリポジトリはすでに作成してあることを前提に説明させていただきます。
今回の説明ではそれらのリポジトリを以下のように呼ばせてもらいます。

  • プロジェクトリポジトリ -> アクションを使用するリポジトリ
  • アクションリポジトリ -> アクションが登録してあるリポジトリ

ちなみにサンプルコードというほどでもないですが、GitHubにサンプルで作ったプルリクエストがあります。

パーソナルアクセストークンの取得

GitHub Actionsでプライベートのリポジトリの情報を取得するには、そのリポジトリのアクセス権限を持ったアクセストークンが必要です。以下の資料を参考にしてトークンを取得します。
(この記事ではPERSONAL_ACCESSTOKENと言う名前でトークンを設定したことを前提に説明していきます。)

コマンドライン用の個人アクセストークンを作成する

次のサブモジュール設定でアクセストークンの文字列を使用しますので、コピーをとっておきましょう。

アクションを使いたいプロジェクトにサブモジュールの設定

それではプロジェクトリポジトリにサブモジュールとしてアクションリポジトリを設定していきます。
GitHub Actionsでサブモジュールの取得にパーソナルアクセストークンを使用するために、以下のような手順が必要となります。
また、パーソナルアクセストークンはsshではなく、httpsでしか使用できないので注意が必要です。

  • 取得したパーソナルアクセストークンを~/.netrcに設定してhttpsでローカルからアクションリポジトリにアクセスできるようにする 参考: GitHubでユーザ名・パスワード省略(push, pull)
    ~/.netrcに以下を追記

    ~/.netrc
    machine github.com
    login [{GitHubのユーザ名}]
    password [{所得したパーソナルアクセストークンの文字列}]
    
  • プロジェクトリポジトリにサブモジュールとしてアクションリポジトリを追加 参考: Git submodule の基礎
    プロジェクトリポジトリに移動して下記のコマンドでサブモジュールを追加(アクションリポジトリのURLは必ず https で!)

    git submodule add https://{アクションリポジトリのURL} .github/actions
    

    上記のコマンドでは、.githubディレクトリ内のactionsディレクトリにサブモジュールを設定していますが、他の場所でも大丈夫です。

  • 変更をコミット

これでアクションをサブモジュールとして追加できました!
が、GitHub Actionsでサブモジュールを使うにはもう少し設定が必要です。

プロジェクトリポジトリからアクションリポジトリのアクションを使ってみる

GitHub Actionsでサブモジュールを取得するために、パーソナルアクセストークンを使用します。
ワークフローにパーソナルアクセストークンを直書きしてもサブモジュールを取得できますが、セキュリティの観点から、プロジェクトリポジトリのsecretsに登録する方法を説明します。

パーソナルアクセストークンをプロジェクトリポジトリのsecretsに登録

プロジェクトリポジトリのsecrets情報としてパーソナルアクセストークンを以下の手順で登録していきます。

  1. タブでSettingsを選択
  2. メニューバーでSecretsを選択
  3. Add a new secretを選択
  4. NameにPERSONAL_ACCESSTOKENを、Valueに先ほど取得したパーソナルアクセストークンの文字列を入力
  5. Add secret
    スクリーンショット 2019-11-29 11.44.12.png

これでやっとプロジェクトリポジトリでアクションを追加する準備が全て完了しました!

workflowの作成

ワークフローファイルでのサブモジュールにしたアクションの使い方は、同じリポジトリ内にアクションがある時と同様にプロジェクトのルートからのパスを指定してあげます。また、サブモジュールをチェックアウトする記述も必要です。

/.gihub/workflow/pull_request.yml
name: Using Private Repositroy Sample

on:
  pull_request:
    branches:
    - master
jobs:
  build:

    runs-on: ubuntu-latest

    steps:
    - name: checkout with submodule
      uses: actions/checkout@v1
      with:
        submodules: true
        token: ${{ secrets.PERSONAL_ACCESSTOKEN }}

    - name: hoge
      uses: ./.github/actions/hoge

    - name: huga
      uses: ./.github/actions/huga

サブモジュールをチェックアウトする記述は以下の部分ですね。サブモジュールを取得するにはcheckoutのアクションを使用してwithの所にtokenを渡す必要があります。
tokenには先ほどsecretsに登録したパーソナルアクセストークンを指定してあげます。

- name: checkout with submodule
  uses: actions/checkout@v1
  with:
    submodules: true
    token: ${{ secrets.PERSONAL_TOKEN }}

実行結果

上記の例ではプルリクエストを作成時にアクションを実行してくれます。
実際にプルリクエストを作ってみると・・・!できました!!!
スクリーンショット 2019-11-29 12.10.31.png

まとめ

いかがでしたでしょうか。トークンの扱いが少し面倒ですが、アクションのコードが一元管理できるのは結構いいのかなと個人的には思います。
まぁ、GitHubがプライベートリポジトリに作成したアクションを使用できるようにしてくれれば、最高なんですけどね

23
14
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
23
14

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?