From 6dd5595f1e483a6eecc02f7b167bef2e4b0d7376 Mon Sep 17 00:00:00 2001 From: Brian Clozel Date: Tue, 29 Jun 2021 16:34:14 +0200 Subject: [PATCH] Add Milestone releases CI pipeline --- ci/config/changelog-generator.yml | 17 +++++++++++ ci/config/release-scripts.yml | 6 ++++ ci/parameters.yml | 4 +-- ci/pipeline.yml | 43 ++++++++++++++++++++++++++ ci/scripts/generate-changelog.sh | 12 ++++++++ ci/scripts/promote-version.sh | 18 +++++++++++ ci/scripts/stage-version.sh | 50 +++++++++++++++++++++++++++++++ ci/tasks/generate-changelog.yml | 20 +++++++++++++ ci/tasks/promote-version.yml | 18 +++++++++++ ci/tasks/stage-version.yml | 17 +++++++++++ 10 files changed, 203 insertions(+), 2 deletions(-) create mode 100644 ci/config/changelog-generator.yml create mode 100644 ci/config/release-scripts.yml create mode 100755 ci/scripts/generate-changelog.sh create mode 100755 ci/scripts/promote-version.sh create mode 100755 ci/scripts/stage-version.sh create mode 100755 ci/tasks/generate-changelog.yml create mode 100644 ci/tasks/promote-version.yml create mode 100644 ci/tasks/stage-version.yml diff --git a/ci/config/changelog-generator.yml b/ci/config/changelog-generator.yml new file mode 100644 index 00000000..93713c63 --- /dev/null +++ b/ci/config/changelog-generator.yml @@ -0,0 +1,17 @@ +changelog: + repository: spring-projects/spring-graphql + sections: + - title: ":star: New Features" + labels: + - "type: enhancement" + - title: ":beetle: Bug Fixes" + labels: + - "type: bug" + - "type: regression" + - title: ":notebook_with_decorative_cover: Documentation" + labels: + - "type: documentation" + - title: ":hammer: Dependency Upgrades" + sort: "title" + labels: + - "type: dependency-upgrade" diff --git a/ci/config/release-scripts.yml b/ci/config/release-scripts.yml new file mode 100644 index 00000000..816d2b50 --- /dev/null +++ b/ci/config/release-scripts.yml @@ -0,0 +1,6 @@ +logging: + level: + io.spring.concourse: DEBUG +spring: + main: + banner-mode: off \ No newline at end of file diff --git a/ci/parameters.yml b/ci/parameters.yml index 5a008a6b..88b4960e 100644 --- a/ci/parameters.yml +++ b/ci/parameters.yml @@ -1,5 +1,5 @@ -github-repo: "https://github.com/spring-projects-experimental/spring-graphql.git" -github-repo-name: "spring-projects-experimental/spring-graphql" +github-repo: "https://github.com/spring-projects/spring-graphql.git" +github-repo-name: "spring-projects/spring-graphql" docker-hub-organization: "springci" artifactory-server: "https://repo.spring.io" branch: "main" diff --git a/ci/pipeline.yml b/ci/pipeline.yml index d4db625a..03470837 100644 --- a/ci/pipeline.yml +++ b/ci/pipeline.yml @@ -7,6 +7,10 @@ anchors: GRADLE_ENTERPRISE_ACCESS_KEY: ((gradle_enterprise_secret_access_key)) GRADLE_ENTERPRISE_CACHE_USERNAME: ((gradle_enterprise_cache_user.username)) GRADLE_ENTERPRISE_CACHE_PASSWORD: ((gradle_enterprise_cache_user.password)) + artifactory-task-params: &artifactory-task-params + ARTIFACTORY_SERVER: ((artifactory-server)) + ARTIFACTORY_USERNAME: ((artifactory-username)) + ARTIFACTORY_PASSWORD: ((artifactory-password)) resource_types: - name: artifactory-resource @@ -88,9 +92,48 @@ jobs: threads: 8 get_params: threads: 8 +- name: stage-milestone + serial: true + plan: + - get: ci-image + - get: git-repo + trigger: false + - task: stage + image: ci-image + file: git-repo/ci/tasks/stage-version.yml + params: + RELEASE_TYPE: M + <<: *gradle-enterprise-task-params + - put: artifactory-repo + params: + <<: *artifactory-params + repo: libs-staging-local + - put: git-repo + params: + repository: stage-git-repo +- name: promote-milestone + serial: true + plan: + - get: ci-image + - get: git-repo + trigger: false + - get: artifactory-repo + trigger: false + passed: [stage-milestone] + params: + download_artifacts: false + save_build_info: true + - task: promote + image: ci-image + file: git-repo/ci/tasks/promote-version.yml + params: + RELEASE_TYPE: M + <<: *artifactory-task-params groups: - name: "builds" jobs: ["build"] +- name: "releases" + jobs: [ "stage-milestone", "promote-milestone" ] - name: "ci-images" jobs: ["build-ci-images"] diff --git a/ci/scripts/generate-changelog.sh b/ci/scripts/generate-changelog.sh new file mode 100755 index 00000000..d3d2b97e --- /dev/null +++ b/ci/scripts/generate-changelog.sh @@ -0,0 +1,12 @@ +#!/bin/bash +set -e + +CONFIG_DIR=git-repo/ci/config +version=$( cat artifactory-repo/build-info.json | jq -r '.buildInfo.modules[0].id' | sed 's/.*:.*:\(.*\)/\1/' ) + +java -jar /github-changelog-generator.jar \ + --spring.config.location=${CONFIG_DIR}/changelog-generator.yml \ + ${version} generated-changelog/changelog.md + +echo ${version} > generated-changelog/version +echo v${version} > generated-changelog/tag diff --git a/ci/scripts/promote-version.sh b/ci/scripts/promote-version.sh new file mode 100755 index 00000000..44c5ff62 --- /dev/null +++ b/ci/scripts/promote-version.sh @@ -0,0 +1,18 @@ +#!/bin/bash + +source $(dirname $0)/common.sh +CONFIG_DIR=git-repo/ci/config + +version=$( cat artifactory-repo/build-info.json | jq -r '.buildInfo.modules[0].id' | sed 's/.*:.*:\(.*\)/\1/' ) +export BUILD_INFO_LOCATION=$(pwd)/artifactory-repo/build-info.json + +java -jar /opt/concourse-release-scripts.jar \ + --spring.config.location=${CONFIG_DIR}/release-scripts.yml \ + publishToCentral $RELEASE_TYPE $BUILD_INFO_LOCATION artifactory-repo || { exit 1; } + +java -jar /opt/concourse-release-scripts.jar \ + --spring.config.location=${CONFIG_DIR}/release-scripts.yml \ + promote $RELEASE_TYPE $BUILD_INFO_LOCATION || { exit 1; } + +echo "Promotion complete" +echo $version > version/version diff --git a/ci/scripts/stage-version.sh b/ci/scripts/stage-version.sh new file mode 100755 index 00000000..0b285de0 --- /dev/null +++ b/ci/scripts/stage-version.sh @@ -0,0 +1,50 @@ +#!/bin/bash +set -e + +source $(dirname $0)/common.sh +repository=$(pwd)/distribution-repository + +pushd git-repo > /dev/null +git fetch --tags --all > /dev/null +popd > /dev/null + +git clone git-repo stage-git-repo > /dev/null + +pushd stage-git-repo > /dev/null + +snapshotVersion=$( awk -F '=' '$1 == "version" { print $2 }' gradle.properties ) +if [[ $RELEASE_TYPE = "M" ]]; then + stageVersion=$( get_next_milestone_release $snapshotVersion) + nextVersion=$snapshotVersion +elif [[ $RELEASE_TYPE = "RC" ]]; then + stageVersion=$( get_next_rc_release $snapshotVersion) + nextVersion=$snapshotVersion +elif [[ $RELEASE_TYPE = "RELEASE" ]]; then + stageVersion=$( get_next_release $snapshotVersion) + nextVersion=$( bump_version_number $snapshotVersion) +else + echo "Unknown release type $RELEASE_TYPE" >&2; exit 1; +fi + +echo "Staging $stageVersion (next version will be $nextVersion)" +sed -i "s/version=$snapshotVersion/version=$stageVersion/" gradle.properties + +git config user.name "Spring Buildmaster" > /dev/null +git config user.email "buildmaster@springframework.org" > /dev/null +git add gradle.properties > /dev/null +git commit -m"Release v$stageVersion" > /dev/null +git tag -a "v$stageVersion" -m"Release v$stageVersion" > /dev/null + +./gradlew --no-daemon --max-workers=4 -PdeploymentRepository=${repository} build publishAllPublicationsToDeploymentRepository + +git reset --hard HEAD^ > /dev/null +if [[ $nextVersion != $snapshotVersion ]]; then + echo "Setting next development version (v$nextVersion)" + sed -i "s/version=$snapshotVersion/version=$nextVersion/" gradle.properties + git add gradle.properties > /dev/null + git commit -m"Next development version (v$nextVersion)" > /dev/null +fi; + +echo "Staging Complete" + +popd > /dev/null diff --git a/ci/tasks/generate-changelog.yml b/ci/tasks/generate-changelog.yml new file mode 100755 index 00000000..ea048af9 --- /dev/null +++ b/ci/tasks/generate-changelog.yml @@ -0,0 +1,20 @@ +--- +platform: linux +image_resource: + type: registry-image + source: + repository: springio/github-changelog-generator + tag: '0.0.6' +inputs: +- name: git-repo +- name: artifactory-repo +outputs: +- name: generated-changelog +params: + GITHUB_ORGANIZATION: + GITHUB_REPO: + GITHUB_USERNAME: + GITHUB_TOKEN: + RELEASE_TYPE: +run: + path: git-repo/ci/scripts/generate-changelog.sh diff --git a/ci/tasks/promote-version.yml b/ci/tasks/promote-version.yml new file mode 100644 index 00000000..abdd8fed --- /dev/null +++ b/ci/tasks/promote-version.yml @@ -0,0 +1,18 @@ +--- +platform: linux +inputs: +- name: git-repo +- name: artifactory-repo +outputs: +- name: version +params: + RELEASE_TYPE: + ARTIFACTORY_SERVER: + ARTIFACTORY_USERNAME: + ARTIFACTORY_PASSWORD: + SONATYPE_USER: + SONATYPE_PASSWORD: + SONATYPE_URL: + SONATYPE_STAGING_PROFILE_ID: +run: + path: git-repo/ci/scripts/promote-version.sh diff --git a/ci/tasks/stage-version.yml b/ci/tasks/stage-version.yml new file mode 100644 index 00000000..ded11483 --- /dev/null +++ b/ci/tasks/stage-version.yml @@ -0,0 +1,17 @@ +--- +platform: linux +inputs: +- name: git-repo +outputs: +- name: stage-git-repo +- name: distribution-repository +params: + RELEASE_TYPE: + CI: true + GRADLE_ENTERPRISE_CACHE_USERNAME: + GRADLE_ENTERPRISE_CACHE_PASSWORD: + GRADLE_ENTERPRISE_URL: https://ge.spring.io +caches: +- path: gradle +run: + path: git-repo/ci/scripts/stage-version.sh