Databricks ReposによるGit連携

[Repos for Git integration \| Databricks on AWS](https://docs.databricks.com/repos.html)の翻訳です(2022/2/11時点)。

> [Databricksクイックスタートガイド](https://qiita.com/taka_yayoi/items/125231c126a602693610)のコンテンツです。


> **プレビュー** 
Databricks Reposにおける任意のファイルサポートはは[パブリックプレビュー](https://docs.databricks.com/release-notes/release-types.html)です。詳細は、[Databricks repoにおける非ノートブックファイルの作業](#databricks-repoにおける非ノートブックファイルの作業)、[Python、Rモジュールのインポート](#pythonrモジュールのインポート)をご覧ください。

データサイエンス、データエンジニアリングのコード開発におけるベストプラクティスをサポートするために、Databricks ReposはGitプロバイダーとのリポジトリレベルのインテグレーションを提供します。Databricksノートブックでコードを開発し、リモートのGitリポジトリと同期することができます。Databricksを用いることで、リモートリポジトリのクローンや、ブランチの管理、変更のプッシュ、プル、コミット時の差分の確認といったGitの機能を利用することができるようになります。

Databricks ReposはCI/CDパイプラインとインテグレーションできるように[API](#repos-api)を提供しています。例えば、常に最新のコードバージョンになるように、プログラムからDatabricksのrepoをアップデートすることができます。

Databricks Reposでは、Gitリポジトリへのアクセスをコントロールする[許可リスト](#許可リストの利用)や[ソースコードにおける平文テキストシークレットの検知](#シークレットの検知)のようなセキュリティ機能も提供しています。

[監査ログ](https://docs.databricks.com/administration-guide/account-settings/audit-logs.html)が有効化されている場合には、Databricksのrepoを操作した際に監査イベントが記録されます。例えば、Databricksのrepoを作成、更新、削除した際、ワークスペースに関連づけられているreposの一覧を表示した際、Databricks repoとリモートのGitと変更を同期した際に、イベントログが記録されます。

Databricks reposを用いたコード開発のベストプラクティスに関しては、[CI/CDワークフローによるRepos連携のベストプラクティス](#cicdワークフローによるrepos連携のベストプラクティス)を参照ください。

# 要件

Databricksは以下のGitプロバイダーをサポートしています。

- GitHub
- Bitbucket
- GitLab
- Azure DevOps
- AWS CodeCommit

GitサーバーはDatabricksからアクセスできるようになっています。Databricksでは、VPNの先にあるGitサーバーのようなプライベートGitサーバーはサポートしていません。

Databricks Reposにおける任意ファイルのサポートはDatabricksランタイム8.4以降で利用できます。

# DatabricksにおけるGit連携の設定

1. Databricksワークスペースの![](https://docs.databricks.com/_images/user-settings-icon.png)**Setting**をクリックし、メニューから**User Settings**を選択します。
1. **User Settings**ページで、**Git Integration**タブに移動します。
1. [GitHub](https://docs.databricks.com/notebooks/github-version-control.html#configure-version-control)、[Bitbucket Cloud](https://docs.databricks.com/notebooks/bitbucket-cloud-version-control.html#configure-version-control)、[GitLab](https://docs.databricks.com/notebooks/gitlab-version-control.html#configure-version-control)、[Azure DevOps](https://docs.microsoft.com/azure/devops/organizations/accounts/use-personal-access-tokens-to-authenticate)、[AWS CodeCommit](https://qiita.com/taka_yayoi/items/bdf421d402a95acde4e5)の手順に従います。
    - Azure DevOpsにおいては、Git連携はAzure Active Directoryトークンはサポートしていません。Azure DevOpsのパーソナルアクセストークンを使用してください。
1. GitHubにおいて会社のSAML SSOが有効化されているのであれば、SSOに対して[認証されたあなたのパーソナルアクセストークン](https://docs.github.com/en/github/authenticating-to-github/authorizing-a-personal-access-token-for-use-with-saml-single-sign-on)があることを確認してください。

# Databricks Reposにおける任意ファイルサポートの有効化

> **プレビュー**
この機能は[パブリックプレビュー](https://docs.databricks.com/release-notes/release-types.html)です。

リモートGitリポジトリとノートブックを同期することに加え、Files in Reposは、`.py`ファイル、`.csv`、`.json`フォーマットのデータファイル、`.yaml`設定ファイルなどあらゆるタイプのファイルを同期することを可能にします。これらのファイルをDatabricks repoにインポートして読み込むことができます。また、UIでプレーンテキストファイルを参照、編集することもできます。

この機能のサポートを無効化した場合には、repoでは非ノートブックファイルを参照しつづけることはできますが、編集することはできなくなります。

## 要件

Databricks Reposで非ノートブックを取り扱うには、Databricks Runtime 8.4以上が必要となります。

## Files in Reposの有効化

管理者が以下の手順を踏むことで、この機能を有効化できます。

1. [Admin Console](https://docs.databricks.com/administration-guide/admin-console.html)に移動します。
1. **Workspace Settings**タブをクリックします。
1. Advancedセクションで**Files in Repos**トグルをクリックします。
1. **Confirm**をクリックします。
1. ブラウザーをリフレッシュします。

Files in reposを有効化した後にrepoに最初にアクセスすると、repoに非ノートブックファイルを同期するためにプルオペレーションを実行しなくてはならないことを知らせるダイアログが表示されます。ファイルを同期するために**Agree and Pull**を選択します。マージの競合があるばあいには、競合する変更を破棄するか、新規ブランチに変更をプッシュするのかを選択するためのダイアログが表示されます。

# リモートGitリポジトリのクローン

リモートのGitリポジトリをクローンし、Databricks上でノートブックやファイルを操作することができます。ノートブックを作成し、ノートブックや他のファイルを編集し、リモートリポジトリと同期します。開発作業のために新規ブランチを作成することもできます。PRの作成、競合の解決、ブランチのマージ、削除、ブランチのリベースなどいくつかのタスクに関しては、Gitプロバイダーで作業しなくてはなりません。

1. サイドバーの![](https://docs.databricks.com/_images/repos-icon.png)**Repos**をクリックします。
1. **Add Repo**をクリックします
![](https://docs.databricks.com/_images/add-repo.png)
1. **Add Repo**ダイアログで**Clone remote Git repo**をクリックし、リポジトリのURLを入力します。ドロップダウンメニューからGitプロバイダーを選択し、必要に応じてDatabricks repoで使用する名前を変更し、**Create**をクリックします。リモートリポジトリのコンテンツがDatabricks repoにコピーされます。
![](https://docs.databricks.com/_images/clone-from-repo.png)


# Databricks repoにおけるノートブックの作業

Repoに新規ノートブックあるいはフォルダを作成するには、Repo名の隣の下矢印をクリックし、**Create > Notebook**あるいは**Create > Folder**を選択します。
![](https://docs.databricks.com/_images/create-notebook-folder.png)

Repoにノートブックあるいはフォルダを移動するには、ノートブック、フォルダのドロップダウンメニューから**Move**を選択します。
![](https://docs.databricks.com/_images/move-drop-down.png)

ダイアログで、移動先のRepoを指定します。
![](https://docs.databricks.com/_images/moving.png)

SQLやPythonファイルを単一セルで構成されるDatabrikcsノートブックとしてインポートすることが可能です。

- SQLファイルの先頭行に`-- Databricks notebook source`を追加してください。
- Pythonファイルの先頭行に`## Databricks notebook source`を追加してください。

# Databricks repoにおける非ノートブックファイルの作業

このセクションでは、どのようにrepoにファイルを追加し、参照、編集するのかを説明します。

> **プレビュー**
この機能は[パブリックプレビュー](https://docs.databricks.com/release-notes/release-types.html)です。

## 新規ファイルの作成

repoにファイルを作成するもっとも一般的な方法は[Gitリポジトリをクローン](#リモートgitリポジトリのクローン)することです。Databricks repoに新規ファイルを直接作成することもできます。repoの名前の隣の下向き矢印をクリックし、メニューから**Create > File**を選択します。
![](https://docs.databricks.com/_images/create-file.png)

## ファイルのアップロード

ローカルシステムからファイルをアップロードするには、repoの名前の隣の下向き矢印をクリックし、メニューから**Upload File(s)**を選択します。ダイアログにファイルをドラッグするか、ファイルを選択するために**browse**をクリックします。
![](https://docs.databricks.com/_images/upload-files.png)

## ファイルの編集

repoのファイルを編集するには、Reposブラウザでファイル名をクリックします。ファイルがオープンし、編集することができます。変更は自動で保存されます。

マークダウン(`.md`)ファイルを開いた際、デフォルトではレンダリングされたビューが表示されます。ファイルを編集するには、ファイルエディタ内をクリックします。プレビューモードに戻るには、ファイルエディタ外の任意の場所をクリックします。

## コードのリファクタリング

コード開発のベストプラクティスは、容易に再利用できるようにコードをモジュール化することです。RepoでカスタムのPythonファイルを作成し、`import`ぶんを用いてノートブックでこれらのファイルのコードを利用できるようにします。例えば、こちらの[サンプルノートブック](#サンプルノートブック)をご覧ください。

ノートブックを再利用可能なファイルにリファクタリングするには以下の手順を踏みます。

1. ReposのUIから[新規ブランチを作成](#ブランチの作成)します。
1. [新規ソースコードファイルを作成](#databricks-repoにおける非ノートブックファイルの作業)します。
1. ノートブックで上記新規ファイルのコードを利用できるように、Pythonのimport文を追加します。
1. [変更をGitプロバイダーにコミットしプッシュ](#リモートgitリポジトリに変更をコミットプッシュする)します。

## プログラムからrepoのファイルにアクセスする

`.csv`や`.json`ファイルのような小さいデータファイルをプログラムから読み込むことができます。ノートブックのプログラムからファイルを作成、編集することはできません。

```py:Python
import pandas as pd
df = pd.read_csv("./data/winequality-red.csv")
df
```

repoのファイルにアクセスするのにSparkを使うこともできます。Sparkはファイルデータにアクセスするためには絶対パスが必要となります。repoにおけるファイルの絶対パスは`file:/Workspace/Repos/<user_folder>/<repo_name>/file`となります。

ファイルの隣のドロップダウンメニューからRepoのファイルの絶対パス、相対パスをコピーすることができます。
![](https://docs.databricks.com/_images/file-drop-down.png)

以下の例では、フルパスを取得するために`{os.getcwd()}`を使っています。

```py:Python
import os
spark.read.format("csv").load(f"file:{os.getcwd()}/my_data.csv")
```

## サンプルノートブック

以下のノートブックはrepoで任意のファイルをどのように取り扱うのかを説明しています。

[Databricks Reposにおける任意ファイルの取り扱い](https://github.com/taka-yayoi/public_repo/tree/main/repos_arbitrary_files)

# Python、Rモジュールを取り扱う

> **プレビュー**
この機能は[パブリックプレビュー](https://docs.databricks.com/release-notes/release-types.html)です。

## 要件

Databricksランタイム8.4以降が必要です。

## Python、Rモジュールのインポート

repoにおける現在の作業ディレクトリとノートブックは自動的にPythonのパスに追加されます。repoのルートで作業している際には、ルートディレクトリ、全てのサブディレクトリからモジュールをインポートすることができます。

別のrepoからモジュールをインポートするには、以下のように対象のrepoを`sys.path`に追加する必要があります。

```py:Python
import sys
sys.path.append("/Workspace/Repos/<user-name>/<repo-name>")

# to use a relative path
import sys
import os
sys.path.append(os.path.abspath('..'))
```

クラスターライブラリに保存されたモジュールやノートブックスコープライブラリと同じように、repoのモジュールから関数をインポートすることができます。

```py:Python
from sample import power
power.powerOfTwo(3)
```

```r:R
source("sample.R")
power.powerOfTwo(3)
```

## Databricks Pythonノートブックをインポートする

通常のPythonファイルと、ソースコード形式でエクスポートされたDatabricksのPythonノートブックを区別するために、Databricksはノートブックのソースコードファイルの先頭に`# Databricks Notebook source`という行を追加します。

ノートブックをインポートする際、Databricksはこれを認識し、Pythonモジュールではなくノートブックとしてインポートします。

ノートブックをPythonモジュールとしてインポートしたいのであれば、コードエディタでノートブックを編集し、`# Databricks Notebook source`の行を削除する必要があります。この行を削除することでノートブックを通常のPythonファイルに変換することができます。

### 優先ルールのインポート

Repoのノートブックで`import`文を使用すると、Repoのライブラリはクラスターにインストールされている同名のライブラリやwheelよりも優先されます。

## Pythonモジュールのオートリロード

Pythonコードを開発している際に複数のファイルを編集しているのであれば、以下のコマンドを使用することで全てのモジュールのリロードを強制することができます。

```py:Python
%load_ext autoreload
%autoreload 2
```

## テストにDatabricks webターミナルを使用する

ファイルをインポートして、ノートブックで実行することなしにPython、Rモジュールに対する変更をテストするために、Databricks webターミナルを使用することができます。

1. [webターミナル](https://docs.databricks.com/clusters/web-terminal.html)を開きます。
1. Repoのディレクトリに移動します：`cd /Workspace/Repos/<path_to_repo>/`
1. Python、Rファイルを実行します。`python file_name.py`あるいは`Rscript file_name.r`

# リモートGitリポジトリと同期する

Gitと同期する際には、Gitダイアログを使います。GitダイアログではリモートGitリポジトリから変更をプルしたり、変更をコミットすることが可能です。また、作業するブランチを切り替えたり、新たな[ブランチを作成](#ブランチの作成)できます。

> **重要**

> - ダイアログでGitの操作を行うと、ノートブックに付けられているコメントや改訂履歴はクリアされます。詳細は[変更が発生するとRepoのノートブックのコメントはクリアされます](#変更が発生するとrepoのノートブックのコメントはクリアされます)を参照ください。
- ノートブックがノートブックエクスペリメントと関連づけられており、当該ノートブックを含まないブランチに切り替えた場合、エクスペリメントは永久に削除されます。詳細はMLflowエクスペリメントが失われる可能性を参照ください。

## Gitダイアログを開く

ノートブックあるいはReposブラウザからGitダイアログにアクセスできます。

- ノートブックにおいては、ノートブックの左上にあるGitブランチのボタンをクリックします。
![](https://docs.databricks.com/_images/git-button-notebook.png)
- Reposブラウザでは、Repo名の隣のボタンをクリックします。
![](https://docs.databricks.com/_images/git-button-repos.png)
- あるいは、Repo名の下矢印ボタンをクリックし、**Git...**を選択します。
![](https://docs.databricks.com/_images/repo-menu.png)

## リモートGitリポジトリから変更をプルする

リモートGitリポジトリから変更をプルするには、Gitダイアログで![](https://docs.databricks.com/_images/pull-button.png)をクリックします。ノートブックがリモートリポジトリの最新バージョンで更新されます。

マージの競合の解決方法に関しては、[マージの競合](#マージの競合)を参照ください。

## マージの競合

マージの競合を解決するためには、競合する変更を破棄するか、新規ブランチに変更をコミットし、プルリクエストを用いてオリジナルのフィーチャーブランチにマージする必要があります。

1. マージの競合がある場合には、Repos UIではプルのキャンセルか競合の解決を行うためのメッセージが表示されます。**Resolve conflict using PR**を選択した場合、変更をコミットするための新規ブランチを作成するためのダイアログが表示されます。
![](https://docs.databricks.com/_images/resolve-conflict-dialog.png)

1. **Commit to new branch**をクリックすると、リンク**Create a pull request to resolve merge conflicts**を含むメッセージが表示されます。Gitプロバイダーにアクセスするためにリンクをクリックします。
![](https://docs.databricks.com/_images/merge-conflict-create-pr-msg.png)

1. GitプロバイダーでPRを作成し、競合を解決し、新規ブランチをオリジナルのブランチにマージします。
1. Repos UIに戻ります。オリジナルブランチに対応するGitリポジトリから変更をプルするためにGitダイアログを使用します。

## リモートGitリポジトリに変更をコミット、プッシュする

新たなノートブックを作成した、あるいは、既存のノートブックに変更を加えた際には、Gitダイアログは変更点を表示します。
![](https://docs.databricks.com/_images/git-commit-push.png)

変更点のサマリーを入力し、**Commit & Push**をクリックすることでこれらの変更点をリモートGitリポジトリにプッシュします。

マスターブランチへのプッシュ権限がない場合には、[ブランチを新たに作成](#ブランチの作成)し、Gitプロバーダーのインタフェースで、マスターブランチにマージするためのプルリクエスト(PR)を作成します。

> **注意**

> - ノートブックのコミットには実行結果は含まれません。コミットが行われる前に実行結果全てがクリアされます。
> - マージの競合の解決方法に関しては、[マージの競合](#マージの競合)を参照ください。

## ブランチの作成

Gitダイアログで既存のブランチから新たなブランチを作成できます。
![](https://docs.databricks.com/_images/git-dialog-new-branch.png)

# Databricks Reposのアクセス管理

## 権限の管理

Repoを作成した場合には、**Can Manage**権限を持ちます。これにより、Gitオペレーションを実行したり、リモートリポジトリを変更できます。Gitの認証情報(パーソナルアクセストークンとユーザー名)なしに、パブリックなリモートリポジトリをクローンできます。パブリックリモートリポジトリを変更あるいは、プライベートリモートリポジトリをクローン・変更するためには、リモートリポジトリに対する読み取り、書き込み権限を持ったGitプロバイダのユーザー名とパーソナルアクセストークンを持っている必要があります。

## 許可リストの利用

管理者は、ユーザーがコミット、プッシュできるリモートリポジトリを制限することができます。

1. Admin Consoleに移動します。
1. **Workspace Settings**をクリックします。
1. **Advanced**セクションで、**Enable Repos Git URL Allow List**とグルをクリックします。
1. **Confirm**をクリックします。
1. **Repos Git URL Allow List: Empty list**の隣のフィールドに、カンマ区切りのURLプレフィクスのリストを入力します。
1. **Save**をクリックします。

ユーザーは指定されたURLプレフィクスに合致するGitリポジトリのみにコミット、プッシュが行えます。デフォルトの設定は「空のリスト」であり、全てのリポジトリへのアクセスを拒否しています。全てのリポジトリへのアクセスを許可するには、**Enable Repos Git URL Allow List**を無効化します。

> **注意**

> - リストを保存することで、既存のURLプレフィクスのセットを上書きします。
> - 効果が出るまでに約15分かかります。

## シークレットの検知

Reposはコードに対して`AKIA`のプレフィックスで始まるアクセスキーIDをスキャンし、コミットの前にユーザーに警告します。

# Repos API

Repos APIのアップデートエンドポイントにより、特定のGitブランチの最新の状態にアップデートすることが可能です。これにより、Repoのノートブックをジョブで実行する前にRepoをアップデートすることができます。詳細に関しては[Repos API](https://docs.databricks.com/dev-tools/api/latest/repos.html)をご覧ください。

# Terraformインテグレーション

[Databricks Terraform provider](https://docs.databricks.com/dev-tools/terraform/index.html)と[databricks\_repo](https://registry.terraform.io/providers/databrickslabs/databricks/latest/docs/resources/repo)を用いて、完全に自動化された環境でDatabricks Reposを管理することができます。

```
resource "databricks_repo" "this" {
  url = "https://github.com/user/demo.git"
}
```

# CI/CDワークフローによるRepos連携のベストプラクティス

本章では、お持ちのCI/CDワークフローとDatabricks Reposをどのように連携されるかのベストプラクティスをご説明します。以下の図で全体像を示しています。
![](https://docs.databricks.com/_images/repos-best-practices.png)

## 管理者のワークフロー

Reposはユーザー単位のフォルダとトップレベルのフォルダを持ちます。ユーザー単位のフォルダは、ユーザーがリモートリポジトリのクローンを作成した際に自動的に作成されます。ユーザーのフォルダは、ユーザーがそれぞれの変更を加えることができる”ローカルチェックアウト”と考えることができます。

### トップレベルRepoフォルダの設定

管理者はトップレベルのフォルダを作成できます。一般的なユースケースは、Dev、Staging、Productionというそれぞれの開発フェーズに応じたブランチを格納するRepoを作成するというものです。例えば、あなたの組織がメインブランチをProductionに使っているのであれば、Prodcutionフォルダにはメインブランチと接続されたRepoが格納されます。

典型的なパターンでは、ワークスペースの非管理者ユーザーには、トップレベルのフォルダに対しては読み取り権限のみを与えます。
![](https://docs.databricks.com/_images/top-level-repo-folders.png)

### マージの際にRepoを更新するためのGit自動化の設定

Reposが常に最新の状態にあるようにするために、自動で[Repos API](#repos-api)を呼び出すようにGitを設定することが可能です。PRによるメインブランチへのマージが成功する都度、Repos APIエンドポイントを呼び出し、Repoが最新の状態になるようにGitを設定できます。

例えば、Githubでは[Github Actions](https://github.com/features/actions)を用いて設定できます。

## 開発者のワークフロー

Databricks Reposのご自身のユーザーフォルダーでリモートリポジトリをクローンします。メインブランチに直接変更をプッシュするのではなく、新たに[フィーチャーブランチを作成](#ブランチの作成)するか、以前に自身の作業用として作成したブランチを選択するのがベストプラクティスです。自身のコードをマージする準備ができたら、プルリクエストを作成し、Gitでのレビュー、マージプロセスに従います。

以下にサンプルのワークフローを示します。

### 要件

このワークフローを実施するには、[Git連携の設定](#databricksにおけるgit連携の設定)を完了している必要があります。

> **注意**
それぞれの開発者は自身のフィーチャーブランチで作業することをお勧めします。開発者でフィーチャーブランチを共有すると、お使いのGitプロバイダーでの解決を必要とするマージの競合を引き起こします。マージの競合の解決方法に関しては、[マージの競合](#マージの競合)を参照ください。

### ワークフロー

1. [お使いの既存のGitリポジトリを自身のDatabricksワークスペースにクローンします](#リモートgitリポジトリのクローン)。
1. メインブランチから[フィーチャーブランチを作成](#ブランチの作成)するためにRepos UIを使用します。この例では、シンプルにするために*feature-b*という単一のブランチを使用します。作業内容に応じて複数のフィーチャーブランチを作成、利用することができます。
1. Repo内のDatabricksノートブック、ファイルに変更を加えます。
1. [変更をGitプロバイダーにコミット、プッシュします](#リモートgitリポジトリに変更をコミットプッシュする)。
1. これで、同僚はGitリポジトリを自身のユーザーフォルダーにクローンすることができます。
    1. 新規ブランチで、同僚はRepo内のDatabricksノートブック、ファイルに変更を加えます。
    1. 同僚が[変更をGitプロバイダーにコミット、プッシュします](#リモートgitリポジトリに変更をコミットプッシュする)。
1. 他のブランチの変更をマージするか、フィーチャーブランチを切り直すためには、Gitコマンドライン、あるいはローカルシステムのIDEを使用する必要があります。そして、Databricks Repo内にある*feature-b*ブランチに変更をプルするために、ReposのUIでGitダイアログを使用します。
1. 作業内容をメインブランチにマージする準備ができたら、*feature-b*の変更をマージするためのPRを作成するためにGitプロバイダーを使用します。
1. Repos UIでメインブランチに対する変更をプルします。

## プロダクションジョブワークフロー

ジョブにはReposのノートブックを直接指定できます。ジョブが実行される際には、Repoの現在のバージョンのものが使用されます。

[管理者のワークフロー](#管理者のワークフロー)で説明した自動化処理が設定されている場合には、マージが成功するたびにRepos APIが呼び出されReposが更新されます。結果として、ジョブは常に最新の状態のコードを実行することになります。

# 移行のティップス

> **プレビュー**
この機能は[パブリックプレビュー](https://docs.databricks.com/release-notes/release-types.html)です。

ノートブックで定義されているPython、Rの関数を他のノートブックで利用できるようにするために、`%run`コマンドを使用しているか、クラスターにカスタムの`.whl`ファイルをインストールしているのであれば、これらのカスタムモジュールをDatabrikcsのrepoに格納することを検討してください。こうすることで、ノートブックと他のコードモジュールを同期することができ、ノートブックが常に適切なバージョンを使用していることを保証し続けられます。

## `%run`コマンドからの移行

`%run`コマンドを用いることでノートブックに他のノートブックを含めることができ、サポート用のPython、Rコードを他のノートブックで利用できるようにするためによく利用されます。この例では、`power.py`というノートブックに以下のようなコードが記述されているものとします。

```py:Python
# This code is in a notebook named "power.py".
def n_to_mth(n,m):
  print(n, "to the", m, "th power is", n**m)
```

次に、`%run`コマンドを使用して`power.py`で定義されている関数を、別のノートブックで使用できるようにします。

```py:Python
# This notebook uses a %run command to access the code in "power.py".
%run ./power
n_to_mth(3, 4)
```

Files in Reposを用いることで、Pythonコードを含むモジュールを直接インポートし、関数を実行することができます。

```py:Python
from Power import n_to_mth
n_to_mth(3, 4)
```

## カスタムPython`.whl`ファイルからの移行

カスタム`.whl`ファイルをクラスターにインストールし、クラスターにアタッチされているノートブックでこれらをインポートすることができます。コードが頻繁にアップデートされる場合には、このプロセスは面倒で、エラーが混入しやすいものとなります。Files in Reposを用いる音で、これらのPythonファイルをモジュールを利用するノートブックと同じrepoに格納することで、ノートブックが適切なバージョンを使用していることを保証できます。

Pythonプロジェクトのパッケージングに関しては、こちらの[チュートリアル](https://packaging.python.org/tutorials/packaging-projects/)をご覧ください。

# 制限及びFAQ

## 変更が発生するとRepoのノートブックのコメントはクリアされます

ノートブックソースコードを変更するGitオペレーションは、セルの結果、コメント、改訂履歴、ウィジェットを含むノートブックの状態をクリアします。例えば、Gitのプルはノートブックのソースコードを変更する場合があります。この場合、Databricks Reposは変更をインポートするために既存のノートブックを上書きする必要があります。Gitコミット、プッシュや、新規ブランチの作成は、ノートブックソースコードに影響を与えないので、これらのオペレーションではノートブックの状態は保持されます。

## MLflowエクスペリメントが失われる可能性

以下のワークフローにおいては、MLflowのエクスペリメントが恒久的に削除されます。

1. ブランチAでノートブックのMLflowエクスペリメントを実行します。エクスペリメントがMLflowに記録されます。
1. ノートブックを持たないブランチBに切り替えます。ノートブックが削除されたことを知らせるダイアログが表示されます。
1. 再度ブランチAに切り替えると、ノートブックは依然として存在しますが、もはやエクスペリメントは存在しません。

## Gitオペレーションが進行中のノートブックでジョブがスタートしたら何が起きますか？

Gitオペレーションが進行中の際、Repoのいくつかのノートブックがアップデートされ、いくつかのものはアップデートされていない可能性があります。これによって、予期しない振る舞いをする場合があります。

例えば、ノートブックAがノートブックZを`%run`コマンドで呼び出しているとします。Gitオペレーションがスタートしている間にジョブが実行される際、ノートブックAは最新バージョンですが、ノートブックZはまだアップデートされていない場合、ノートブックAの`%run`コマンドは、古いバージョンのノートブックZを起動するかもしれません。Gitオペレーションの間は、ノートブックの状態は予測不可能であり、ジョブは失敗するか、ノートブックAとノートブックZが異なるバージョンで実行される可能性があります。

## どうすれば、Databricksノートブック以外の.pyファイルなどをRepoで実行できますか？

以下の方法があります。

- クラスターにライブラリとしてデプロイします
- Gitリポジトリから直接pipでインストールします。[シークレットマネージャ](https://qiita.com/taka_yayoi/items/7e4eae0786b94cb7a5de)による認証情報が必要となります。
- ノートブックで`%run`を使います。
- カスタムコンテナイメージを使います。[Customize containers with Databricks Container Services](https://docs.databricks.com/security/secrets/secrets.html)を参照ください。

## ユーザーフォルダではなくトップレベルフォルダを作成できますか？

はい、管理者は単一階層を持つトップレベルフォルダを作成できます。Reposでは複数階層のフォルダはサポートしていません。

## ReposはコミットのGPGサインをサポートしていますか？

いいえ

## Githubのトークンはどこにどのように格納されますか？Databricksから誰かアクセスできますか？

- Databricksのコントロールプレーンに認証用のトークンは格納されます。Databricksの従業員は監査された一時的な認証情報を用いてのみアクセスすることができます。
- Databricksはこれらの認証情報の作成、削除を記録しています。しかし、その利用は記録していません。Databricksは、Databricksアプリケーションによるトークンの利用を監査するために、Gitオペレーションを記録しています。
- Github enterpriseはトークンの使用を監査しています。他のGitサービスもGitサーバー監査機能を持っている場合があります。

## Reposはオンプレミスあるいは自身でホストしたGitサーバーをサポートしていますか？

いいえ

## ReposはGitサブモジュールをサポートしていますか？

いいえ。Gitサブモジュールを含むrepoをクローンすることはできますが、サブモジュールはクローンされません。

## ReposはSSHをサポートしていますか？

いいえ、HTTPSのみです。

## Reposは`.gitignore`ファイルをサポートしていますか？

はい。ファイルをrepoに追加し、それをGitに追跡して欲しくない場合には、`.gitignore`ファイルを作成するか、リモートリポジトリからクローンしたものを使うかして、拡張子を含むファイル名を追加してください。

`.gitignore`はまだGitに追跡されていないファイルに対してのみ動作します。すでにGitに追跡されているファイルを`.gitignore`ファイルに追加しても、Gitによって追跡され続けます。

## 外部のオーケストレーションツールに頼ることなしに、ジョブの実行前にGitからリポジトリの最新バージョンをプルすることができますか？

いいえ。大抵の場合、ブランチ(main/prod)に対する全てのプッシュがProductionのRepoを更新するように、Gitサーバーにおけるpre-commitとして連携できます。

## ipynbファイルをプルできますか？

はい。ファイルはノートブックフォーマットではなく`.json`ファイルにレンダリングされます。

## Repoをエクスポートすることはできますか？

Repoの全体、ノートブック、フォルダーをエクスポートすることができます。非ノートブックのファイルをエクスポートはできません。Repo全体をエクスポートした際、非ノートブックは含まれません。これらをエクスポートするには[Workspace CLI](https://docs.databricks.com/dev-tools/cli/workspace-cli.html)、[Workspace API 2\.0](https://docs.databricks.com/dev-tools/api/latest/workspace.html)を使用してください。

## ライブラリがクラスターにインストールされており、Repoのフォルダに同じ名前のライブラリが含まれている場合、どちらのライブラリがインポートされますか？

Repoのライブラリがインポートされます。

## Repoのサイズ、ファイル数に制限はありますか？

Databricksは、repoのサイズに制限をかけていません。作業用のブランチは200MBに制限されます。個々のファイルは100MBに制限されます。

Repoには2000以上のノートブックを含めないことをお勧めします。

制限を超えた際にはエラーメッセージを受け取るかもしれません。最初のクローンでタイムアウトエラーが発生するかもしれませんが、バックエンドでは処理が成功しているケースもあります。

## Reposはブランチのマージをサポートしていますか？

いいえ。Gitプロバイダーでプルリクエストを作成し、マージすることをお勧めします。

## Databricks reposのコンテンツは暗号化されていますか？

デフォルトキーを用いてコンテンツは暗号化されています。[カスタマーマネージドキー](https://docs.databricks.com/security/keys/customer-managed-keys-notebook-aws.html)による暗号化はサポートしていません。

## DatabricksのRepoからブランチを削除することはできますか？

いいえ。ブランチを削除するには、Gitプロバイダー上で操作を行なってください。

## Databricks reposのコンテンツはどこに格納されていますか？

Repoのコンテンツはコントロールプレーンのディスクに一時的にクローンされます。メインワークスペースにおけるノートブックと同様に、Databricksノートブックはコントロールプレーンのデータベースに格納されます。ノートブック以外のファイルは最大で30日間ディスクに保存されます。

## ワークスペースでReposを無効にするにはどうしたらいいですか？

ワークスペースでGitに対するReposを無効にするには、以下の手順に従ってください。

1. [Admin Console](https://docs.databricks.com/administration-guide/admin-console.html)に移動します。
1. **Workspace Settings**タブをクリックします。
1. **Advanced**セクションで**Repos**とグルをクリックします。
1. **Confirm**をクリックします。
1. ブラウザーをリフレッシュします。

## Files in Reposの制限

> **プレビュー**
この機能は[パブリックプレビュー](https://docs.databricks.com/release-notes/release-types.html)です。

- Databricksランタイム10.1以下では、Files in Repos(任意ファイルのサポート)はSparkストリーミングとの互換性がありません。Databricksランタイム10.1以下が動作しているクラスターでSparkストリーミングを使用するには、クラスターでFiles in Reposを無効にする必要があります。[Spark設定](https://qiita.com/taka_yayoi/items/8d951b660cd87c6c5f18#spark%E3%81%AE%E8%A8%AD%E5%AE%9A)`spark.databricks.enableWsfs`を`false`に設定してください。
- Python、Rノートブックではネイティブファイルの読み込みをサポートしています。Scalaノートブックではサポートされていませんが、今と同じようにDBFSに対してScalaノートブックを使用することはできます。
- ファイルに対してはGitダイアログでdiffは利用できません。
- テキストにエンコードされるファイルのみがUIでレンダリングされます。Databricksでファイルを参照するには、ファイルサイズは10MB未満である必要があります。
- ノートブックからファイルを作成、編集することはできません。
- ノートブックのみをエクスポートすることができます。Repoから非ノートブックファイルをエクスポートすることはできません。


# トラブルシュート

## エラーメッセージ：Invalid credentials

以下を試してください：

- Git integrationタブ(**User Settings > Git Integration**)の設定が正しいことを確認してください。
- **Add Repo**[ダイアログ](#リモートgitリポジトリのクローン)で適切なGitプロバイダーを選択したことを確認してください。
- パーソナルアクセストークン、アプリケーションのパスワードが適切なリポジトリへのアクセス権限を持っていることを確認してください。
- GitプロバイダーでSSOが有効な場合には、SSOに対してトークンを承認してください。
- Gitのコマンドラインでトークンをテストしてください。以下のコマンドが成功する必要があります：
    -  `git clone https://<username>:<personal_access_token>@github.com/<org>/<repo_name>.git`
    -  `git clone -c http.sslVerify=false -c http.extraHeader='Authorization: Bearer <token>' https://agile.act.org/`

## エラーメッセージ：Secure connection could not be established because of SSL problems
```
<link>: Secure connection to <link> could not be established because of SSL problems
```
DatabricksコントロールプレーンからGitサーバーにアクセスできない場合に、このエラーが発生します。プライベートなGitサーバーはサポートされていません。

## Timeoutエラー

大規模repoのクローンや大規模ブランチのチェックアウトでタイムアウトエラーに直面する場合がありますが、バックグラウンドではオペレーションが完了している場合があります。ワークスペースの負荷が大きい場合には、後で再トライすることができます。

## 404エラー

非ノートブックファイルをオープンしようとした際に404エラーになった場合には、数分待ってから再トライしてください。ワークスペースで機能が有効化された際には、webappが設定フラグを取得するのに数分の時間差があります。

## Databricks repoに非ノートブックファイルをプルした後に`resource not found`エラー

Databricks Runtime 8.4以降を使用していない場合に、このエラーが発生する場合があります。repoで非ノートブックファイルを取り扱うには、Databricks Runtime 8.4以降が必要になります。

## 再クローンを提案するエラー

```
There was a problem with deleting folders. The repo could be in an inconsistent state and re-cloning is recommended.
```

このエラーは、Repoからフォルダーを削除する過程で問題が発生したことを示しています。これは、Repoに不整合が発生している状態であり、削除されたフォルダーが依然として存在していることを意味しています。このエラーが発生した場合には、状態をリセットするために削除、再クローンすることをお勧めします。

```
Unable to set repo to most recent state. This may be due to force pushes overriding commit history on the remote repo. Repo may be out of sync and re-cloning is recommended.
```

このエラーはローカルとGitの状態が乖離していることを示しています。これは、リモートのプッシュがローカルのリポジトリに存在している最近のコミットの上書きを強制した際に発生する場合があります。DatabricksではRepoのハードリセットをサポートしておらず、このエラーが発生した場合にはRepoの削除、再クローンをすることをお勧めします。

## 管理者がFiles in Reposを有効化したが、リモートのリポジトリをクローンしたり、既存のrepoにファイルをプルしても期待されるファイルが表示されない

- ブラウザーをリフレッシュし、新たな設定を取得するようにクラスターを再起動してください。
- クラスターはDatabricks Runtime 8.4以降が動作している必要があります。

### Databricks 無料トライアル

[Databricks 無料トライアル](https://databricks.com/jp/try-databricks)