From da310ec96c3fbf37c6830c5112a544ab26fbdf70 Mon Sep 17 00:00:00 2001 From: Andy Wilkinson Date: Mon, 26 Apr 2021 12:52:31 +0100 Subject: [PATCH] Set up Concourse-based CI builds Closes gh-721 --- README.md | 4 +- build.gradle | 21 +- ci/README.adoc | 17 ++ ci/images/README.adoc | 21 ++ ci/images/ci-image/Dockerfile | 8 + ci/images/get-jdk-url.sh | 11 + ci/images/setup.sh | 33 ++ ci/parameters.yml | 9 + ci/pipeline.yml | 441 +++++++++++++++++++++++++++ ci/scripts/build-pr-project.sh | 8 + ci/scripts/build-project-windows.bat | 4 + ci/scripts/build-project.sh | 9 + ci/scripts/common.sh | 4 + ci/scripts/generate-changelog.sh | 12 + ci/scripts/promote.sh | 13 + ci/scripts/stage.sh | 50 +++ ci/tasks/build-ci-image.yml | 26 ++ ci/tasks/build-pr-project.yml | 13 + ci/tasks/build-project-windows.yml | 15 + ci/tasks/build-project.yml | 19 ++ ci/tasks/generate-changelog.yml | 20 ++ ci/tasks/promote.yml | 17 ++ ci/tasks/stage.yml | 17 ++ gradle/publish-maven.gradle | 24 +- 24 files changed, 795 insertions(+), 21 deletions(-) create mode 100644 ci/README.adoc create mode 100644 ci/images/README.adoc create mode 100644 ci/images/ci-image/Dockerfile create mode 100755 ci/images/get-jdk-url.sh create mode 100755 ci/images/setup.sh create mode 100644 ci/parameters.yml create mode 100644 ci/pipeline.yml create mode 100755 ci/scripts/build-pr-project.sh create mode 100755 ci/scripts/build-project-windows.bat create mode 100755 ci/scripts/build-project.sh create mode 100644 ci/scripts/common.sh create mode 100755 ci/scripts/generate-changelog.sh create mode 100755 ci/scripts/promote.sh create mode 100755 ci/scripts/stage.sh create mode 100644 ci/tasks/build-ci-image.yml create mode 100644 ci/tasks/build-pr-project.yml create mode 100644 ci/tasks/build-project-windows.yml create mode 100644 ci/tasks/build-project.yml create mode 100755 ci/tasks/generate-changelog.yml create mode 100644 ci/tasks/promote.yml create mode 100644 ci/tasks/stage.yml diff --git a/README.md b/README.md index 8ed4f451..f7f4087b 100644 --- a/README.md +++ b/README.md @@ -46,8 +46,8 @@ There are several that you can contribute to Spring REST Docs: Spring REST Docs is open source software released under the [Apache 2.0 license][14]. -[1]: https://build.spring.io/plugins/servlet/wittified/build-status/SRD-PUB (Build status) -[2]: https://build.spring.io/browse/SRD-PUB +[1]: https://ci.spring.io/api/v1/teams/spring-restdocs/pipelines/spring-restdocs-2.0.x/jobs/build/badge (Build status) +[2]: https://ci.spring.io/teams/spring-restdocs/pipelines/spring-restdocs-2.0.x?groups=build [3]: https://asciidoctor.org [4]: https://docs.spring.io/spring-framework/docs/4.1.x/spring-framework-reference/htmlsingle/#spring-mvc-test-framework [5]: https://developer.github.com/v3/ diff --git a/build.gradle b/build.gradle index 1d402ec9..bd867be7 100644 --- a/build.gradle +++ b/build.gradle @@ -1,6 +1,7 @@ plugins { id 'io.spring.javaformat' version "$javaFormatVersion" apply false id 'io.spring.nohttp' version '0.0.6.RELEASE' apply false + id 'maven-publish' } allprojects { @@ -13,6 +14,7 @@ allprojects { apply plugin: "samples" apply plugin: "io.spring.nohttp" +apply from: "${rootProject.projectDir}/gradle/publish-maven.gradle" nohttp { source.exclude "samples/rest-notes-slate/slate/source/javascripts/lib/_jquery*.js" @@ -165,14 +167,13 @@ task api (type: Javadoc) { outputLevel = "quiet" source = "1.8" splitIndex = true - stylesheetFile = file("src/main/javadoc/spring-javadoc.css") use = true windowTitle = "Spring REST Docs ${project.version} API" } } } -task docsZip(type: Zip, dependsOn: [":docs:asciidoctor", ":api", ":buildSamples"]) { +task docsZip(type: Zip, dependsOn: [":docs:asciidoctor", ":api", ":restNotesSpringHateoasGradle"]) { group = "Distribution" archiveBaseName = "spring-restdocs" archiveClassifier = "docs" @@ -190,16 +191,12 @@ task docsZip(type: Zip, dependsOn: [":docs:asciidoctor", ":api", ":buildSamples" from(file("samples/rest-notes-spring-hateoas/build/asciidoc/html5")) { into "samples/restful-notes" } +} - from(file("samples/rest-notes-slate/build/docs")) { - into "samples/slate" +publishing { + publications { + maven(MavenPublication) { + artifact docsZip + } } } - -configurations { - archives -} - -artifacts { - archives docsZip -} diff --git a/ci/README.adoc b/ci/README.adoc new file mode 100644 index 00000000..396bbcf9 --- /dev/null +++ b/ci/README.adoc @@ -0,0 +1,17 @@ +== Concourse pipeline + +Ensure that you've setup the spring-restdocs target and can login + +[source] +---- +$ fly -t spring-restdocs login -n spring-restdocs -c https://ci.spring.io +---- + +The pipeline can be deployed using the following command: + +[source] +---- +$ fly -t spring-restdocs set-pipeline -p spring-restdocs-2.0.x -c ci/pipeline.yml -l ci/parameters.yml +---- + +NOTE: This assumes that you have Vault integration configured with the appropriate secrets. diff --git a/ci/images/README.adoc b/ci/images/README.adoc new file mode 100644 index 00000000..92fa3c2e --- /dev/null +++ b/ci/images/README.adoc @@ -0,0 +1,21 @@ +== CI Images + +These images are used by CI to run the actual builds. + +To build the image locally run the following from this directory: + +---- +$ docker build --no-cache -f /Dockerfile . +---- + +For example + +---- +$ docker build --no-cache -f ci-image/Dockerfile . +---- + +To test run: + +---- +$ docker run -it --entrypoint /bin/bash +---- diff --git a/ci/images/ci-image/Dockerfile b/ci/images/ci-image/Dockerfile new file mode 100644 index 00000000..a73b78fc --- /dev/null +++ b/ci/images/ci-image/Dockerfile @@ -0,0 +1,8 @@ +FROM ubuntu:focal-20210401 + +ADD setup.sh /setup.sh +ADD get-jdk-url.sh /get-jdk-url.sh +RUN ./setup.sh java8 + +ENV JAVA_HOME /opt/openjdk +ENV PATH $JAVA_HOME/bin:$PATH diff --git a/ci/images/get-jdk-url.sh b/ci/images/get-jdk-url.sh new file mode 100755 index 00000000..14469df1 --- /dev/null +++ b/ci/images/get-jdk-url.sh @@ -0,0 +1,11 @@ +#!/bin/bash +set -e + +case "$1" in + java8) + echo "https://github.com/AdoptOpenJDK/openjdk8-binaries/releases/download/jdk8u292-b10/OpenJDK8U-jdk_x64_linux_hotspot_8u292b10.tar.gz" + ;; + *) + echo $"Unknown java version" + exit 1 +esac diff --git a/ci/images/setup.sh b/ci/images/setup.sh new file mode 100755 index 00000000..d5078192 --- /dev/null +++ b/ci/images/setup.sh @@ -0,0 +1,33 @@ +#!/bin/bash +set -ex + +########################################################### +# UTILS +########################################################### + +export DEBIAN_FRONTEND=noninteractive +apt-get update +apt-get install --no-install-recommends -y tzdata ca-certificates net-tools libxml2-utils git curl libudev1 libxml2-utils iptables iproute2 jq +ln -fs /usr/share/zoneinfo/UTC /etc/localtime +dpkg-reconfigure --frontend noninteractive tzdata +rm -rf /var/lib/apt/lists/* + +curl https://raw.githubusercontent.com/spring-io/concourse-java-scripts/v0.0.3/concourse-java.sh > /opt/concourse-java.sh + + +########################################################### +# JAVA +########################################################### +JDK_URL=$( ./get-jdk-url.sh $1 ) + +mkdir -p /opt/openjdk +cd /opt/openjdk +curl -L ${JDK_URL} | tar zx --strip-components=1 +test -f /opt/openjdk/bin/java +test -f /opt/openjdk/bin/javac + +########################################################### +# GRADLE ENTERPRISE +########################################################### +mkdir ~/.gradle +echo 'systemProp.user.name=concourse' > ~/.gradle/gradle.properties \ No newline at end of file diff --git a/ci/parameters.yml b/ci/parameters.yml new file mode 100644 index 00000000..ce8eb973 --- /dev/null +++ b/ci/parameters.yml @@ -0,0 +1,9 @@ +github-repo: "https://github.com/spring-projects/spring-restdocs.git" +github-repo-name: "spring-projects/spring-restdocs" +docker-hub-organization: "springci" +artifactory-server: "https://repo.spring.io" +branch: "main" +milestone: "2.0.x" +build-name: "spring-restdocs" +concourse-url: "https://ci.spring.io" +task-timeout: 1h00m diff --git a/ci/pipeline.yml b/ci/pipeline.yml new file mode 100644 index 00000000..6f31b9bc --- /dev/null +++ b/ci/pipeline.yml @@ -0,0 +1,441 @@ +anchors: + git-repo-resource-source: &git-repo-resource-source + uri: ((github-repo)) + username: ((github-username)) + password: ((github-password)) + branch: ((branch)) + registry-image-resource-source: ®istry-image-resource-source + username: ((docker-hub-username)) + password: ((docker-hub-password)) + tag: ((milestone)) + gradle-enterprise-task-params: &gradle-enterprise-task-params + 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)) + docker-hub-task-params: &docker-hub-task-params + DOCKER_HUB_USERNAME: ((docker-hub-username)) + DOCKER_HUB_PASSWORD: ((docker-hub-password)) + github-task-params: &github-task-params + GITHUB_REPO: spring-restdocs + GITHUB_ORGANIZATION: spring-projects + GITHUB_PASSWORD: ((github-ci-release-token)) + GITHUB_USERNAME: ((github-username)) + MILESTONE: ((milestone)) + sontatype-task-params: &sonatype-task-params + SONATYPE_USER_TOKEN: ((sonatype-username)) + SONATYPE_PASSWORD_TOKEN: ((sonatype-password)) + SONATYPE_URL: ((sonatype-url)) + SONATYPE_STAGING_PROFILE_ID: ((sonatype-staging-profile-id)) + artifactory-task-params: &artifactory-task-params + ARTIFACTORY_SERVER: ((artifactory-server)) + ARTIFACTORY_USERNAME: ((artifactory-username)) + ARTIFACTORY_PASSWORD: ((artifactory-password)) + build-project-task-params: &build-project-task-params + privileged: true + timeout: ((task-timeout)) + file: git-repo/ci/tasks/build-project.yml + params: + BRANCH: ((branch)) + <<: *gradle-enterprise-task-params + <<: *docker-hub-task-params + artifactory-repo-put-params: &artifactory-repo-put-params + signing_key: ((signing-key)) + signing_passphrase: ((signing-passphrase)) + repo: libs-snapshot-local + folder: distribution-repository + build_uri: "https://ci.spring.io/teams/${BUILD_TEAM_NAME}/pipelines/${BUILD_PIPELINE_NAME}/jobs/${BUILD_JOB_NAME}/builds/${BUILD_NAME}" + build_number: "${BUILD_PIPELINE_NAME}-${BUILD_JOB_NAME}-${BUILD_NAME}" + disable_checksum_uploads: true + threads: 8 + artifact_set: + - include: + - "/**/spring-restdocs-*.zip" + properties: + "zip.type": "docs" + "zip.deployed": "false" + slack-fail-params: &slack-fail-params + text: > + :concourse-failed: + [$TEXT_FILE_CONTENT] + text_file: git-repo/build/build-scan-uri.txt + silent: true + icon_emoji: ":concourse:" + username: concourse-ci + slack-success-params: &slack-success-params + text: > + :concourse-succeeded: + [$TEXT_FILE_CONTENT] + text_file: git-repo/build/build-scan-uri.txt + silent: true + icon_emoji: ":concourse:" + username: concourse-ci +resource_types: +- name: artifactory-resource + type: registry-image + source: + repository: springio/artifactory-resource + tag: 0.0.14 +- name: pull-request + type: registry-image + source: + repository: teliaoss/github-pr-resource + tag: v0.23.0 +- name: github-status-resource + type: registry-image + source: + repository: dpb587/github-status-resource + tag: master +- name: slack-notification + type: registry-image + source: + repository: cfcommunity/slack-notification-resource + tag: latest +resources: +- name: git-repo + type: git + icon: github + source: + <<: *git-repo-resource-source +- name: git-repo-windows + type: git + icon: github + source: + <<: *git-repo-resource-source + git_config: + - name: core.autocrlf + value: true +- name: git-pull-request + type: pull-request + icon: source-pull + source: + access_token: ((github-ci-pull-request-token)) + repository: ((github-repo-name)) + base_branch: ((branch)) + ignore_paths: ["ci/*"] +- name: github-pre-release + type: github-release + icon: briefcase-download-outline + source: + owner: spring-projects + repository: spring-restdocs + access_token: ((github-ci-release-token)) + pre_release: true + release: false +- name: github-release + type: github-release + icon: briefcase-download + source: + owner: spring-projects + repository: spring-restdocs + access_token: ((github-ci-release-token)) + pre_release: false +- name: ci-images-git-repo + type: git + icon: github + source: + uri: ((github-repo)) + branch: ((branch)) + paths: ["ci/images/*"] +- name: ci-image + type: registry-image + icon: docker + source: + <<: *registry-image-resource-source + repository: ((docker-hub-organization))/spring-restdocs-ci +- name: artifactory-repo + type: artifactory-resource + icon: package-variant + source: + uri: ((artifactory-server)) + username: ((artifactory-username)) + password: ((artifactory-password)) + build_name: ((build-name)) +- name: repo-status-build + type: github-status-resource + icon: eye-check-outline + source: + repository: ((github-repo-name)) + access_token: ((github-ci-status-token)) + branch: ((branch)) + context: build +- name: slack-alert + type: slack-notification + icon: slack + source: + url: ((slack-webhook-url)) +- name: daily + type: time + icon: clock-outline + source: { interval: "24h" } +jobs: +- name: build-ci-images + plan: + - get: ci-images-git-repo + trigger: true + - get: git-repo + - task: build-ci-image + privileged: true + file: git-repo/ci/tasks/build-ci-image.yml + output_mapping: + image: ci-image + vars: + ci-image-name: ci-image + - put: ci-image + params: + image: ci-image/image.tar +- name: build + serial: true + public: true + plan: + - get: ci-image + - get: git-repo + trigger: true + - put: repo-status-build + params: { state: "pending", commit: "git-repo" } + - do: + - task: build-project + image: ci-image + <<: *build-project-task-params + on_failure: + do: + - put: repo-status-build + params: { state: "failure", commit: "git-repo" } + - put: slack-alert + params: + <<: *slack-fail-params + - put: repo-status-build + params: { state: "success", commit: "git-repo" } + - put: artifactory-repo + params: + <<: *artifactory-repo-put-params + get_params: + threads: 8 + on_failure: + do: + - put: slack-alert + params: + <<: *slack-fail-params + - put: slack-alert + params: + <<: *slack-success-params +- name: build-pull-requests + serial: true + public: true + plan: + - get: ci-image + - get: git-repo + resource: git-pull-request + trigger: true + version: every + - do: + - put: git-pull-request + params: + path: git-repo + status: pending + - task: build-project + image: ci-image + file: git-repo/ci/tasks/build-pr-project.yml + timeout: ((task-timeout)) + on_success: + put: git-pull-request + params: + path: git-repo + status: success + on_failure: + put: git-pull-request + params: + path: git-repo + status: failure +- name: windows-build + serial: true + plan: + - get: git-repo + resource: git-repo-windows + - get: daily + trigger: true + - do: + - task: build-project + privileged: true + file: git-repo/ci/tasks/build-project-windows.yml + tags: + - WIN64 + timeout: ((task-timeout)) + params: + BRANCH: ((branch)) + <<: *gradle-enterprise-task-params + on_failure: + do: + - put: slack-alert + params: + <<: *slack-fail-params + - put: slack-alert + params: + <<: *slack-success-params +- 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.yml + params: + RELEASE_TYPE: M + <<: *gradle-enterprise-task-params + <<: *docker-hub-task-params + - put: artifactory-repo + params: + <<: *artifactory-repo-put-params + repo: libs-staging-local + - put: git-repo + params: + repository: stage-git-repo +- name: stage-rc + serial: true + plan: + - get: ci-image + - get: git-repo + trigger: false + - task: stage + image: ci-image + file: git-repo/ci/tasks/stage.yml + params: + RELEASE_TYPE: RC + <<: *gradle-enterprise-task-params + <<: *docker-hub-task-params + - put: artifactory-repo + params: + <<: *artifactory-repo-put-params + repo: libs-staging-local + - put: git-repo + params: + repository: stage-git-repo +- name: stage-release + serial: true + plan: + - get: ci-image + - get: git-repo + trigger: false + - task: stage + image: ci-image + file: git-repo/ci/tasks/stage.yml + params: + RELEASE_TYPE: RELEASE + <<: *gradle-enterprise-task-params + <<: *docker-hub-task-params + - put: artifactory-repo + params: + <<: *artifactory-repo-put-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.yml + params: + RELEASE_TYPE: M + <<: *artifactory-task-params + - task: generate-changelog + file: git-repo/ci/tasks/generate-changelog.yml + params: + RELEASE_TYPE: M + GITHUB_USERNAME: ((github-username)) + GITHUB_TOKEN: ((github-ci-release-token)) + - put: github-pre-release + params: + name: generated-changelog/tag + tag: generated-changelog/tag + body: generated-changelog/changelog.md +- name: promote-rc + serial: true + plan: + - get: ci-image + - get: git-repo + trigger: false + - get: artifactory-repo + trigger: false + passed: [stage-rc] + params: + download_artifacts: false + save_build_info: true + - task: promote + image: ci-image + file: git-repo/ci/tasks/promote.yml + params: + RELEASE_TYPE: RC + <<: *artifactory-task-params + - task: generate-changelog + file: git-repo/ci/tasks/generate-changelog.yml + params: + RELEASE_TYPE: RC + GITHUB_USERNAME: ((github-username)) + GITHUB_TOKEN: ((github-ci-release-token)) + - put: github-pre-release + params: + name: generated-changelog/tag + tag: generated-changelog/tag + body: generated-changelog/changelog.md +- name: promote-release + serial: true + plan: + - get: ci-image + - get: git-repo + trigger: false + - get: artifactory-repo + trigger: false + passed: [stage-release] + params: + download_artifacts: true + save_build_info: true + - task: promote + image: ci-image + file: git-repo/ci/tasks/promote.yml + params: + RELEASE_TYPE: RELEASE + <<: *artifactory-task-params + <<: *sonatype-task-params +- name: create-github-release + serial: true + plan: + - get: ci-image + - get: git-repo + - get: artifactory-repo + trigger: true + passed: [promote-release] + params: + download_artifacts: false + save_build_info: true + - task: generate-changelog + file: git-repo/ci/tasks/generate-changelog.yml + params: + RELEASE_TYPE: RELEASE + GITHUB_USERNAME: ((github-username)) + GITHUB_TOKEN: ((github-ci-release-token)) + - put: github-release + params: + name: generated-changelog/tag + tag: generated-changelog/tag + body: generated-changelog/changelog.md +groups: +- name: "builds" + jobs: ["build", "windows-build"] +- name: "releases" + jobs: ["stage-milestone", "stage-rc", "stage-release", "promote-milestone", "promote-rc", "promote-release", "create-github-release"] +- name: "ci-images" + jobs: ["build-ci-images"] +- name: "pull-requests" + jobs: ["build-pull-requests"] diff --git a/ci/scripts/build-pr-project.sh b/ci/scripts/build-pr-project.sh new file mode 100755 index 00000000..76e5d84c --- /dev/null +++ b/ci/scripts/build-pr-project.sh @@ -0,0 +1,8 @@ +#!/bin/bash +set -e + +source $(dirname $0)/common.sh + +pushd git-repo > /dev/null +./gradlew -Dorg.gradle.internal.launcher.welcomeMessageEnabled=false --no-daemon --max-workers=4 --continue build buildSamples +popd > /dev/null diff --git a/ci/scripts/build-project-windows.bat b/ci/scripts/build-project-windows.bat new file mode 100755 index 00000000..297740fa --- /dev/null +++ b/ci/scripts/build-project-windows.bat @@ -0,0 +1,4 @@ +SET "JAVA_HOME=C:\opt\jdk-8" +SET PATH=%PATH%;C:\Program Files\Git\usr\bin +cd git-repo +.\gradlew -Dorg.gradle.internal.launcher.welcomeMessageEnabled=false --no-daemon --max-workers=4 build buildSamples diff --git a/ci/scripts/build-project.sh b/ci/scripts/build-project.sh new file mode 100755 index 00000000..d0ae3118 --- /dev/null +++ b/ci/scripts/build-project.sh @@ -0,0 +1,9 @@ +#!/bin/bash +set -e + +source $(dirname $0)/common.sh +repository=$(pwd)/distribution-repository + +pushd git-repo > /dev/null +./gradlew -Dorg.gradle.internal.launcher.welcomeMessageEnabled=false --no-daemon --max-workers=4 -PdeploymentRepository=${repository} build buildSamples publishAllPublicationsToDeploymentRepository +popd > /dev/null diff --git a/ci/scripts/common.sh b/ci/scripts/common.sh new file mode 100644 index 00000000..85bd1233 --- /dev/null +++ b/ci/scripts/common.sh @@ -0,0 +1,4 @@ +source /opt/concourse-java.sh + +setup_symlinks +cleanup_maven_repo "org.springframework.restdocs" diff --git a/ci/scripts/generate-changelog.sh b/ci/scripts/generate-changelog.sh new file mode 100755 index 00000000..0cffe7fc --- /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 \ + --changelog.repository=spring-projects/spring-restdocs \ + ${version} generated-changelog/changelog.md + +echo ${version} > generated-changelog/version +echo v${version} > generated-changelog/tag diff --git a/ci/scripts/promote.sh b/ci/scripts/promote.sh new file mode 100755 index 00000000..14ad9861 --- /dev/null +++ b/ci/scripts/promote.sh @@ -0,0 +1,13 @@ +#!/bin/bash + +source $(dirname $0)/common.sh + +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 /spring-boot-release-scripts.jar publishToCentral $RELEASE_TYPE $BUILD_INFO_LOCATION artifactory-repo || { exit 1; } + +java -jar /spring-boot-release-scripts.jar promote $RELEASE_TYPE $BUILD_INFO_LOCATION || { exit 1; } + +echo "Promotion complete" +echo $version > version/version diff --git a/ci/scripts/stage.sh b/ci/scripts/stage.sh new file mode 100755 index 00000000..1e79f9f2 --- /dev/null +++ b/ci/scripts/stage.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 buildSamples 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 "DONE" + +popd > /dev/null diff --git a/ci/tasks/build-ci-image.yml b/ci/tasks/build-ci-image.yml new file mode 100644 index 00000000..30b2df98 --- /dev/null +++ b/ci/tasks/build-ci-image.yml @@ -0,0 +1,26 @@ +--- +platform: linux +image_resource: + type: registry-image + source: + repository: vito/oci-build-task +inputs: +- name: ci-images-git-repo +outputs: +- name: image +caches: +- path: ci-image-cache +params: + CONTEXT: ci-images-git-repo/ci/images + DOCKERFILE: ci-images-git-repo/ci/images/((ci-image-name))/Dockerfile + DOCKER_HUB_AUTH: ((docker-hub-auth)) +run: + path: /bin/sh + args: + - "-c" + - | + mkdir -p /root/.docker + cat > /root/.docker/config.json < - from components.java - versionMapping { - usage("java-api") { - fromResolutionResult() - } - usage("java-runtime") { - fromResolutionResult() + project.plugins.withType(JavaPlugin) { + from components.java + versionMapping { + usage("java-api") { + fromResolutionResult() + } + usage("java-runtime") { + fromResolutionResult() + } } } pom {