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

Я считаю, что это проблема с внутренним терраформом с использованием git для проверки модуля, но Дженкинс не настроил клиент git внутри самого задания конвейера. Желательно, чтобы я мог каким-то образом передать учетные данные, используемые заданием многоотраслевого конвейера, в само задание и настроить git, но я не понимаю, как это сделать. Любая помощь будет оценена.


person George Richardson    schedule 11.10.2018    source источник
comment
Это публичный проект?   -  person ydaetskcoR    schedule 11.10.2018
comment
@ydaetskcoR нет, к сожалению, это не так. И родительский проект, и модуль являются частными репозиториями в битбакете.   -  person George Richardson    schedule 11.10.2018
comment
Это проблема git, а не проблема Terraform / Jenkins.   -  person Matt Schuchard    schedule 11.10.2018
comment
@MattSchuchard Я знаю, что это проблема с учетными данными git, однако это акт передачи учетных данных проверки из сборки Jenkins, с которой у меня возникли проблемы, а не настройка самого git, которую я мог бы сделать вручную.   -  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, а затем я использовал ответ от этот вопрос, чтобы установить помощник по учетным данным для чтения git в этих кредитах. Затем вы можете запустить terraform init, и он сбросит ваши модули. Наконец, он очищает измененные настройки git, чтобы избежать заражения других сборок. Обратите внимание, что конфигурация --global здесь, вероятно, не лучшая идея для большинства людей, но она потребовалась мне из-за причуды в наших агентах Jenkins.

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

person George Richardson    schedule 12.10.2018