CD with Jenkins. Lessons Learned

67 %
33 %
Information about CD with Jenkins. Lessons Learned

Published on November 4, 2016

Author: kirilltolkachev7

Source: slideshare.net

1. CD with Jenkins Lessons Learned

2. @tolkv 2 @lavcraft

3. About me Architect@ /aatarasoff /aatarasoff habrahabr.ru/aatarasoff developerblog.info

4. Что такое Jenkins? ПО для сборки артефактов?

5. Continuous Integration Много людей - один артефакт Синхронизация изменений, тестирование, code review Цель - артефакт

6. Monolith Microservices

7. Continuous Integration Delivery

8. Continuous Delivery Артефактов много Не нужна синхронизация изменений Цель - деплой в бой

9. Три часа и в продакшен

10. Continuous Delivery Tools Jenkins GoCD Team City CircleCI etc.

11. Почему Jenkins? OpenSource Экспертиза Огромное количество интеграций Pipeline Plugin

12. Lessons Learned 1. Линейный Pipeline

13. Линейная доставка Независимые потоки доставки Нет менеджмента зависимостей Каждый артефакт готов работать в неполном окружении Feature Toggle

14. Pipeline plugin Декларативное описание процесса (Groovy DSL) Очень просто сконфигурировать Визуализация процесса

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. //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. //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. //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. //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

20. //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

21. //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' ]] ]) }

22. //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' ]] ]) }

23. //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

24. Интерфейс Jenkins

25. Интерфейс Jenkins

26. Blueocean plugin Пока в стадии beta Красивая визуализация процесса на современных технологиях

27. Нет интерфейса – нет проблем

28. Lessons Learned 1. Линейный Pipeline 2. Автогенерация джобов

29. Job DSL plugin Декларативное описание создания джобов (Groovy DSL) Очень просто сконфигурировать, легко смасштабировать Унификация разработки как бонус

