Terraform tidak dapat menarik modul sebagai bagian dari pipa jenkins

Saya memiliki jenkinsfile yang berfungsi dan dapat menerapkan beberapa infrastruktur secara otomatis dengan terraform. Sayangnya setelah menambahkan modul terraform dengan sumber git, modul tersebut berhenti berfungsi dengan kesalahan berikut:

+ 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 di atas dikaburkan setelah kejadian tersebut. Di bawah ini adalah sintaks modul cut down:

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

Di bawah ini adalah file 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'
      }
    }
  }
}

Saya yakin ini adalah masalah dengan terraform secara internal yang menggunakan git untuk memeriksa modul tetapi Jenkins belum mengonfigurasi klien git dalam pekerjaan pipeline itu sendiri. Sebaiknya saya dapat meneruskan kredensial yang digunakan oleh pekerjaan pipa multibranch ke dalam pekerjaan itu sendiri dan mengkonfigurasi git tetapi saya tidak tahu bagaimana cara melakukannya. Bantuan apa pun akan dihargai.


person George Richardson    schedule 11.10.2018    source sumber
comment
Apakah ini proyek publik?   -  person ydaetskcoR    schedule 11.10.2018
comment
@ydaetskcoR tidak, sayangnya. Proyek induk dan modul adalah repo pribadi di bitbucket   -  person George Richardson    schedule 11.10.2018
comment
Ini adalah masalah git dan bukan masalah Terraform/Jenkins.   -  person Matt Schuchard    schedule 11.10.2018
comment
@MattSchuchard Saya sadar bahwa ini adalah masalah kredensial git, namun ini adalah tindakan meneruskan kredensial checkout dari build Jenkins yang bermasalah dengan saya, bukan mengonfigurasi git itu sendiri yang dapat saya lakukan secara manual.   -  person George Richardson    schedule 11.10.2018
comment
saya tidak melihat withCredentials apa pun dalam kode saluran Anda.   -  person Matt Schuchard    schedule 11.10.2018


Jawaban (1)


Jadi saya menemukan solusi yang tidak ideal yang mengharuskan Anda menentukan kredensial di dalam Jenkinsfile Anda daripada secara otomatis menggunakan kredensial yang digunakan oleh pekerjaan untuk checkout.

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'
}

Caranya adalah dengan memuat kredensial ke dalam variabel lingkungan menggunakan blok withCredentials dan kemudian saya menggunakan jawaban dari pertanyaan ini untuk menyetel pembantu kredensial agar git dapat membaca kredit tersebut. Anda kemudian dapat menjalankan terraform init dan itu akan menurunkan modul Anda. Akhirnya menghapus pengaturan git yang dimodifikasi agar tidak mengkontaminasi build lain. Perhatikan bahwa konfigurasi --global di sini mungkin bukan ide yang baik bagi kebanyakan orang tetapi diperlukan bagi saya karena kekhasan agen Jenkins kami.

Jika ada yang punya cara lebih lancar untuk melakukan ini, saya akan sangat tertarik mendengarnya.

person George Richardson    schedule 12.10.2018