Jenkins Declarative Pipeline vs Scripted Pipeline - 4 key differences
Jenkins Scripted Pipeline vs Declarative - answering viewer's questions!
Jenkins Pipeline Environment Variables explained
четверг, 14 мая 2020 г.
понедельник, 4 мая 2020 г.
Update MacOS
Если довелось обновлять mac os с mojave до catalina (например, если взят сервер в MacInCloud), и updater говорит что нет обновлений, нужно сделать
sudo softwareupdate --reset-ignored
И после этого обновление появится.
НО! Если это MacInCloud - сначала нужно убедиться что сервер в совместимых! И желательно написать в саппорт (обязательно, если железо более старое чем mac mini late 2012)
рецепт взят отсюда
вторник, 21 апреля 2020 г.
AWS Cloud Map
Cloud Map allows you to register any application resources such as databases, queues, microservices, and other cloud resources with custom names. Cloud Map then constantly checks the health of resources to make sure the location is up-to-date. The application can then query the registry for the location of the resources needed based on the application version and deployment environment.
https://aws.amazon.com/ru/about-aws/whats-new/2018/11/introducing-aws-cloud-map/
https://aws.amazon.com/ru/blogs/aws/aws-cloud-map-easily-create-and-maintain-custom-maps-of-your-applications/
Video:
https://www.youtube.com/watch?v=fMGd9IUaotE
https://aws.amazon.com/ru/about-aws/whats-new/2018/11/introducing-aws-cloud-map/
https://aws.amazon.com/ru/blogs/aws/aws-cloud-map-easily-create-and-maintain-custom-maps-of-your-applications/
Video:
https://www.youtube.com/watch?v=fMGd9IUaotE
понедельник, 20 апреля 2020 г.
Jenkins: пропускаем шаг начальной настройки
При автоматической выкатке часто надо пропустить шаг настройки (мастер), есть несколько способов
1) java -Djenkins.install.runSetupWizard=false -jar jenkins.war
Вариант через переменную (для докера)
ENV JAVA_OPTS "-Djenkins.install.runSetupWizard=false ${JAVA_OPTS:-}"
2) поставить плагин jcasc и при влитом конфиге он должен визард пропускать. Но не всегда, например https://github.com/jenkinsci/configuration-as-code-plugin/issues/393, поэтому 1 метод предпочтительнее.
3) Не проверялось, но иногда встречается в гугле
echo ${JENKINS_VERSION} > ${JENKINS_HOME}/jenkins.install.UpgradeWizard.state
1) java -Djenkins.install.runSetupWizard=false -jar jenkins.war
Вариант через переменную (для докера)
ENV JAVA_OPTS "-Djenkins.install.runSetupWizard=false ${JAVA_OPTS:-}"
2) поставить плагин jcasc и при влитом конфиге он должен визард пропускать. Но не всегда, например https://github.com/jenkinsci/configuration-as-code-plugin/issues/393, поэтому 1 метод предпочтительнее.
3) Не проверялось, но иногда встречается в гугле
echo ${JENKINS_VERSION} > ${JENKINS_HOME}/jenkins.install.UpgradeWizard.state
среда, 8 апреля 2020 г.
Jenkins pipeline jobs
Помимо Freestyle задач, если pipeline, это код на груви. Главные преимущества - переносимость, возможность держать конфиги в системе контроля версий, сами pipelines можно прямо из гита вызывать, можно код положить в Jenkinsfile и передавать вместе с проектом.
Минусы - сложность освоения, зачастую совершенно невнятные ошибки, что раньше в вебе накликивалось за пол часа, теперь надо долго и вдумчиво писать.
Чуть добавляет сложности то, их несколько видов, и они не очень совместимы.
По синтаксису: scripted, declarative
Pipeline, multibranch pipeline
Intro
https://jenkins.io/doc/book/pipeline/getting-started/
https://github.com/jenkinsci/pipeline-plugin/blob/master/TUTORIAL.md
Next
https://jenkins.io/doc/book/pipeline/syntax/
2 models
https://jenkins.io/doc/pipeline/steps/pipeline-model-definition/
For plugins
https://jenkins.io/doc/pipeline/steps/
Очень достойные документы, где описано очень много полезного. post, when... Хотя бы по диагонали но прочитать.
https://www.blazemeter.com/blog/how-to-use-the-jenkins-scripted-pipeline/
https://www.blazemeter.com/blog/how-to-use-the-jenkins-declarative-pipeline/
Advanced:
https://www.cloudbees.com/blog/top-10-best-practices-jenkins-pipeline-plugin
PS
Раньше формат вызова плагинов был примерно таким
step([$class: 'ArtifactArchiver', artifacts: 'something'])
В новом синтаксисе (года с 2016) это гораздо читаемее и сокращается до
archiveArtifacts 'something'
Но. Не всегда. Например, в 2020 у плагина Mailer существует только такой формат вызова
step([$class: 'Mailer']): E-mail Notification
https://jenkins.io/doc/pipeline/steps/mailer/
Чуть больше про это
https://stackoverflow.com/questions/48797509/class-syntax-in-jenkins-scripted-dsl
PS2
When a recorder is run from a pipeline, it might set the build’s status (for example to unstable), but otherwise is likely to work intuitively. Running a notifier is trickier since normally a pipeline in progress has no status yet, unlike a freestyle project whose status is determined before the notifier is called. To help interoperate better with these, you can use the
https://github.com/jenkinsci/workflow-basic-steps-plugin/blob/master/src/main/resources/org/jenkinsci/plugins/workflow/steps/CatchErrorStep/help.html
catchError : This step is most useful when used in Declarative Pipeline or with the options to set the stage result or ignore build interruptions. Otherwise, consider using plain try-catch-finallyblocks.
Минусы - сложность освоения, зачастую совершенно невнятные ошибки, что раньше в вебе накликивалось за пол часа, теперь надо долго и вдумчиво писать.
Чуть добавляет сложности то, их несколько видов, и они не очень совместимы.
По синтаксису: scripted, declarative
Pipeline, multibranch pipeline
Intro
https://jenkins.io/doc/book/pipeline/getting-started/
https://github.com/jenkinsci/pipeline-plugin/blob/master/TUTORIAL.md
Next
https://jenkins.io/doc/book/pipeline/syntax/
2 models
https://jenkins.io/doc/pipeline/steps/pipeline-model-definition/
For plugins
https://jenkins.io/doc/pipeline/steps/
Очень достойные документы, где описано очень много полезного. post, when... Хотя бы по диагонали но прочитать.
https://www.blazemeter.com/blog/how-to-use-the-jenkins-scripted-pipeline/
https://www.blazemeter.com/blog/how-to-use-the-jenkins-declarative-pipeline/
Advanced:
https://www.cloudbees.com/blog/top-10-best-practices-jenkins-pipeline-plugin
PS
Раньше формат вызова плагинов был примерно таким
step([$class: 'ArtifactArchiver', artifacts: 'something'])
В новом синтаксисе (года с 2016) это гораздо читаемее и сокращается до
archiveArtifacts 'something'
Но. Не всегда. Например, в 2020 у плагина Mailer существует только такой формат вызова
step([$class: 'Mailer']): E-mail Notification
https://jenkins.io/doc/pipeline/steps/mailer/
Чуть больше про это
https://stackoverflow.com/questions/48797509/class-syntax-in-jenkins-scripted-dsl
PS2
When a recorder is run from a pipeline, it might set the build’s status (for example to unstable), but otherwise is likely to work intuitively. Running a notifier is trickier since normally a pipeline in progress has no status yet, unlike a freestyle project whose status is determined before the notifier is called. To help interoperate better with these, you can use the
catchError step, or manually set a build status using currentBuild.result. See the help for the catchError step for examples.https://github.com/jenkinsci/workflow-basic-steps-plugin/blob/master/src/main/resources/org/jenkinsci/plugins/workflow/steps/CatchErrorStep/help.html
catchError : This step is most useful when used in Declarative Pipeline or with the options to set the stage result or ignore build interruptions. Otherwise, consider using plain try-catch-finallyblocks.
вторник, 7 апреля 2020 г.
Mac: Нормальный вывод du
Не знаю какие дендропришельцы делали вывод для du, штатно это что-то совершенно нечитаемое и бесполезное, и даже -h не улучшает ситуацию.
Правильная команда:
df -lHPh
И в конфиг ~/.bash_profile
alias du='df -lHPh'
Правильная команда:
df -lHPh
И в конфиг ~/.bash_profile
alias du='df -lHPh'
среда, 1 апреля 2020 г.
Jenkins: передача параметров между задачами
Иногда (часто) есть несколько задач, между которыми надо передавать аргументы.
В случае, если первая задача хочет запустить вторую, тут очень просто. Ставим плагин Parameterized Trigger plugin, во второй задаче перечисляем что мы хотим получать, а в первой добавляем шаг сборки "Trigger/Call builds on other projects" и там есть поле для переменных, которые мы передаём, формат обычный, NEW_VAR=some_var
как-то так
А вот от второй задачи к первой - весьма сложно. Пожалуй, самым простым вариантом - во второй задаче выводим нужные переменные в файл, а в первой импортируем переменные из файла, через шаг сборки Inject environment variables. То есть через trigger build запускаем вторую задачу, там внутри пишем нужные переменные в общедоступный файл (поэтому будет работать только внутри 1 сервера, и папки лучше всего брать $HOME или /tmp), а следущим шагом через inject читаем переменные, формат переменных обычный, на строку VAR="value", сам путь в Properties File Path
примерно так
В случае, если первая задача хочет запустить вторую, тут очень просто. Ставим плагин Parameterized Trigger plugin, во второй задаче перечисляем что мы хотим получать, а в первой добавляем шаг сборки "Trigger/Call builds on other projects" и там есть поле для переменных, которые мы передаём, формат обычный, NEW_VAR=some_var
как-то так
А вот от второй задачи к первой - весьма сложно. Пожалуй, самым простым вариантом - во второй задаче выводим нужные переменные в файл, а в первой импортируем переменные из файла, через шаг сборки Inject environment variables. То есть через trigger build запускаем вторую задачу, там внутри пишем нужные переменные в общедоступный файл (поэтому будет работать только внутри 1 сервера, и папки лучше всего брать $HOME или /tmp), а следущим шагом через inject читаем переменные, формат переменных обычный, на строку VAR="value", сам путь в Properties File Path
примерно так
вторник, 31 марта 2020 г.
aws secrets manager
https://docs.aws.amazon.com/secretsmanager/latest/userguide/manage_create-basic-secret.html
https://docs.aws.amazon.com/secretsmanager/latest/userguide/best-practices.html
https://github.com/jenkinsci/aws-secrets-manager-credentials-provider-plugin/blob/master/docs/README.md
https://docs.aws.amazon.com/cli/latest/reference/secretsmanager/index.html#cli-aws-secretsmanager
Оказывается, через pipeline очень удобно работать с хранящимися данными
Работать лучше через CLI, у веба есть какие-то баги
Bugs
All secrets must be uploaded via the AWS CLI or API. This is because the AWS Web console currently insists on wrapping your secret string in JSON.
https://docs.aws.amazon.com/secretsmanager/latest/userguide/best-practices.html
https://github.com/jenkinsci/aws-secrets-manager-credentials-provider-plugin/blob/master/docs/README.md
https://docs.aws.amazon.com/cli/latest/reference/secretsmanager/index.html#cli-aws-secretsmanager
Оказывается, через pipeline очень удобно работать с хранящимися данными
Работать лучше через CLI, у веба есть какие-то баги
Bugs
All secrets must be uploaded via the AWS CLI or API. This is because the AWS Web console currently insists on wrapping your secret string in JSON.
Jenkins и upload to S3
Жил-был дженкинс, работал себе, задачи на нём вида Freestyle крутились себе. И сразу оговорка, нода, на которой запускалась задача выкатки, не в амазоне, дальше это будет важно.
Есть для выкатки через freestyle плагин s3 publish, он же /s3/ в плагинах. Но есть у него огромный, гигантский косяк: он не умеет в ACL. Вообще не умеет. Ни в каком виде. А на офсайте жалкая отмазка "выставите нужные права на весь бакет через IAM", что разумеется далеко не всегда приемлемо.
Да, у него есть metadata, но толку от неё ровно 0. Потому что оно мало того что не умеет Canned ACL, так даже x-amz- не выставить, там захардкожен префикс, что-то вроде x-amz-meta-, и ничего с этим не сделать. Ладно, не было печали, посмотрим другие варианты.
aws s3 cp|sync
s3cmd put|sync
итд - поскольку нода не в амазоне, мы не можем настроить IAM на выкатку без токена, а по некоторым причинам его могут не давать сделать.
Хорошо, есть вроде неплохой плагин aws pipeline plugin, он умеет сильно больше чем s3 plugin, поставим. И первый косяк, оно не умеет в freestyle. Надо переписывать задачу в pipeline. Что ж, давно было желание, переписали. Второй косяк. s3Upload не работает, потому что конфликт имён с s3 plugin. И как только мы удаляем s3 plugin, у нас ломаются все связанные задачи. А их может быть больше десятка. Но и это не всё. Косяк 3. Похоже, что s3 plugin выкатывал файлы через Jenkins, потому что оно просто работало. А aws pipeline делает это с самой ноды, и ничего не работает. Никто же не добавил AWS_ переменные. Но даже если добавить withAWS - может не заработать, если у нас не 2 переменные а 3: AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, AWS_SESSION_TOKEN. И передать их как-то - не выйдет. И выставить через def в начале пайплайна - тоже не работает. Так что 2 плагина, функционал которых фактически не пересекается, вместе стоять не могут.
Тут на помощь приходят copyArtifact и более удобный в данном случае stash, при условии что у нас есть нода в амазоне, на которой можно будет сделать unstash + s3Upload.
На то, чтобы выяснить и отладить это всё, может уйти не 1 день.
Если бы удалось пропихнуть фикс в s3 plugin с переименованием s3Upload во что-то ещё (в этом модуле всего 2 функции, в отличие от заточенный под пайплайны aws pipeline), то они могли бы существовать мирно вместе. А так - им надо обоим ставить тэг Conflicts и блокировать совместную установку.
Есть для выкатки через freestyle плагин s3 publish, он же /s3/ в плагинах. Но есть у него огромный, гигантский косяк: он не умеет в ACL. Вообще не умеет. Ни в каком виде. А на офсайте жалкая отмазка "выставите нужные права на весь бакет через IAM", что разумеется далеко не всегда приемлемо.
Да, у него есть metadata, но толку от неё ровно 0. Потому что оно мало того что не умеет Canned ACL, так даже x-amz- не выставить, там захардкожен префикс, что-то вроде x-amz-meta-, и ничего с этим не сделать. Ладно, не было печали, посмотрим другие варианты.
aws s3 cp|sync
s3cmd put|sync
итд - поскольку нода не в амазоне, мы не можем настроить IAM на выкатку без токена, а по некоторым причинам его могут не давать сделать.
Хорошо, есть вроде неплохой плагин aws pipeline plugin, он умеет сильно больше чем s3 plugin, поставим. И первый косяк, оно не умеет в freestyle. Надо переписывать задачу в pipeline. Что ж, давно было желание, переписали. Второй косяк. s3Upload не работает, потому что конфликт имён с s3 plugin. И как только мы удаляем s3 plugin, у нас ломаются все связанные задачи. А их может быть больше десятка. Но и это не всё. Косяк 3. Похоже, что s3 plugin выкатывал файлы через Jenkins, потому что оно просто работало. А aws pipeline делает это с самой ноды, и ничего не работает. Никто же не добавил AWS_ переменные. Но даже если добавить withAWS - может не заработать, если у нас не 2 переменные а 3: AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, AWS_SESSION_TOKEN. И передать их как-то - не выйдет. И выставить через def в начале пайплайна - тоже не работает. Так что 2 плагина, функционал которых фактически не пересекается, вместе стоять не могут.
Тут на помощь приходят copyArtifact и более удобный в данном случае stash, при условии что у нас есть нода в амазоне, на которой можно будет сделать unstash + s3Upload.
На то, чтобы выяснить и отладить это всё, может уйти не 1 день.
Если бы удалось пропихнуть фикс в s3 plugin с переименованием s3Upload во что-то ещё (в этом модуле всего 2 функции, в отличие от заточенный под пайплайны aws pipeline), то они могли бы существовать мирно вместе. А так - им надо обоим ставить тэг Conflicts и блокировать совместную установку.
понедельник, 30 марта 2020 г.
Debian: EOL Шрёдингера
Дебиан настолько гениален и велик, что у него бывает EOL Штрёдингера. Когда он еол и не еол одновременно.
https://www.debian.org/releases/jessie/index.ru.html
Jessie получает долгосрочную поддержку (LTS) вплоть до конца июня 2020 года.
Но. https://lepkov.ru/debian-8-jessie-repo-update/
Для пакета jessie-updates вы можете просто удалить его из своего /etc/apt/sources.list. Это бесполезно, потому что все пакеты, которые были в обновлениях jessie, были объединены в jessie, когда был выпущен Debian 8.11.
Пакет jessie-backports был заархивирован на archive.debian.org, поэтому вы можете использовать:
...
Более того, просто поправив бэкпорты, получаем сразу 2 ошибки.
E: Release file for http://archive.debian.org/debian/dists/jessie-backports/InRelease is expired (invalid since 3600d 1h 9min 51s). Updates for this repository will not be applied.
И то, что пакеты больше не согласованы. Банальный certbot УЖЕ не поставить, ругается на зависимости слишком свежих версий. Но это уже совсем другая история...
https://www.debian.org/releases/jessie/index.ru.html
Jessie получает долгосрочную поддержку (LTS) вплоть до конца июня 2020 года.
Но. https://lepkov.ru/debian-8-jessie-repo-update/
Для пакета jessie-updates вы можете просто удалить его из своего /etc/apt/sources.list. Это бесполезно, потому что все пакеты, которые были в обновлениях jessie, были объединены в jessie, когда был выпущен Debian 8.11.
Пакет jessie-backports был заархивирован на archive.debian.org, поэтому вы можете использовать:
...
Более того, просто поправив бэкпорты, получаем сразу 2 ошибки.
E: Release file for http://archive.debian.org/debian/dists/jessie-backports/InRelease is expired (invalid since 3600d 1h 9min 51s). Updates for this repository will not be applied.
И то, что пакеты больше не согласованы. Банальный certbot УЖЕ не поставить, ругается на зависимости слишком свежих версий. Но это уже совсем другая история...
AWS S3: немного про ACL
Для начала, как посмотреть права на файле в s3, кроме веба?
s3cmd info s3://(bucket)/(dir/file)
aws s3api get-object-acl --bucket (bucket) --key (dir/file)
В выводе будут строки ACL:
Но что с этим знанием делать дальше? Для начала, читать доку
пятница, 27 марта 2020 г.
вторник, 24 марта 2020 г.
Jenkins: переносим задачи на другой сервер
При наличии доступа к серверу:
переносим /var/lib/jenkinsпонедельник, 23 марта 2020 г.
DevOps для разработчиков
https://habr.com/ru/company/jugru/blog/489488/
Достаточно интересный взгляд на задачи девопса и плюсы для программиста
Достаточно интересный взгляд на задачи девопса и плюсы для программиста
Подписаться на:
Сообщения (Atom)