-
-
Save chetanku/c51526d7322989ba5a62f186df261cd3 to your computer and use it in GitHub Desktop.
# Starter pipeline | |
# Start with a minimal pipeline that you can customize to build and deploy your code. | |
# Add steps that build, run tests, deploy, and more: | |
# https://aka.ms/yaml | |
trigger: | |
- master | |
pool: | |
vmImage: 'ubuntu-latest' | |
variables: | |
major: 2 | |
minor: 0 | |
stages: | |
# Versioning master branch builds | |
- stage: | |
displayName: Build_Master_Version_Number | |
condition: eq(variables['Build.SourceBranch'], 'refs/heads/master') | |
jobs: | |
- job: Build_Master_Version_Number | |
variables: | |
patch: $[counter(variables['minor'], 0)] | |
steps: | |
- bash: | | |
echo "##vso[build.updatebuildnumber]$(major).$(minor).$(patch)" | |
name: SetMasterBuildName | |
# Versioning feature branch and PR builds | |
- stage: | |
displayName: Build_Branch_Version_Number | |
condition: ne(variables['Build.SourceBranch'], 'refs/heads/master') | |
jobs: | |
- job: Build_Branch_Version_Number | |
variables: | |
prpatch: $[counter(variables['system.pullrequest.pullrequestid'], 0)] | |
brpatch: $[counter(variables['build.sourcebranchname'], 0)] | |
steps: | |
- bash: | | |
echo "##vso[build.updatebuildnumber]$(major).$(minor)-PullRequest.$(prpatch)" | |
condition: eq(variables['Build.Reason'], 'PullRequest') | |
name: SetPRBuildName | |
- bash: | | |
echo "##vso[build.updatebuildnumber]$(major).$(minor)-$(Build.SourceBranchName).$(brpatch)" | |
condition: ne(variables['Build.Reason'], 'PullRequest') | |
name: SetBranchBuildName | |
# Stage for building your application | |
- stage: Build_Steps | |
displayName: Build_Steps | |
condition: always() | |
jobs: | |
- job: Build_Steps | |
displayName: Build_Steps | |
steps: | |
- script: echo Hello, world! | |
name: 'Run_a_one_line_script' | |
- script: | | |
echo Add other tasks to build, test, and deploy your project. | |
echo See https://aka.ms/yaml | |
name: 'Run_a_multi_line_cript' | |
Thanks for the blogpost on this. After trying to get my YAML work using pieces of this, I wanted to point out that you don't necessarily need dedicated stages for these. I found doing it that way slowed down the build immensely as it tried to spin up a new environment for each stage. Instead I tried to move each of these as close to an individual task as possible (Stage>Job>Step/Task). In the end, I have two stages (Versioning and Build), with the version related parts split up by job and task. You can further speed up the process by explicitly specifying that a repository is not needed with a - checkout: none
statement immediately under each of your steps:
lines to have it skip doing a full checkout each time. Hope this helps anyone else looking to do something similar :-)
Hey @nickalbrecht, This example was just a way to show versioning, and I didn't focus on structuring the yaml. Apologize for this. Glad you have a optimized way of doing it. Can you please share your yaml file as well ? Thanks
No worries, just wanted to point out those tips in case they could be of use to anyone else. after writing that comment, I actually had to revert some of my work trying to move down to specific tasks/jobs. I can't specify variables:
on a task it seems, only on a job. But jobs can apparently run in parallel, so I actually hit a situation where my build ran before the script to get build number. It's possible to specify a dependsOn:
, but I don't think that supports an 'or' operator to specify one job OR another. So, I had to go back to separate stages so that I had a parent stage to use as a dependsOn:
My use it actually for .NET Core, but you can easily see the similarities
https://gist.github.com/nickalbrecht/51aa4a9ae2535ccc1b74110d1cf98d14
Thank You for this !! It is very helpful
gist