EC2上のソースコードを自動でGitHubにバックアップする

こんにちは！
今日はAWS EC2インスタンス上にあるソースコードを、定時になると自動でGitHubにcommit、pushしてくれる仕組みを作りたいと思います。
筆者はプログラミング歴1年半ほどの学生で、調べながらだいたい4時間弱で出来ました。AWS歴は半年ないほどです。
# 目次
1. [完成イメージ](#anchor1)
1. [前提条件](#anchor2)
1. [EC2とGitHubを繋ぐ](#anchor3)
1. [バックアップするスクリプトを組む](#anchor4)
1. [スクリプトを定時に実行する](#anchor5)
1. [参考](#anchor6)

<a id="anchor1"></a>
## 完成イメージ
毎日0時5分になると、自動で対象のディレクトリのソースコードをGitHubにcommit、pushする。

<a id="anchor2"></a>
# 前提条件
- GitHubアカウントを持っている
- バックアップするレポジトリが存在する
- EC2インスタンスが立ち上がっていて、ソースコードが置いてある
- gitコマンドが使用できる
- cdやvimコマンドなどLinuxの基本的な操作がわかる
- あくまで個人開発や勉強用のため、セキュリティは考慮しない

<a id="anchor3"></a>
# EC2とGitHubを繋ぐ
まずはEC2に接続していつものコンソールに行きましょう。
sshでGitHubに繋ぎにいくには暗号キーを作成して登録しなくてはいけません。
コンソール上で以下のコマンドを実行し、暗号キーを作成します。
```bash 
ssh-keygen -t rsa
```
実行後3回入力が求められるので手順通りに進めます。
#### 暗号キーを保存する場所
特にこだわりがなければそのままEnter
```
Enter file in which to save the key (/home/ec2-user/.ssh/id_rsa):
```

#### パスフレーズの設定
設定しない方向で今回は進めていきます。
設定するとめんどくさくはなりますが一応動作します(今回は説明しません)
Enterを押して次へ
```
Enter passphrase (empty for no passphrase):
```
もう一度求められるのでEnter
```
Enter same passphrase again:
```
これで暗号キーの作成は完了です。
作成した暗号キーをコピーするために以下のコマンドを実行します。
```
cat ~/.ssh/id_rsa.pub
```
出力された内容を全てコピーします。(ssh-rsa から compute.internalまで)

### GitHubに暗号キーを登録する
GitHubに移動します。
SettingsからSSH and GPG keysの中のNew SSH keyを選択。
![スクリーンショット 2023-09-26 7.51.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3565003/9923f1f2-ae3f-8419-32d8-53e605d441c5.png)

titleは暗号キー名、keyに先ほどコピーした暗号キーを貼り付けます。
![スクリーンショット 2023-09-26 8.00.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3565003/c07967e3-c451-2ba2-0470-7d5ae6cf4a95.png)
これで暗号キーの登録は完了です。
EC2のコンソールからsshで接続できるかテストしてみましょう。
以下のコマンドを実行します。
```
ssh -T git@github.com
```
このような返答が来たら接続成功です。
```
Hi GitHub名! You've successfully authenticated, but GitHub does not provide shell access.
```

<a id="anchor4"></a>
# バックアップするスクリプトを組む
まずは作業ディレクトリにcdコマンドで移動しましょう。
いつものようにGitHubと連携します。
```
git remote add origin git@github.com:<ユーザー名>/＜レポジトリ名＞
```
```
git init
```
次にssh の秘密鍵を明示するスクリプトを作成します。
```
vi git-ssh.sh
```
vim画面が開かれたら以下をペーストしてパスの部分を暗号キーのパスに書き換えます。
暗号キーの保存場所を特に指定していなければ基本的にこのままで大丈夫です。
```sh
#!/bin/sh
exec ssh -oIdentityFile=/home/ec2-user/.ssh/id_rsa "$@"
```
:wqで保存してvim画面を閉じたあと以下を実行して権限を付与します。
```
chmod 755 git-ssh.sh
```
また、暗号キーを使用する際にも権限が必要になるので、そちらにも付与します。
パスはそれぞれの環境に合わせてください。
```
chmod 600 ~/.ssh/id_rsa
```
ここまで長かったですがついにバックアップするスクリプトを作成していきます。
vimコマンドでバックアップするshファイルを作成します。ファイル名はなんでも構いません。
```
vi git_backup.sh
```
vim画面が開いたら以下をコピペします。
パスはそれぞれの環境に合わせてください。
```sh
#!/bin/bash
DATE=$(TZ='Asia/Tokyo' date +'%Y-%m-%d %H:%M:%S')
cd /home/ec2-user/作業ディレクトリ
export GIT_SSH=/home/ec2-user/作業ディレクトリ/git-ssh.sh
# gitコマンド
git checkout -b auto-backup
git add *
git commit -m "自動バックアップ ${DATE}"
git push origin auto-backup
```
:wqで保存してvim画面を閉じたあと、権限を付与します。
```
chmod +x git_backup.sh
```
これでバックアップする処理は完成です。一度実行してみましょう。
```
sh git_backup.sh
```
実行後* [new branch]      auto-backup -> auto-backupと出ていたら成功です。

<a id="anchor5"></a>
# スクリプトを定時に実行する
ここからはcronという機能を使って定時になるとシェルスクリプトを実行する仕組みを作っていきます。
root権限でcronを設定していきます。
```
sudo crontab -e
```
実行するとvimのような画面になると思います。
今回は0時5分にバックアップを実行するということで以下のように記述します。パスは環境に合わせてください。
```sh
CRON_TZ=Asia/Tokyo
5 0 * * * /home/ec2-user/作業ディレクトリ/git_backup.sh
```
ここで ```5 0 * * *``` という記述があると思います。
この部分で時間を設定していてそれぞれの役割が以下の通りになります。
```分 時 日 月 曜日 ``` 
今回は日、月、曜日のところが```*```にしているので、毎日、毎月、毎曜日という意味になります。
設定が終わったら:wqで閉じます。
cronは更新すると再読み込みするまで更新内容が適用されません。なので更新後は必ず再読み込みしましょう。
```
sudo systemctl restart crond
```

これで完成です！
cronの時間設定の部分を1分後とかにしてみてちゃんと動くか確認してみましょう。

<a id="anchor6"></a>
# 参考
https://tm.root-n.com/unix:command:git:cron_git_push

https://qiita.com/mottoki/items/a2eeaf3a76e83269d960