Menguji, menyinkronkan, dan men-deploy DAG dari GitHub

Cloud Composer 1 | Cloud Composer 2

Panduan ini menjelaskan cara membuat pipeline CI/CD untuk menguji, menyinkronkan, dan men-deploy DAG ke lingkungan Cloud Composer Anda dari repositori GitHub Anda.

Jika Anda hanya ingin menyinkronkan data dari layanan lain, lihat Mentransfer data dari layanan lain.

Ringkasan pipeline CI/CD

Diagram arsitektur yang menampilkan langkah-langkah alur. Peninjauan pra-pengiriman dan PR ada di bagian GitHub, sedangkan sinkronisasi DAG dan verifikasi DAG manual ada di bagian Google Cloud.
Gambar 1. Diagram arsitektur yang menampilkan langkah-langkah alur (klik untuk memperbesar)

Pipeline CI/CD untuk menguji, menyinkronkan, dan men-deploy DAG memiliki langkah-langkah berikut:

  1. Anda membuat perubahan pada DAG dan mengirim perubahan tersebut ke cabang pengembangan di repositori Anda.

  2. Anda membuka permintaan pull terhadap cabang utama repositori Anda.

  3. Cloud Build menjalankan pengujian unit untuk memeriksa apakah DAG Anda valid.

  4. Permintaan pull Anda disetujui dan digabungkan ke cabang utama repositori Anda.

  5. Cloud Build menyinkronkan lingkungan Cloud Composer pengembangan Anda dengan perubahan baru tersebut.

  6. Anda memverifikasi bahwa DAG berperilaku seperti yang diharapkan di lingkungan pengembangan Anda.

  7. Jika DAG berfungsi seperti yang diharapkan, Anda harus mengupload DAG ke lingkungan Cloud Composer produksi.

Tujuan

Sebelum memulai

  • Panduan ini mengasumsikan bahwa Anda menggunakan dua lingkungan Cloud Composer yang identik: lingkungan pengembangan dan lingkungan produksi.

    Untuk keperluan panduan ini, Anda mengonfigurasi pipeline CI/CD hanya untuk lingkungan pengembangan Anda. Pastikan lingkungan yang Anda gunakan bukan lingkungan produksi.

  • Panduan ini mengasumsikan bahwa Anda memiliki DAG dan pengujiannya disimpan di repositori GitHub.

    Contoh pipeline CI/CD menunjukkan konten repositori contoh. DAG dan pengujian disimpan di direktori dags/, dengan file persyaratan, file batasan, dan file konfigurasi Cloud Build yang disimpan di level atas. Utilitas sinkronisasi DAG dan persyaratannya terletak di direktori utils.

Membuat tugas pemeriksaan pra-pengiriman dan pengujian unit

Tugas Cloud Build pertama menjalankan pemeriksaan pra-pengiriman, yang menjalankan pengujian unit untuk DAG Anda.

Menambahkan pengujian unit

Buat pengujian unit untuk DAG Anda, jika belum melakukannya. Simpan pengujian ini bersama DAG di repositori Anda, masing-masing dengan akhiran _test. Misalnya, file pengujian untuk DAG di example_dag.py adalah example_dag_test.py. Pengujian ini berjalan sebagai pemeriksaan pra-pengiriman di repositori Anda.

Membuat konfigurasi YAML Cloud Build untuk pemeriksaan pra-pengiriman

Di repositori Anda, buat file YAML bernama test-dags.cloudbuild.yaml yang mengonfigurasi tugas Cloud Build untuk pemeriksaan pra-pengiriman. Di dalamnya, ada tiga langkah:

  1. Instal dependensi yang diperlukan oleh DAG Anda.
  2. Instal dependensi yang diperlukan oleh pengujian unit Anda.
  3. Jalankan pengujian DAG.

steps:
  # install dependencies
  - name: python:3.8-slim
    entrypoint: pip
    args: ["install", "-r", "requirements.txt", "-c", "constraints.txt", "--user"]

  - name: python:3.8-slim
    entrypoint: pip
    args: ["install", "-r", "requirements-test.txt", "--user"]

  # run in python 3.8 which is latest version in Cloud Composer
  - name: python:3.8-slim
    entrypoint: python3.8
    args: ["-m", "pytest", "-s", "dags/"]

Membuat pemicu Cloud Build untuk pemeriksaan prapengiriman

Ikuti panduan Membuat repositori dari GitHub untuk membuat pemicu berbasis aplikasi GitHub dengan konfigurasi berikut:

  • Name: test-dags

  • Peristiwa: Pull Request

  • Sumber - Repositori: pilih repositori Anda

  • Sumber - Cabang dasar: ^main$ (ubah main menjadi nama cabang dasar repositori Anda, jika diperlukan)

  • Sumber - Kontrol Komentar: tidak diperlukan

  • Konfigurasi Build - File konfigurasi build cloud: /test-dags.cloudbuild.yaml (jalur ke file build Anda)

Membuat tugas sinkronisasi DAG dan menambahkan skrip utilitas DAG

Selanjutnya, konfigurasikan tugas Cloud Build yang menjalankan skrip utilitas DAG. Skrip utilitas dalam tugas ini menyinkronkan DAG Anda dengan lingkungan Cloud Composer Anda setelah digabungkan ke cabang utama dalam repositori Anda.

Menambahkan skrip utilitas DAG

Tambahkan skrip utilitas DAG ke repositori Anda. Skrip utilitas ini menyalin semua file DAG di direktori dags/ repositori Anda ke direktori sementara, dengan mengabaikan semua file Python non-DAG. Skrip tersebut kemudian menggunakan library klien Cloud Storage untuk mengupload semua file dari direktori sementara tersebut ke direktori dags/ di bucket lingkungan Cloud Composer Anda.

from __future__ import annotations

import argparse
import glob
import os
from shutil import copytree, ignore_patterns
import tempfile

# Imports the Google Cloud client library
from google.cloud import storage

def _create_dags_list(dags_directory: str) -> tuple[str, list[str]]:
    temp_dir = tempfile.mkdtemp()

    # ignore non-DAG Python files
    files_to_ignore = ignore_patterns("__init__.py", "*_test.py")

    # Copy everything but the ignored files to a temp directory
    copytree(dags_directory, f"{temp_dir}/", ignore=files_to_ignore, dirs_exist_ok=True)

    # The only Python files left in our temp directory are DAG files
    # so we can exclude all non Python files
    dags = glob.glob(f"{temp_dir}/*.py")
    return (temp_dir, dags)

def upload_dags_to_composer(
    dags_directory: str, bucket_name: str, name_replacement: str = "dags/"
) -> None:
    """
    Given a directory, this function moves all DAG files from that directory
    to a temporary directory, then uploads all contents of the temporary directory
    to a given cloud storage bucket
    Args:
        dags_directory (str): a fully qualified path to a directory that contains a "dags/" subdirectory
        bucket_name (str): the GCS bucket of the Cloud Composer environment to upload DAGs to
        name_replacement (str, optional): the name of the "dags/" subdirectory that will be used when constructing the temporary directory path name Defaults to "dags/".
    """
    temp_dir, dags = _create_dags_list(dags_directory)

    if len(dags) > 0:
        # Note - the GCS client library does not currently support batch requests on uploads
        # if you have a large number of files, consider using
        # the Python subprocess module to run gsutil -m cp -r on your dags
        # See https://cloud.google.com/storage/docs/gsutil/commands/cp for more info
        storage_client = storage.Client()
        bucket = storage_client.bucket(bucket_name)

        for dag in dags:
            # Remove path to temp dir
            dag = dag.replace(f"{temp_dir}/", name_replacement)

            try:
                # Upload to your bucket
                blob = bucket.blob(dag)
                blob.upload_from_filename(dag)
                print(f"File {dag} uploaded to {bucket_name}/{dag}.")
            except FileNotFoundError:
                current_directory = os.listdir()
                print(
                    f"{name_replacement} directory not found in {current_directory}, you may need to override the default value of name_replacement to point to a relative directory"
                )
                raise

    else:
        print("No DAGs to upload.")

if __name__ == "__main__":
    parser = argparse.ArgumentParser(
        description=__doc__, formatter_class=argparse.RawDescriptionHelpFormatter
    )
    parser.add_argument(
        "--dags_directory",
        help="Relative path to the source directory containing your DAGs",
    )
    parser.add_argument(
        "--dags_bucket",
        help="Name of the DAGs bucket of your Composer environment without the gs:// prefix",
    )

    args = parser.parse_args()

    upload_dags_to_composer(args.dags_directory, args.dags_bucket)

Membuat konfigurasi YAML Cloud Build untuk menyinkronkan DAG

Di repositori Anda, buat file YAML bernama add-dags-to-composer.cloudbuild.yaml yang mengonfigurasi tugas Cloud Build untuk menyinkronkan DAG. Di dalamnya, ada dua langkah:

  1. Instal dependensi yang diperlukan oleh skrip utilitas DAG.

  2. Jalankan skrip utilitas untuk menyinkronkan DAG di repositori Anda dengan lingkungan Cloud Composer Anda.

steps:
  # install dependencies
  - name: python
    entrypoint: pip
    args: ["install", "-r", "utils/requirements.txt", "--user"]

  # run
  - name: python
    entrypoint: python
    args: ["utils/add_dags_to_composer.py", "--dags_directory=${_DAGS_DIRECTORY}", "--dags_bucket=${_DAGS_BUCKET}"]

Membuat pemicu Cloud Build

Ikuti panduan Membuat repositori dari GitHub untuk membuat pemicu berbasis aplikasi GitHub dengan konfigurasi berikut:

  • Name: add-dags-to-composer

  • Peristiwa: Kirim ke cabang

  • Sumber - Repositori: pilih repositori Anda

  • Sumber - Cabang dasar: ^main$ (ubah main menjadi nama cabang dasar repositori Anda, jika diperlukan)

  • Sumber - Filter file yang disertakan (glob): dags/**

  • Konfigurasi Build - File konfigurasi build cloud: /add-dags-to-composer.cloudbuild.yaml (jalur ke file build Anda)

Dalam Konfigurasi lanjutan, tambahkan dua variabel substitusi:

  • _DAGS_DIRECTORY - direktori tempat dags berada di repositori Anda. Jika Anda menggunakan repositori contoh dari panduan ini, kodenya adalah dags/.

  • _DAGS_BUCKET - bucket Cloud Storage yang berisi direktori dags/ di lingkungan Cloud Composer pengembangan Anda. Hapus awalan gs://. Contoh: us-central1-example-env-1234ab56-bucket.

Menguji pipeline CI/CD

Di bagian ini, ikuti alur pengembangan DAG yang menggunakan pemicu Cloud Build yang baru Anda buat.

Menjalankan tugas prapengiriman

Buat permintaan pull ke cabang utama untuk menguji build Anda. Temukan pemeriksaan pra-pengiriman Anda di halaman tersebut. Klik Details dan pilih View more details on Google Cloud Build untuk melihat log build di Google Cloud Console.

Screenshot pemeriksaan github yang disebut test-dags dengan panah merah yang menunjuk ke nama project dalam tanda kurung
Gambar 2. Screenshot status pemeriksaan pra-pengiriman Cloud Build di GitHub (klik untuk memperbesar)

Jika pemeriksaan pra-pengiriman Anda gagal, lihat Mengatasi kegagalan build.

Memvalidasi bahwa DAG berfungsi di lingkungan Cloud Composer pengembangan Anda

Setelah permintaan pull Anda disetujui, gabungkan ke cabang utama Anda. Gunakan konsol Google Cloud untuk melihat hasil build Anda. Jika memiliki banyak pemicu Cloud Build, Anda dapat memfilter build berdasarkan nama pemicu add-dags-to-composer.

Setelah tugas sinkronisasi Cloud Build berhasil, DAG yang disinkronkan akan muncul di lingkungan Cloud Composer pengembangan Anda. Di sana, Anda dapat memvalidasi bahwa DAG berfungsi seperti yang diharapkan.

Menambahkan DAG ke lingkungan produksi

Setelah DAG berfungsi seperti yang diharapkan, tambahkan secara manual ke lingkungan produksi Anda. Untuk melakukannya, upload file DAG ke direktori dags/ di bucket lingkungan Cloud Composer produksi Anda.

Jika tugas sinkronisasi DAG gagal atau jika DAG tidak berperilaku seperti yang diharapkan di lingkungan Cloud Composer pengembangan, lihat Mengatasi kegagalan build.

Mengatasi kegagalan build

Bagian ini menjelaskan cara mengatasi skenario kegagalan build umum.

Bagaimana jika pemeriksaan pra-pengiriman saya gagal?

Dari permintaan pull Anda, klik Details, lalu pilih View more details on Google Cloud Build untuk melihat log build di Konsol Google Cloud. Gunakan log ini untuk membantu Anda men-debug masalah pada DAG. Setelah masalahnya teratasi, lakukan perbaikan dan kirim ke cabang Anda. Pemeriksaan pra-pengiriman akan berjalan lagi, dan Anda dapat terus melakukan iterasi menggunakan log sebagai alat proses debug.

Bagaimana jika tugas sinkronisasi DAG saya gagal?

Gunakan konsol Google Cloud untuk melihat hasil build. Jika memiliki banyak pemicu Cloud Build, Anda dapat memfilter build berdasarkan nama pemicu add-dags-to-composer. Periksa log tugas build dan selesaikan error. Jika Anda memerlukan bantuan lainnya untuk mengatasi error, gunakan saluran dukungan.

Bagaimana jika DAG saya tidak berfungsi dengan baik di lingkungan Cloud Composer saya?

Jika DAG tidak berfungsi seperti yang diharapkan di lingkungan Cloud Composer pengembangan, jangan promosikan DAG secara manual ke lingkungan Cloud Composer produksi Anda. Sebagai gantinya, lakukan salah satu hal berikut:

  • Kembalikan permintaan pull dengan perubahan yang merusak DAG untuk memulihkannya ke status segera sebelum perubahan Anda (tindakan ini juga akan mengembalikan semua file lain dalam permintaan pull tersebut).
  • Buat permintaan pull baru untuk mengembalikan perubahan secara manual pada DAG yang rusak.
  • Buat permintaan pull baru untuk memperbaiki error di DAG Anda.

Mengikuti salah satu langkah ini akan memicu pemeriksaan pra-pengiriman baru dan setelah penggabungan, tugas sinkronisasi DAG.

Langkah selanjutnya