⚙️

GitHub Actions でリポジトリ間のファイルを同期する

2021/03/18に公開
2

達成したいこと

  • リポジトリ 1とリポジトリ 2の間で共通のファイルがあり、リポジトリ 1 が更新された時に
    リポジトリ 2にも同じ内容の更新を反映したい。

今回は例としてリポジトリ 1にあるtarget.ymlが更新されたときにリポジトリ 2のtarget.ymlも更新する PR を自動作成します。

すでに類似の記事が存在しますが、こちらは npm packageの更新だったので少し違います。
Github Actions で他のリポジトリからの変更通知を受け取って PR を作成する Workflow
ただ、基本的にやっていることは同じです。

実装方法

GitHub Actions を使用します。
前提として GitHub のアクセストークンを発行しておいてください。
Creating a personal access token

更新元のリポジトリ 1のGitHub Actionsは以下の通りです。

name: dispatch target file updated
on:
  push:
    branches:
      - main
    paths:
      - 'target.yml'
jobs:
  dispatch-target-updated:
    strategy:
      matrix:
        repo: ['organization/repository2']
    name: dispatch-target-updated
    runs-on: ubuntu-latest
    steps:
      - name: dispatch target-updated
        uses: peter-evans/repository-dispatch@v1
        with:
          token: ${{ secrets.GITHUB_ACCESS_TOKEN }}
          repository: ${{ matrix.repo }}
          event-type: target-updated

target.ymlの変更がmainブランチにpushされたのをトリガーとして実行します。参照
今回はtarget-updatedというイベントをorganization/repository2に送信しています。
リポジトリ 2 ではこのイベントを受け取ったときにGitHub Actionsを実行します。

次にファイルをコピーするリポジトリ 2のGitHub Actions をみてみます。

name: copy target.yml from repository1
on:
  repository_dispatch:
    types: [target-updated]
jobs:
  copy-target:
    name: copy target.yml
    runs-on: ubuntu-latest
    steps:
      - name: checkout
        uses: actions/checkout@v2
      - name: clone repository1
        uses: actions/checkout@v2
        with:
          repository: organization/repository1
          path: repository1
          token: ${{ secrets.GITHUB_ACCESS_TOKEN }}
      - name: copy target.yml
        run: cp repository1/target.yml target.yml
      - name: clean repository1
        run: rm -rf repository1
      - name: create PR
        uses: peter-evans/create-pull-request@v3
        with:
          token: ${{ secrets.GITHUB_ACCESS_TOKEN }}
          author: ${{ github.actor }} <${{ github.actor }}@users.noreply.github.com>
          commit-message: 'copy target.yml'
          branch: copy_target
          branch-suffix: timestamp
          delete-branch: true
          title: 'updated target.yml'

repository_dispatchtarget-updatedのイベントを受け取ったのをトリガーとして実行します。

具体的にはリポジトリ 1 を clone してcpコマンドでtarget.ymlをコピーしてプルリクエストを
作成しています。

最後に

リポジトリ 間で共通のファイルを使用したいけど、モノリポにするのも大変というケースで有効な方法かなと思います。

Discussion

チャアーハンチャアーハン

参考になります。
GitHub Actions内の表記ubuntu-latargetはubuntu-latestの誤記ではないでしょうか。