развертывание функций на основе измененных файлов в фиксации Jenkinsfile

У меня есть много функций в моем репозитории Bitbucket и один файл Jenkins для запуска одного задания для развертывания этих функций 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, но он не может этого сделать.


person Souad    schedule 27.02.2019    source источник


Ответы (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)
      }
  }
}

У меня работает создание образов докеров. Для изменений только в одном ОГРОМНОМ монорепозитории.

Для запуска скрипта снимите флажок: введите здесь описание изображения

person ozlevka    schedule 27.02.2019
comment
Я пытаюсь использовать ваше решение, но получаю следующее: Scripts not permitted to use method org.jenkinsci.plugins.workflow.support.steps.build.RunWrapper getRawBuild. Administrators can decide whether to approve or reject this signature. - person Souad; 28.02.2019
comment
Я использую Jenkinsfile, поэтому у меня нет этого флажка - person Souad; 28.02.2019
comment
stackoverflow.com/a/48104262/1573395. Я надеюсь, что вы в состоянии сделать это. Если нет, вам нужно будет написать java-библиотеку... - person ozlevka; 28.02.2019
comment
Я пробую второй скрипт по этой ссылке support.cloudbees.com/hc/en-us/articles/ Я получаю другой тип ошибки: исключение, которое произошло: в поле com.cloudbees.groovy.cps .impl.BlockScopeEnv.locals в объекте com.cloudbees.groovy.cps.impl.BlockScopeEnv спасибо - person Souad; 28.02.2019
comment
не могли бы вы проверить этот вопрос: stackoverflow.com/questions/54928577/ - person Souad; 28.02.2019