GitHub Actionを利用し、Privateリポジトリのものを、をPublicリポジトリへプッシュする方法を説明したいと思います。

リポジトリ構成

今回の構成は以下の通りです。

Repository-A (Private)
       │ GitHub Actions
Repository-B (Public)

開発者はRepository-Aへコミットするだけで、GitHub Actionsが自動的にRepository-Bへ同期します。

Personal Access Token(PAT)の作成

GitHub Actionsから別リポジトリへPushするためには認証情報が必要です。

GitHubではPersonal Access Token(PAT)を利用することで安全に認証できます。

PATは以下から作成できます。

GitHub Settings → Developer Settings → Personal Access Tokens

Fine-grained Personal Access Tokenの利用を推奨します。

推奨設定

対象リポジトリ:

Repository-B

権限:

Contents
 └ Read and Write

必要以上の権限は付与しないようにしましょう。

Secretの登録

作成したPATをGitHub Actionsで利用するため、Repository-AへSecretとして登録します。

設定画面:

Repository-A
 └ Settings
    └ Secrets and variables
       └ Actions

新しいSecretを追加します。

例:

PAT_TO_PUBLIC_REPO

値には作成したPATを設定します。

GitHub Actions内では以下のように参照できます。

${{ secrets.PAT_TO_PUBLIC_REPO }}

GitHub Actionsの作成

続いてWorkflowを作成します。

作成場所:

.github/workflows/sync-public.yml

サンプルコードは以下です。

name: Sync To Public Repository

on:
  push:
    branches:
      - main

jobs:
  sync:
    runs-on: ubuntu-latest

    steps:
      - name: Checkout Private Repository
        uses: actions/checkout@v4

      - name: Clone Public Repository
        run: |
                    git clone https://${{ secrets.PAT_TO_PUBLIC_REPO }}@github.com/USER/Repository-B.git public-repo

      - name: Copy Files
        run: |
          rsync -av --delete \
            --exclude='.git' \
            ./ public-repo/          

      - name: Commit Changes
        run: |
          cd public-repo

          git config user.name "github-actions"
          git config user.email "github-actions@github.com"

          git add .

          git diff --cached --quiet || \
          git commit -m "Auto sync from private repository"

          git push origin main          

このWorkflowはmainブランチへのPushを検知すると自動実行されます。

rsyncによる同期

同期処理にはrsyncを利用しています。

rsync -av --delete

主なオプションは以下です。

オプション説明
-a属性を保持してコピー
-v詳細表示
–delete削除されたファイルも同期

これにより、Publicリポジトリの内容をPrivateリポジトリと一致させることができます。

特定フォルダを除外する

機密情報を含むフォルダを公開したくない場合は除外設定を利用します。

例えば以下の構成の場合

Repository-A
├ src
├ docs
├ secret
└ config

secretフォルダを除外するには、

rsync -av --delete \
  --exclude='secret/' \
  --exclude='.git' \
  ./ public-repo/

と設定します。

複数指定も可能です。

--exclude='secret/'
--exclude='config/'
--exclude='.env'

運用時の注意点

Secretを公開しない

PATはGitHubアカウントへのアクセス権限を持っています。

以下のような行為は避けましょう。

  • ソースコードへ直接記載
  • READMEへ掲載
  • Issueへ貼り付け

必ずGitHub Secretsを利用してください。

公開対象を確認する

自動同期を導入する前に、以下を確認しましょう。

  • APIキー
  • パスワード
  • 接続先情報
  • 社内ドキュメント
  • 個人情報

が含まれていないことを確認してください。

テスト用リポジトリで検証する

本番運用前にテスト用リポジトリで十分な検証を行うことを推奨します。

誤った設定で公開してしまうと、機密情報の漏洩につながる可能性があります。

まとめ

GitHub Actionsを利用すると、PrivateリポジトリからPublicリポジトリへの同期を完全自動化できます。

今回紹介した構成には以下のメリットがあります。

  • 手動コピー不要
  • 公開作業の自動化
  • ヒューマンエラーの削減
  • オープンソース運用との相性が良い
  • READMEやドキュメントの自動公開が可能