6
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

GitHub Actions + DatabricksでCI/CDを実現してみる

6
Last updated at Posted at 2022-05-07

はじめに

前回「databricks と pytest の integration を試してみる」にて、pytestのリモート実行を可能にしたため、今回は一歩進めてgithub actionsを利用して、pushやpull request時に自動的にpytestが実行されるように設定してみたいと思います。

イメージはこんな感じ
image.png

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ボタンをクリックして、自分のアカウント上に作成します。

image.png

2. GitHub SecretsへDatabricks Tokenの登録

DatabricksのWorkspaceにアクセスするために、Tokenが必要になります。これらをGitHub Actionのワークフローに平文で書くのはセキュリティ上推奨されませんので、GitHub Secretsを使って予め登録しておきます。

Databricksのアクセストークンは、Setting -> User Settings -> Access Token にて生成することができます。Databricks Access Tokenの生成

今回は、dbTokenというキーで、登録しました。
image.png

3. Databricks Job実行(Run Submit)用のjsonファイル作成

以前の記事でも作成しましたが、DatabriksのリモートJob実行のために、jsonファイルを用意しておきます。
今回はこちらのrun submit.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を作成しておきます。
image.png

今回は以下のようなワークフローを作成しました。upload_wheel.yml

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上から確認できます。

image.png

DatabricksのJob UIでもJob Statusが確認できます。
image.png

これで、pull requestをもとにGitHub Actionによるワークフローが実行されて、databricks上でpytestが行われる連携ができました。
最後にDatabricksのGit連携を行い、コードをプッシュして確認したいと思います。

6. DatabricksとGit連携設定

こちらの記事を参考にGit連携を行います。Repositoryは先ほどForkしたレポジトリーになります。

image.png

適当に新規のノートブック(github_test)を作成し、先ほどGitHub上で作成したBranchを選択しcommit&pushします。
(Commit&Pushだけだと、Pull Request作成されませんが、今回はPull Request中のBranchへの変更のためトリガーが発動します)

image.png

Job画面を見ると、新規のJobが実行されていることがわかります。
image.png

python コードをノートブック形式で表示するには?

今回のオリジナルコードが、.py で作成されているため、Databricksノートブック上で表示するとシンプルなエディターになってしまいますが、pythonファイルの先頭に ## Databricks notebook source を追加して、インポートするとノートブック形式で利用できます。
(一度インポートした後に修正すると、再インポートが必要になります)

image.png

最後に

このようにGitHub Actionsと連携すると、CI/CDが簡単に実現できそうです。他のDatabricks Workspace上でテスト実行するなども可能になります。是非お試しください。

Workflowを含むリポジトリ

今回私がForkして、Workflowを作成したリポジトリはこちらです。

6
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?