Общий трубопровод Дженкинс для Terraform - PullRequest
1 голос
/ 26 марта 2019

Я довольно новичок в работе с Дженкинсом, и у меня есть пара вопросов. Я надеюсь, что вы, ребята, классные, сможете помочь мне в правильном направлении. У меня закончились ссылки на Google, и документация Jenkins мне здесь не помогает.

Сначала небольшая информация о том, над чем я работаю. Я работаю над созданием общего / общего конвейера Jenkins, через который наша команда может выполнить наш код terraform. Конвейер является декларативным с несколькими этапами: проверка git, инициализация / план TF, утверждение плана TF и ​​применение TF.

Три основные проблемы, над которыми я работаю:

1) Убедиться в отсутствии коллизий, так как будет немало людей, использующих этот конвейер для развертывания своего кода terraform. Прямо сейчас я использую три параметра в рабочей области, чтобы помочь сохранить вещи в контейнере. Это имя проекта, идентификатор учетной записи и название филиала. Я также добавляю эти параметры в имя плана для дополнительного удобства, но не уверен, нужен ли он.

2) Положить план Terraform и применить на разных этапах. Когда выполняется приложение, я получаю сообщение об ошибке, которое необходимо повторно инициализировать, когда я делал это на предыдущем этапе. Что-то мне не хватает, чтобы заставить это работать?

3) Я храню и распаковываю файлы между этапами. Может ли это вызвать конфликты, когда его используют несколько человек? Или этапы довольно контейнерные?

Вот код: (стадии одобрения еще нет)

def repositoryURL = env.gitlabSourceRepoHttpUrl != null && env.gitlabSourceRepoHttpUrl != "" ? env.gitlabSourceRepoHttpUrl : env.RepoURL
def repositoryBranch = env.gitlabTargetBranch != null && env.gitlabTargetBranch != "" ? env.gitlabTargetBranch : env.RepoBranch
def notificationEmail = env.gitlabUserEmail != null && env.gitlabUserEmail != "" ? env.gitlabSourceRepoHttpUrl : env.Email
def projectName = env.ProjectName
def deployAccountId = env.AccountId

pipeline {
    agent none
    stages {
        stage("Checkout") {
            agent any
            steps {
                git branch: "${repositoryBranch}", credentialsId: '...', url: "${repositoryURL}"
                stash name: 'tf', useDefaultExcludes: false
            }
        }
        stage("Terraform Plan") {
            agent {
                kubernetes {
                    label 'myagent'
                    containerTemplate {
                        name 'cis'
                        image 'docker-local.myrepo.com/my-image:v2'
                        ttyEnabled true
                        command 'cat'
                    }
                }
            }
            steps {
                container('cis') {                    
                    unstash 'tf'
                    script {                                                      
                        sh "terraform init"

                        try {
                            sh "terraform workspace select ${deployAccountId}_${projectName}_${repositoryBranch}"
                        } catch (Exception e) {
                            sh "terraform workspace new ${deployAccountId}_${projectName}_${repositoryBranch}"
                        }

                        sh "terraform plan -out=${deployAccountId}_${projectName}_${repositoryBranch}_plan.tfplan -input=false"

                        stash includes: "*.tfplan" name: "tf-plan", useDefaultExcludes: false
                    }
                }
            }
            post{
                success{
                    echo "Terraform init complete"
                }
                failure{
                    echo "Terraform init failed"
                }
            }
        }
        stage ("Terraform Apply") {
            agent {
                kubernetes {
                    label 'myagent'
                    containerTemplate {
                        name 'cis'
                        image 'docker-local.myrepo.com/my-image:v2'
                        ttyEnabled true
                        command 'cat'
                    }
                }
            }
            steps {
                container("cis") {
                    withCredentials([[
                        $class: 'AmazonWebServicesCredentialsBinding',
                        credentialsId: 'my-creds',
                        accessKeyVariable: 'AWS_ACCESS_KEY_ID',
                        secretKeyVariable: 'AWS_SECRET_ACCESS_KEY'
                    ]]) {
                        script {
                            unstash "tf"
                            unstash "tf-plan"                        
                            sh """
                               set +x
                               temp_role="\$(aws sts assume-role --role-arn arn:aws:iam::000000000000:role/myrole --role-session-name jenkinzassume)" > /dev/null 2>&1

                               export AWS_ACCESS_KEY_ID=\$(echo \$temp_role | jq .Credentials.AccessKeyId | xargs) > /dev/null 2>&1
                                export AWS_SECRET_ACCESS_KEY=\$(echo \$temp_role | jq .Credentials.SecretAccessKey | xargs) > /dev/null 2>&1
                                export AWS_SESSION_TOKEN=\$(echo \$temp_role | jq .Credentials.SessionToken | xargs) > /dev/null 2>&1
                                set -x

                               terraform apply ${deployAccountId}_${projectName}_${repositoryBranch}_plan.tfplan
                           """
                        }
                    }
                }
            }
        }
    }
}
...