name: Trigger Build workflow on: workflow_call: inputs: image_type: required: true type: string defaults: run: shell: pwsh jobs: trigger-workflow: runs-on: ubuntu-latest outputs: ci_workflow_run_id: ${{ steps.resolve.outputs.ci_workflow_run_id }} ci_workflow_run_url: ${{ steps.resolve.outputs.ci_workflow_run_url }} env: CI_PR_TOKEN: ${{ secrets.CI_PR_TOKEN }} PR_TITLE: ${{ github.event.pull_request.title }} CI_REPO: ${{ vars.CI_REPO }} steps: - name: Checkout Code uses: actions/checkout@v4 - name: Trigger Build workflow run: | Import-Module ./helpers/GitHubApi.psm1 $gitHubApi = Get-GithubApi -Repository "${env:CI_REPO}" -AccessToken "${env:CI_PR_TOKEN}" $eventType = "trigger-${{ inputs.image_type }}-build" [string] $prGuid = New-Guid $clientPayload = @{ pr_title = "${env:PR_TITLE} - " + $prGuid custom_repo = "${{ github.event.pull_request.head.repo.full_name }}" custom_repo_commit_hash = "${{ github.event.pull_request.head.sha }}" } $gitHubApi.DispatchWorkflow($eventType, $clientPayload) "PR_GUID=$prGuid" | Out-File -Append -FilePath $env:GITHUB_ENV - name: Resolve Workflow Run ID id: resolve run: | Import-Module ./helpers/GitHubApi.psm1 $gitHubApi = Get-GithubApi -Repository "${env:CI_REPO}" -AccessToken "${env:CI_PR_TOKEN}" $workflowFileName = $("{0}.yml" -f "${{ inputs.image_type }}").ToLower() $WorkflowSearchPattern = "${env:PR_GUID}" # It might take a few minutes for the action to start $attempt = 1 do { $workflowRuns = $gitHubApi.GetWorkflowRuns($WorkflowFileName).workflow_runs $workflowRunId = ($workflowRuns | Where-Object {$_.display_title -match $WorkflowSearchPattern}).id | Select-Object -First 1 if (-not ([string]::IsNullOrEmpty($workflowRunId))) { $workflowRun = $gitHubApi.GetWorkflowRun($workflowRunId) Write-Host "Found the workflow run with ID $workflowRunId on attempt $attempt. Workflow run link: $($workflowRun.html_url)" "ci_workflow_run_id=$workflowRunId" | Out-File -Append -FilePath $env:GITHUB_OUTPUT "ci_workflow_run_url=$($workflowRun.html_url)" | Out-File -Append -FilePath $env:GITHUB_OUTPUT break } Write-Host "Workflow run for $WorkflowSearchPattern pattern not found on attempt $attempt." $attempt += 1 Start-Sleep 30 } until ($attempt -eq 10) if ([string]::IsNullOrEmpty($workflowRunId)) { throw "Failed to find a workflow run for '$WorkflowSearchPattern'." } wait-completion: runs-on: ubuntu-latest needs: trigger-workflow steps: - name: Checkout Code uses: actions/checkout@v4 - name: Wait for workflow completion env: CI_PR_TOKEN: ${{ secrets.CI_PR_TOKEN }} CI_REPO: ${{ vars.CI_REPO }} run: | ./helpers/WaitWorkflowCompletion.ps1 ` -WorkflowRunId "${{ needs.trigger-workflow.outputs.ci_workflow_run_id }}" ` -Repository "${env:CI_REPO}" ` -AccessToken "${env:CI_PR_TOKEN}" - name: Add Summary if: always() run: | "# Test Partner Image" >> $env:GITHUB_STEP_SUMMARY "| Key | Value |" >> $env:GITHUB_STEP_SUMMARY "| :-----------: | :--------: |" >> $env:GITHUB_STEP_SUMMARY "| Workflow Run | [Link](${{ needs.trigger-workflow.outputs.ci_workflow_run_url }}) |" >> $env:GITHUB_STEP_SUMMARY "| Workflow Result | $env:CI_WORKFLOW_RUN_RESULT |" >> $env:GITHUB_STEP_SUMMARY " " >> $env:GITHUB_STEP_SUMMARY cancel-workflow: runs-on: ubuntu-latest needs: [trigger-workflow, wait-completion] if: cancelled() steps: - name: Checkout Code uses: actions/checkout@v4 - name: Cancel workflow env: CI_PR_TOKEN: ${{ secrets.CI_PR_TOKEN }} CI_REPO: ${{ vars.CI_REPO }} run: | Import-Module ./helpers/GitHubApi.psm1 $gitHubApi = Get-GithubApi -Repository "${env:CI_REPO}" -AccessToken "${env:CI_PR_TOKEN}" $gitHubApi.CancelWorkflowRun("${{ needs.trigger-workflow.outputs.ci_workflow_run_id }}")