интегрировать Дженкинса в Terraform с Bitbucket - PullRequest
0 голосов
/ 12 декабря 2018

Я создал скрипт terraform для архитектуры aws, который включает в себя экземпляр ec2 и jenkins на ec2.Я новичок в jenkins и пытаюсь понять, как интегрировать его с bitbucket, используя существующий скрипт terraform.Любая помощь будет принята с благодарностью.

1 Ответ

0 голосов
/ 13 декабря 2018

Рабочий процесс конвейера CI / CD для применения изменений в инфраструктуре с использованием terraform:

  1. Разработчик или инженер по эксплуатации изменяют файл конфигурации terraform на своем локальном компьютере и фиксируют код в BitBucket.
  2. Gitbucket webhook запускает задание непрерывной интеграции для jenkins.
  3. Jenkins извлекает последний код из сконфигурированного репо, который содержит файлы terraform, в свое рабочее пространство.
  4. Он считывает конфигурацию terraform, а затем инициализируетудаленный консул backend.
  5. Terraform создает план об изменениях, которые должны быть применены к инфраструктуре
  6. Jenkins отправляет уведомление в свободный канал об изменениях для утверждения вручную.
  7. Здесь пользователь может одобрить или отклонить план terraform.
  8. Пользовательский ввод отправляется на сервер jenkins для продолжения дальнейших действий.
  9. После того, как изменения утверждены оператором, jenkinsвыполнит команду применения Terraformотражают изменения в инфраструктуре.
  10. Terraform создаст отчет о ресурсах и их зависимостях, созданных при выполнении плана.
  11. Terraform предоставит ресурсы в среде провайдера.
  12. Jenkins снова отправит уведомление слабому каналу о состоянии инфраструктуры после внесения в нее изменений.После выполнения задания конвейерное задание Jenkin настраивается для очистки рабочей области, созданной заданием.

Как настроить среду развертывания?

  1. Создать репозиторий вИнструменты scm, такие как gitlab или bitbucket, передают конфигурацию terraform и ее модуль зависимостей в репозиторий.Если вы используете какой-либо сторонний удаленный модуль в качестве зависимости, он будет автоматически загружен во время выполнения.
  2. Если у вас нет сервера Jenkins, просто извлеките образ док-станции jenkins и запустите его на локальном компьютере.Если вы настраиваете его в облачной среде, проверьте образ виртуальной машины jenkins на Marketplace, чтобы настроить среду и настроить необходимые плагины.
  3. Создайте веб-крюк в настройках репозитория Bitbucket, чтобы вызвать http-вызов к вашемуjenkins перезванивает URL для запуска задания непрерывной интеграции.
  4. Если у вас есть существующий сервер jenkins, убедитесь, что на сервере jenkins установлен плагин конвейера.В противном случае перейдите к «Управление подключаемыми модулями» и установите подключаемый модуль конвейера.
  5. В этом проекте мы используем консул в качестве удаленного бэкэнда для сохранения состояния и блокировки состояния.Не рекомендуется использовать локальное состояние для случая, когда в проекте задействовано несколько человек, и для производственных развертываний.Хорошо использовать удаленный бэкэнд, который обеспечивает высокодоступное хранилище с функциями блокировки состояния, чтобы избежать одновременной записи состояния несколькими пользователями.
  6. Если в вашей среде нет хранилища ключей консула, просто потянитеКонсул докер образ и настройка кластера одного узла.Если это производственное развертывание, настройте распределенное хранилище значений ключей.
  7. Создайте приложение в Slack и запишите подробности интеграции Slack для настройки его в Jenkinsfile.
  8. Настройте данные вашего провайдера и бэкэндподробности в основном файле конфигурации terraform либо по переменной среды, либо сохраняются в репозитории.В моем случае я собираюсь предоставить ресурс в AWS, а мой CI-сервер размещен в AWS.Поэтому я назначаю роль IAM своему серверу с достаточными привилегиями.
  9. Создайте новый проект в Jenkins с помощью подключаемого модуля конвейера.
  10. Добавьте файл Jenkins, в котором определены этапы конвейера.Сохраните задание и запустите его вручную для тестирования.Затем примените изменения к конфигурации и передайте изменения в битовую корзину и убедитесь, что задание запускается автоматически.Проверьте журнал Jenkins для получения более подробной информации о работе.

enter image description here

###Jenkinsfile###
import groovy.json.JsonOutput

//git env vars
env.git_url = 'https://user@bitbucket.org/user/terraform-ci.git'
env.git_branch = 'master'
env.credentials_id = '1'

//slack env vars
env.slack_url = 'https://hooks.slack.com/services/SDKJSDKS/SDSDJSDK/SDKJSDKDS23434SDSDLCMLC'
env.notification_channel = 'my-slack-channel'

//jenkins env vars
env.jenkins_server_url = 'https://52.79.46.98'
env.jenkins_node_custom_workspace_path = "/opt/bitnami/apps/jenkins/jenkins_home/${JOB_NAME}/workspace"
env.jenkins_node_label = 'master'
env.terraform_version = '0.11.10'

def notifySlack(text, channel, attachments) {
    def payload = JsonOutput.toJson([text: text,
        channel: channel,
        username: "Jenkins",
        attachments: attachments
    ])
    sh "export PATH=/opt/bitnami/common/bin:$PATH && curl -X POST --data-urlencode \'payload=${payload}\' ${slack_url}"
}

pipeline {
	agent {
		node {
			customWorkspace "$jenkins_node_custom_workspace_path"
			label "$jenkins_node_label"
		} 
	}
	
	stages {
		stage('fetch_latest_code') {
			steps {
				git branch: "$git_branch" ,
				credentialsId: "$credentials_id" ,
				url: "$git_url"
			}
		}

		stage('install_deps') {
			steps {
				sh "sudo apt install wget zip python-pip -y"
				sh "cd /tmp"
				sh "curl -o terraform.zip https://releases.hashicorp.com/terraform/'$terraform_version'/terraform_'$terraform_version'_linux_amd64.zip"
				sh "unzip terraform.zip"
				sh "sudo mv terraform /usr/bin"
				sh "rm -rf terraform.zip"
			}
		}

		stage('init_and_plan') {
			steps {
				sh "sudo terraform init $jenkins_node_custom_workspace_path/workspace"
				sh "sudo terraform plan $jenkins_node_custom_workspace_path/workspace"
				notifySlack("Build completed! Build logs from jenkins server $jenkins_server_url/jenkins/job/$JOB_NAME/$BUILD_NUMBER/console", notification_channel, [])
			}
		}

		stage('approve') {
			steps {
			  notifySlack("Do you approve deployment? $jenkins_server_url/jenkins/job/$JOB_NAME", notification_channel, [])
				input 'Do you approve deployment?'
			}
		}

		stage('apply_changes') {
			steps {
				sh "echo 'yes' | sudo terraform apply $jenkins_node_custom_workspace_path/workspace"
				notifySlack("Deployment logs from jenkins server $jenkins_server_url/jenkins/job/$JOB_NAME/$BUILD_NUMBER/console", notification_channel, [])
			}
		}
	}
	
	post { 
  	always { 
    	cleanWs()
   }
  }
}
###Code Completed###
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...