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
560
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
21
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
750
【虎の穴ラボ Tech Talk】虎の穴ラボTech Talk説明資料
toranoana
0
510
虎の穴ラボ Tech Talk_CDKでFargate環境構築
toranoana
1
690
Other Decks in Technology
See All in Technology
制約理論(ToC)入門 2026版
recruitengineers
PRO
7
2.1k
PLATEAU で バーチャル花火大会
tatsuya1970
0
110
Data Hubグループ 紹介資料
sansan33
PRO
0
3.2k
20260807_第6回_関東kaggler会LT_claw系bot xangiと始める、"寂しくない" kaggle
sugupoko
0
220
【CEDEC2026】専門性の高いデフォルメチームが挑んだ人材育成戦略 〜Cygames Academiaの企画から実施まで〜
cygames
PRO
0
530
『三匹の子ぶた』から学ぶネットワークセキュリティの昔と今 / Network Security: Then and Now Through the Lens of The Three Little Pigs
nttcom
1
1.8k
事業価値と Engineering 2026年度版
recruitengineers
PRO
45
22k
20260608_Codexの可能性_ノンプログラマー向け_大城追記
doradora09
PRO
0
780
Webアクセシビリティ入門 2026
recruitengineers
PRO
3
460
TypeScript入門 2026
recruitengineers
PRO
3
500
Bill One 開発エンジニア 紹介資料
sansan33
PRO
7
19k
ボトムアップ文化が強い組織で セキュリティをどう根付かせていくかの現在進行形の話 / Making Security Stick in a Bottom-Up Organization
yamaguchitk333
0
210
Featured
See All Featured
The Cost Of JavaScript in 2023
addyosmani
55
10k
Bridging the Design Gap: How Collaborative Modelling removes blockers to flow between stakeholders and teams @FastFlow conf
baasie
0
640
The AI Search Optimization Roadmap by Aleyda Solis
aleyda
1
6k
No one is an island. Learnings from fostering a developers community.
thoeni
21
3.8k
A designer walks into a library…
pauljervisheath
211
24k
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
31
2.8k
AI Search: Implications for SEO and How to Move Forward - #ShenzhenSEOConference
aleyda
1
1.3k
[SF Ruby Conf 2025] Rails X
palkan
2
1.3k
Documentation Writing (for coders)
carmenintech
77
5.4k
The Illustrated Children's Guide to Kubernetes
chrisshort
51
53k
The AI Revolution Will Not Be Monopolized: How open-source beats economies of scale, even for LLMs
inesmontani
PRO
3
3.7k
Building Experiences: Design Systems, User Experience, and Full Site Editing
marktimemedia
0
570
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