From febd40c4ff04aa0a3fe36cad235fa3b9e58ada52 Mon Sep 17 00:00:00 2001 From: Mark Iantorno Date: Thu, 23 Jun 2022 09:54:03 -0400 Subject: [PATCH] Adding release pipeline. [skip ci] --- release-pipeline.yml | 180 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 180 insertions(+) create mode 100644 release-pipeline.yml diff --git a/release-pipeline.yml b/release-pipeline.yml new file mode 100644 index 00000000000..8cc8c236102 --- /dev/null +++ b/release-pipeline.yml @@ -0,0 +1,180 @@ +# HAPI FHIR Build Pipeline + +variables: + MAVEN_CACHE_FOLDER: $(Pipeline.Workspace)/.m2/repository + MAVEN_OPTS: '' + NEW_RELEASE_VERSION: + BRANCH: + +trigger: none + +pool: + vmImage: ubuntu-latest + +jobs: + + - job: get_release_version + timeoutInMinutes: 5 + steps: + - task: PowerShell@2 + # This task pulls the value from the hapi-fhir project pom.xml file. All modules are released as + # the same version, at the same time, as defined in the root level pom.xml. + inputs: + targetType: 'inline' + script: | + [xml]$pomXml = Get-Content -Path .\pom.xml + # version + Write-Host $pomXml.project.version + $version_from_pom=$pomXml.project.version + Write-Host "##vso[task.setvariable variable=version_from_pom]$version_from_pom" + displayName: Save pom file version to local variable. + - task: Bash@3 + # Prints out the pom version, for debugging purposes + inputs: + targetType: 'inline' + script: echo Pulled version from pom.xml => $(version_from_pom) + displayName: Print out pom version. + - task: Bash@3 + # Determines the new release tag label. For existing release branches, this is straightforward, + # as we just take the current project pom version (ie. 5.7.1). However, for the current master + # branch we often have a branch name like "6.1.5-PRE2-SNAPSHOT", in which case, we need to normalize + # the release label from that project version to get the "maj.min.patch" version we will release. + inputs: + targetType: 'inline' + script: | + echo Current project version set as $version_from_pom + if [[ "$(Build.SourceBranchName)" == "master" ]]; + then + echo On master branch. We need to remove PRE tag from pom version. + new_release_version="${version_from_pom%-PRE*}" + else + new_release_version=$(version_from_pom) + fi + echo "##vso[task.setvariable variable=NEW_RELEASE_VERSION]$new_release_version" + echo release HAPI version $new_release_version + displayName: Determine new release version. + - task: Bash@3 + # Here we check if the tag we plan to release is already tagged in git, if it is we bomb out + inputs: + targetType: 'inline' + script: | + tag_label="v${NEW_RELEASE_VERSION}" + echo verifying that release version $tag_label does not already exist in git project... + if git rev-list $tag_label >/dev/null + then + echo tag $tag_label already exists in project, please update you pom version and try again + exit 1 + else + echo 'tag does not already exist in project, proceeding...' + fi + displayName: Check if deployment already exists. + - task: Bash@3 + # Azure pipelines cannot pass variables between pipelines, but it can pass files, so we + # pass the determined build tag (ex: 5.7.4) as a string in a file. + # This is used in the release pipeline, so we create it here. + inputs: + targetType: 'inline' + script: | + echo $(NEW_RELEASE_VERSION) + echo "$(NEW_RELEASE_VERSION)" > $(System.DefaultWorkingDirectory)/NEW_RELEASE_VERSION + displayName: Save release label to file. + - task: CopyFiles@2 + # Copies the NEW_RELEASE_VERSION file containing the pom version to the staging directory + inputs: + SourceFolder: '$(System.Defaultworkingdirectory)' + Contents: "$(System.DefaultWorkingDirectory)/NEW_RELEASE_VERSION" + TargetFolder: '$(build.artifactstagingdirectory)' + displayName: Copy the version file to the artifact staging directory. + - task: PublishBuildArtifacts@1 + # Publishes the files we've moved into the staging directory, so they can be accessed by the + # release pipeline. + displayName: 'Publish Build Artifacts' + inputs: + PathtoPublish: '$(build.artifactstagingdirectory)' + - job: get_branch_id + timeoutInMinutes: 5 + steps: + - task: PowerShell@2 + # This task pulls the branch name from the azure build environment and sets as a job-level variable. + inputs: + targetType: 'inline' + script: | + $branch_name = '$(Build.SourceBranchName)' + Write-Host "##vso[task.setvariable variable=branch_name]$branch_name" + displayName: Save branch name to local variable. + - task: Bash@3 + # Prints out the branch name, for debugging purposes + inputs: + targetType: 'inline' + script: echo Current branch name => $(branch_name) + displayName: Print out the branch name. + - task: Bash@3 + # Azure pipelines cannot pass variables between pipelines, but it can pass files, so we + # pass the branch name (ex: rel_2022_05) as a string in a file. + # This is used in the release pipeline, so we create it here. + inputs: + targetType: 'inline' + script: | + echo $(branch_name) + BRANCH=$(branch_name) + echo "$BRANCH" > $(System.DefaultWorkingDirectory)/BRANCH + displayName: Save branch name to file. + - task: CopyFiles@2 + # Copies the BRANCH file containing the pom version to the staging directory + inputs: + SourceFolder: '$(System.Defaultworkingdirectory)' + Contents: "$(System.DefaultWorkingDirectory)/BRANCH" + TargetFolder: '$(build.artifactstagingdirectory)' + displayName: Copy the branch name file to the artifact staging directory. + - task: PublishBuildArtifacts@1 + # Publishes the files we've moved into the staging directory, so they can be accessed by the + # release pipeline. + displayName: 'Publish Build Artifacts' + inputs: + PathtoPublish: '$(build.artifactstagingdirectory)' + + - job: buildaroni + # We're going to do a full build, including all unit and intergration tests. We do this here, before any + # actual release pipeilne kicks off, and we don't do it again at any point in the release pipeline. The assumption here + # is that once we pull the code, it won't change again on this branch until the release is complete. We + # want to fail fast if there is an issue, and avoid running the tests more than once so it doesn't take all day. + timeoutInMinutes: 360 + dependsOn: ['get_release_version', 'get_branch_id'] + container: maven:3.8-openjdk-17 + steps: + - task: Cache@2 + inputs: + key: 'maven | "$(Agent.OS)" | ./pom.xml' + path: $(MAVEN_CACHE_FOLDER) + - task: DockerInstaller@0 + displayName: Docker Installer + inputs: + dockerVersion: 17.09.0-ce + releaseType: stable + - task: Maven@3 + env: + JAVA_HOME_11_X64: /usr/java/openjdk-17 + displayName: Checkstyle Build + inputs: + mavenPomFile: 'hapi-fhir-checkstyle/pom.xml' + goals: 'clean install' + options: '-Dmaven.repo.local=$(MAVEN_CACHE_FOLDER)' + jdkVersionOption: 1.11 + - task: Bash@3 + inputs: + targetType: 'inline' + script: mkdir -p $(MAVEN_CACHE_FOLDER); pwd; ls -al $(MAVEN_CACHE_FOLDER) + - task: Maven@3 + env: + JAVA_HOME_11_X64: /usr/java/openjdk-17 + inputs: + goals: 'clean install' + # These are Maven CLI options (and show up in the build logs) - "-nsu"=Don't update snapshots. We can remove this when Maven OSS is more healthy + options: '-P ALLMODULES,JACOCO,CI,ERRORPRONE -e -B -Dmaven.repo.local=$(MAVEN_CACHE_FOLDER) -Dmaven.wagon.http.pool=false -Dhttp.keepAlive=false -Dstyle.color=always -Djansi.force=true -DskipTests' + # These are JVM options (and don't show up in the build logs) + mavenOptions: '-Xmx1024m $(MAVEN_OPTS) -Dorg.slf4j.simpleLogger.showDateTime=true -Dorg.slf4j.simpleLogger.dateTimeFormat=HH:mm:ss,SSS -Duser.timezone=America/Toronto' + jdkVersionOption: 1.11 + + + +