Показаны различия между двумя версиями страницы.
Предыдущая версия справа и слева Предыдущая версия Следующая версия | Предыдущая версия | ||
jenkins:pipelines [2024/02/01 13:42] admin |
jenkins:pipelines [2025/01/19 15:53] (текущий) admin |
||
---|---|---|---|
Строка 1: | Строка 1: | ||
====== Pipelines ====== | ====== Pipelines ====== | ||
- | |||
- | |||
===== Общее ===== | ===== Общее ===== | ||
- | |||
<code groovy> | <code groovy> | ||
if (params.getOrDefault(' | if (params.getOrDefault(' | ||
Строка 16: | Строка 13: | ||
===== Переменные ===== | ===== Переменные ===== | ||
+ | < | ||
+ | < | ||
+ | <code groovy> | ||
+ | pipeline { | ||
+ | agent any | ||
+ | |||
+ | stages { | ||
+ | stage(" | ||
+ | steps { | ||
+ | | ||
+ | } | ||
+ | } | ||
+ | stage(" | ||
+ | steps { | ||
+ | script{ | ||
+ | // хотя хз, чет не сработало | ||
+ | script: ''' | ||
+ | echo " | ||
+ | ''' | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | |||
==== Переменные среды ==== | ==== Переменные среды ==== | ||
[[https:// | [[https:// | ||
Строка 139: | Строка 164: | ||
==== Переменные ==== | ==== Переменные ==== | ||
Обращаться к переменным следует всегда с префиксами если они есть, например для переменных окружения это " | Обращаться к переменным следует всегда с префиксами если они есть, например для переменных окружения это " | ||
+ | |||
< | < | ||
- | < | + | < |
+ | Модуль **sh** по всей видимости выполняется напрямую в оболочке, | ||
+ | Задать переменные окружения из скрипта можно в блоке **Environment**\\ | ||
<code groovy> | <code groovy> | ||
- | // Входящий параметр | + | // Входящий параметр |
stage(' | stage(' | ||
steps { | steps { | ||
Строка 158: | Строка 187: | ||
} | } | ||
- | // Объявление переменной | + | // Объявление |
stage(' | stage(' | ||
environment{ | environment{ | ||
Строка 177: | Строка 206: | ||
} | } | ||
} | } | ||
+ | |||
+ | // | ||
+ | // Или вот пример | ||
+ | stage(' | ||
+ | environment { | ||
+ | VERSION_STRING = new SimpleDateFormat(" | ||
+ | } | ||
+ | steps { | ||
+ | sh label: 'my scritp', | ||
+ | echo variable in other block1 - $VERSION_STRING | ||
+ | echo variable in other block2 - " | ||
+ | echo variable in other block3 - ' | ||
+ | ''' | ||
+ | } | ||
+ | } | ||
+ | |||
+ | |||
+ | |||
// Объявление входных параметров | // Объявление входных параметров | ||
Строка 215: | Строка 262: | ||
- | < | ||
- | < | ||
+ | < | ||
+ | < | ||
<code groovy> | <code groovy> | ||
// Так не работает, | // Так не работает, | ||
Строка 238: | Строка 285: | ||
===== Дата/ | ===== Дата/ | ||
+ | * **java.time.LocalDateTime** - Дата и время без часового пояса в календарной системе ISO-8601, например 2007-12-03T10: | ||
+ | * **java.time.Instant** - тут что то более жесткое | ||
+ | |||
+ | |||
+ | * **ZoneId** - (java.time.ZoneId) больше связано с правилами преобразования между часовыми поясами\\ | ||
+ | * **ZoneOffset** - (java.time.ZoneOffset) тут уже больше про смещение относительно UTC\\ | ||
< | < | ||
Строка 250: | Строка 303: | ||
def start = LocalDateTime.now().plusMinutes(360) | def start = LocalDateTime.now().plusMinutes(360) | ||
+ | // Тоже текущая дата, формат такой же, но дженкинс попросил аппрув (хотя не помню с первым возможно тоже был) | ||
+ | import java.time.Instant | ||
+ | def current_instant = Instant.now() | ||
</ | </ | ||
</ | </ | ||
+ | |||
+ | < | ||
+ | < | ||
+ | [[https:// | ||
+ | <code groovy> | ||
+ | import java.time.LocalDateTime | ||
+ | import java.time.ZoneId | ||
+ | |||
+ | // ZoneId, тут есть явное определение временных зон, пример из джавы | ||
+ | ZoneId zone = ZoneId.of(" | ||
+ | ZonedDateTime time = ZonedDateTime.now(zone) | ||
+ | |||
+ | // В груви так работает (тут есть перечень зон https:// | ||
+ | def zoned_dt = LocalDateTime.now(ZoneId.of(" | ||
+ | |||
+ | |||
+ | // Offset, собсна " | ||
+ | // Так работает | ||
+ | def current_dt = LocalDateTime.now() | ||
+ | def offset_dt = LocalDateTime.now(ZoneOffset.ofHours(+6)) | ||
+ | |||
+ | // Вот тоже пример, | ||
+ | ZoneOffset zoneOffSet = ZoneOffset.of(" | ||
+ | OffsetTime time = OffsetTime.now(zoneOffSet); | ||
+ | </ | ||
+ | </ | ||
+ | ===== Сохранение артефактов ===== | ||
< | < | ||
- | < | + | < |
+ | Сохраняет указанные файлы для дальнейшего использования в пайплайне, | ||
+ | Сохраняет в виде TAR архива, | ||
+ | По умолчанию чистится после каждой сборки, | ||
+ | Можно добавить исключения на добавляемые файлы. Сохраняет указанные файлы в текущем рабочем каталоге, | ||
<code groovy> | <code groovy> | ||
+ | stage(" | ||
+ | agent { slave1 } | ||
+ | steps { | ||
+ | (...) | ||
+ | stash includes: ' | ||
+ | } | ||
+ | } | ||
+ | stage(" | ||
+ | agent { master } | ||
+ | steps { | ||
+ | cleanWs() | ||
+ | unstash name: DYNAMIC_SLAVE | ||
+ | } | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | Указывать нужно с маской, | ||
+ | <code groovy> | ||
+ | stage(" | ||
+ | steps { | ||
+ | script { | ||
+ | sh """ | ||
+ | mkdir my_dir | ||
+ | touch my_dir/ | ||
+ | touch my_dir/ | ||
+ | touch my_dir/ | ||
+ | ls -l | ||
+ | """ | ||
+ | stash includes: " | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | | ||
+ | stage(" | ||
+ | steps { | ||
+ | script { | ||
+ | cleanWs() | ||
+ | sh "ls -l" | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | | ||
+ | stage(" | ||
+ | steps { | ||
+ | script { | ||
+ | unstash name: " | ||
+ | sh "ls -l my_dir" | ||
+ | } | ||
+ | } | ||
+ | } | ||
</ | </ | ||
</ | </ | ||
+ | < | ||
+ | < | ||
+ | Архивирует артефакты сборки, | ||
+ | По умолчанию Maven автоматически архивирует произведенные артефакты. Указанные здесь артефакты будут архивированы поверх\\ | ||
+ | Файлы указываются так же маской\\ | ||
+ | <code groovy> | ||
+ | archiveArtifacts artifacts: ' | ||
+ | archiveArtifacts artifacts: ' | ||
+ | archiveArtifacts artifacts: ' | ||
+ | # Из примера выше | ||
+ | archiveArtifacts artifacts: ' | ||
+ | </ | ||
+ | </ | ||
+ | ===== Примеры ===== | ||
+ | < | ||
+ | < | ||
+ | <code groovy> | ||
+ | import java.time.LocalDateTime | ||
+ | import java.time.ZoneId | ||
+ | pipeline { | ||
+ | agent { | ||
+ | label ' | ||
+ | } | ||
+ | | ||
+ | environment { | ||
+ | GRAFANA_API_TOKEN = credentials(' | ||
+ | } | ||
+ | | ||
+ | stages { | ||
+ | stage(' | ||
+ | steps { | ||
+ | SetParameters() | ||
+ | script{ | ||
+ | | ||
+ | //def start_time_silence = LocalDateTime.now(ZoneId.of(" | ||
+ | //def end_time_silence = start_time_silence.plusMinutes(params.DURATION_MIN.toInteger()) | ||
+ | | ||
+ | def start_time_silence = LocalDateTime.now() | ||
+ | def end_time_silence = start_time_silence.plusMinutes(params.DURATION_MIN.toInteger()) | ||
+ | | ||
+ | def response = httpRequest acceptType: ' | ||
+ | contentType: | ||
+ | responseHandle: | ||
+ | httpMode: ' | ||
+ | ignoreSslErrors: | ||
+ | url: ' | ||
+ | wrapAsMultipart: | ||
+ | authentication: | ||
+ | requestBody: | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | { | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | } | ||
+ | ] | ||
+ | }""" | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | | ||
+ | } | ||
+ | } | ||
- | ====== Gradle ====== | + | def SetParameters() { |
+ | properties([ | ||
+ | parameters([ | ||
+ | string( | ||
+ | name: ' | ||
+ | description: | ||
+ | trim: true | ||
+ | ), | ||
+ | string( | ||
+ | name: ' | ||
+ | defaultValue: | ||
+ | description: | ||
+ | trim: true | ||
+ | ) | ||
+ | ]) | ||
+ | ]) | ||
+ | } | ||
+ | </ | ||
+ | </ | ||
- | < | ||
- | < | ||
- | :!: Скрипты справа все таки совпадают с тасками что есть в файле " | ||
- | вот только как он обновляется ? таску вроде прописал, | ||
+ | |||
+ | |||
+ | < | ||
+ | < | ||
<code groovy> | <code groovy> | ||
- | // Проверка переданной переменной, | + | pipeline { |
- | if(!project.hasProperty(" | + | |
- | // Обращаться к свойству | + | agent { |
- | project.properties[" | + | label ' |
+ | } | ||
- | // Вообще таска для ShadowJar | + | options |
- | tasks { | + | |
- | " | + | ansiColor(' |
- | | + | |
- | | + | |
- | val serverAppName = " | + | } |
- | | + | |
- | doFirst | + | stages { |
- | | + | |
- | | + | |
+ | script { | ||
+ | cleanWs() | ||
+ | sh( | ||
+ | label: 'repo sync', | ||
+ | script: ''' | ||
+ | PATH="${HOME}/.bin:${PATH}" | ||
+ | repo init -u ssh:// | ||
+ | repo sync | ||
+ | repo forall -c git checkout | ||
+ | ''' | ||
+ | | ||
+ | } | ||
+ | } | ||
} | } | ||
} | } | ||
} | } | ||
+ | |||
+ | |||
+ | # | ||
+ | # Выбор ветки | ||
+ | # | ||
+ | stage(' | ||
+ | steps { | ||
+ | script { | ||
+ | SetParameters() | ||
+ | cleanWs() | ||
+ | sh( | ||
+ | label: 'repo sync', | ||
+ | script: ''' | ||
+ | PATH=" | ||
+ | repo init -u ssh:// | ||
+ | repo sync | ||
+ | if [ ${BRANCH} != " | ||
+ | repo forall -c git checkout ${BRANCH} | ||
+ | fi | ||
+ | if [ ${GERRIT_REFSPEC} != " | ||
+ | cd igs/ | ||
+ | fi | ||
+ | ''' | ||
+ | ) | ||
+ | } | ||
+ | } | ||
+ | } | ||
</ | </ | ||
</ | </ | ||
+ | |||
< | < | ||
- | < | + | < |
<code bash> | <code bash> | ||
- | # Если скритп "gradlew" в папке с проектом | + | - name: " |
- | stage(' | + | block: |
- | steps { | + | - name: " |
- | sh "bash ./ | + | import_tasks: |
+ | |||
+ | - name: " | ||
+ | ansible.builtin.shell: | ||
+ | cmd: "sleep 25 && systemctl is-active myservice@{{ instance_name }}.service" | ||
+ | rescue: | ||
+ | - name: " | ||
+ | ansible.builtin.shell: | ||
+ | cmd: 'tar -xzvf ./ | ||
+ | chdir: '{{ instance.root_path }}/{{ instance_name }}' | ||
+ | |||
+ | - name: " | ||
+ | import_tasks: | ||
+ | |||
+ | - name: "Прерываем выполнение в случае отката" | ||
+ | ansible.builtin.fail: | ||
+ | msg: "!!! Откат изменений после сбоя. Прерываем дальнейшее выполнение !!!" | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | |||
+ | |||
+ | < | ||
+ | < | ||
+ | <code java> | ||
+ | pipeline { | ||
+ | |||
+ | agent { | ||
+ | label ' | ||
+ | } | ||
+ | |||
+ | options { | ||
+ | quietPeriod 5 | ||
+ | ansiColor(' | ||
+ | timestamps() | ||
+ | buildDiscarder logRotator(artifactDaysToKeepStr: | ||
+ | } | ||
+ | |||
+ | environment { | ||
+ | EXTRAS = getExtras() | ||
+ | } | ||
+ | |||
+ | stages { | ||
+ | stage(' | ||
+ | steps { | ||
+ | | ||
+ | SetParameters() | ||
+ | cleanWs() | ||
+ | script { | ||
+ | currentBuild.displayName = " | ||
+ | buildDescription " | ||
+ | } | ||
+ | | ||
+ | label: 'repo sync', | ||
+ | script: ''' | ||
+ | PATH="${HOME}/ | ||
+ | repo init -u ssh:// | ||
+ | repo sync | ||
+ | if [ ${BRANCH} != " | ||
+ | repo forall -c git checkout ${BRANCH} | ||
+ | fi | ||
+ | if [ ${GERRIT_REFSPEC} != " | ||
+ | cd igs/ | ||
+ | fi | ||
+ | ''' | ||
+ | ) | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | stage(' | ||
+ | when { | ||
+ | expression { | ||
+ | !params.SKIP_BUILD | ||
+ | } | ||
+ | } | ||
+ | environment { | ||
+ | NEXUS_CREDS = credentials(' | ||
+ | } | ||
+ | steps { | ||
+ | sh label: ' | ||
+ | cd $WORKSPACE/ | ||
+ | | ||
+ | | ||
+ | " | ||
+ | " | ||
+ | : | ||
+ | ''' | ||
+ | } | ||
+ | } | ||
+ | stage(' | ||
+ | steps { | ||
+ | dir(" | ||
+ | ansiblePlaybook( | ||
+ | playbook: " | ||
+ | extras: " | ||
+ | colorized: true, | ||
+ | ) | ||
+ | } | ||
+ | } | ||
+ | } | ||
} | } | ||
} | } | ||
- | # Если нет, тогда | + | def getExtras() { |
- | stage('Build jar') { | + | |
- | steps { | + | |
- | sh "bash ./gradlew myProject: | + | } else { |
+ | | ||
} | } | ||
+ | } | ||
+ | |||
+ | def SetParameters() { | ||
+ | properties([ | ||
+ | parameters([ | ||
+ | booleanParam( | ||
+ | name: ' | ||
+ | description: | ||
+ | defaultValue: | ||
+ | ), | ||
+ | [ | ||
+ | $class: ' | ||
+ | choiceType: ' | ||
+ | description: | ||
+ | name: ' | ||
+ | randomName: ' | ||
+ | filterable: false, | ||
+ | script: [ | ||
+ | $class: ' | ||
+ | fallbackScript: | ||
+ | classpath: [], | ||
+ | sandbox: false, | ||
+ | script: | ||
+ | ''' | ||
+ | return[' | ||
+ | ''' | ||
+ | ], | ||
+ | script: [ | ||
+ | classpath: [], | ||
+ | sandbox: false, | ||
+ | script: | ||
+ | ''' | ||
+ | def cmd = ['/ | ||
+ | def result = cmd.execute().text.tokenize() | ||
+ | return result | ||
+ | ''' | ||
+ | ] | ||
+ | ] | ||
+ | ], | ||
+ | [ | ||
+ | $class: ' | ||
+ | choiceType: ' | ||
+ | name: ' | ||
+ | description: | ||
+ | randomName: ' | ||
+ | script: [ | ||
+ | $class: ' | ||
+ | script: [ | ||
+ | classpath: [], | ||
+ | sandbox: false, | ||
+ | script: ''' | ||
+ | import com.cloudbees.plugins.credentials.CredentialsMatchers | ||
+ | import com.cloudbees.plugins.credentials.CredentialsProvider | ||
+ | import com.cloudbees.plugins.credentials.common.StandardUsernameCredentials | ||
+ | import com.cloudbees.plugins.credentials.domains.DomainRequirement | ||
+ | import jenkins.model.Jenkins | ||
+ | import hudson.security.ACL | ||
+ | jenkins = Jenkins.get() | ||
+ | def lookupSystemCredentials = { | ||
+ | credentialsId -> return CredentialsMatchers.firstOrNull( | ||
+ | CredentialsProvider.lookupCredentials( | ||
+ | StandardUsernameCredentials.class, | ||
+ | jenkins, | ||
+ | ACL.SYSTEM, | ||
+ | Collections.< | ||
+ | ), | ||
+ | CredentialsMatchers.withId(credentialsId) | ||
+ | ) | ||
+ | } | ||
+ | credential = lookupSystemCredentials(" | ||
+ | nexusLogin = credential.getUsername() | ||
+ | nexusPasswd = credential.getPassword().getPlainText() | ||
+ | def targetUrl=" | ||
+ | def sout = new StringBuilder(), | ||
+ | def proc = "curl -X GET $targetUrl" | ||
+ | proc.consumeProcessOutput(sout, | ||
+ | proc.waitForOrKill(1000) | ||
+ | def response=sout.toString() | ||
+ | def metadata = new XmlParser().parseText(response) | ||
+ | def versions = [' | ||
+ | versions.addAll(metadata.versioning.versions.version.collect({it.text()}).reverse()) | ||
+ | return versions | ||
+ | ''' | ||
+ | ] | ||
+ | ] | ||
+ | ], | ||
+ | [ | ||
+ | $class | ||
+ | choiceType | ||
+ | filterLength: | ||
+ | filterable | ||
+ | name : ' | ||
+ | randomName | ||
+ | script | ||
+ | $class: ' | ||
+ | script: [ | ||
+ | classpath: [], | ||
+ | sandbox | ||
+ | script | ||
+ | def fm_instances = [] | ||
+ | def file1 = new File("/ | ||
+ | file1.eachLine { | ||
+ | fm_instances.add(it) | ||
+ | } | ||
+ | def result = [" | ||
+ | result.addAll(fm_instances) | ||
+ | return result''' | ||
+ | ] | ||
+ | ] | ||
+ | ], | ||
+ | string( | ||
+ | defaultValue: | ||
+ | description: | ||
+ | name: ' | ||
+ | trim: true | ||
+ | ) | ||
+ | ]) | ||
+ | ]) | ||
} | } | ||
</ | </ | ||
</ | </ | ||
+ | |||
< | < | ||
- | < | + | < |
- | Тут модификация shadowJar для того чтобы в имя файла не добавлялся постфикс | + | <code groovy> |
- | Так же можно явно задавать имя артефакту\\ | + | pipeline { |
- | Так же таска для публикации в nexus\\ | + | environment { |
+ | MY_VAR = "123" | ||
+ | } | ||
- | <code bash> | + | agent { |
- | plugins | + | |
- | | + | label ' |
- | java | + | } |
- | | + | } |
- | id(" | + | |
- | id(" | + | |
- | } | + | |
- | dependencies | + | parameters |
- | (зависимости могут варьироваться) | + | |
- | | + | } |
- | implementation(Deps.opencsv) | + | |
- | } | + | |
- | application | + | stages |
- | | + | stage("First" |
+ | when { | ||
+ | expression { | ||
+ | MY_VAR == " | ||
+ | } | ||
+ | } | ||
+ | steps { | ||
+ | cleanWs() | ||
+ | script { | ||
+ | sh "echo 'this is first stage'" | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | |||
+ | stage(" | ||
+ | when { | ||
+ | expression { | ||
+ | MY_VAR == " | ||
+ | } | ||
+ | } | ||
+ | steps { | ||
+ | script { | ||
+ | sh "echo 'this is second stage'" | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | |||
+ | } | ||
} | } | ||
- | group = " | + | </ |
- | version = " | + | </ |
- | // При желании, | + | |
- | fun getGitCommit(): String { | + | |
- | val result = StringBuilder() | + | < |
- | val process = ProcessBuilder(" | + | < |
- | | + | <code groovy> |
- | | + | stage('first-stage') { |
+ | | ||
+ | | ||
+ | branch ' | ||
+ | |||
} | } | ||
- | process.waitFor() | + | ----- |
- | return | + | |
- | } | + | expression { |
+ | | ||
+ | inputOptimizer == " | ||
+ | | ||
+ | } | ||
+ | ----- | ||
+ | when { | ||
+ | environment name: ' | ||
+ | } | ||
+ | ----- | ||
- | tasks { | + | steps { |
- | | + | echo 'run this stage - ony if the branch = master branch' |
- | | + | |
- | manifest | + | script |
- | | + | if (env.BRANCH_NAME == "myBranch") { |
- | | + | echo ' |
- | " | + | |
- | " | + | |
- | | + | |
} | } | ||
+ | |||
} | } | ||
} | } | ||
+ | </ | ||
- | publishing { | + | Вариативность: |
- | | + | <code groovy> |
- | | + | when { allOf { branch ' |
- | url = uri("${properties[" | + | --- |
- | | + | when { anyOf { branch ' |
- | | + | --- |
- | | + | when { not { branch ' |
+ | ---- | ||
+ | |||
+ | // Комбинировать тоже можно | ||
+ | when { | ||
+ | | ||
+ | | ||
+ | environment name: ' | ||
+ | environment name: ' | ||
+ | | ||
} | } | ||
- | | + | --- |
+ | |||
+ | when { | ||
+ | expression { BRANCH_NAME ==~ / | ||
+ | anyOf { | ||
+ | environment name: ' | ||
+ | environment name: ' | ||
+ | } | ||
+ | } | ||
+ | --- | ||
+ | |||
+ | |||
+ | </ | ||
+ | |||
+ | |||
+ | Еще можно задать параметры сравнения (comparator): | ||
+ | <code groovy> | ||
+ | // Сравнивать по регулярке | ||
+ | when { branch pattern: " | ||
+ | |||
+ | // Простое сравнение | ||
+ | when { branch: " | ||
+ | </ | ||
+ | |||
+ | |||
+ | |||
+ | :!: Строки могут плохо преобразовываться в логические значения, | ||
+ | |||
+ | |||
+ | Вариативность выполнения в зависимости от переменных и параметров\\ | ||
+ | В т.ч подходит для инициализации джобы запуском без параметров\\ | ||
+ | <code groovy> | ||
+ | pipeline { | ||
+ | environment { | ||
+ | MY_VAR = " | ||
} | } | ||
- | publications | + | |
- | | + | agent any |
- | | + | |
+ | parameters | ||
+ | | ||
+ | string description: | ||
+ | string description: | ||
+ | } | ||
+ | |||
+ | stages { | ||
+ | stage(" | ||
+ | | ||
+ | expression { params.MY_VAR } | ||
+ | expression { params.MY_VAR2 != "" | ||
+ | expression { !params.MY_VAR2 } | ||
+ | expression { params.MY_PARAM == " | ||
+ | } | ||
+ | steps { | ||
+ | cleanWs() | ||
+ | script { | ||
+ | sh "echo 'this is first stage'" | ||
+ | } | ||
+ | } | ||
} | } | ||
} | } | ||
} | } | ||
</ | </ | ||
+ | </ | ||
- | Избавится | + | |
- | параметр " | + | < |
+ | < | ||
+ | <code groovy> | ||
+ | // Создание файла | ||
+ | configFileProvider([configFile(fileId: | ||
+ | script { | ||
+ | } | ||
+ | } | ||
+ | |||
+ | // Данные в переменной | ||
+ | configFileProvider([configFile(fileId: | ||
+ | script { | ||
+ | } | ||
+ | } | ||
+ | |||
+ | </ | ||
+ | </ | ||
+ | |||
+ | |||
+ | |||
+ | < | ||
+ | < | ||
+ | <code groovy> | ||
+ | writeFile file: " | ||
+ | text: ${var1} | ||
+ | test: ${var2} | ||
+ | """ | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | |||
+ | |||
+ | ==== Запись результатов/ | ||
+ | |||
+ | < | ||
+ | < | ||
+ | |||
+ | Запись | ||
+ | Можно | ||
<code bash> | <code bash> | ||
- | # Вариант с таской | + | currentBuild.description = " |
- | tasks { | + | </ |
+ | |||
+ | Артефакты файлами\\ | ||
+ | <code bash> | ||
+ | archiveArtifacts artifacts: ' | ||
+ | </ | ||
+ | |||
+ | |||
+ | Публикация полноценного отчета, доступен слева в меню\\ | ||
+ | <code bash> | ||
+ | publishHTML (target : [allowMissing: | ||
+ | keepAll: true, reportDir: '', | ||
+ | reportName: 'My Reports', | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | ====== Use Gradle ====== | ||
+ | < | ||
+ | < | ||
+ | :!: Скрипты | ||
+ | вот только как он обновляется ? таску вроде прописал, | ||
+ | |||
+ | |||
+ | <code groovy> | ||
+ | // Проверка переданной переменной, | ||
+ | if(!project.hasProperty(" | ||
+ | |||
+ | // Обращаться к свойству | ||
+ | project.properties[" | ||
+ | |||
+ | // Вообще таска для ShadowJar | ||
+ | tasks { | ||
" | " | ||
- | | + | |
- | | + | isZip64 = true |
- | | + | val serverAppName = "server_app-$serverAppVersion.jar" |
- | | + | archiveFileName.set(serverAppName) |
- | | + | |
- | "Module-version" | + | |
- | | + | |
} | } | ||
} | } | ||
} | } | ||
+ | </ | ||
+ | </ | ||
- | # Таска с Jar | + | |
- | fun configureJar(jar: Jar) { | + | < |
- | jar.setManifestClassPathToRuntimeDependencies() | + | < |
- | | + | <code bash> |
- | | + | # Если |
- | | + | stage(' |
- | | + | steps { |
- | | + | sh " |
- | | + | |
- | } | + | } |
+ | |||
+ | # Если нет, тогда | ||
+ | stage('Build jar') { | ||
+ | steps { | ||
+ | sh "bash ./gradlew myProject: | ||
} | } | ||
- | jar.archiveFileName.set(" | ||
- | jar.archiveClassifier.set("" | ||
} | } | ||
</ | </ | ||
Строка 433: | Строка 1100: | ||
- | ==== Запуск из консоли ==== | ||
- | Сборка и загрузка в репозиторий\\ | ||
- | <code bash> | ||
- | ./gradlew -PnexusUrl=https:// | ||
- | </ | ||
+ | Прерывание | ||
- | ==== ShadowJar ==== | ||
- | Есть несколько вариантов, | ||
- | **plugins { id(" | ||
- | [[https:// | + | if (!params.MY_VAR.contains(" |
+ | currentBuild.result = ' | ||
+ | error(" | ||
+ | } | ||
+ | |||