📁

GitHub ActionsでGitHubリポジトリをS3に自動バックアップしてみた

に公開

はじめに

GitHub Actions で GitHubリポジトリを AWS S3 に自動バックアップするワークフローを作ってみました。

作ったものはテンプレートとして GitHub で公開しています。
リポジトリはこちらです。
興味がある方はぜひ使ってみてください。

作成のきっかけ

きっかけは先日読んだ、こちらのブログ記事です。
  
🚀 Why You Should Keep Multiple Backups of Your Code (Don’t Rely Only on GitHub)

内容は「GitHubで管理してるリポジトリはバックアップを取っておいた方がいいよ」というものです。
記事を読んで自分もバックアップを取ることにしました。

記事内で cron やタスクスケジューラを使った自動ローカルバックアップ方法が紹介されていたのですが、私は常にPCを起動しているわけではないので 「オンラインで完結する仕組みが欲しい」 と思い、「GitHub Actions の定期実行機能 を使えば実現できるのでは?」 と考え、自分で作ってみることにしました。

仕様

ワークフローの流れ

  • GitHub Actions を定期実行
  • バックアップ対象として指定したリポジトリを git clone --mirror で取得
  • bundle ファイルを作成
  • 作成したファイルをS3バケットにアップロード

バックアップされるもの

  • すべてのコミット履歴(全ブランチ・全タグを含む)
  • ブランチ・タグ情報
  • リモート設定・リファレンス情報

バックアップされないもの

  • Issues / Pull Requests / Projects / Discussions / Actions の履歴
  • Wiki や GitHub Pages に置いた静的ファイル
  • リポジトリの設定(Branch Protection ルールなど)

実装時にハマったところ

  • awscli のインストール
    • ランナー上で awscli をインストールするステップでエラー
    • 調べてみるとランナーには awscli が標準でインストールされているようで、そもそもインストール不要でした
  • GitHub Personal Access Token 認証
    • Fine-grained Personal Access Tokens を使ったところ認証に失敗
    • Classic Token で repo スコープを付与したら成功しました

GitHub Actions 実行でエラーが出たとき、GitHub Copilot が原因と対策を教えてくれたおかげで比較的スムーズに解決できました。

完成と公開

自分のリポジトリを対象にテストしたところ、無事にバックアップが取れたので
作成したものをテンプレート化して公開することにしました。

公開しようと思ったのは:

  • 誰かの役に立つかもしれない
  • 自分のポートフォリオになる
  • ブログのネタにもなる

という思いからです。一石三鳥です。

公開するにあたって、より多くの人が使えるように以下の点を工夫しました。

  • 英語コメント
    • yamlファイル内のコメントは英語にしました
  • READMEの多言語化
    • 日本語版・英語版、両方を用意しました
  • ライセンス明記
    • 利用ルールを明確にするためにMITライセンスを追加しました

今後の展望

まだ作ったばかりなので明確なロードマップはありませんが

  • まずは自分でしばらく運用してみる
  • ユーザーからのフィードバックを取り入れる
  • S3のライフサイクル管理(保存コストや削除ポリシー)も検討したい

と考えています。
改善案があれば共有して頂けると幸いです。

実装した感想

英語の勉強として読んだ海外のブログ記事と、React 自動デプロイのやり方を調べた時に知った GitHub Actions が思わぬ所でつながり、形になりました。アイデアの素材を自分の中に蓄積するためにもインプットは大事だなと感じました。

今回のワークフロー実装は GitHub Actions / GitHub Copilot / AWS を同時に触ることができておもしろかったです。

今後も誰かの役に立ちそうなものを、楽しみながら作ってきたいと思います。

Discussion