Terraform ไม่สามารถดึงโมดูลเป็นส่วนหนึ่งของไปป์ไลน์เจนกินส์ได้

ฉันมี jenkinsfile ที่ใช้งานได้และสามารถปรับใช้โครงสร้างพื้นฐานบางอย่างโดยอัตโนมัติด้วย Terraform น่าเสียดายหลังจากเพิ่มโมดูล Terraform ด้วยซอร์ส git มันหยุดทำงานโดยมีข้อผิดพลาดต่อไปนี้:

+ terraform init -input=false -upgrade

Upgrading modules...

- module.logstash

  Updating source "git::https://bitbucket.org/*****"

Error downloading modules: Error loading modules: error downloading 'https://bitbucket.org/*****': /usr/bin/git exited with 128: Cloning into '.terraform/modules/34024e811e7ce0e58ceae615c545a1f8'...

fatal: could not read Username for 'https://bitbucket.org': No such device or address



script returned exit code 1

URL ข้างต้นถูกทำให้สับสนหลังจากข้อเท็จจริงแล้ว ด้านล่างนี้คือไวยากรณ์ของโมดูลแบบตัดทอน:

module "logstash" {
  source             = "git::https://bitbucket.org/******"
  ...
}

ด้านล่างเป็นไฟล์ Jenkins:

pipeline {
  agent {
    label 'linux'
  }
  triggers {
    pollSCM('*/5 * * * *')
  }
  stages {
    stage ('init') {
      steps {
        sh 'terraform init -input=false -upgrade'
      }
    }
    stage('validate') {
      steps {
        sh 'terraform validate -var-file="production.tfvars"'
      }
    }
    stage('deploy') {
      when {
        branch 'master'
      }
      steps {
        sh 'terraform apply -auto-approve -input=false -var-file=production.tfvars'
      }
    }
  }
}

ฉันเชื่อว่านี่เป็นปัญหากับ Terraform ภายในโดยใช้ git เพื่อชำระเงินโมดูล แต่ Jenkins ไม่ได้กำหนดค่าไคลเอนต์ git ภายในงานไปป์ไลน์เอง โดยเฉพาะอย่างยิ่งฉันสามารถส่งข้อมูลรับรองที่ใช้โดยงานไปป์ไลน์แบบหลายสาขาไปยังงานเองและกำหนดค่าคอมไพล์ได้ แต่ฉันไม่รู้ว่าจะทำอย่างไร ความช่วยเหลือใด ๆ ที่จะได้รับการชื่นชม


person George Richardson    schedule 11.10.2018    source แหล่งที่มา
comment
เป็นโครงการสาธารณะหรือไม่?   -  person ydaetskcoR    schedule 11.10.2018
comment
@ydaetskcoR ไม่มันไม่ใช่น่าเสียดาย ทั้งโปรเจ็กต์หลักและโมดูลเป็น repos ส่วนตัวใน bitbucket   -  person George Richardson    schedule 11.10.2018
comment
นี่เป็นปัญหา git ไม่ใช่ปัญหา Terraform/Jenkins   -  person Matt Schuchard    schedule 11.10.2018
comment
@MattSchuchard ฉันรู้ว่านี่เป็นปัญหาข้อมูลรับรองคอมไพล์ อย่างไรก็ตาม มันเป็นการส่งข้อมูลรับรองการชำระเงินจากบิลด์เจนกินส์ที่ฉันประสบปัญหา ไม่ใช่กำหนดค่าคอมไพล์เองซึ่งฉันสามารถทำได้ด้วยตนเอง   -  person George Richardson    schedule 11.10.2018
comment
ฉันไม่เห็น withCredentials ใด ๆ ในรหัสไปป์ไลน์ของคุณ   -  person Matt Schuchard    schedule 11.10.2018


คำตอบ (1)


ดังนั้นฉันจึงพบวิธีแก้ปัญหาที่ไม่เหมาะซึ่งกำหนดให้คุณต้องระบุข้อมูลรับรองภายใน Jenkinsfile ของคุณแทนที่จะใช้ข้อมูลประจำตัวที่งานใช้เพื่อชำระเงินโดยอัตโนมัติ

withCredentials([usernamePassword(credentialsId: 'bitbucketcreds', passwordVariable: 'GIT_PASS', usernameVariable: 'GIT_USER')]) {
  sh "git config --global credential.helper '!f() { sleep 1; echo \"username=${env.GIT_USER}\\npassword=${env.GIT_PASS}\"; }; f'"
  sh 'terraform init -input=false -upgrade'
  sh 'git config --global --remove-section credential'
}

เคล็ดลับคือการโหลดข้อมูลรับรองลงในตัวแปรสภาพแวดล้อมโดยใช้บล็อก withCredentials จากนั้นฉันใช้คำตอบจาก คำถามนี้เพื่อตั้งค่าตัวช่วยข้อมูลรับรองเพื่อให้คอมไพล์อ่านในเครดิตเหล่านั้น จากนั้นคุณสามารถเรียกใช้ terraform init และมันจะดึงโมดูลของคุณลงมา ในที่สุดก็ล้างการตั้งค่าคอมไพล์ที่แก้ไขแล้ว เพื่อหวังว่าจะหลีกเลี่ยงการปนเปื้อนบิลด์อื่น ๆ โปรดทราบว่าการกำหนดค่า --global ที่นี่อาจไม่ใช่ความคิดที่ดีสำหรับคนส่วนใหญ่ แต่จำเป็นสำหรับฉันเนื่องจากความไม่ชอบมาพากลของตัวแทน Jenkins ของเรา

หากใครมีวิธีที่ราบรื่นกว่านี้ในการทำเช่นนี้ฉันก็สนใจที่จะได้ยินมันมาก

person George Richardson    schedule 12.10.2018