Help us understand the problem. What is going on with this article?

Git Action でリポジトリのミラーを行う

要件

  • リポジトリを他人と共有したい
  • 特定の人物には閲覧のみさせたい。もしくは push を無効にしたい
  • 閲覧できるソースの範囲を限定したい

対応

  • リポジトリを別のリポジトリにミラーコピーして、そのリポジトリを共有する
  • git push された際に、Git Action で自動的にミラーコピーできるように設定する

手順

01. ミラー先リポジトリを作成する【ブラウザ:ミラー先リポジトリ】

ブラウザから Github に入り、 アカウントのリポジトリリストから New で、空のリポジトリを作成します。
READMEを作成するにチェックを入れると、リポジトリがすぐに作成されるのでそちらの方が楽だと思います。
中身は手動では何も入れなくて大丈夫です。

02. パスフレーズなしのSSH鍵を生成する【ローカル】

Action では対話ができないので、通常のSSH鍵ではなく、パスフレーズなしのSSH鍵を指定する必要があります。
そのためのSSH鍵を作成します。
ミラー先(閲覧用) のリポジトリをcloneする際のSSH鍵のある場所に移動します。

$ cd .ssh

パスフレーズなしのSSH鍵を生成します。
OpenSSHの構成が OpenSSH 7.8 から変わりヘッダが -----BEGIN RSA PRIVATE KEY----- から -----BEGIN OPENSSH PRIVATE KEY----- に変わり、ActionでのSSH接続が失敗する場合があります。
その対策のため、 -m PEM をオプションに追加してSSH鍵を生成してください。

$ ssh-keygen -t rsa -b 4096 -m PEM -C <githubアカウントメールアドレス>

SSH鍵の名前を id_rsa_nopass にして生成します。
(id_rsaのままだと上書きしてしまうので注意してください。)
怖い場合は、.ssh-nopass とか別のフォルダを作成して、その中で作業すると安全だと思います。

Generating public/private rsa key pair.
Enter file in which to save the key (/<ユーザーディレクトリ>/.ssh/id_rsa): ./id_rsa_nopass

パスフレーズには何も入力せず、Enterで進みます。

Enter same passphrase again:
Your identification has been saved in ./id_rsa_nopass.
Your public key has been saved in ./id_rsa_nopass.pub.
The key fingerprint is:
<フィンガープリント> <githubアカウントメールアドレス>
The key's randomart image is:
+---[RSA 4096]----+
(略)
+----[SHA256]-----+

参考:【OpenSSH 7.8】秘密鍵を生成する形式が変更になった件について

03. git secret に秘密鍵を登録する【ブラウザ:ミラー元リポジトリ】

先ほど作成した秘密鍵を、リポジトリの secret(暗号化領域) に登録します。

参考: Githubの secret について

ミラー元(作業用) のリポジトリの SettingsSecrets を開きます。

image.png

Add a new secret のリンクを押下します。
secret登録欄が開きます。

image.png

id_rsa_nopass(秘密鍵) の内容をクリップボードにコピーします。

$ clip < ./id_rsa_nopass

Name 欄に SSH_PRIVATE_KEY と入力します。
Value 欄で、Ctrl+Vで、クリップボードにコピーした内容を貼り付けます。

Add secret ボタンを押下します。

image.png

このように登録されていたらOKです。

04. SSH鍵を登録する【ブラウザ:アカウント】

SSH公開鍵を登録して、SSHログインができるようにします。

image.png

githubのアイコンから Settingsを選択します。

image.png

Settings メニューから SSH and GPG keys を選択し、SSH keysの「New SSH key」を選択します。

一旦、git bash に戻って、公開鍵キーをクリップボードにコピーします。

$ clip < ./id_rsa_nopass.pub

Key欄にペーストします。
Titleは任意のキー名(半角英数がよいでしょう)を設定します。

image.png

「Add SSH Key」をクリックするとパスワードを求められるので入力確認します。

image.png

登録が完了すると、キー名とフィンガープリントが表示されます。

image.png

github に SSH接続します。
SSH鍵を<ユーザディレクトリ>以外で作成した場合、-iオプションで鍵のパスを指定する必要があります。
SSH鍵のパスフレーズなしに接続できることを確認します。

$ ssh -T git@github.com -i ./id_rsa_nopass
Hi miu200521358! You've successfully authenticated, but GitHub does not provide shell access.

参考:Testing your SSH connection

05. .gitattributes を登録する【ブラウザ:ミラー元リポジトリ】

ミラー元(作業用) のリポジトリのルートに .gitattributes がない場合、新規ファイルを作成してください。
既にある場合は、そのファイルに下記を追記してください。

