Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Continuous Delivery with Jenkins: Lessons Learned

Сейчас только ленивый не говорит про DevOps, краеугольным камнем которого является организация потока непрерывной доставки ценности клиенту. Continuous Delivery перестаёт быть опцией и становится обязательным требованием.
В докладе будут рассмотрены:
- общие подходы к организации Continuous Delivery на базе Jenkins-а в совсем не тепличных условиях
- практики и подходы, которые позволяют быстро настраивать и собирать десятки микросервисов
- подводные камни, с которыми пришлось столкнуться, и способы борьбы с ними

  • Be the first to comment

  • Be the first to like this

Continuous Delivery with Jenkins: Lessons Learned

  1. 1. CD with Jenkins Lessons Learned
  2. 2. About me Architect @ /aatarasoff /aatarasoff habrahabr.ru/aatarasoff developerblog.info
  3. 3. Что такое Jenkins? ПО для сборки артефактов?
  4. 4. Continuous Integration Много людей - один артефакт Синхронизация изменений, тестирование, code review Цель - артефакт
  5. 5. Monolith Microservices
  6. 6. Continuous Integration Delivery
  7. 7. Continuous Delivery Артефактов много Не нужна синхронизация изменений Цель - деплой в бой
  8. 8. Continuous Delivery Tools Jenkins GoCD Team City CircleCI etc.
  9. 9. Почему Jenkins? OpenSource Экспертиза Огромное количество интеграций Pipeline Plugin
  10. 10. Lessons Learned 1. Линейный Pipeline
  11. 11. Линейная доставка Независимые потоки доставки Нет менеджмента зависимостей Каждый артефакт готов работать в неполном окружении Feature Toggle
  12. 12. Pipeline plugin Декларативное описание процесса (Groovy DSL) Очень просто сконфигурировать Визуализация процесса
  13. 13. //checkout and definition stage node('build') { // Mark the code checkout 'stage' stage 'Checkout' git credentialsId: 'jenkins-git', url: "${git_url}/${repo}.git" // Mark build 'stage' stage 'Build' sh ('./gradlew clean dockerBuild final') } //next steps
  14. 14. //checkout and definition stage node('build') { // Mark the code checkout 'stage' stage 'Checkout' git credentialsId: 'jenkins-git', url: "${git_url}/${repo}.git" // Mark build 'stage' stage 'Build' sh ('./gradlew clean dockerBuild final') } //next steps
  15. 15. //checkout and definition stage node('build') { // Mark the code checkout 'stage' stage 'Checkout' git credentialsId: 'jenkins-git', url: "${git_url}/${repo}.git" // Mark build 'stage' stage 'Build' sh ('./gradlew clean dockerBuild final') } //next steps
  16. 16. //checkout and definition stage node('build') { // Mark the code checkout 'stage' stage 'Checkout' git credentialsId: 'jenkins-git', url: "${git_url}/${repo}.git" // Mark build 'stage' stage 'Build' sh ('./gradlew clean dockerBuild final') } //next steps
  17. 17. //checkout and definition stage node('build') { // Mark the code checkout 'stage' stage 'Checkout' git credentialsId: 'jenkins-git', url: "${git_url}/${repo}.git" // Mark build 'stage' stage 'Build' sh ('./gradlew clean dockerBuild final') } //next steps
  18. 18. //checkout and definition stage node('build') { // Mark the code checkout 'stage' stage 'Checkout' git credentialsId: 'jenkins-git', url: "${git_url}/${repo}.git" // Mark build 'stage' stage 'Build' sh ('./gradlew clean dockerBuild final') } //next steps
  19. 19. //checkout and definition stage node('build') { // Mark the code checkout 'stage' stage 'Checkout' checkout([$class: 'GitSCM', branches: [[name: '*/master']], doGenerateSubmoduleConfigurations: false, extensions: [ [$class: 'UserExclusion', excludedUsers: 'jenkins'], [$class: 'CleanBeforeCheckout'], [$class: 'LocalBranch', localBranch: 'master'] ], userRemoteConfigs: [[ credentialsId: 'jenkins-git', url: "${git_url}/${artifact_name}.git", refspec: '+refs/heads/master:refs/remotes/origin/master' ]] ]) }
  20. 20. Blueocean plugin Пока в стадии alpha Красивая визуализация процесса на современных технологиях
  21. 21. Lessons Learned 1. Линейный Pipeline 2. Автогенерация джобов
  22. 22. Job DSL plugin Декларативное описание создания джобов (Groovy DSL) Очень просто сконфигурировать, легко смасштабировать Унификация разработки как бонус
  23. 23. def jobs = "${JOBS_LIST}".split( 'n' ) jobs.each { job -> pipelineJob("${basePath}/${job}") { //define SCM definition { cps { script(readFileFromWorkspace('some_script.groovy')) sandbox() } } } }
  24. 24. def jobs = "${JOBS_LIST}".split( 'n' ) jobs.each { job -> pipelineJob("${basePath}/${job}") { //define SCM definition { cps { script(readFileFromWorkspace('some_script.groovy')) sandbox() } } } }
  25. 25. scm { git { remote { url "${some_url}.git" credentials 'jenkins-git' } branch '*/master' createTag false } } logRotator { numToKeep(3) } concurrentBuild(false)
  26. 26. Lessons Learned 1. Линейный Pipeline 2. Автогенерация джобов 3. Даём управление человеку
  27. 27. А зачем нам человек? Недостаточный уровень автоматизации Невозможность принять решение go-nogo в автоматическом режиме Формальные процедуры и процессы
  28. 28. Pipeline inputs Дают возможность приостановить работу до принятия решения человеком Есть REST API Можно параметризовать http://developerblog.info/2016/05/31/poluchaiem-upravlieniie-obratno-v-jenkins-pipeline/
  29. 29. input id: 'TestsArePassed' http://host:port/job/name/number/input/TestsArePassed/proceedEmpty http://host:port/job/name/number/input/TestsArePassed/abort
  30. 30. Jira Integration Учётная система Возможность назначать на определённые этапы ответственных лиц Jira Plugin (есть интеграция с Pipeline Plugin)
  31. 31. jiraIssueUpdate( jqlSearch: jql, workflowActionName: 'Testing', comment: "Deploy to test environment is completed" ) jiraComment ( issueKey: jira_id, body: "Auto tests have been started» )
  32. 32. Lessons Learned 1. Линейный Pipeline 2. Автогенерация джобов 3. Даём управление человеку 4. Борьба с ограничениями
  33. 33. Не хватает возможностей? Это OpenSource, всегда можно написать свой плагин или доработать существующий Пул-реквесты не всегда будут приняты … или будут приняты через продолжительное время
  34. 34. //checkout and definition stage node('build') { // Mark the code checkout 'stage' stage 'Checkout' checkout([$class: 'GitSCM', branches: [[name: '*/master']], doGenerateSubmoduleConfigurations: false, extensions: [ [$class: 'UserExclusion', excludedUsers: 'jenkins'], [$class: 'CleanBeforeCheckout'], [$class: 'LocalBranch', localBranch: 'master'] ], userRemoteConfigs: [[ credentialsId: 'jenkins-git', url: "${git_url}/${artifact_name}.git", refspec: '+refs/heads/master:refs/remotes/origin/master' ]] ]) }
  35. 35. //checkout and definition stage node('build') { // Mark the code checkout 'stage' stage 'Checkout' git credentialsId: 'jenkins-git', url: "${git_url}/${repo}.git", excludedUsers: 'jenkins', cleanBeforeCheckout: true } Удобно, но патч был отклонён
  36. 36. jiraIssueUpdate( jqlSearch: jql, workflowActionName: 'Testing', comment: 'Deploy to test environment is completed' )
  37. 37. jiraIssueUpdate( jqlSearch: jql, workflowActionName: 'Testing', comment: 'Deploy to test environment is completed' ) jiraIssueFieldUpdate( issueKey: jira_id, fieldName: 'Jenkins Info', fieldValue: 'some value' ) Патч пока висит на рассмотрении
  38. 38. Не жди, используй Juseppe? OpenSource UpdateCenter Можно собирать свои версии плагинов раньше, чем они попадут в UpdateCenter Решает проблемы с сетевым доступом (это когда у мастера нет доступа в интернет) https://github.com/yandex-qatools/juseppe
  39. 39. Сетевые ограничения Разные среды в разных DMZ Сложно заказывать доступы между машинами Решение в использовании slave-ов с разными лэйблами для разных сред/сетевых сегментов
  40. 40. Lessons Learned 1. Линейный Pipeline 2. Автогенерация джобов 3. Даём управление человеку 4. Борьба с ограничениями 5. Конфигурируй как код
  41. 41. Конфигурация как код Не хочется делать Backup-ы Команд много и есть желание быстро поднимать и конфигурировать новые экземпляры Immutable-конфигурация
  42. 42. Блеск и нищета конфигурации Легко конфигурировать джобы (см. JobDSL и Pipeline Plugin) Добавлять мета-джобы можно через jenkins-cli Сложно конфигурировать сам Jenkins: credentials, tools, plugins (шаблонизация xml, init groovy scripts, API etc.)
  43. 43. Lessons Learned 1. Линейный Pipeline 2. Автогенерация джобов 3. Даём управление человеку 4. Борьба с ограничениями 5. Конфигурируй как код
  44. 44. Plugins & tools List JobDSL Pipeline Plugin Blueocean Plugin Jira Plugin Juseppe
  45. 45. /aatarasoff /aatarasoff habrahabr.ru/aatarasoff developerblog.info Вопросы и ответы Architect @

    Be the first to comment

    Login to see the comments

Сейчас только ленивый не говорит про DevOps, краеугольным камнем которого является организация потока непрерывной доставки ценности клиенту. Continuous Delivery перестаёт быть опцией и становится обязательным требованием. В докладе будут рассмотрены: - общие подходы к организации Continuous Delivery на базе Jenkins-а в совсем не тепличных условиях - практики и подходы, которые позволяют быстро настраивать и собирать десятки микросервисов - подводные камни, с которыми пришлось столкнуться, и способы борьбы с ними

Views

Total views

3,228

On Slideshare

0

From embeds

0

Number of embeds

57

Actions

Downloads

28

Shares

0

Comments

0

Likes

0

×