30. jobs.each { job -> pipelineJob("${basePath}/${job}") { //define SCM definition { cps { script(readFileFromWorkspace('some_script.groovy')) sandbox() } } } }

31. jobs.each { job -> pipelineJob("${basePath}/${job}") { //define SCM definition { cps { script(readFileFromWorkspace('some_script.groovy')) sandbox() } } } }

32. scm { git { remote { url "${some_url}.git" credentials 'jenkins-git' } branch '*/master' createTag false } } logRotator { numToKeep(3) } concurrentBuild(false)

33. Что есть ansible: • установка jenkins master

34. Что есть ansible: • установка jenkins master • juseppe обязательно нужен

35. Что есть ansible: • установка jenkins master • juseppe обязательно нужен • преднастройка slave

36. Что есть ansible: • установка jenkins master • juseppe обязательно нужен • преднастройка slave проекты:

37. Lessons Learned 1. Линейный Pipeline 2. Автогенерация джобов 3. Даём управление человеку

38. А зачем нам человек? Недостаточный уровень автоматизации Невозможность принять решение go-nogo в автоматическом режиме Формальные процедуры и процессы

39. Pipeline inputs Дают возможность приостановить работу до принятия решения человеком Есть REST API Можно параметризовать http://developerblog.info/2016/05/31/poluchaiem-upravlieniie-obratno-v-jenkins-pipeli ne/

40. input id: 'TestsArePassed' http://host:port/job/name/number/input/TestsArePassed/proceedEmpty http://host:port/job/name/number/input/TestsArePassed/abort

41. Jira Integration Учётная система Возможность назначать на определённые этапы ответственных лиц

42. jiraIssueUpdate( jqlSearch: jql, workflowActionName: 'Testing', comment: "Deploy to test environment is completed" ) jiraComment ( issueKey: jira_id, body: "Auto tests have been started» )

43. <——— Интеграционные тесты <——— Сборка завершена <——— Деплой в тест

44. Lessons Learned 1. Линейный Pipeline 2. Автогенерация джобов 3. Даём управление человеку 4. Борьба с ограничениями

45. Не хватает возможностей ? Это OpenSource, всегда можно написать свой плагин или доработать существующий Пул-реквесты не всегда будут приняты … или будут приняты через продолжительное время

46. //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' ]] ]) }

47. //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 } }

48. //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 } } Удобно, но патч был отклонён

49. jiraIssueUpdate( jqlSearch: jql, workflowActionName: 'Testing', comment: 'Deploy to test environment is completed' )

50. jiraIssueUpdate( jqlSearch: jql, workflowActionName: 'Testing', comment: 'Deploy to test environment is completed' ) jiraIssueFieldUpdate( issueKey: jira_id, fieldName: 'Jenkins Info', fieldValue: 'some value' ) Патч пока висит на рассмотрении

51. Не жди, используй Juseppe? OpenSource UpdateCenter Можно собирать свои версии плагинов раньше, чем они попадут в UpdateCenter Решает проблемы с сетевым доступом (это когда у мастера нет доступа в интернет) https://github.com/yandex-qatools/jusepp e

52. Сетевые ограничения Разные среды в разных DMZ Сложно заказывать доступы между машинами Решение в использовании slave-ов с разными лэйблами для разных сред/сетевых сегментов

53. Сетевые ограничения Разные среды в разных DMZ Сложно заказывать доступы между машинами Решение в использовании slave-ов с разными лэйблами для разных сред/сетевых сегментов

54. Lessons Learned 1. Линейный Pipeline 2. Автогенерация джобов 3. Даём управление человеку 4. Борьба с ограничениями 5. Конфигурируй как код

55. docker rm -f jenkins

56. docker rm -f jenkins

57. Конфигурация как код Не хочется делать Backup-ы Команд много и есть желание быстро поднимать и конфигурировать новые экземпляры Immutable-конфигурация

58. Конфигурация как код Не хочется делать Backup-ы Команд много и есть желание быстро поднимать и конфигурировать новые экземпляры Immutable-конфигурация

59. Конфигурация как код Не хочется делать Backup-ы Команд много и есть желание быстро поднимать и конфигурировать новые экземпляры Immutable-конфигурация

60. Блеск и нищета конфигурации Легко конфигурировать джобы (см. JobDSL и Pipeline Plugin) Добавлять мета-джобы можно через jenkins-cli Сложно конфигурировать сам Jenkins: credentials, tools, plugins (шаблонизация xml, init groovy scripts, API, cli etc.)

61. curl -XPOST 'jenkins/credentials/store/system/domain/_/createCredentials' --data-urlencode 'json={ "credentials": { "scope": "GLOBAL", "id": "jenkins-http", "username": "jenkins", "password": "sniknej123", "description": "", "$class": "...UsernamePasswordCredentialsImpl" } }'

62. Конфигурация как код говоришь?

63. Конфигурация как год говоришь Install Master

64. Конфигурация как год говоришь Install Master template job xml

65. Конфигурация как год говоришь Install Master template job xml Job DSL

66. Конфигурация как год говоришь Install Master template job xml Job DSL Git job dslpipeline groovy

67. Конфигурация как год говоришь Install Master template job xml Job DSL Git job dslpipeline groovy Generate jobs

68. Больше Прокси Джобов

69. Больше Прокси Джобов

70. Lessons Learned 1. Линейный Pipeline 2. Автогенерация джобов 3. Даём управление человеку 4. Борьба с ограничениями 5. Конфигурируй как код

71. Lessons Learned 1. Линейный Pipeline 2. Автогенерация джобов 3. Даём управление человеку 4. Борьба с ограничениями 5. Конфигурируй как код

72. Lessons Learned 1. Отдельные Master´а

73. Lessons Learned 1. Отдельные Master´а 2. Всё как код

74. Lessons Learned 1. Отдельные Master´а 2. Всё как код 3. Пайплайн всем

75. Lessons Learned 1. Отдельные Master´а 2. Всё как код 3. Пайплайн всем 4. Не смотреть в UI

76. Lessons Learned 1. Отдельные Master´а 2. Всё как код 3. Пайплайн всем 4. Не смотреть в UI 5. KISS и Контрибьють!

77. Plugins & tools List JobDSL Pipeline Plugin Blueocean Plugin Jira Plugin Juseppe

78. @aatarasoff @aatarasoff QA @tolkv @lavcraft

Add a comment