.github/ export-ignore
.git*    export-ignore

これは、Actionが保存される github/workflow のフォルダと、.gitattributes 等、gitの設定ファイルを、export時に除外する、という指定です。
この指定を追加していくことで、ミラー先(閲覧用) のリポジトリにミラーコピーされるファイルをコントロールできます。

06. Git Action を登録する【ブラウザ:ミラー元リポジトリ】

ミラー元(作業用) のリポジトリのメニューから Actions を押下します。
新規Actionに登録するワークフローを選べますが、無視して右上の Set up a workflow yourself をクリックします。
image.png

このような入力画面が出てきたら、下記コードを適当なテキストエディタにコピーしてください。

image.png

下記コードの設定項目(env: の下の <日本語の項目>)を書き換えて、既存のコードはすべて削除した上で、下記コード全文を main.yml に貼り付けてください。
コメントもそのまま貼り付け可能です。

name: Mirror Repository 

on:
  push:
    branches:
      - master  # branch:master に対する push が行われた時にのみ処理を実行する
jobs:
  build:
    runs-on: ubuntu-latest  # 最新のubuntuイメージを使用する
    env:
      # ミラー先リポジトリ名
      MIRROR_REPOSITORY_NAME: <ミラー先リポジトリ名>
      # ミラー先のリポジトリSSHパス
      MIRROR_RIPOSITORY:  <ミラー先リポジトリのclone用SSHパス(git:github~っての)>
      # gitアカウント名(git config user.name)
      GIT_NAME: <Github のアカウント名>
      # gitメールアドレス(git config user.email)
      GIT_MAILADDRESS: <Github のメールアドレス>
    steps:
    - uses: actions/checkout@v2
    - name: set-git
      run: |
        git config --global user.name $GIT_NAME
        git config --global user.email $GIT_MAILADDRESS
    - name: set-ssh
      run: |
        mkdir ~/.ssh                                            # SSHディレクトリ作成
        chmod 700 ~/.ssh                                        # 権限を設定
        echo "${{ secrets.SSH_PRIVATE_KEY }}" > ~/.ssh/id_rsa   # secretに保存されているパスフレーズなしの秘密鍵を出力する
        chmod 600 ~/.ssh/id_rsa                                 # 権限を限定する
    - name: clone
      run: |
        mkdir ~/mirror                                          # ミラー用ディレクトリ作成
        cd ~/mirror                                             # ミラー用ディレクトリに移動
        git clone $MIRROR_RIPOSITORY                            # ミラー用リポジトリをclone
        echo | ls -l ./                                         # ファイル存在確認
    - name: export
      run: |
        git archive --format=zip HEAD > ~/original.zip          # リポジトリの最新ソースを zip でexportする
        echo | ls -l ~/original.zip                             # ファイル存在確認
        mkdir ~/original                                        # 保持用ディレクトリ作成
        unzip -o -d ~/$MIRROR_REPOSITORY_NAME ~/original.zip    # zipを展開する(既存上書き)
        echo | ls -l ~/$MIRROR_REPOSITORY_NAME                  # 中身表示
    - name: copy
      run: |
        cp -r ~/$MIRROR_REPOSITORY_NAME ~/mirror                # オリジナルをミラーにコピーする
        echo | ls -l ~/mirror/$MIRROR_REPOSITORY_NAME           # 中身表示
    - name: push
      run: |
        cd ~/mirror/$MIRROR_REPOSITORY_NAME                     # ミラー用リポジトリに移動
        echo | ls -l                                            # 中身表示
        git diff                                                # 差分表示
        git add -A                                              # 全部追加
        git commit -m "mirror from original"                    # commit
        git push origin master                                  # push

コピペできたら、右上のStart commitを押下します。

image.png

直接 push してしまって良い場合は上のラジオボタン、pull request を生成する場合は下のラジオボタンを選択してください。
上のラジオボタンを選択して commit した場合、直後に Action が実行されます。
下のラジオボタンの場合、pull request をマージしたタイミングで Action が実行されるはずです。
image.png

image.png

実際のログを確認します。

image.png

image.png

image.png
(どの項目にも簡単なログを出してます)

image.png

このように、緑のチェックマークがついていれば、その処理は成功しています。
赤い×だと失敗しているので、中を確認してください。

07. ミラー先を確認する【ブラウザ:ミラー先リポジトリ】

ミラー先リポジトリを確認すると、初回は全ファイルがcommitされています。
2回目以降は、更新のあったファイルがあげられています。

image.png

蛇足

Git Action では、デプロイやtest等、様々なワークフローが実行できます。
herokuへの自動リリースもできると思います。

以上

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした