iT邦幫忙

2023 iThome 鐵人賽

DAY 19
1

上一篇提到 dbt 的 CI 檢查項目,接下來 CI 過了要自動 deploy,dbt deploy 要做什麼以及有什麼注意事項嗎?

  • deploy 到正式環境要達成的事項

    • 更新 data warehouse 的資料: 這次變更的 model 需要再跑一次 dbt run,更新正式資料庫的資料
    • 更新 models.sql 檔案到正式環境
    • 產生新的 dbt doc: dbt 的一個功能是產生 table 關聯圖及文件說明,因此要更新這些內容
  • 以下為 deploy 時要做的事

    1. 以下與 CI 項目類似
    sh "dbt clean" 
    sh "dbt deps " 
    sh "dbt compile "
    
    1. dbt build 為正式環境,因此移除 CI 中的 --vars 'env: staging'
    sh "dbt build --select ${files} --exclude 'source:*'" 
    
    1. 複製檔案到正式環境
    sh "gsutil rsync -r {dbt-folder/from jenkins env} {gs://dbt-folder}"
    sh "gsutil  rsync -r {gs://dbt-folder} {production-vm /dbt-folder}"
    
    1. 正式環境執行 dbt 文件更新
    sh "docker run --rm \
    --env GOOGLE_APPLICATION_CREDENTIALS=/root/credentials.json \
    --volume /opt/auth/credentials.json:/root/credentials.json \
    --mount type=bind,source=/opt/dbt,target=/usr/app \
    --mount type=bind,source=/opt/dbt/profiles.yml,target=/root/.dbt/profiles.yml \
    ghcr.io/dbt-labs/dbt-bigquery:1.3.latest \
    docs generate"
    

以上4步驟就可以組成一個腳本,放在正式的 CICD 的流程中

  • def PROFILES_DIRECTION = '--profiles-dir .'以下為完整的 CICD 流程,部分 jenkins 項目省略
def PROFILES_DIRECTION = '--profiles-dir .'
pipeline {
    agent any

    stages {
        stage('Deploy') {
            when {
                expression {
                    params.STAGE == 'deploy'
                }
            }
            steps {
                script {
										def files = #{寫一個程式判斷有更動的 model 檔案名}
                    sh "dbt clean"
                    sh "dbt deps ${PROFILES_DIRECTION}"
                    sh "dbt compile ${PROFILES_DIRECTION}"
                    if (files) {
                        sh "dbt build --select ${files} ${PROFILES_DIRECTION} --exclude 'source:*'"
                    } else {
                        echo "No need to run dbt"
                    }
                    sh "/bin/bash .jenkins/deploy.sh" # dbt 部署邏輯如上
                }
            }
        }

        stage('Branch PR') {
            when {
                expression {
                    params.STAGE == 'branch PR'
                }
            }
            steps {
                script {
										def files =  #{寫一個程式判斷有更動的 model 檔案名}
                    sh "dbt clean"
                    sh "dbt deps ${PROFILES_DIRECTION}"
                    sh "dbt compile ${PROFILES_DIRECTION}"
                    if (files) {
                        sh "dbt build --select ${files} ${PROFILES_DIRECTION} --exclude 'source:*'"
                    } else {
                        echo "No need to run dbtt build"
                    }
                }
            }
        }
    }
    
post {
        always {
            script {
               # 通知應用程式邏輯
            }    
        }
    }
}

以上就是用 jenkins 寫的 dbt Core CI/CD流程腳本


上一篇
dbt 要部署前做的 CI 項目有哪些?怎麼做?
下一篇
dbt 學習資源
系列文
如何借助 dbt 優化當代資料倉儲及資料工程師的水肥之路分享30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言