根据 Jenkinsfile 提交中更改的文件部署函数

deploy functions based on the changed files in a commit by Jenkinsfile

我的 Bitbucket 存储库和一个 Jenkinsfile 中有许多函数来启动一项作业以部署这些 python 函数。 我需要根据存储库中更改的文件部署功能。 我的回购结构是这样的:

-- functions
  -- func1
    -- app.py
  -- func2.py
    -- app.py
  -- fun3.py
    -- app.py

我想做的是:当我改变一些功能时,只部署这个功能而不部署其他功能。所以当我提交更改时,我需要查找更改的文件并部署相应的功能。 在 jenkinsfile 中我做了这样的事情:

            sh '''
                last_commit=$(git describe --always)

                access_token=$(cat BITBUCKET_TOKEN)             
                changed_file=$(curl https://api.bitbucket.org/1.0/repositories/account/reponame/changesets/$last_commit?access_token=$access_token | jq -r .files[].file)
                echo $changed_file > CHANGED_FILE
            '''
           CHANGED_FILE = readFile 'CHANGED_FILE'
           if (CHANGED_FILE.contains('functions/func1')) {
              // instructions ... 
           }
           CHANGED_FILE = readFile 'CHANGED_FILE'
           if (CHANGED_FILE.contains('functions/func2')) {
              // instructions ... 
           }

这里我只得到最后一次提交,我只从中得到一个改变的文件。我想知道使用什么逻辑来处理具有许多已更改文件的许多提交? 我尝试使用 Webhook 插件,但它无法执行此操作。

你可以运行这样的东西(对不起我的错Groovy):

def changeLogSets = this.currentBuild.rawBuild.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]
           this.deployFunction(file.path)
      }
  }
}

我正在为构建 docker 图像工作。仅在一个巨大的单一仓库中进行更改。

对于 运行ning 脚本取消选中: