繁体   English   中英

将jenkins与terrain集成在terraform上

[英]integrate jenkins on terraform with bitbucket

我为aw体系结构创建了terraform脚本,其中包括ec2实例和ec2上的jenkins。 我是jenkins的新手,并试图弄清楚如何使用现有的terraform脚本将其与bitbucket集成。 任何帮助将不胜感激。

CI / CD管道工作流程,用于使用terraform将更改应用于基础架构:

  1. 开发人员或运营工程师在其本地计算机上更改terraform配置文件,并将代码提交给BitBucket。
  2. Gitbucket Webhook触发了jenkins的持续集成工作。
  3. Jenkins将从配置的仓库中提取最新代码,该仓库包含terraform文件到其工作空间。
  4. 它读取terraform配置,然后初始化远程领事后端。
  5. Terraform生成有关必须在基础架构上应用的更改的计划
  6. 詹金斯(Jenkins)将闲置变更的通知发送到闲置渠道,以供人工批准。
  7. 在这里,用户可以批准或不批准地形计划。
  8. 用户输入将发送到jenkins服务器以继续执行进一步的操作。
  9. 一旦更改得到操作员的批准,詹金斯将执行terraform apply命令以将更改反映到基础架构。
  10. Terraform将创建有关在执行计划时创建的资源及其依赖性的报告。
  11. Terraform将在提供程序环境中配置资源。
  12. 在对基础结构应用更改后,Jenkins将再次向松弛通道发送有关基础结构状态的通知。 执行作业后,将配置Jenkin管道作业以清理作业创建的工作空间。

如何设置部署环境?

  1. 在gitlab或bitbucket之类的scm工具中创建一个仓库,然后将terraform配置及其依赖模块提交给仓库。 如果您使用任何第三方远程模块作为依赖项,则它将在执行时自动下载。
  2. 如果您没有Jenkins服务器,则只需提取一个jenkins docker映像并在本地计算机上运行它即可。 如果要在云环境中进行设置,请从市场上检查jenkins虚拟机映像以设置环境并配置所需的插件。
  3. 在bitbucket存储库设置中创建一个webhook,以调用对jenkins回调URL的http调用,以触发持续集成作业。
  4. 如果您有现有的jenkins服务器,请确保在jenkins服务器中安装了管道插件。 否则,转到“管理插件”并安装管道插件。
  5. 在这个项目中,我们使用领事作为状态存储和状态锁定的远程后端。 在项目涉及多个人和生产部署的情况下,建议不要使用本地状态。 最好使用远程后端,该后端可提供具有状态锁定功能的高可用性存储,以避免一次由多个用户写入状态。
  6. 如果您的环境中没有领事键值存储,只需拉出领事docker映像并设置单个节点集群即可。 如果是生产部署,请设置分布式键值存储。
  7. 在Slack中创建一个应用程序,并记下在Jenkinsfile中配置它的Slack集成详细信息。
  8. 通过环境变量或持久化在回购中,在主要terraform配置文件中配置提供者详细信息和后端详细信息。 就我而言,我将在AWS中配置资源,而CI服务器托管在AWS中。 因此,我正在使用足够的权限向服务器分配IAM角色。
  9. 使用管道插件在Jenkins中创建一个新项目。
  10. 在定义管道阶段的位置添加Jenkinsfile。 保存作业并手动触发以进行测试。 然后将更改应用于配置,并将更改提交到bitbucket,并确保自动触发作业。 查看Jenkins日志以获取有关该作业的更多详细信息。

在此处输入图片说明

 ###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### 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM