Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
【toranoana.deno#17】 DenoでGitHubのバックアップ with Cha...
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
虎の穴ラボ株式会社
July 31, 2024
Technology
540
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
【toranoana.deno#17】 DenoでGitHubのバックアップ with ChatGPT
toranoana.deno#17での発表資料です。
https://yumenosora.connpass.com/event/323679/
虎の穴ラボ株式会社
July 31, 2024
More Decks by 虎の穴ラボ株式会社
See All by 虎の穴ラボ株式会社
Tailwind CSSとAtomic Designで実現する効率的な Web 開発の事例
toranoana
1
670
Denoについて、同人誌記事を出しました+update
toranoana
0
220
【虎の穴ラボ Tech Talk #2】プロンプトエンジニアリング
toranoana
0
160
20241121_[TechTalk#2]虎の穴ラボでのLLMについて取り組み紹介
toranoana
0
160
社内チャットへRAG導入した話(Tech Talk #2)
toranoana
0
230
Deno Deploy で Web Cache API を 使えるようになったので試した知見
toranoana
1
730
【虎の穴ラボ Tech Talk】虎の穴ラボTech Talk説明資料
toranoana
0
500
虎の穴ラボ Tech Talk_CDKでFargate環境構築
toranoana
1
560
虎の穴ラボスキルアップ支援制度の利用例
toranoana
0
11k
Other Decks in Technology
See All in Technology
機械学習を「社会実装」するということ 2026年夏版 / Social Implementation of Machine Learning June 2026 Version
moepy_stats
5
2.4k
FDE という解 ― 暗黙知と明示知をつなぐ、伴走型エンジニアリング ―
otanet
0
160
AAIFに入ってみた ~内から見えるコミュニティ動向~
sato4
0
220
就職⽀援サービスにおけるキャリアアドバイザーのシフトスケジューリング
recruitengineers
PRO
1
140
手塩にかけりゃいいってもんじゃない
ming_ayami
0
570
【NRUG vol.18】なぜ多くのオブザーバビリティ導入は失敗するのか
nrug_member
0
130
AIはどのように 組織のアジリティを変えるのか?
junki
3
790
SONiCで構築・運用する生成AI向けパブリッククラウドネットワーク ~実装編~
sonic
0
210
Bedrock AgentCore RuntimeでAuth0 Changelog調査AIをアップグレードした話
t5u8a5a
1
140
Oracle AI Database@Azure:サービス概要のご紹介
oracle4engineer
PRO
6
2k
2026TECHFRESH畢業分享會 - 葬送的通靈師:化系統與用戶雜訊成行動訊號
line_developers_tw
PRO
0
1k
2026 TECHFRESH 畢業分享會 - 開發日常大解密!從領域驅動到企業級上線
line_developers_tw
PRO
0
1k
Featured
See All Featured
Building Adaptive Systems
keathley
44
3.1k
What the history of the web can teach us about the future of AI
inesmontani
PRO
1
610
BBQ
matthewcrist
89
10k
DBのスキルで生き残る技術 - AI時代におけるテーブル設計の勘所
soudai
PRO
65
55k
Building a Modern Day E-commerce SEO Strategy
aleyda
45
9.1k
Designing Dashboards & Data Visualisations in Web Apps
destraynor
231
55k
コードの90%をAIが書く世界で何が待っているのか / What awaits us in a world where 90% of the code is written by AI
rkaga
62
44k
Building a A Zero-Code AI SEO Workflow
portentint
PRO
0
590
Evolution of real-time – Irina Nazarova, EuRuKo, 2024
irinanazarova
9
1.4k
Abbi's Birthday
coloredviolet
2
8.1k
Embracing the Ebb and Flow
colly
88
5.1k
sira's awesome portfolio website redesign presentation
elsirapls
0
280
Transcript
Copyright (C) 2024 Toranoana Lab Inc. All Rights Reserved. DenoでGitHubのバックアップ
with ChatGPT 虎の穴ラボ株式会社 藤原佳顕 T O R A N O A N A L a b 1
Copyright (C) 2024 Toranoana Lab Inc. All Rights Reserved. 目次
1. 自己紹介 2. 概要 3. GitHubのバックアップについて 4. やったことの紹介 5. まとめ 2
Copyright (C) 2024 Toranoana Lab Inc. All Rights Reserved. 自己紹介ページ
(藤原) 藤原 佳顕(ふじわら よしあき) : yoshiaki fujiwara ‣ Webエンジニア ‣ 新規事業担当(Fantia、Creatia)、アーキテクトチーム (CSIRTも) ‣ 前職:独立系ソフトウェア会社、主に GISとWeb、ライブラリ開発 ‣ TypeScript、Ruby on Rails、C#、C++ ‣ React、Vue、Angular ‣ 入社理由 ‣ 自分がスキルアップできそうな場所に行きたい ‣ オタク系の話ができるところに行きたい 好きなモノ ‣ シューティングゲーム、格闘ゲーム ‣ SF小説 ‣ プログラミング 3
Copyright (C) 2024 Toranoana Lab Inc. All Rights Reserved. 概要
4
Copyright (C) 2024 Toranoana Lab Inc. All Rights Reserved. 概要と経緯
• 概要 ◦ 最近セキュリティの(防ぎようのない)事故が多い ◦ そのため会社の資産はバックアップしておきたい ◦ ソースコードやWikiも資産の一部 ◦ ソースコードさえあればサービス復旧もかろうじてなんとかなるはず! ◦ 逆にソースまで失われると本当に終わりなのでバックアップしたい 5
Copyright (C) 2024 Toranoana Lab Inc. All Rights Reserved. GitHubのバックアップについて
6
Copyright (C) 2024 Toranoana Lab Inc. All Rights Reserved. GitHubのバックアップについて
• 素朴にリポジトリのダウンロードリンクから ZIPを定期的にダウンロードする ◦ 例:https://github.com/denoland/deno/archive/refs/heads/main.zip 7
Copyright (C) 2024 Toranoana Lab Inc. All Rights Reserved. GitHubのバックアップについて
• スクリプトで定期的に clone & pullする ◦ 例:git clone https://github.com/denoland/deno.git 8
Copyright (C) 2024 Toranoana Lab Inc. All Rights Reserved. GitHubのバックアップについて
• GitLab等GitHub外のリポジトリマネージャーにミラーリングする ◦ 例:GitLab(self-managed含む), Giteaなど ▪ https://about.gitlab.com/ja-jp/install/ ▪ https://about.gitea.com/ ◦ 管理が煩雑そうだが、 GitHub上のコードに侵害があった場合はすぐに業務復帰できそう 9
Copyright (C) 2024 Toranoana Lab Inc. All Rights Reserved. GitHubのバックアップについて
• GitHub公式で紹介されている方式 (採用!) ◦ https://docs.github.com/ja/repositories/archiving-a-github-repository/backing-up -a-repository ◦ --mirrorオプションを付けつつの git clone ◦ wikiも同様に{リポジトリ名}.wiki.gitすればリポジトリとして扱えるので上記同様でバックアップ できる ◦ 一回cloneしておけばなにかする必要がなさそうなので簡単そう ◦ 何より公式が出している方法なので乗っておくのが良さそうということで採用 10
Copyright (C) 2024 Toranoana Lab Inc. All Rights Reserved. 作ったもの紹介
11
Copyright (C) 2024 Toranoana Lab Inc. All Rights Reserved. 作ったもの紹介
• 先述の通り、mirrorオプション付きのgit cloneを利用 • リポジトリの量的に手作業は難しいのでDenoでCLIツールを作って自動化 • Denoで作ったCLIツールはcronで定期的に新規リポジトリを見に行くようにする • また、CLIツールでリストアもできるようにしておきたい • Organizationに紐づく全リポジトリとそのWikiを対象にしたい • その量が多すぎるので、リポジトリ一覧はGitHub APIで取得したい • GitHub APIの実行にはGitHub Appを作ってそのトークンを利用 • 上記をAI(ChatGPT)に相談しながらやってみる • 以降出てくるコードはそのまま使っているわけではないので注意! 12
Copyright (C) 2024 Toranoana Lab Inc. All Rights Reserved. 作ったもの紹介
• なぜDeno? ◦ 最終的にはワンバイナリのCLIツールが欲しかったのでDenoだと作れた ◦ 他候補:Rust、Go ▪ GASでGitHub APIを扱ったことがあり、流用しやすいDeno(JS/TS)に倒した ▪ メンテ上JS/TS系のほうが誰でも扱えそうだった ▪ 小さいところからDeno使いたかった ◦ JS/TSであれば、AIとの親和性が高そう ▪ ハルシネーションや、Denoの最新状況がAIに入ってなくても、JS/TSでコード出してもら えれば割となんとかなる 13
Copyright (C) 2024 Toranoana Lab Inc. All Rights Reserved. 作ったもの紹介
• はじめの一歩 ◦ 全部privateなので、リポジトリにアクセスするのにSSHキー等が必要 ◦ AIに普通にバックアップの方法尋ねるとPersonal Access Tokenやサービスアカウ ント使う方法を提示される ▪ 料金が無駄にかかったり、利用期限が発生するのでNG ◦ 明示的にGitHub Appを使う方法を尋ねる 14
Copyright (C) 2024 Toranoana Lab Inc. All Rights Reserved. 作ったもの紹介
15
Copyright (C) 2024 Toranoana Lab Inc. All Rights Reserved. 作ったもの紹介
• JWTが必要なのでその作り方と同時にバックアップのコードを出してもらう ◦ 実はJWTが必要なのは最初からわかっていた(GASからAPI実行したことあったため) ◦ 何もしないと全体的にシェルスクリプトが出てくる ◦ とりあえずコードだけ出してもらって分割はよしなにやる方向で 16
Copyright (C) 2024 Toranoana Lab Inc. All Rights Reserved. 作ったもの紹介
17
Copyright (C) 2024 Toranoana Lab Inc. All Rights Reserved. 作ったもの紹介
• モジュールの管理方法や古いライブラリを使っているっぽいところを修正してもらう ◦ import-map使ってもらう ◦ dotenvが若干古い方法になっているのでstdにあるものを使ってもらう ◦ 他cryptoも同様 ◦ import-mapはその形式になっていればdeno.jsonへの移植は簡単なので、deno.json周りは 気にしない 18
Copyright (C) 2024 Toranoana Lab Inc. All Rights Reserved. 作ったもの紹介
19
Copyright (C) 2024 Toranoana Lab Inc. All Rights Reserved. 作ったもの紹介
• コードが若干古い問題 ◦ readAllが非推奨化後消されているっぽいので使えない ▪ https://zenn.dev/uki00a/articles/whats-new-for-deno-in-2021#%E9%9D%9E%E6% 8E%A8%E5%A5%A8%E5%8C%96%E3%81%95%E3%82%8C%E3%81%9Fapi ◦ ChatGPTがどこの時点の情報を持っているかによって答えられない場合があるので注意が必 要 ▪ その場合いくら聞いてもダメなパターンが多いため、Denoの動向などについてはある程 度知っておく必要はある ▪ 古いバージョンでゴリ押ししてくるパターンもある 20
Copyright (C) 2024 Toranoana Lab Inc. All Rights Reserved. 作ったもの紹介
21 存在しないものの指摘
Copyright (C) 2024 Toranoana Lab Inc. All Rights Reserved. 作ったもの紹介
22 古いのゴリ押しされるとreadAllとかが存在してしまうので、バージョンを強制しようと試行錯誤
Copyright (C) 2024 Toranoana Lab Inc. All Rights Reserved. 作ったもの紹介
23 やっぱりダメなのでもう使うものを別のもので強制させる
Copyright (C) 2024 Toranoana Lab Inc. All Rights Reserved. 作ったもの紹介
• まだ古い… 24 export async function runCommand( cmd: string[], options: Record<string, unknown> = {}, ) { const process = new Deno.Command(cmd[0], { args: cmd.slice(1), stdout: "piped", stderr: "piped", ...options, }).spawn(); const { success, stdout, stderr } = await process.output(); if (success) { const output = new TextDecoder().decode(stdout); console.log(output); } else { const error = new TextDecoder().decode(stderr); console.error(error); } }
Copyright (C) 2024 Toranoana Lab Inc. All Rights Reserved. 作ったもの紹介
• リストアもしてもらう 25 import "@std/dotenv/load"; import { runCommand } from "./command.ts"; export async function restoreRepos(selectedRepos?: string[]) { const BACKUP_DIR = Deno.env.get("BACKUP_DIR")!; const RESTORE_DIR = Deno.env.get("RESTORE_DIR")!; const backupRepos = Array.from(Deno.readDirSync(BACKUP_DIR)).filter((entry) => entry.isDirectory ); const filteredRepos = selectedRepos ? backupRepos.filter((repo) => selectedRepos.includes(repo.name.replace(".wiki", "")) ) : backupRepos; await Deno.mkdir(RESTORE_DIR, { recursive: true }); for (const repo of filteredRepos) { const repoName = repo.name; const repoPath = `${BACKUP_DIR}/${repoName}`; const restorePath = `${RESTORE_DIR}/${repoName}`; await runCommand(["git", "clone", repoPath, restorePath]); } }
Copyright (C) 2024 Toranoana Lab Inc. All Rights Reserved. 作ったもの紹介
• 他聞いたこととか自分でやったこと ◦ GitHubのAPIリミットの対応 ◦ GitHubのAPIページネーションの対応 ◦ JSR対応 ▪ JSRできたのが最近なため、最初から無理そうだと思っていたので、自分で書き換えただけ • 最終的にできたものの動かし方 ◦ deno run --allow-net --allow-env --allow-read --allow-write --allow-run backup_restore_repos.ts backup ◦ deno run --allow-net --allow-env --allow-read --allow-write --allow-run backup_restore_repos.ts restore ◦ 個別にも指定可能(バックアップ、リストアどちらも) ▪ deno run --allow-net --allow-env --allow-read --allow-write --allow-run backup_restore_repos.ts backup repo1 repo2 26
Copyright (C) 2024 Toranoana Lab Inc. All Rights Reserved. まとめ
27
Copyright (C) 2024 Toranoana Lab Inc. All Rights Reserved. まとめ
• AI使いつつ、DenoでGitHubバックアップするCLIツールを作った紹介でした • JWTの部分などに顕著ですが、JS/TSなため、Deno特有のものというより、世間に 転がっているJS/TSでのコードも出てきており、AI利用する上ではJS/TS使える Denoは結構良いのではなかろうかと思います • ほとんど手直しなしで、AIに書いてもらってものそのままで動いてます • とはいえ古い部分や動かないところなどはあるので、知識は必要 28