Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
【toranoana.deno#17】 DenoでGitHubのバックアップ with Cha...
Search
虎の穴ラボ株式会社
July 31, 2024
Technology
590
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 虎の穴ラボ株式会社
関西Ruby登壇資料
toranoana
0
39
Tailwind CSSとAtomic Designで実現する効率的な Web 開発の事例
toranoana
1
730
Denoについて、同人誌記事を出しました+update
toranoana
0
250
【虎の穴ラボ Tech Talk #2】プロンプトエンジニアリング
toranoana
0
170
20241121_[TechTalk#2]虎の穴ラボでのLLMについて取り組み紹介
toranoana
0
190
社内チャットへRAG導入した話(Tech Talk #2)
toranoana
0
260
Deno Deploy で Web Cache API を 使えるようになったので試した知見
toranoana
1
780
【虎の穴ラボ Tech Talk】虎の穴ラボTech Talk説明資料
toranoana
0
540
虎の穴ラボ Tech Talk_CDKでFargate環境構築
toranoana
1
720
Other Decks in Technology
See All in Technology
AIエージェントに 権限と鍵をどこまで渡すか
nrinetcom
PRO
2
160
Flutter Webを「SDK」として配る — 50以上のゲームを支える埋め込みアーキテクチャ
masayukisuda
0
160
新米を「売り越さない」、Aurora DSQLで作る在庫ゼロ死守の限定ドロップEC
yama3133
0
120
なぜ東京にいる私が、新潟の技術コミュニティを運営するのか by 八雲慎之助
yakumo
0
200
【Oracle AI SPOTLIGHT ウェビナー】事例から見る!なぜOCIが選ばれたのか ― AI時代のクラウド戦略を紐解く ―
oracle4engineer
PRO
1
140
AIテスト自動化と評価駆動開発EDD
happysamurai294
0
110
推論基盤と Scale-Up Interconnect の現状と制約から俯瞰する技術動向
markunet
2
680
これだけは抑えておきたい!後悔しない re:Invent の過ごし方 / AWS re:Invent 2026 prestudy
kinunori
2
610
増え続けるプロダクトの品質をどう担保するか。ProductSpecとTypeScriptによる取り組み
joere
2
270
クラウドエージェントの先駆け Devin。今も最先端を走る、他との違い
kinopeee
1
520
Flutter Widget Previewerで始めるUIプレビューとVRTの自動化
sakusaku3939
0
180
あなたのDartコードは丸見えかもしれない ~reFlutterで暴くFlutterアプリの中身と多層防御~
zozotech
PRO
0
710
Featured
See All Featured
Bridging the Design Gap: How Collaborative Modelling removes blockers to flow between stakeholders and teams @FastFlow conf
baasie
0
750
Redefining SEO in the New Era of Traffic Generation
szymonslowik
1
500
Discover your Explorer Soul
emna__ayadi
2
1.3k
Designing for humans not robots
tammielis
254
26k
Marketing Yourself as an Engineer | Alaka | Gurzu
gurzu
0
340
The Impact of AI in SEO - AI Overviews June 2024 Edition
aleyda
6
1.3k
Building Experiences: Design Systems, User Experience, and Full Site Editing
marktimemedia
1
650
Why Mistakes Are the Best Teachers: Turning Failure into a Pathway for Growth
auna
0
340
The Spectacular Lies of Maps
axbom
PRO
1
1.1k
Amusing Abliteration
ianozsvald
1
370
職位にかかわらず全員がリーダーシップを発揮するチーム作り / Building a team where everyone can demonstrate leadership regardless of position
madoxten
70
68k
Visualization
eitanlees
153
17k
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