簡體   English   中英

Jenkins Multibranch Pipeline 僅檢查推送到 GIT 的新文件或更改文件

[英]Jenkins Multibranch Pipeline check only the new or changed files pushed to GIT

我們正在使用一種工具,其中所有元素都通過 .json 編寫。

目前我的 GIT 文件夾結構如下所示:

元素文件夾-> element1.json、element2.json、element3.json

腳本文件夾 -> 例如transformation.py

測試文件夾-> run-element.sh

詹金斯文件

我現在遇到的問題是,應使用 testfolder 中的 bashscript 測試文件夾 elementsfolder 中的 .json 文件,並且(如有必要)應調用像 transformations.py 這樣的腳本。 到目前為止,這也有效,但始終測試所有 .json 文件(無論是否未更改)。 但事實並非如此。 僅應測試已更改或新創建的元素。 一天結束時,我們有超過 6000 個元素,因此,對所有元素的測試成本太高。 誰能幫我這個? 在 Jenkins 中,管道看起來像這樣(我只發布階段構建,因為測試和部署是相似的):

 stages {
        stage('Build') {
            environment {
                CREDS = credentials('creds')
                ENDPOINT = 'automation-api'
            }
            steps {
                sh '''
                username=$USR
                password=$PSW

                # Login curl
                login=$(curl -k -s -H "Content-Type: application/json" -X POST -d \\{\\"username\\":\\"$username\\",\\"password\\":\\"$password\\"\\} "$ENDPOINT/session/login" )
                token=$(echo ${login##*token\\" : \\"} | cut -d '"' -f 1)

                # Build
                #1. Validation .json
                curl -k -s -H "Authorization: Bearer $token" -X POST -F "definitionsFile=@element/*.json" "$ENDPOINT/build"
                #2. Show Error
                curl --show-error --fail -k -s -H "Authorization: Bearer $token" -X POST -F "definitionsFile=@element/*.json" "$ENDPOINT/build"
                #3. Logout
                curl -k -s -H "Authorization: Bearer $token" -X POST "$ENDPOINT/session/logout"
                '''
            }
        }

如果您從 SCM 簽出,Jenkins 將允許您檢查上次構建和當前構建之間的變更集。 所以基本上你可以先嘗試找到真正改變的文件,然后只使用那些文件。 請參考以下示例。 獲得更改的文件列表后,您可以將它們移動到新目錄或從elementsfolder中刪除未更改的文件。 以下示例getFilesChanged將返回 repo 中所有更改/添加的文件的列表。 您可能需要調整此功能以符合您的要求。

pipeline {
  agent any
  stages { 
      stage('clone') {
              steps {
                    git branch: 'main', url: 'https://github.com/xxx/sample.git'
              }
      }
      stage('build') {
              steps {
                  script {
                        println(getFilesChanged())
                        // Do your cleanup here and then execute the SH block
                  }
              }
      }
  }
}

def getFilesChanged() {
    def filesList = []
    def changeLogSets = currentBuild.changeSets
                    for (int i = 0; i < changeLogSets.size(); i++) {
                        def entries = changeLogSets[i].items
                        for (int j = 0; j < entries.length; j++) {
                            def entry = entries[j]
                            def files = new ArrayList(entry.affectedFiles)
                                for (int k = 0; k < files.size(); k++) {
                                def file = files[k]
                                filesList.add(file.path)
                }
            }
        }
    return filesList
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM