見出し画像

Github ActionsでリポジトリAからリポジトリBにプルリクエストを出す

こんにちは。
私は普段はメーカーでUIデザインを担当しています。

この記事はGithub ActionsもGithub Appsも使ったこともない、汚いおじさんデザイナーが備忘録として書いているメモです。
間違っていたり、もっといい方法があったりするかもしれません。

何がしたいのか


社内には複数のアプリ(プロダクト)があり日々開発が進んでいます。

こちらの記事でも書きましたが、社内のアプリにアイコンや、色指定など共通部分が多くあり、現状プロダクト毎に管理しているので、更新性がイマイチです。
そこで、このデザイントークンと呼ばれるような情報をFigmaからGithubに連携してなるべく自動化したいと思い賢い人達の情報を見ながら試行錯誤しています。

Figma内のアイコンをGithubに対してプルリクエストを出すところまではできましが、次に以下の問題にぶち当たりました。

◎問題

  • プロダクト毎にリポジトリが分かれているのでGithub Actionsのworkflowをそれぞれ設定する必要がありそう

  • そもそもプロダクトと直接関係ないソースをリポジトリに追加するのがモヤモヤする

◎解決案

そこで、アイコンの書き出し元のブランチを「makePR」ブランチとしてそこから、各プロダクトのブランチに足していプルリクエストを出せないかと素人ながら考えました。



Github Appを登録する

リポジトリを超えてプルリクエストを出すにはGithub Appを作成する必要があるらしいです。

GitHub Developer Settingsにアクセス

  • GitHubにログインした状態で、右上のプロフィールアイコンをクリックし、ドロップダウンメニューから「Settings」を選択します。

  • 左側のメニューから「Developer settings」を選択します。

GitHub Appの作成

  • 「Developer settings」ページで、「GitHub Apps」をクリックし、次に「New GitHub App」をクリックします。

アプリの設定

色々設定がありますが、今回は以下だけで問題なかったです。

  • 「GitHub App name」:アプリの名前を入力します。

  • 「Homepage URL」:アプリのホームページURLを入力します。
    必須項目なので入力が必要がですが、何でもいいです。グローバルでユニークである必要があります。

  • Webhook > Activeのチェックは外します

  • 「Repository permissions」:アプリがアクセスできるリポジトリの権限を設定します。
    今回は、「Contents、Pull requests」の権限をRead & Writeにしました(不要な権限もあるかも)

上記、必要な設定を行ったら、「Create GitHub App」をクリックしてアプリを作成します。

必要な情報の取得

アプリ作成後、App IDやClient ID、Client Secret、Private keyなどの必要な情報が表示されます。これらは後でアプリの設定や認証に使用するのでコピーしておきます。

アプリのインストール

作成されたアプリのページで、「Install App」をクリックし、インストールしたいリポジトリまたは組織を選択します。
今回はworkflowを実行するリポジトリと、プルリクエストを受け取るリポジトリの両方を選択します。

最終イメージ

workfolwを実行するブランチの「Settings > Actions secrets and variables」のRepository secretsにAPP_ID、PRIVATE_KEYの情報を登録します。

最終的にはこんな感じの設定になります。


makePRブランチのGithub Actionsのworkflowはこんな感じになりました。

name: makePR

on: workflow_dispatch

jobs:
  create_pull_request:
    runs-on: ubuntu-latest
    steps:
      - name: Global Git Configuration
        run: |
          git config --global user.email "action@github.com"
          git config --global user.name "GitHub Action"
          
      - name: Generate github token for GitHub App
        id: generate_token
        uses: tibdex/github-app-token@v2
        with:
          app_id: ${{ secrets.APP_ID }}
          private_key: ${{ secrets.PRIVATE_KEY }} 
          
      - name: Checkout makePR's repo
        uses: actions/checkout@v3
        with:
          repository: "hogehoge/makePR"
          fetch-depth: 0

      - name: Checkout takePR's repo
        uses: actions/checkout@v3
        with:
          repository: "hogehoge/takePR"
          token: ${{ steps.generate_token.outputs.token }}
          fetch-depth: 0
          path: "takePR"          
      
      - name: Commit Update Info to makePR's repo
        run: |
          echo "UPDATE_INFO=Update generated at $(date)" > update-info.txt
        
      - name: Copy updated variables to takePR's repo
        run: |
          cp update-info.txt takePR/

      - name: Create Pull Request
        uses: peter-evans/create-pull-request@v6
        with:
          token: ${{ steps.generate_token.outputs.token }}
          commit-message: "Update from makePR"
          committer: GitHub <noreply@github.com>
          author: ${{ github.actor }} <${{ github.actor }}@users.noreply.github.com>
          branch: feat/abc
          branch-suffix: timestamp
          delete-branch: true
          title: "Update from makePR"
          body: Variables has been updated
          path: "takePR"

とりあえず、リポジトリを超えてプルリクエストを出すことができました。
デザイントークンの連携にはまだまだ壁がありますが、1個ずつ超えていこうと思います。

この記事が気に入ったらサポートをしてみませんか?