Terraform не может тянуть модули как часть трубопровода Дженкинса - PullRequest
0 голосов
/ 11 октября 2018

У меня есть файл jenkins, который работал и смог автоматически развернуть некоторую инфраструктуру с помощью 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/******"
  ...
}

Ниже представлен файл Jenkinsfile:

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 для проверки модуля, но Дженкинсне настроен клиент git внутри самого конвейерного задания.Желательно, чтобы я мог как-то передать учетные данные, используемые заданием многоотраслевого конвейера, в само задание и настроить git, но я не знаю, как это сделать.Любая помощь будет оценена.

1 Ответ

0 голосов
/ 12 октября 2018

Итак, я нашел неидеальное решение, которое требует от вас указывать учетные данные в вашем 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, а затем я использовал ответ из этого вопроса , чтобы установить помощник по учетным данным для git для чтения вэти кредиты.Затем вы можете запустить terraform init, и он будет сбрасывать ваши модули.Наконец, он очищает измененные настройки git, чтобы избежать заражения других сборок.Обратите внимание, что конфигурация --global здесь, вероятно, не очень хорошая идея для большинства людей, но она была необходима для меня из-за причуд в наших агентах Jenkins.

Если у кого-то есть более плавный способ сделать это, мне было бы очень интересно услышать это.

...