簡體   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