3

I have two pipelines - build and publish. Build pipeline can produce up two artifacts but it depends on given parameters.

Publish pipeline is automatically triggered when build pipeline is completed. Publish pipeline then tooks published artifacts and deploy them. However I want to run publish tasks only and only if particular artifacts exists from build pipeline.

Right now, if artifact does not exists, it will fail "download" task.

Simplified to important parts and redacted some secret info

resources:
  pipelines:
    - pipeline: buildDev # Internal name of the source pipeline, used elsewhere within app-ci YAML, # e.g. to reference published artifacts
      source: "Build"
      trigger:
        branches:
          - dev
          - feat/*


stages:
  - stage: publish
    displayName: " Publish to Firebase"
    jobs:
      - job: publish_firebase_android      
        displayName: "Publish Android to Firebase"
        steps:
          - script: |
               
          - download: buildDev
            artifact: android

          - download: buildDev
            artifact: changelog

          - task: DownloadSecureFile@1
            name: firebaseKey
            displayName: "Download Firebase key"
            inputs:
              secureFile: "<secure>.json"

           - script: <upload>          
             displayName: "Deploy APK to Firebase"
             workingDirectory: "$(Pipeline.Workspace)/buildDev/android/"
        

      - job: publish_firebase_ios
        displayName: "Publish iOS to Firebase"
        steps:
          - download: buildDev
            artifact: iOS

          - download: buildDev
            artifact: changelog
          - task: DownloadSecureFile@1
            name: firebaseKey
            displayName: "Download Firebase key"
            inputs:
              secureFile: "<secure>.json"
          - script: <upload...>
            workingDirectory: "$(Pipeline.Workspace)/buildDev/iOS/"
            displayName: "Deploy IPA to Firebase"           

I've tried to find some solution but every other solution solve the only problem within the same pipeline. Based on MS Docs I can't find if there is a prepared env. a variable that could point to "pipeline resources". With that env. variable I could theoretically run a script which checks presence of artifact, set variable and use that variable as condition for steps.

Petr Nymsa
  • 98
  • 1
  • 9

1 Answers1

2

I think you can use stage filters in trigger. I don't know what structure your build pipeline is, but you can set up a stage to publish artifacts. Execute that stage if there are artifacts to publish, otherwise skip it. You can do this using conditions. Here is a simple sample:

stages:
- stage: Build
  jobs:
  - job: build
    steps:
    ...

- stage: Artifact
  condition: ... # Set the condition based on your parameter
  jobs:
  - job: artifact
    steps:
    ...

Then use the stage filter in the publishing pipeline. If the stage executes successfully, then the publish pipeline will run, otherwise, the publish pipeline will not run.

resources:
  pipelines:
  - pipeline: buildpipeline
    source: buildpipeline
    trigger:
      stages:
      - Artifact

Using variable groups is an option as well. You can use the variable groups to pass variable from a pipeline to another pipeline. Here are the detailed steps:

(1). Create a variable group in Pipelines/Library and add a new Variable. I will call this variable "var" later.

(2). In your build pipeline, you can update "var" based on your parameters:

variables:
- group: {group name}

- bash: |
    az pipelines variable-group variable update --group-id {id} --name var --value yes
  env:
    AZURE_DEVOPS_EXT_PAT: $(System.AccessToken)
  condition: ...

Tip 1. If you don't know your variable group id, go to Pipelines/Library and select your variable group. You can find it in the URL: https://dev.azure.com/...&variableGroupId={id}&...

Tip 2. If you meet the error "You do not have permissions to perform this operation on the variable group.", go to Pipelines/Library and select your variable group. Click on "Security" and give "{pipeline name} Build Service" user the Administrator role.

Tip 3. Use your parameter in condition to decide whether to update var.

(3). In your publish pipeline, you can use var from variable group in condition:

condition: eq(variables['var'], 'yes')
Jane Ma-MSFT
  • 4,461
  • 1
  • 6
  • 12
  • 1
    Thanks for the suggestion, although it can work, the problem can be with parallel builds. However I think I will try it. – Petr Nymsa Mar 15 '22 at 08:59
  • @PetrNymsa Please check my edited answer. I've updated what I think is the more ideal method at the top of the answer. – Jane Ma-MSFT Mar 15 '22 at 09:13
  • 1
    Stage filters looks promising, but this would need to split publish pipeline into two separate. Build pipeline creates potentially two different artifacts (ios and android). Publish pipeline then takes these artefacts and uploads them. I will try it and let youknow – Petr Nymsa Mar 15 '22 at 13:19