Size: a a a

2020 December 17

Н

Никитяо in jenkins_ru
Tuyen Do
i'm use ubuntu version 18.04 and want to install jenkins version 2.12
источник

VD

Viacheslav Dubrovsky... in jenkins_ru
Dentaky
Подскажите, как получить лог в декларативном пайплайне?

Я понял, как из файла его почитать по типу def lines = new File("C:/Program Files (x86)/Jenkins/jobs/MyJob/builds/5/log").readLines()

Потом могу найти там нужное мне вхождение и в зависимости от резалта обработать.

А как во время выполнения пайпа лог в виде файла словить, чтобы в блоке пост его обработать?
import jenkins.branch.NameMangler
import groovy.transform.Field

@Field def keyString = 'Run TESTENV=TestEnv'

def getLogMap() {
 def tokens = "${env.JOB_NAME}".tokenize('/')
 def repo = tokens[tokens.size()-2]
 try {
   def i
   def result=[:]
   exec = """
     set +x
     LOG_FILE="\$JENKINS_HOME/jobs/${repo}/branches/${NameMangler.apply(env.BRANCH_NAME)}/builds/\$BUILD_ID/log"
     LOG_INDEX_FILE="\$JENKINS_HOME/jobs/${repo}/branches/${NameMangler.apply(env.BRANCH_NAME)}/builds/\$BUILD_ID/log-index"
     LOG_LINES=\$(grep --byte-offset --text "${keyString}" "\$LOG_FILE"| sed "s/[^[:print:]\t]//g; s/\\(^[0-9]*:\\).*=\\(.*\\)/\\1 \\2/g; s/'\$//g")
     LOG_INDEX=\$(grep '.* .*' "\$LOG_INDEX_FILE")
     while read -r line ; do
         offset=\$(echo \$line | cut -d ":" -f1)
         str=\$(echo \$line | cut -d " " -f2)
         if [[ "X\$offset" == "X" ]]; then
           echo "Offset if empty in line=\$line"
           continue
         fi
         index=\$(echo "\$LOG_INDEX" | awk '\$1 > '\$offset' { print  prev; exit; } { prev = \$2 }')
         echo "\$str \$index"
     done <<< "\$LOG_LINES" | uniq
     """
   return sh(script: exec, returnStdout: true).trim().tokenize('\n')
 } catch (error) {
   throw (error)
 }
}

def getURL(logIndex, findString) {
 findString=findString.replaceAll(".*=", "")
 resultStr=logIndex.findAll { it.contains(findString) }
 def result=''
 for (s in resultStr){
   i=s.tokenize()
   result = result + "[log|${env.BUILD_URL}execution/node/" + i[1] + '/log/] '
 }
 return result.trim()
}

Это положите в шаред либу в файл var/getResults.groovy. Вызывать из пайплайна так:
node ('master') {
  logIndex=getResults.getLogMap()
  stepURL=getResults.getURL(logIndex, "Run TESTENV=TestEnv")
}

Для генерации индекса, logIndex=getResults.getLogMap() только 1 раз запускаете. А getURL с текстом на который нужна ссылка можно много раз дергать. Ну и затем его можно отправлять в письме. Задача не совсем про то что вы спрашивали, но надеюсь идея понятна.
источник

T

Tuyen Do in jenkins_ru
correct. thank you so much
источник

VD

Viacheslav Dubrovsky... in jenkins_ru
Elenhil
Кто у вас генерит нужное вам сообщение?
Это не всегда подходит, т.к. сообщение может генериться из третьей тулзы, и проверить результат нужно после
источник

VD

Viacheslav Dubrovsky... in jenkins_ru
есть еще вариант складывать все логи в еластик и от туда выгребать. Но тоже не очень красиво выходит. Плюс куча накладных расходов.
источник

E

Elenhil in jenkins_ru
Viacheslav Dubrovskyi
Это не всегда подходит, т.к. сообщение может генериться из третьей тулзы, и проверить результат нужно после
Эээ. Как третья тулза будет писать в лог то? В бэкграунде?
источник

VD

Viacheslav Dubrovsky... in jenkins_ru
она просто в аутпут пишет. И по выводу нужно делать анализ и если есть определенный текст получить ссылку на этот степ
источник

E

Elenhil in jenkins_ru
Viacheslav Dubrovskyi
она просто в аутпут пишет. И по выводу нужно делать анализ и если есть определенный текст получить ссылку на этот степ
Ну дык да. Это в вар, вар просматриваем, ставим флаг
источник

E

Elenhil in jenkins_ru
А не весь лог
источник

VD

Viacheslav Dubrovsky... in jenkins_ru
Elenhil
Ну дык да. Это в вар, вар просматриваем, ставим флаг
Не очень понял. Что такое вар?
источник

E

Elenhil in jenkins_ru
Обычная переменная
источник

E

Elenhil in jenkins_ru
Из sh returnStdout:true
источник

VD

Viacheslav Dubrovsky... in jenkins_ru
аа
источник

E

Elenhil in jenkins_ru
Потому что а если добавится тулза очередная которая будет выводить то же слово?
источник

E

Elenhil in jenkins_ru
А если лог будет на десяток метров?
источник

E

Elenhil in jenkins_ru
А как это потом саппортить?
источник

VD

Viacheslav Dubrovsky... in jenkins_ru
ну можно и так. Т.е. анализировать сразу по выполнению степа. Накапливать куда-то и потом 1 раз отсылать письмо. В  моем случае я немного другую задачу решал. Поиск ссылки на степ по тексту в логе всей джобы.
источник

E

Elenhil in jenkins_ru
Viacheslav Dubrovskyi
ну можно и так. Т.е. анализировать сразу по выполнению степа. Накапливать куда-то и потом 1 раз отсылать письмо. В  моем случае я немного другую задачу решал. Поиск ссылки на степ по тексту в логе всей джобы.
Оо
источник

II

Igor Ivanov in jenkins_ru
Vladimir
Коллеги, а можете просветить?
есть желание вместо ручного добавления параметров в джобу сохранить и в файле
не могу найти где прочитать как это сделать
нашёл вот такой способ
parameters {
       booleanParam (name: 'deploy-all', defaultValue: false,     description: '')
       string (name: 'ModuleBranch', defaultValue: '*/release/1.0.1', description: 'Ветка в проекте раскатки')  
       booleanParam (name: 'deploy-app-back', defaultValue: false,     description: '')
       booleanParam (name: 'deploy-app-front', defaultValue: false,     description: '')
}
оно воткнёт указанные параметры в джоб после первого запуска
т.е. открываешь джоб — в нём старые параметры, запускаешь, он скорее всего падаешь, открываешь его снова — параметры обновились, можно работать

если это не устраивает, то можно смотреть в сторону job dsl или jenkins job builder
источник

V

Vladimir in jenkins_ru
спасибо, чекну
источник