はじめに
前回「databricks と pytest の integration を試してみる」にて、pytestのリモート実行を可能にしたため、今回は一歩進めてgithub actionsを利用して、pushやpull request時に自動的にpytestが実行されるように設定してみたいと思います。
GitHub Actionsとは
GitHub上のリポジトリやイシューに対するさまざまな操作をトリガーとしてあらかじめ定義しておいた処理を実行できる機能で、今まで外部サービスとの連携が必要だった自動テストや自動ビルドなどがGitHubだけで実現できるようになります。しかもある程度までの規模であればフリーで利用できるというありがたいサービスです。従来よりも簡単にCI/CDを実現することが出来るようになります。
こちらのさくらナレッジさんの「GitHubの新機能「GitHub Actions」で試すCI/CD」で使い方など分かりやすくまとめていただいております。
またGitHub Learning Labで気軽に試すことができます。
DatabricksとGitHub Actions
databricksはGitHub Actions用に以下の2つのワークフローを用意されてます。これによりノートブックの実行や、ファイルのアップロード手順が簡素化されます。今回はupload-dbfs-tempのActionを利用したいと思います。
・ databricks/run-notebook
・ databricks/upload-dbfs-temp
1. リポジトリのFork
今回は、前回利用したコードを利用して実装してみたいと思います。Github actionsを利用するためにはRepository Ownerになる必要があるため、一旦repositoryをforkしておきます。右上の Forkボタンをクリックして、自分のアカウント上に作成します。
2. GitHub SecretsへDatabricks Tokenの登録
DatabricksのWorkspaceにアクセスするために、Tokenが必要になります。これらをGitHub Actionのワークフローに平文で書くのはセキュリティ上推奨されませんので、GitHub Secretsを使って予め登録しておきます。
Databricksのアクセストークンは、Setting -> User Settings -> Access Token にて生成することができます。Databricks Access Tokenの生成
3. Databricks Job実行(Run Submit)用のjsonファイル作成
以前の記事でも作成しましたが、DatabriksのリモートJob実行のために、jsonファイルを用意しておきます。
今回はこちらのrun submit.jsonファイルを用意しました。内容の詳細は以前の記事をご覧ください。
{
"run_name": "jmaru_DatabricksTestsExample",
"new_cluster": {
"spark_version": "10.4.x-scala2.12",
"node_type_id": "i3.xlarge",
"num_workers": 1
},
"timeout_seconds": 3600,
"libraries": [
{ "pypi": { "package": "pytest==5.3.5" } },
{ "whl": "dbfs:/tmp/jmaru/jobs/myapp/databricks_tests_example-0.0.1-py3-none-any.whl" }
],
"spark_python_task": {
"python_file": "dbfs:/tmp/jmaru/jobs/myapp/run_tests.py",
"parameters": [ "--pyargs", "tests", "-s", "-v", "--junit-xml", "dbfs:/tmp/jmaru/jobs/myapp/junit.xml" ]
}
}
4. GitHub Action Workflowの作成
Forkしたリポジトリ上にAction Workflowファイルを作成します。.github/workflows/upload_wheel.yml GitHub Actionsでは、./github/workflows ディレクトリにWorkflowファイルを作成するのがルールです。
今回は、新規のBranch上に作成し、Pull Requestを作成しておきます。

今回は以下のようなワークフローを作成しました。upload_wheel.yml
name: Databricks Pytest Integration test.
on:
[pull_request]
env:
DATABRICKS_HOST: https://xxxxxxx.cloud.databricks.com/ #(対象となるWorkspace URLを入力)
DATABRICKS_TOKEN: ${{ secrets.dbToken }} #先ほど登録したGitHub Secretsを呼び出す
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Checks out the repo
uses: actions/checkout@v2
# run_tests.py をDBFS上にアップロード。databricksが提供している upload-dbfs-tempを活用
- name: Upload main file
uses: databricks/upload-dbfs-temp@v0
id: upload_file
with:
local-path: test-harness/databricks_test_harness/run_tests.py
dbfs-temp-dir: 'dbfs:/tmp/jmaru/jobs/myapp/'
# Wheelによるパッケージ化
- name: Setup python
uses: actions/setup-python@v2
- name: Install wheel
run: pip install wheel
- name: Build wheel
working-directory: ./example
run:
python setup.py bdist_wheel
# Wheel fileのアップロード
- name: Upload Wheel
uses: databricks/upload-dbfs-temp@v0
id: upload_wheel
with:
local-path: example/dist/databricks_tests_example-0.0.1-py3-none-any.whl
dbfs-temp-dir: 'dbfs:/tmp/jmaru/jobs/myapp/'
# databricks run submit実行のため、databricks-cli のインストール
- name: install databricks cli
run: pip install databricks-cli
# run submit(Job API)の実行
- name: Trigger run submit
working-directory: ./example
run:
databricks runs submit --json-file run_submit.json
databricks/uplpoad-dbfs-temp アクションで実行したものは、処理実行後にポスト処理でアップロードしたファイルが削除されるため注意。残したい場合は、copy処理を付け足したり、普通にdatabricks-cliの機能を使う方がベターかと。
5. 実行確認
上記ワークフローファイルをCommitし、Pull Requestが作成または更新されると、GitHub Action Workflowが実行されます。(今回はPull Requestをトリガーとしたため)実行ステータスもGitHub上から確認できます。
DatabricksのJob UIでもJob Statusが確認できます。

これで、pull requestをもとにGitHub Actionによるワークフローが実行されて、databricks上でpytestが行われる連携ができました。
最後にDatabricksのGit連携を行い、コードをプッシュして確認したいと思います。
6. DatabricksとGit連携設定
こちらの記事を参考にGit連携を行います。Repositoryは先ほどForkしたレポジトリーになります。
適当に新規のノートブック(github_test)を作成し、先ほどGitHub上で作成したBranchを選択しcommit&pushします。
(Commit&Pushだけだと、Pull Request作成されませんが、今回はPull Request中のBranchへの変更のためトリガーが発動します)
Job画面を見ると、新規のJobが実行されていることがわかります。

python コードをノートブック形式で表示するには?
今回のオリジナルコードが、.py で作成されているため、Databricksノートブック上で表示するとシンプルなエディターになってしまいますが、pythonファイルの先頭に ## Databricks notebook source を追加して、インポートするとノートブック形式で利用できます。
(一度インポートした後に修正すると、再インポートが必要になります)
最後に
このようにGitHub Actionsと連携すると、CI/CDが簡単に実現できそうです。他のDatabricks Workspace上でテスト実行するなども可能になります。是非お試しください。
Workflowを含むリポジトリ
今回私がForkして、Workflowを作成したリポジトリはこちらです。






