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
虎の穴ラボ株式会社
July 31, 2024
Technology
550
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
13
Tailwind CSSとAtomic Designで実現する効率的な Web 開発の事例
toranoana
1
680
Denoについて、同人誌記事を出しました+update
toranoana
0
230
【虎の穴ラボ Tech Talk #2】プロンプトエンジニアリング
toranoana
0
160
20241121_[TechTalk#2]虎の穴ラボでのLLMについて取り組み紹介
toranoana
0
170
社内チャットへRAG導入した話(Tech Talk #2)
toranoana
0
240
Deno Deploy で Web Cache API を 使えるようになったので試した知見
toranoana
1
740
【虎の穴ラボ Tech Talk】虎の穴ラボTech Talk説明資料
toranoana
0
510
虎の穴ラボ Tech Talk_CDKでFargate環境構築
toranoana
1
570
Other Decks in Technology
See All in Technology
壊して学ぶAWS CDK: そのcdk deployで消えるもの、残るもの
k_adachi_01
1
420
Oracle Exadata Database Service on Cloud@Customer X11M (ExaDB-C@C) サービス概要
oracle4engineer
PRO
2
8.4k
Playwright × AI Agent でE2Eテストはどう変わるか AI駆動テストの可能性と実用検証の結果
taiga7543
1
540
SoccerMaster: A Vision Foundation Model for Soccer Understanding
kzykmyzw
0
150
CIで使うClaude
iwatatomoya
0
290
公式ドキュメントの歩き方etc
coco_se
1
120
最適な自走を最小限の支援で — M&Aで拡大する組織で少人数SREが挑んだ1年 / SRE NEXT 2026
genda
0
1.5k
AIと共生する開発者プラットフォーム:バクラクのモノレポ×マイクロサービス基盤
sakajunquality
2
4k
AI時代のPlaywright活用(システムテストを自動化する ー 実行エンジンにPla ywrightを選んだ理由)
ynisqa1988
1
680
OpenTelemetryにおけるGoのゼロコード・コンパイル時計装について #fukuokago
quiver
0
130
ゴールデンパスは敷いただけでは道にならない ─ 企画部門のエンジニアが技術標準を事業価値に変えるまで
mhrtech
1
230
伝票作成AIエージェントを支える、LLMOpsとインフラの選択肢 / AICon2026_takeda
rakus_dev
0
140
Featured
See All Featured
Bootstrapping a Software Product
garrettdimon
PRO
307
120k
Into the Great Unknown - MozCon
thekraken
41
2.6k
From Legacy to Launchpad: Building Startup-Ready Communities
dugsong
0
260
Claude Code のすすめ
schroneko
67
230k
Imperfection Machines: The Place of Print at Facebook
scottboms
270
14k
Dominate Local Search Results - an insider guide to GBP, reviews, and Local SEO
greggifford
PRO
0
210
Bioeconomy Workshop: Dr. Julius Ecuru, Opportunities for a Bioeconomy in West Africa
akademiya2063
PRO
1
180
Build your cross-platform service in a week with App Engine
jlugia
234
18k
Balancing Empowerment & Direction
lara
6
1.2k
Odyssey Design
rkendrick25
PRO
2
730
The untapped power of vector embeddings
frankvandijk
2
1.8k
Paper Plane (Part 1)
katiecoart
PRO
1
9.7k
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