在Jenkinsfile的提交中根据更改后的文件部署功能

时间:2019-02-27 08:41:39

标签: git groovy jenkins-pipeline bitbucket-cloud

我的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插件,但无法执行此操作。

1 个答案:

答案 0 :(得分:1)

您可以运行类似的命令(对不起,我对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镜像。仅在一个巨大的monorepo中进行更改。

对于运行脚本,请取消选中: enter image description here