要件
- リポジトリを他人と共有したい
- 特定の人物には閲覧のみさせたい。もしくは 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
(暗号化領域) に登録します。
ミラー元(作業用) のリポジトリの Settings
> Secrets
を開きます。
Add a new secret
のリンクを押下します。
secret登録欄が開きます。
id_rsa_nopass(秘密鍵) の内容をクリップボードにコピーします。
$ clip < ./id_rsa_nopass
Name
欄に SSH_PRIVATE_KEY
と入力します。
Value
欄で、Ctrl+Vで、クリップボードにコピーした内容を貼り付けます。
Add secret
ボタンを押下します。
このように登録されていたらOKです。
04. SSH鍵を登録する【ブラウザ:アカウント】
SSH公開鍵を登録して、SSHログインができるようにします。
githubのアイコンから Settings
を選択します。
Settings メニューから SSH and GPG keys
を選択し、SSH keysの「New SSH key」を選択します。
一旦、git bash に戻って、公開鍵キーをクリップボードにコピーします。
$ clip < ./id_rsa_nopass.pub
Key欄にペーストします。
Titleは任意のキー名(半角英数がよいでしょう)を設定します。
「Add SSH Key」をクリックするとパスワードを求められるので入力確認します。
登録が完了すると、キー名とフィンガープリントが表示されます。
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
をクリックします。
このような入力画面が出てきたら、下記コードを適当なテキストエディタにコピーしてください。
下記コードの設定項目(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
を押下します。
直接 push してしまって良い場合は上のラジオボタン、pull request を生成する場合は下のラジオボタンを選択してください。
上のラジオボタンを選択して commit した場合、直後に Action が実行されます。
下のラジオボタンの場合、pull request をマージしたタイミングで Action が実行されるはずです。
実際のログを確認します。
このように、緑のチェックマークがついていれば、その処理は成功しています。
赤い×だと失敗しているので、中を確認してください。
07. ミラー先を確認する【ブラウザ:ミラー先リポジトリ】
ミラー先リポジトリを確認すると、初回は全ファイルがcommitされています。
2回目以降は、更新のあったファイルがあげられています。
蛇足
Git Action では、デプロイやtest等、様々なワークフローが実行できます。
herokuへの自動リリースもできると思います。
以上