Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Uyarı
Bu makale, üçüncü taraf tarafından geliştirilen Jenkins'i kapsar. Sağlayıcıya başvurmak için Jenkins Yardımı'na bakın.
CI/CD işlem hatlarınızı yönetmek ve çalıştırmak için kullanabileceğiniz çok sayıda CI/CD aracı vardır. Bu makalede Jenkins otomasyon sunucusunun nasıl kullanılacağı gösterilmektedir. CI/CD bir tasarım deseni olduğundan, bu makalede özetlenen adımlar ve aşamalar, her araçta işlem hattı tanım dilinde birkaç değişiklikle aktarılmalıdır. Ayrıca, bu örnek işlem hattındaki kodun büyük bir kısmı standart Python kodu çalıştırır ve diğer araçlarda çağırabilirsiniz. Azure Databricks'te CI/CD'ye genel bakış için bkz. Azure Databricks'te CI/CD.
Azure DevOps'u Azure Databricks ile kullanma hakkında bilgi için bkz Azure DevOps'u kullanarak Azure Databricks'te sürekli tümleştirme ve teslim.
CI/CD geliştirme iş akışı
Databricks, Jenkins ile CI/CD geliştirme için aşağıdaki iş akışını önerir:
- Üçüncü taraf Git sağlayıcınızla bir depo oluşturun veya mevcut bir depo kullanın.
- Yerel geliştirme makinenizi aynı üçüncü taraf deposuna bağlayın. Yönergeler için üçüncü taraf Git sağlayıcınıza ait belgelere bakın.
- Mevcut güncelleştirilmiş yapıtları (not defterleri, kod dosyaları ve derleme betikleri gibi) üçüncü taraf deposundan yerel geliştirme makinenize çekin.
- İstediğiniz gibi yerel geliştirme makinenizde yapıtlar oluşturun, güncelleştirin ve test edin. Ardından, yerel geliştirme makinenizdeki yeni ve değiştirilmiş yapıtları üçüncü taraf deposuna gönderin. Yönergeler için üçüncü taraf Git sağlayıcınızın documenation bölümüne bakın.
- Gerekirse 3. ve 4. adımları yineleyin.
- Jenkins'i üçüncü taraf deponuzdan yerel geliştirme makinenize veya Azure Databricks çalışma alanınıza otomatik olarak yapıtları çekmek için düzenli aralıklarla tümleşik bir yaklaşım olarak kullanın; yerel geliştirme makinenizde veya Azure Databricks çalışma alanınızda kod oluşturma, test etme ve çalıştırma; ve test ve çalıştırma sonuçlarını raporlama. Jenkins'i el ile çalıştırabilirsiniz ancak gerçek dünyadaki uygulamalarda üçüncü taraf Git sağlayıcınıza depo çekme isteği gibi belirli bir olay gerçekleştiğinde Jenkins'i çalıştırmasını bildirirsiniz.
Bu makalenin geri kalanında, yukarıdaki CI/CD geliştirme iş akışını uygulamak için Jenkins'i kullanmanın bir yolunu açıklamak için örnek bir proje kullanılır.
Jenkins yerine Azure DevOps kullanma hakkında bilgi için bkz . Azure DevOps kullanarak Azure Databricks'te sürekli tümleştirme ve teslim.
Yerel geliştirme makinesi kurulumu
Bu makalenin örneği, Databricks CLI ve Databricks Varlık Paketleri'ne aşağıdakileri yapmalarını bildirmek için Jenkins'i kullanır:
- Yerel geliştirme makinenizde bir Python tekerlek dosyası oluşturun.
- Yerel geliştirme makinenizden Azure Databricks çalışma alanına ek Python dosyaları ve Python not defterleriyle birlikte yerleşik Python tekerlek dosyasını dağıtın.
- Karşıya yüklenen Python wheel dosyasını ve not defterlerini bu çalışma alanında test edin ve çalıştırın.
Yerel geliştirme makinenizi Azure Databricks çalışma alanınıza bu örnekte derleme ve karşıya yükleme aşamalarını gerçekleştirme talimatı vermek üzere ayarlamak için yerel geliştirme makinenizde aşağıdakileri yapın:
1. Adım: Gerekli araçları yükleme
Bu adımda Databricks CLI, Jenkins jq
ve Python tekerlek derleme araçlarını yerel geliştirme makinenize yüklersiniz. Bu örneği çalıştırmak için bu araçlar gereklidir.
Henüz yapmadıysanız Databricks CLI sürüm 0.205 veya üzerini yükleyin. Jenkins, bu örneğin testini geçirmek ve çalışma alanınızda yönergeleri çalıştırmak için Databricks CLI'yi kullanır. Bkz. Databricks CLI'yı yükleme veya güncelleştirme.
Henüz yapmadıysanız Jenkins'i yükleyin ve başlatın. Bkz. Linux, macOS veya Windows için Jenkins'i yükleme.
jq'yi yükleyin. Bu örnek, JSON biçimli bazı komut çıkışlarını ayrıştırmak için kullanır
jq
.Şu komutu kullanarak
pip
Python tekerlek bina araçlarını yükleyin (bazı sistemlerdepip3
yerinepip
kullanmanız gerekebilir):pip install --upgrade wheel
2. Adım: Jenkins İşlem Hattı Oluşturma
Bu adımda, bu makalenin örneğine yönelik bir Jenkins İşlem Hattı oluşturmak için Jenkins'i kullanacaksınız. Jenkins, CI/CD işlem hatları oluşturmak için birkaç farklı proje türü sağlar. Jenkins Pipelines, Jenkins eklentilerini çağırmak ve yapılandırmak için Groovy kodunu kullanarak Jenkins İşlem Hattı'nda aşamaları tanımlamak için bir arabirim sağlar.
Jenkins'te Jenkins İşlem Hattı oluşturmak için:
- Jenkins'i başlattıktan sonra Jenkins Panonuzdan Yeni Öğe'ye tıklayın.
-
Öğe adı girin alanında Jenkins İşlem Hattı için bir ad yazın, örneğin
jenkins-demo
. - İşlem hattı proje türü simgesine tıklayın.
- Tamam'a tıklayın. Jenkins Boru Hattının Yapılandır sayfası görüntülenir.
- İşlem Hattı alanındaki Tanımlama açılan listesinde, SCM'den İşlem Hattı betiği seçin.
- SCM açılan listesinden Gitseçin.
- Depo URL'si için, üçüncü bölüm Git sağlayıcınız tarafından barındırılan deponun URL'sini yazın.
-
Dal Tanımlayıcısıiçin
*/<branch-name>
yazın; burada<branch-name>
, deponuzda kullanmak istediğiniz dalın adıdır; örneğin*/main
. - Henüz ayarlanmadıysa,
betik yolu için yazın. Bu makalede Jenkinsfile
öğesini daha sonra oluşturursunuz. - Zaten işaretliyse Basit kullanıma alma başlıklı kutunun işaretini kaldırın.
- Kaydet'e tıklayın.
3. Adım: Jenkins'e genel ortam değişkenleri ekleme
Bu adımda Jenkins'e üç genel ortam değişkeni ekleyeceksiniz. Jenkins bu ortam değişkenlerini Databricks CLI'ya geçirir. Databricks CLI,Azure Databricks çalışma alanınızda kimlik doğrulaması yapmak için bu ortam değişkenleri için değerlere ihtiyaç duyar. Bu örnekte hizmet sorumlusu için OAuth makineden makineye (M2M) kimlik doğrulaması kullanılmaktadır (ancak diğer kimlik doğrulama türleri de kullanılabilir). Azure Databricks çalışma alanınız için OAuth M2M kimlik doğrulamasını yapılandırmak üzere, OAuth kullanarak bir hizmet sorumlusu aracılığıyla Azure Databricks kaynaklarına katılımsız erişimi yetkilendirmek için bkz..
Bu örnek için üç genel ortam değişkeni şunlardır:
-
DATABRICKS_HOST
,https://
ile başlayan Azure Databricks çalışma alanı URL'niz olarak ayarlayın. Bkz: Çalışma alanı örneği adları, URL'ler ve kimlikler. -
DATABRICKS_CLIENT_ID
, aynı zamanda uygulama kimliği olarak da bilinen hizmet sorumlusunun istemci kimliği olacak şekilde ayarlanır. -
DATABRICKS_CLIENT_SECRET
, hizmet sorumlusunun Azure Databricks OAuth gizli anahtarına ayarlanır.
Jenkins'te genel ortam değişkenlerini ayarlamak için, Jenkins Panonuzdan:
- Kenar çubuğunda Jenkins'i Yönet'e tıklayın.
- Sistem Yapılandırması bölümünde Sistem'e tıklayın.
- Genel özellikler bölümünde, Kutucuklu Ortam değişkenleri kutusunu işaretleyin.
- Ekle'ye tıklayın ve ortam değişkeninin Ad ve Değer değerlerini girin. Bunu her ek ortam değişkeni için yineleyin.
- Ortam değişkenlerini eklemeyi bitirdiğinizde, Jenkins Panonuza dönmek için Kaydet'e tıklayın.
Jenkins İşlem Hattını Tasarlama
Jenkins, CI/CD işlem hatları oluşturmak için birkaç farklı proje türü sağlar. Bu örnek bir Jenkins İşlem Hattı uygular. Jenkins Pipelines, Jenkins eklentilerini çağırmak ve yapılandırmak için Groovy kodunu kullanarak Jenkins İşlem Hattı'nda aşamaları tanımlamak için bir arabirim sağlar.
Jenkins pipeline tanımını Jenkinsfile adlı bir metin dosyasına yazarsınız ve bu da projenin kaynak denetim deposunda denetlenebilir. Daha fazla bilgi için bkz . Jenkins İşlem Hattı. Bu makalenin örneği için Jenkins İşlem Hattı aşağıda verilmiştir. Bu örnekte Jenkinsfile
, aşağıdaki yer tutucuları değiştirin:
- Üçüncü taraf Git sağlayıcınız tarafından barındırılan kullanıcı adı ve depo adıyla
<user-name>
ve<repo-name>
değerlerini değiştirin. Bu makalede örnek olarak GitHub URL'si kullanılmaktadır. - Depo içindeki yayın dalının adıyla
<release-branch-name>
değerini değiştirin. Örneğin, bu olabilirmain
. -
<databricks-cli-installation-path>
yerine Databricks CLI'nın yüklü olduğu yerel geliştirme makinenizdeki yolu girin. Örneğin, macOS'ta bu olabilir/usr/local/bin
. -
<jq-installation-path>
'ı yerel geliştirme makinenizdejq
'in yüklü olduğu yol ile değiştirin. Örneğin, macOS'ta bu olabilir/usr/local/bin
. - çalışma alanınızda bu örnek için oluşturulan işleri benzersiz olarak tanımlamaya yardımcı olacak bir dizeyle
<job-prefix-name>
öğesini değiştirin. Örneğin, bu olabilirjenkins-demo
. -
BUNDLETARGET
değerinin, bu makalenin devamında tanımlanan Databricks Varlık Paketi hedefinin adı olandev
olarak ayarlandığına dikkat edin. Gerçek dünyadaki uygulamalarda bunu kendi paket hedefinizin adıyla değiştirirsiniz. Paket hedefleri hakkında daha fazla ayrıntı bu makalenin devamında verilmiştir.
Depo kökünüze eklemeniz gereken Jenkinsfile
burada:
// Filename: Jenkinsfile
node {
def GITREPOREMOTE = "https://github.com/<user-name>/<repo-name>.git"
def GITBRANCH = "<release-branch-name>"
def DBCLIPATH = "<databricks-cli-installation-path>"
def JQPATH = "<jq-installation-path>"
def JOBPREFIX = "<job-prefix-name>"
def BUNDLETARGET = "dev"
stage('Checkout') {
git branch: GITBRANCH, url: GITREPOREMOTE
}
stage('Validate Bundle') {
sh """#!/bin/bash
${DBCLIPATH}/databricks bundle validate -t ${BUNDLETARGET}
"""
}
stage('Deploy Bundle') {
sh """#!/bin/bash
${DBCLIPATH}/databricks bundle deploy -t ${BUNDLETARGET}
"""
}
stage('Run Unit Tests') {
sh """#!/bin/bash
${DBCLIPATH}/databricks bundle run -t ${BUNDLETARGET} run-unit-tests
"""
}
stage('Run Notebook') {
sh """#!/bin/bash
${DBCLIPATH}/databricks bundle run -t ${BUNDLETARGET} run-dabdemo-notebook
"""
}
stage('Evaluate Notebook Runs') {
sh """#!/bin/bash
${DBCLIPATH}/databricks bundle run -t ${BUNDLETARGET} evaluate-notebook-runs
"""
}
stage('Import Test Results') {
def DATABRICKS_BUNDLE_WORKSPACE_ROOT_PATH
def getPath = "${DBCLIPATH}/databricks bundle validate -t ${BUNDLETARGET} | ${JQPATH}/jq -r .workspace.file_path"
def output = sh(script: getPath, returnStdout: true).trim()
if (output) {
DATABRICKS_BUNDLE_WORKSPACE_ROOT_PATH = "${output}"
} else {
error "Failed to capture output or command execution failed: ${getPath}"
}
sh """#!/bin/bash
${DBCLIPATH}/databricks workspace export-dir \
${DATABRICKS_BUNDLE_WORKSPACE_ROOT_PATH}/Validation/Output/test-results \
${WORKSPACE}/Validation/Output/test-results \
-t ${BUNDLETARGET} \
--overwrite
"""
}
stage('Publish Test Results') {
junit allowEmptyResults: true, testResults: '**/test-results/*.xml', skipPublishingChecks: true
}
}
Bu makalenin geri kalanında, bu Jenkins İşlem Hattı'ndaki her aşama ve Jenkins'in bu aşamada çalışması için yapıtların ve komutların nasıl ayarlanacağı açıklanır.
Üçüncü taraf deposundan en son yapıtları çekme
Bu Jenkins İşlem Hattı'nın Checkout
ilk aşaması olan aşama aşağıdaki gibi tanımlanır:
stage('Checkout') {
git branch: GITBRANCH, url: GITREPOREMOTE
}
Bu aşama, Jenkins'in yerel geliştirme makinenizde kullandığı çalışma dizininin üçüncü taraf Git deponuzdan en son yapıtlara sahip olmasını sağlar. Jenkins genellikle bu çalışma dizinini olarak <your-user-home-directory>/.jenkins/workspace/<pipeline-name>
ayarlar. Bu, aynı yerel geliştirme makinesinde kendi yapıt kopyanızı Jenkins'in üçüncü taraf Git deponuzda kullandığı yapıtlardan ayrı tutmanızı sağlar.
Databricks Varlık Paketini Doğrulama
Bu Jenkins İşlem Hattı'nın Validate Bundle
ikinci aşaması olan aşama aşağıdaki gibi tanımlanır:
stage('Validate Bundle') {
sh """#!/bin/bash
${DBCLIPATH}/databricks bundle validate -t ${BUNDLETARGET}
"""
}
Bu aşama, yapıtlarınızı test edip çalıştırmak için iş akışlarını tanımlayan Databricks Varlık Paketinin söz dizimsel olarak doğru olmasını sağlar. Yalnızca paket olarak bilinen Databricks Varlık Paketleri, tam veri, analiz ve ML projelerini bir kaynak dosya koleksiyonu olarak ifade etmeye olanak sağlar. Bkz. Databricks Varlık Paketleri nedir?.
Bu makalenin paketini tanımlamak için yerel makinenizde kopyalanan deponun kökünde adlı databricks.yml
bir dosya oluşturun. Bu örnek databricks.yml
dosyada aşağıdaki yer tutucuları değiştirin:
-
<bundle-name>
değerini paket için benzersiz bir programatik adla değiştirin. Örneğin, bu olabilirjenkins-demo
. - çalışma alanınızda bu örnek için oluşturulan işleri benzersiz olarak tanımlamaya yardımcı olacak bir dizeyle
<job-prefix-name>
öğesini değiştirin. Örneğin, bu olabilirjenkins-demo
. Jenkinsfile dosyanızdakiJOBPREFIX
değeriyle eşleşmelidir. - değerini iş kümelerinizin Databricks Runtime sürüm kimliğiyle değiştirin
<spark-version-id>
, örneğin13.3.x-scala2.12
. -
<cluster-node-type-id>
'yi, iş kümelerinizin düğüm türü kimliğiyle değiştirin. ÖrneğinStandard_DS3_v2
. - Jenkinsfile içindeki
dev
iletargets
eşlemedekiBUNDLETARGET
'in aynı olduğuna dikkat edin. Paket hedefi, konağı ve ilgili dağıtım davranışlarını belirtir.
databricks.yml
Bu örneğin doğru çalışması için deponuzun köküne eklenmesi gereken dosya aşağıda verilmiştir:
# Filename: databricks.yml
bundle:
name: <bundle-name>
variables:
job_prefix:
description: A unifying prefix for this bundle's job and task names.
default: <job-prefix-name>
spark_version:
description: The cluster's Spark version ID.
default: <spark-version-id>
node_type_id:
description: The cluster's node type ID.
default: <cluster-node-type-id>
artifacts:
dabdemo-wheel:
type: whl
path: ./Libraries/python/dabdemo
resources:
jobs:
run-unit-tests:
name: ${var.job_prefix}-run-unit-tests
tasks:
- task_key: ${var.job_prefix}-run-unit-tests-task
new_cluster:
spark_version: ${var.spark_version}
node_type_id: ${var.node_type_id}
num_workers: 1
spark_env_vars:
WORKSPACEBUNDLEPATH: ${workspace.root_path}
notebook_task:
notebook_path: ./run_unit_tests.py
source: WORKSPACE
libraries:
- pypi:
package: pytest
run-dabdemo-notebook:
name: ${var.job_prefix}-run-dabdemo-notebook
tasks:
- task_key: ${var.job_prefix}-run-dabdemo-notebook-task
new_cluster:
spark_version: ${var.spark_version}
node_type_id: ${var.node_type_id}
num_workers: 1
data_security_mode: SINGLE_USER
spark_env_vars:
WORKSPACEBUNDLEPATH: ${workspace.root_path}
notebook_task:
notebook_path: ./dabdemo_notebook.py
source: WORKSPACE
libraries:
- whl: '/Workspace${workspace.root_path}/files/Libraries/python/dabdemo/dist/dabdemo-0.0.1-py3-none-any.whl'
evaluate-notebook-runs:
name: ${var.job_prefix}-evaluate-notebook-runs
tasks:
- task_key: ${var.job_prefix}-evaluate-notebook-runs-task
new_cluster:
spark_version: ${var.spark_version}
node_type_id: ${var.node_type_id}
num_workers: 1
spark_env_vars:
WORKSPACEBUNDLEPATH: ${workspace.root_path}
spark_python_task:
python_file: ./evaluate_notebook_runs.py
source: WORKSPACE
libraries:
- pypi:
package: unittest-xml-reporting
targets:
dev:
mode: development
Dosya databricks.yml
hakkında daha fazla bilgi için Databricks Varlık Paketi yapılandırması bölümüne bkz.
Paketi çalışma alanınıza dağıtma
Jenkins İşlem Hattı'nın başlıklı Deploy Bundle
üçüncü aşaması aşağıdaki gibi tanımlanır:
stage('Deploy Bundle') {
sh """#!/bin/bash
${DBCLIPATH}/databricks bundle deploy -t ${BUNDLETARGET}
"""
}
Bu aşama iki şey yapar:
-
artifact
dosyasındakidatabricks.yml
eşlemesiwhl
olarak ayarlandığından, bu, Databricks CLI'ya belirtilen konumdakisetup.py
dosyasını kullanarak Python tekerlek dosyasını oluşturmasını ister. - Python tekerlek dosyası yerel geliştirme makinenizde oluşturulduktan sonra Databricks CLI, yerleşik Python tekerlek dosyasını ve belirtilen Python dosyalarını ve not defterlerini Azure Databricks çalışma alanınıza dağıtır. Databricks Varlık Paketleri varsayılan olarak Python wheel dosyasını ve diğer dosyaları
/Workspace/Users/<your-username>/.bundle/<bundle-name>/<target-name>
öğesine dağıtır.
Python tekerlek dosyasının dosyada databricks.yml
belirtildiği gibi derlenmesini sağlamak için, yerel makinenizde kopyalanmış deponuzun kökünde aşağıdaki klasörleri ve dosyaları oluşturun.
Not defterinin çalıştırılacağı Python tekerlek dosyasının mantığını ve birim testlerini tanımlamak için, addcol.py
ve test_addcol.py
adlı iki dosya oluşturun ve bunları deponuzun python/dabdemo/dabdemo
klasöründeki Libraries
adına sahip bir klasör yapısına ekleyin (üç nokta, kısalık adına depoda atlanmış klasörleri gösterir).
├── ...
├── Libraries
│ └── python
│ └── dabdemo
│ └── dabdemo
│ ├── addcol.py
│ └── test_addcol.py
├── ...
Dosya, daha sonra bir Python Wheel dosyasına dönüştürülen ve ardından Azure Databricks kümesine kurulan bir kitaplık fonksiyonu içerir. Bu, bir Apache Spark DataFrame'e sabit bir değerle doldurulmuş yeni bir sütun ekleyen basit bir işlevdir.
# Filename: addcol.py
import pyspark.sql.functions as F
def with_status(df):
return df.withColumn("status", F.lit("checked"))
Dosya test_addcol.py
, with_status
içinde tanımlanan addcol.py
işlevine bir sahte DataFrame nesnesi geçirmeye ilişkin testler içerir. Sonuç daha sonra beklenen değerleri içeren bir DataFrame nesnesiyle karşılaştırılır. Değerler eşleşirse, ki bu örnekte eşleşiyorlar, test geçer.
# Filename: test_addcol.py
import pytest
from pyspark.sql import SparkSession
from dabdemo.addcol import *
class TestAppendCol(object):
def test_with_status(self):
spark = SparkSession.builder.getOrCreate()
source_data = [
("paula", "white", "paula.white@example.com"),
("john", "baer", "john.baer@example.com")
]
source_df = spark.createDataFrame(
source_data,
["first_name", "last_name", "email"]
)
actual_df = with_status(source_df)
expected_data = [
("paula", "white", "paula.white@example.com", "checked"),
("john", "baer", "john.baer@example.com", "checked")
]
expected_df = spark.createDataFrame(
expected_data,
["first_name", "last_name", "email", "status"]
)
assert(expected_df.collect() == actual_df.collect())
Databricks CLI'nın bu kitaplık kodunu bir Python tekerlek dosyasına doğru şekilde paketlemesini sağlamak için, önceki iki dosyayla aynı klasörde ve __init__.py
adlı __main__.py
iki dosya oluşturun. Ayrıca, klasörde aşağıdaki gibi görselleştirilmiş adlı setup.py
python/dabdemo
bir dosya oluşturun (üç nokta, kısa süre için atlanmış klasörleri gösterir):
├── ...
├── Libraries
│ └── python
│ └── dabdemo
│ ├── dabdemo
│ │ ├── __init__.py
│ │ ├── __main__.py
│ │ ├── addcol.py
│ │ └── test_addcol.py
│ └── setup.py
├── ...
Dosya kitaplığın __init__.py
sürüm numarasını ve yazarını içerir. Adınızla <my-author-name>
değiştirin.
# Filename: __init__.py
__version__ = '0.0.1'
__author__ = '<my-author-name>'
import sys, os
sys.path.append(os.path.join(os.path.dirname(__file__), "..", ".."))
Dosya kitaplığın __main__.py
giriş noktasını içerir:
# Filename: __main__.py
import sys, os
sys.path.append(os.path.join(os.path.dirname(__file__), "..", ".."))
from addcol import *
def main():
pass
if __name__ == "__main__":
main()
setup.py
dosyası, kütüphaneyi bir Python wheel dosyasına oluşturmak için ek ayarlar içerir.
<my-url>
, <my-author-name>@<my-organization>
ve <my-package-description>
anlamlı değerlerle değiştirin:
# Filename: setup.py
from setuptools import setup, find_packages
import dabdemo
setup(
name = "dabdemo",
version = dabdemo.__version__,
author = dabdemo.__author__,
url = "https://<my-url>",
author_email = "<my-author-name>@<my-organization>",
description = "<my-package-description>",
packages = find_packages(include = ["dabdemo"]),
entry_points={"group_1": "run=dabdemo.__main__:main"},
install_requires = ["setuptools"]
)
Python tekerleğinin bileşen mantığını test edin
Bu Run Unit Tests
evre, Jenkins İşlem Hattı'nın dördüncü aşaması olarak, bir kitaplığın derlenmiş hâlde çalıştığından emin olmak için mantığını test etmek amacıyla pytest
kullanır. Bu aşama aşağıdaki gibi tanımlanır:
stage('Run Unit Tests') {
sh """#!/bin/bash
${DBCLIPATH}/databricks bundle run -t ${BUNDLETARGET} run-unit-tests
"""
}
Bu aşamada, bir not defteri işini çalıştırmak için Databricks CLI kullanılır. Bu iş Python not defterini dosya adıyla run-unit-test.py
çalıştırır. Bu not defteri kitaplığın mantığına göre çalışır pytest
.
Bu örnekte birim testlerini çalıştırmak için, yerel makinenizdeki kopyalanmış deponuzun köküne aşağıdaki içeriklerle adlı run_unit_tests.py
bir Python not defteri dosyası ekleyin:
# Databricks notebook source
# COMMAND ----------
# MAGIC %sh
# MAGIC
# MAGIC mkdir -p "/Workspace${WORKSPACEBUNDLEPATH}/Validation/reports/junit/test-reports"
# COMMAND ----------
# Prepare to run pytest.
import sys, pytest, os
# Skip writing pyc files on a readonly filesystem.
sys.dont_write_bytecode = True
# Run pytest.
retcode = pytest.main(["--junit-xml", f"/Workspace{os.getenv('WORKSPACEBUNDLEPATH')}/Validation/reports/junit/test-reports/TEST-libout.xml",
f"/Workspace{os.getenv('WORKSPACEBUNDLEPATH')}/files/Libraries/python/dabdemo/dabdemo/"])
# Fail the cell execution if there are any test failures.
assert retcode == 0, "The pytest invocation failed. See the log for details."
Yerleşik Python tekerleğini kullanma
Adlı Run Notebook
bu Jenkins İşlem Hattının beşinci aşaması, yerleşik Python tekerlek dosyasındaki mantığı çağıran bir Python not defterini aşağıdaki gibi çalıştırır:
stage('Run Notebook') {
sh """#!/bin/bash
${DBCLIPATH}/databricks bundle run -t ${BUNDLETARGET} run-dabdemo-notebook
"""
}
Bu aşama Databricks CLI'yı çalıştırır ve çalışma alanınıza bir not defteri işi çalıştırma talimatını da sağlar. Bu not defteri bir DataFrame nesnesi oluşturur, kitaplığın with_status
işlevine geçirir, sonucu yazdırır ve işin çalıştırma sonuçlarını bildirir. Yerel geliştirme makinenizde kopyalanmış deponuzun kökünde aşağıdaki içeriklere sahip adlı dabdaddemo_notebook.py
bir Python not defteri dosyası ekleyerek not defterini oluşturun:
# Databricks notebook source
# COMMAND ----------
# Restart Python after installing the wheel.
dbutils.library.restartPython()
# COMMAND ----------
from dabdemo.addcol import with_status
df = (spark.createDataFrame(
schema = ["first_name", "last_name", "email"],
data = [
("paula", "white", "paula.white@example.com"),
("john", "baer", "john.baer@example.com")
]
))
new_df = with_status(df)
display(new_df)
# Expected output:
#
# +------------+-----------+-------------------------+---------+
# │first_name │last_name │email │status |
# +============+===========+=========================+=========+
# │paula │white │paula.white@example.com │checked |
# +------------+-----------+-------------------------+---------+
# │john │baer │john.baer@example.com │checked |
# +------------+-----------+-------------------------+---------+
Not defteri görev çalıştırma sonuçlarını değerlendirme
Bu Evaluate Notebook Runs
Jenkins İşlem Hattının altıncı aşaması olan aşama, önceki not defteri işi çalıştırmasının sonuçlarını değerlendirir. Bu aşama aşağıdaki gibi tanımlanır:
stage('Evaluate Notebook Runs') {
sh """#!/bin/bash
${DBCLIPATH}/databricks bundle run -t ${BUNDLETARGET} evaluate-notebook-runs
"""
}
Bu aşama Databricks CLI'yı çalıştırır ve bu da çalışma alanınıza bir Python dosya işi çalıştırmasını emreder. Bu Python dosyası, not defteri işi çalıştırması için hata ve başarı ölçütlerini belirler ve bu hata veya başarı sonucunu bildirir. Yerel geliştirme makinenizde kopyalanmış deponuzun kökünde aşağıdaki içeriklere sahip adlı evaluate_notebook_runs.py
bir dosya oluşturun:
import unittest
import xmlrunner
import json
import glob
import os
class TestJobOutput(unittest.TestCase):
test_output_path = f"/Workspace${os.getenv('WORKSPACEBUNDLEPATH')}/Validation/Output"
def test_performance(self):
path = self.test_output_path
statuses = []
for filename in glob.glob(os.path.join(path, '*.json')):
print('Evaluating: ' + filename)
with open(filename) as f:
data = json.load(f)
duration = data['tasks'][0]['execution_duration']
if duration > 100000:
status = 'FAILED'
else:
status = 'SUCCESS'
statuses.append(status)
f.close()
self.assertFalse('FAILED' in statuses)
def test_job_run(self):
path = self.test_output_path
statuses = []
for filename in glob.glob(os.path.join(path, '*.json')):
print('Evaluating: ' + filename)
with open(filename) as f:
data = json.load(f)
status = data['state']['result_state']
statuses.append(status)
f.close()
self.assertFalse('FAILED' in statuses)
if __name__ == '__main__':
unittest.main(
testRunner = xmlrunner.XMLTestRunner(
output = f"/Workspace${os.getenv('WORKSPACEBUNDLEPATH')}/Validation/Output/test-results",
),
failfast = False,
buffer = False,
catchbreak = False,
exit = False
)
Test sonuçlarını içeri aktarma ve raporlama
Adlı Import Test Results
bu Jenkins İşlem Hattı'nın yedinci aşaması, test sonuçlarını çalışma alanınızdan yerel geliştirme makinenize göndermek için Databricks CLI'sini kullanır. başlıklı Publish Test Results
sekizinci ve son aşama, Jenkins eklentisini kullanarak test sonuçlarını Jenkins'e junit
yayımlar. Bu, test sonuçlarının durumuyla ilgili raporları ve panoları görselleştirmenizi sağlar. Bu aşamalar aşağıdaki gibi tanımlanır:
stage('Import Test Results') {
def DATABRICKS_BUNDLE_WORKSPACE_FILE_PATH
def getPath = "${DBCLIPATH}/databricks bundle validate -t ${BUNDLETARGET} | ${JQPATH}/jq -r .workspace.file_path"
def output = sh(script: getPath, returnStdout: true).trim()
if (output) {
DATABRICKS_BUNDLE_WORKSPACE_FILE_PATH = "${output}"
} else {
error "Failed to capture output or command execution failed: ${getPath}"
}
sh """#!/bin/bash
${DBCLIPATH}/databricks workspace export-dir \
${DATABRICKS_BUNDLE_WORKSPACE_FILE_PATH}/Validation/Output/test-results \
${WORKSPACE}/Validation/Output/test-results \
--overwrite
"""
}
stage('Publish Test Results') {
junit allowEmptyResults: true, testResults: '**/test-results/*.xml', skipPublishingChecks: true
}
Tüm kod değişikliklerini üçüncü taraf deponuza gönderme
Şimdi yerel geliştirme makinenizdeki kopyalanmış deponuzun içeriğini üçüncü taraf deponuza göndermeniz gerekir. Göndermeden önce kopyaladığınız depodaki dosyaya .gitignore
aşağıdaki girdileri eklemelisiniz çünkü büyük olasılıkla iç Databricks Varlık Paketi çalışma dosyalarını, doğrulama raporlarını, Python derleme dosyalarını ve Python önbelleklerini üçüncü taraf deponuza göndermemelisiniz. Genellikle, potansiyel olarak güncel olmayan doğrulama raporları ve Python tekerleği derlemelerini kullanmak yerine Azure Databricks çalışma alanınızda yeni doğrulama raporlarını ve en son Python derlemelerini yeniden oluşturmak istersiniz.
.databricks/
.vscode/
Libraries/python/dabdemo/build/
Libraries/python/dabdemo/__pycache__/
Libraries/python/dabdemo/dabdemo.egg-info/
Validation/
Jenkins İşlem Hattınızı çalıştırma
Artık Jenkins İşlem Hattınızı el ile çalıştırmaya hazırsınız. Bunu yapmak için Jenkins Panonuzdan:
- Jenkins İşlem Hattınızın adına tıklayın.
- Kenar çubuğunda Şimdi Oluştur'a tıklayın.
- Sonuçları görmek için en son Pipeline çalıştırmasına (örneğin,
#1
) ve ardından Konsol Çıkışı'na tıklayın.
Bu noktada CI/CD işlem hattı bir tümleştirme ve dağıtım döngüsünü tamamlamıştır. Bu işlemi otomatikleştirerek kodunuzun verimli, tutarlı ve yinelenebilir bir işlem tarafından test edilmesini ve dağıtılmasını sağlayabilirsiniz. Üçüncü taraf Git sağlayıcınıza depo çekme isteği gibi belirli bir olay gerçekleştiğinde Jenkins'i çalıştırmasını bildirmek için üçüncü taraf Git sağlayıcınıza ait belgelere bakın.