⚙️
GitHub Actions でリポジトリ間のファイルを同期する
達成したいこと
- リポジトリ 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_dispatchでtarget-updated
のイベントを受け取ったのをトリガーとして実行します。
具体的にはリポジトリ 1 を clone してcp
コマンドでtarget.yml
をコピーしてプルリクエストを
作成しています。
最後に
リポジトリ 間で共通のファイルを使用したいけど、モノリポにするのも大変というケースで有効な方法かなと思います。
Discussion
参考になります。
GitHub Actions内の表記ubuntu-latargetはubuntu-latestの誤記ではないでしょうか。
おっしゃる通りでした.. ありがとうございます!