GihHubのプライベートリポジトリにあげたipynbファイルをColaboratoryで利用する方法


# はじめに
業務でipynbファイルを他の方にも気軽に実行してほしいという思いで、環境を整えていました。断片的な解決策はたくさんあったのですが、まとめた記事を探すのが難しかったので、本記事にまとめています。


# この記事で解決できること
- GitHubにあるipynbファイルから**Colabratoryに移動**して利用できる
- **プライベートリポジトリ**のipynbファイルをColabratoryで利用できる
- GitHubにおいた**自作モジュール**をColabratoryで利用できる

:::note info
プライベートリポジトリをcloneする方法としては、把握している範囲で「tokenを取得して接続を行う方法」と「ssh接続を行う方法」の2つがありますが、本記事では「tokenを取得して接続を行う方法」を紹介します。
:::

# 設定方法
以下の5つのステップで達成できます。
1. リンク・バッヂ作成 
2. GitHubでColaboratoryと接続する許可を出す
3. パーソナルアクセストークンを発行
4. ColabratoryのSecretsに作成したトークンを設定
5. ipynb内でトークンを呼び出してクローンしたいリポジトリのURLの間に設定し、クローンする
6. (補足)ディレクトリを移動する

2,3,4に関しては1回の設定で完了するので、2回目以降notebookを使う時には設定しなくても大丈夫です。

### 1.リンク・バッヂ作成
GitHubからスムーズにColaboratoryを開くためにバッヂを作成しましょう。

以下のコードをmarkdownで書くと表示できます。
```md
[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/<ユーザー名>/<リポジトリ名>/blob/<ブランチ名>/<パス>/<ノートブック名>.ipynb)
```

- ユーザー名・リポジトリ名・ブランチ名・パス・ノートブック名を設定します
- リポジトリ名とブランチ名の間にある「blob」は忘れやすいので気をつけてください。

**具体例**
```md
 [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/mokroke/colab-github-connect-test/blob/main/connect_test.ipynb)
```
実際に表示すると->  [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/mokroke/colab-github-connect-test/blob/main/connect_test.ipynb)

<br/>
詳しくはこちらの記事をご参照ください

https://qiita.com/Isaka-code/items/eae304e9332532e86a02


### 2.GitHubでColaboratoryと接続する許可を出す
初回はGitHubへの認証が必要です。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3291115/7bde84cc-af52-279d-2d5c-6d87866d8bd8.png" alt="Sample Image" width="450" height="300">

「Access private repositories and organizations」の部分にチェックがついているかを確認してください。

他にわかりにくい点などあれば、以下の資料を参考にしてみてください。

https://zenn.dev/takeshitayy/articles/google-colaboratory_about_s-jfpseov


### 3.パーソナルアクセストークンを発行
プライベートリポジトリにアクセスするためにパーソナルアクセストークンを発行します。

https://docs.github.com/ja/authentication/keeping-your-account-and-data-secure/managing-your-personal-access-tokens

personal access tokenは2種類あり、fine-grained personal access token を使用することが推奨されています。ただ、2024/12現在はSSOに対応する場合は personal access tokens (classic) で設定するしかなさそうです。

Personal access tokensの設定については、「右上のアイコン」 -> 「Setting」 -> 「Developers Setting」 -> 「Personal access」で行えます。

#### fine-grained personal access tokenを使用する場合
git cloneを行う最小設定は、Repository permissionsで、Commit statuses, Contents, Pull requests, Metadata（おそらくdefaultでRead-onlyになっているはず） を「Read-only」に設定するとよさそうです。

https://stackoverflow.com/questions/74532852/clone-github-repo-with-fine-grained-token

#### personal access tokens (classic)を使用する場合
git cloneを行う最小設定は、「repo」にチェックマークをつけることです。

詳しくはこちらの記事で。

https://dev.classmethod.jp/articles/github-personal-access-tokens/


### 4.ColabratoryのSecretsに作成したトークンを設定
左の鍵マークのところをクリックして、「Add new secret」で名前とkeyを設定します。
「Name」のところに、この後取り出すときに使う名前を、「Value」にpersonal access tokenで作成したkeyを貼り付けます。Notebookからアクセスするために、「Notebook access」をオンにしておいてください。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3291115/00b93d39-ad9b-d0c8-8e73-537e16829e30.png" alt="Sample Image" width="450" height="300">


### 5.ipynb内でトークンを呼び出してクローンしたいリポジトリのURLの間に設定し、クローンする
トークンを設定したら、クローンしたいリポジトリのURL（SSHではなくHTTPSの方）にトークンを埋め込みます。
ですので、git cloneするときは以下のようになっているはずです。
``` python
!git clone https://<トークン>@github.com/<ユーザー名>/<リポジトリ名>.git
```

以下のコードをipynbコピペしていただくと設定しやすいと思います！
repository_urlにクローンしたいリポジトリに変更し、トークン名が「GITHUB_TOKEN」（ここはご自身で設定いただいた名前に変更してください）のときに正しく動作します。
```python
from google.colab import userdata
TOKEN = userdata.get('GITHUB_TOKEN')  # GitHubトークンを取得

#HTTPSのURLに$$TOKEN@を追加
repository_url = "https://github.com/mokroke/colab-github-connect-test.git"#@param {type:"string"}

# cloneする
!git clone https://{TOKEN}@{repository_url.replace("https://","")}


```
↓Colaboratoryでコピペしたときの例
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3291115/3cfdf042-43b9-6312-520d-12744b2ba605.png" alt="Sample Image" width="700" height="400">


### 6.（補足）ディレクトリを移動する
少しメインから外れるかもですが、自作モジュールを利用するにはディレクトリを移動する必要があります。
以下のコードなどでディレクトリを移動しておきましょう。
```python
# 必要なライブラリをインポート
import os

# カレントディレクトリをリポジトリ内に変更
os.chdir("<移動したいディレクトリへのパス>")
```


# 最後に
いかがだったでしょうか。もし使いにくい点や、気づいた点などあればコメントいただけますとありがたいです！
最後に、本記事で使用したコードなどをまとめたリポジトリを共有いたします。

https://github.com/mokroke/colab-github-connect-test/tree/main


# 参考資料

↓colabとgithubを使うdemo

https://colab.research.google.com/github/googlecolab/colabtools/blob/master/notebooks/colab-github-demo.ipynb#scrollTo=wKJ4bd5rt1wy

Colaboratory公式 

https://github.com/googlecolab/open_in_colab?tab=readme-ov-file

Colabのアイコンについて

https://qiita.com/Isaka-code/items/eae304e9332532e86a02

Google Colaboratoryの仕組み

https://ts0818.hatenablog.com/entry/2021/02/22/191416

personal access tokenの設定について

https://dev.classmethod.jp/articles/github-personal-access-tokens/


Token使ってCloneしようという記事

https://zenn.dev/e4exp/articles/a4f6acab34fa48



Coraboratoryでsecretsを使う記事

https://qiita.com/suzuki_sh/items/4817e3423f2989bbb9ed



fine-grainedのkeyでcloneできるようにする質問

https://stackoverflow.com/questions/74532852/clone-github-repo-with-fine-grained-token

→ どうやらSSOは（まだ）fine-grainedアクセストークンではサポートされていないようです（2024年8月現在）