Я довольно новичок в работе с Дженкинсом, и у меня есть пара вопросов. Я надеюсь, что вы, ребята, классные, сможете помочь мне в правильном направлении. У меня закончились ссылки на 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
"""
}
}
}
}
}
}
}