Search code examples
gitazure-devopsazure-pipelinesazure-pipelines-yaml

How do I modify a file in a repository from an azure pipeline YAML, after a PR?


Problem:

I want to update and commit a version file after a Pull Request complete in Azure Devops. For example, I have a repository with a "main" branch and a "changes" branch. When I create a pull request to merge "changes" into "main", I want to increment the version in version.h.

I am using Azure Devops pipelines, I have a azure-pipeline.yaml file that is triggered when a pull request is created. The yaml executes and it increments version.h, however, I always fail the step to push the version.h file. I do not know how to add it to the current merge request.

I have all the permissions required as defined here.

Tried:

  1. Triggering on push to main branch, but I don't know how to differentiate between the pipeline version.h push to main or the PR updates pushed to main after the PR completes.
  2. Triggering on pull request, updating the pull request to include change to version.h, but git complains because azure devops has create a merge request and cannot reconcile the change

EDIT: Apologies, it's a little difficult to describe what I am trying to do. The error I ran into was related to trying to push to a repository that was not synced to the remote repository. The repository used by the azure build agent only checks out the merge commit, so pushing to "main" or "changes" ended up out of date. I resolved this by deleting the /s directory after every job.


Solution

  • It is quite confusing to understand your actual requirements, based on your current description, because when a PR validation build runs, the PR is not yet completed and we cannot push the updated ·version.h· file as a commit onto the temporary intermediate branch refs/pull/$(System.PullRequest.PullRequestId)/merge, which can only be generated and changed by the Azure DevOps System and which is actually checked out by the PR validation build.

    When a PR completes, it generates a PR merge commit on the PR target branch (main). As well recognized as an IndividualCI, it can also trigger a pipeline. You may try the sample YAML pipeline below to be triggered by any commit pushed onto main branch, then to update a version.h file and push the commit onto the main branch. Still not sure why not update the version.h file in your PR source branch and bring it into PR target branch together with the PR merge commit.

    trigger:
      branches:
        include:
        - main
      paths:
        exclude:
        - version.h
    
    pool:
      vmImage: ubuntu-latest
    
    steps:
    - checkout: self
      persistCredentials: true
      fetchDepth: 0
    
    - script: |
        git config --global user.email "$(Build.RequestedForEmail)"
        git config --global user.name "Azure Pipelines"
    
        git checkout -b main
        echo test$(Build.BuildId) >> version.h
        git add version.h
        git commit -m "Updated version.h during build $(Build.BuildId)"
        git push origin main
    
    

    Image