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
570
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
33
Tailwind CSSとAtomic Designで実現する効率的な Web 開発の事例
toranoana
1
710
Denoについて、同人誌記事を出しました+update
toranoana
0
240
【虎の穴ラボ Tech Talk #2】プロンプトエンジニアリング
toranoana
0
170
20241121_[TechTalk#2]虎の穴ラボでのLLMについて取り組み紹介
toranoana
0
180
社内チャットへRAG導入した話(Tech Talk #2)
toranoana
0
250
Deno Deploy で Web Cache API を 使えるようになったので試した知見
toranoana
1
760
【虎の穴ラボ Tech Talk】虎の穴ラボTech Talk説明資料
toranoana
0
530
虎の穴ラボ Tech Talk_CDKでFargate環境構築
toranoana
1
700
Other Decks in Technology
See All in Technology
CI/CDではもう遅い - 人とAIが迂回しないDevSecOps Verify基盤の再設計 -
kintotechdev
0
150
ScotSecure West 2026 - Glasgow
raybugg
0
160
AIに任せた品質は、誰が見立てるのか - AI時代のテストマネジメント
nakanao
3
3k
手を動かして実感する、Kiro が変える開発体験
inariku
0
260
技術的負債から考える、AI時代のエンジニアリング投資 — ビズリーチの技術的負債と向き合った経験から、変更し続けられるソフトウェアを考える/ technical-debt-con2026
visional_engineering_and_design
4
3.7k
ボードゲームの遊び相手をFoundation Modelsで作る / iOSDC Japan 2026
genda
0
160
Lambda MicroVMsは常駐サーバーの代わりに なるか? Kiro Crew を動かして検証してみた / Kiro Crew on Lambda MicroVMs
k_adachi_01
2
190
高負荷プロダクション環境におけるAWS Lambdaのリアル 〜スケールとコストを左右する実行ライフサイクルの技術仕様〜
maimyyym
2
520
絵ではじめるKubernetesセキュリティ
aoi1
5
710
aws-iot-platform-architecture-use-cases.pdf
ma2shita
0
630
10年欲しかった音楽管理アプリを、AIと一緒に作りはじめた
judau
1
100
CLIライブラリ開発を支える技術
htnabe
0
150
Featured
See All Featured
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
31
3.4k
Agile Leadership in an Agile Organization
kimpetersen
PRO
0
240
A designer walks into a library…
pauljervisheath
211
25k
Git: the NoSQL Database
bkeepers
PRO
432
67k
Being A Developer After 40
akosma
91
590k
Avoiding the “Bad Training, Faster” Trap in the Age of AI
tmiket
0
250
Money Talks: Using Revenue to Get Sh*t Done
nikkihalliwell
0
500
GitHub's CSS Performance
jonrohan
1033
470k
Designing for Timeless Needs
cassininazir
1
510
Digital Ethics as a Driver of Design Innovation
axbom
PRO
1
440
Applied NLP in the Age of Generative AI
inesmontani
PRO
4
2.5k
How to build a perfect <img>
jonoalderson
1
6k
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