I am using a pipeline (MainPipeline) which triggers the next one (DependantPipeline).
During the DependantPipeline execution on Azure DevOps I see the error on Terraform Plan
step. The 375562
is the buildId
taken from MainPipeline.
In fact it is correct having look at Artifact Registry in GCP since there is no image with such tag.
When I added that tag manually pipeline passes.
I would not like change the terraform code (since still it must be use as it is in different scenarios) so can I change yml definitions to take the buildId
from MainPipeline and use it in the DependantPipeline? If not thats fine, I am curious, so I paste both terraform code, and pipeline definitions to find the correct way.
deploy.yml where is the Terraform Plan
defined.
parameters:
- name: pipelineOptions
type: object
- name: environment
type: string
- name: terraformServiceConnection
type: string
- name: env
type: string
- name: initializeEnvironment
type: boolean
default: false
- name: tearDownEnvironment
type: boolean
default: false
- name: region
type: string
default: $(region)
- name: artifactName
type: string
default: terraform_src
- name: configurationSteps
type: stepList
default: []
- name: artifact_registry_global
type: object
default:
docker:
projectId: $(artifactRepositoryProjectId)
name: $(artifactRepositoryGlobalDockerRepo)
location: $(artifactRepositoryRegion)
buildArtifactsBucket:
bucketName: 'opsd-build-artifacts'
- name: artifact_registry_component
type: object
default:
- name: terraformVersion
type: string
default: $(GlobalTerraformDefaultVersion)
jobs:
- deployment: terraform_plan
dependsOn: InitDeployment
${{ if or(eq(parameters.pipelineOptions.pipelineMode, 'feature'), eq(parameters.pipelineOptions.pipelineMode, 'main')) }}:
displayName: "Teraform"
${{ else }}:
displayName: "Teraform Plan"
environment: ${{parameters.environment}}
workspace:
clean: all
strategy:
runOnce:
deploy:
steps:
- template: ./templates/prepare.yml
parameters:
pipelineOptions: ${{parameters.pipelineOptions}}
env: ${{parameters.env}}
region: ${{parameters.region}}
artifactStagingDirectory: './artifact_staging'
artifactName: ${{parameters.artifactName}}
artifact_registry_global: ${{parameters.artifact_registry_global}}
artifact_registry_component: ${{parameters.artifact_registry_component}}
configurationSteps: ${{parameters.configurationSteps}}
terraformVersion: ${{parameters.terraformVersion}}
terraformServiceConnection: ${{parameters.terraformServiceConnection}}
- script: mkdir $(Build.ArtifactStagingDirectory)/terraform/
displayName: 'Create Terraform Output Folder'
- task: TerraformCLI@0
displayName: 'Terraform Plan'
name: plan
inputs:
command: plan
publishPlanResults: 'Terraform-Plan-${{parameters.env}}-$(System.StageAttempt)'
workingDirectory: '$(Pipeline.Workspace)/${{parameters.artifactName}}/terraform'
# commandOptions: '-out=$(Build.ArtifactStagingDirectory)/terraform/terraform.tfplan -detailed-exitcode'
commandOptions: '-out=$(Build.ArtifactStagingDirectory)/terraform/terraform.tfplan -compact-warnings -detailed-exitcode -input=false -var-file=./config/$(projectId).tfvars'
providerGoogleCredentials: ${{parameters.terraformServiceConnection}}
allowTelemetryCollection: false
- task: PowerShell@2
displayName: "Terraform Analyze Plan"
name: terraform_plan_analysis
inputs:
targetType: "FilePath"
filePath: "$(opsdCicdTemplates)/terraform/scripts/terraform_analyze_plan.ps1"
workingDirectory: '$(Pipeline.Workspace)/${{parameters.artifactName}}/terraform'
arguments:
-planFile '$(Build.ArtifactStagingDirectory)/terraform/terraform.tfplan'
-env '${{parameters.env}}'
- task: TerraformCLI@0
condition: and(succeeded(), eq('${{parameters.pipelineOptions.pipelineMode}}', 'feature'), eq(variables['terraform_plan_analysis.has_changes'], 'true'), not(eq(variables['terraform_plan_analysis.has_dangerous_changes'], 'true')))
displayName: 'Terraform Apply'
inputs:
command: apply
workingDirectory: '$(Pipeline.Workspace)/${{parameters.artifactName}}/terraform'
commandOptions: '$(Build.ArtifactStagingDirectory)/terraform/terraform.tfplan'
providerGoogleCredentials: ${{parameters.terraformServiceConnection}}
allowTelemetryCollection: false
- task: CopyFiles@2
displayName: "Copy Artifacts to Staging Directory"
condition: and(succeeded(), eq(variables['terraform_plan_analysis.has_changes'], 'true'), not(and(eq('${{parameters.pipelineOptions.pipelineMode}}', 'feature'), not(eq(variables['terraform_plan_analysis.has_dangerous_changes'], true)))))
inputs:
SourceFolder: '$(Pipeline.Workspace)/${{parameters.artifactName}}/terraform'
TargetFolder: '$(Build.ArtifactStagingDirectory)/terraform'
cleanTargetFolder: false
Contents: artifact_staging/**/*
- task: PublishPipelineArtifact@0
displayName: "Publish Terraform Plan"
inputs:
artifactName: 'terraform-plan-${{parameters.env}}-$(System.StageAttempt)'
targetPath: '$(Build.ArtifactStagingDirectory)/terraform'
- job: terraform_validate_plan
displayName: Terraform Validate Plan
dependsOn: terraform_plan
# condition: and(succeeded(), eq(dependencies.terraform_plan.outputs['terraform_plan.terraform_plan_analysis.has_dangerous_changes'], 'true'))
condition: |
and(
succeeded(),
or(
eq(dependencies.terraform_plan.outputs['terraform_plan.terraform_plan_analysis.has_dangerous_changes'], 'true'),
and(
eq('${{parameters.env}}', 'prd'),
eq(dependencies.terraform_plan.outputs['terraform_plan.terraform_plan_analysis.has_changes'], 'true')
)
)
)
pool: server
timeoutInMinutes: 4320
- deployment: terraform_apply
displayName: "Terraform Apply"
dependsOn:
- terraform_plan
- terraform_validate_plan
environment: ${{parameters.environment}}
condition: and(in(dependencies.terraform_validate_plan.result, 'Succeeded', 'Skipped'), eq(dependencies.terraform_plan.outputs['terraform_plan.terraform_plan_analysis.has_changes'], 'true'), not(and(eq('${{parameters.pipelineOptions.pipelineMode}}', 'feature'), not(eq(dependencies.terraform_plan.outputs['terraform_plan.terraform_plan_analysis.has_dangerous_changes'], true)))))
workspace:
clean: all
strategy:
runOnce:
deploy:
steps:
- template: ./templates/prepare.yml
parameters:
pipelineOptions: ${{parameters.pipelineOptions}}
env: ${{parameters.env}}
region: ${{parameters.region}}
artifactStagingDirectory: './artifact_staging'
artifactName: ${{parameters.artifactName}}
artifact_registry_global: ${{parameters.artifact_registry_global}}
artifact_registry_component: ${{parameters.artifact_registry_component}}
configurationSteps: ${{parameters.configurationSteps}}
terraformVersion: ${{parameters.terraformVersion}}
terraformServiceConnection: ${{parameters.terraformServiceConnection}}
- task: DownloadPipelineArtifact@2
displayName: "Download Terraform Plan"
inputs:
source: 'current'
#$(dependencies.terraform_plan.outputs['terraform_plan.terraform_plan_artifact.name']
artifact: 'terraform-plan-${{parameters.env}}-$(System.StageAttempt)'
path: '$(Pipeline.Workspace)/${{parameters.artifactName}}/terraform'
- task: TerraformCLI@0
displayName: 'Terraform Apply'
inputs:
command: apply
workingDirectory: '$(Pipeline.Workspace)/${{parameters.artifactName}}/terraform'
commandOptions: './terraform.tfplan'
providerGoogleCredentials: ${{parameters.terraformServiceConnection}}
allowTelemetryCollection: false
job.tf to which error leads.
data "docker_registry_image" "image" {
name = "${var.image.artifact_registry.location}-docker.pkg.dev/${var.image.artifact_registry.project_id}/${var.image.artifact_registry.name}/services/${var.name}:${var.image.build_id}"
}
module "cloud_run_job" {
source = "../../modules/cloud_run/job"
global = var.global
depends_on = [module.secret_iam_members]
name = var.name
image = "${var.image.artifact_registry.location}-docker.pkg.dev/${var.image.artifact_registry.project_id}/${var.image.artifact_registry.name}/services/${var.name}@${data.docker_registry_image.image.sha256_digest}"
service_account_email = module.service_account.email
environment_variables = local.environment_variables
scaling = var.scaling
timeout_seconds = var.timeout_seconds
vpc_connector = local.vpc_connector
secret_mounts = var.secret_mounts
port = var.port
labels = var.labels