diff --git a/README.adoc b/README.adoc index 4791107c..2f39ae0d 100644 --- a/README.adoc +++ b/README.adoc @@ -7,7 +7,7 @@ Edit the files in the src/main/asciidoc/ directory instead. :jdkversion: 1.8 :org: spring-cloud :repo: spring-cloud-release-tools -:branch: master +:branch: main image::https://github.com/{org}/{repo}/workflows/Build/badge.svg?style=svg["Build",link="https://github.com/{org}/{repo}/actions"] @@ -18,8 +18,9 @@ That's why this tool makes it easy to automate the release / dependency update p === Releasing through Jenkins -NOTE: Whenever a release process is broken, Jenkins marks it with a red ball and breaks the build. -Whenever a post-release action went wrong but the release is successful, Jenkins marks the build with a yellow ball and marks the build as unstable. +NOTE: Whenever a release process is broken, Jenkins marks it with a red 'X' and breaks the build. +Whenever a post-release action went wrong but the release is successful, Jenkins marks the build with a yellow exclamation and marks the build as unstable. + ==== Releasing a Single Project @@ -58,19 +59,19 @@ IMPORTANT: If you're doing a e.g. `M1` release, remember to not have any snapsho Since the project is prepared, go to Jenkins and select the https://jenkins.spring.io/view/Spring%20Cloud/view/Releaser/[Releaser view], which the following image shows: -image::https://raw.githubusercontent.com/spring-cloud/spring-cloud-release-tools/master/docs/src/main/asciidoc/images/releasers.png[Releaser view] +image::https://raw.githubusercontent.com/spring-cloud/spring-cloud-release-tools/main/docs/src/main/asciidoc/images/releasers.png[Releaser view] . Pick the proper releaser project (for example, `spring-cloud-build-releaser`). The following image shows the settings for this example: -image::https://raw.githubusercontent.com/spring-cloud/spring-cloud-release-tools/master/docs/src/main/asciidoc/images/scBuildReleaser.png[Spring Cloud Build Releaser - build with parameters] +image::https://raw.githubusercontent.com/spring-cloud/spring-cloud-release-tools/main/docs/src/main/asciidoc/images/scBuildReleaser.png[Spring Cloud Build Releaser - build with parameters] . Next, click `Build with parameters`. The following image shows the UI for doing so: -image::https://raw.githubusercontent.com/spring-cloud/spring-cloud-release-tools/master/docs/src/main/asciidoc/images/runningScBuildReleaser.png[Updated `RELEASER_POM_BRANCH`] +image::https://raw.githubusercontent.com/spring-cloud/spring-cloud-release-tools/main/docs/src/main/asciidoc/images/runningScBuildReleaser.png[Updated `RELEASER_POM_BRANCH`] -Pick from which branch you would like the project (for example, `spring-cloud-build` - defaults to `master`) to be built and update the `RELEASER_POM_BRANCH` to point to the checked-out branch of Spring Cloud Release (for example, `springCloudBuildRelease`). +Pick from which branch you would like the project (for example, `spring-cloud-build` - defaults to `main`) to be built and update the `RELEASER_POM_BRANCH` to point to the checked-out branch of Spring Cloud Release (for example, `springCloudBuildRelease`). You can pick whether you want to perform only post-release tasks or the whole release. . Finally, click `Build`. @@ -142,15 +143,15 @@ $ git add greenwich_sr2.properties && git commit -m "Added Greenwich.SR2 propert Since the project is prepared, go to Jenkins and select the https://jenkins.spring.io/view/Spring%20Cloud/view/Releaser/[Releaser view], as the following image shows: -image::https://raw.githubusercontent.com/spring-cloud/spring-cloud-release-tools/master/docs/src/main/asciidoc/images/releasersForMetaRelease.png[Releaser view] +image::https://raw.githubusercontent.com/spring-cloud/spring-cloud-release-tools/main/docs/src/main/asciidoc/images/releasersForMetaRelease.png[Releaser view] . Pick the proper meta-releaser project (for example, `spring-cloud-meta-releaser`), as the following image shows: -image::https://raw.githubusercontent.com/spring-cloud/spring-cloud-release-tools/master/docs/src/main/asciidoc/images/springCloudMetaRelease.png[Spring Cloud Meta Releaser - build with parameters] +image::https://raw.githubusercontent.com/spring-cloud/spring-cloud-release-tools/main/docs/src/main/asciidoc/images/springCloudMetaRelease.png[Spring Cloud Meta Releaser - build with parameters] . Next, click `Build with parameters`. -image::https://raw.githubusercontent.com/spring-cloud/spring-cloud-release-tools/master/docs/src/main/asciidoc/images/runningSpringCloudMetaReleaser.png[Spring Cloud Meta Releaser view] +image::https://raw.githubusercontent.com/spring-cloud/spring-cloud-release-tools/main/docs/src/main/asciidoc/images/runningSpringCloudMetaReleaser.png[Spring Cloud Meta Releaser view] You have quite a few options to pick, but the most important one is to set the value of the `RELEASE_VERSION` to the given release train version (for example, `Greenwich.SR2`). Continue updating the rest of the fields if necessary and read the field descriptions and this documentation for more information. @@ -197,7 +198,7 @@ All the tasks are opt in, so if you do opt in for everything you'll get: - Uses the fixed versions to clone and check out each project (e.g. `spring-cloud-sleuth: 2.1.0.RELEASE`) - From the version analyzes the branch and checks it out. E.g. -** for `spring-cloud-release`'s `Finchley.RELEASE` version will resolve either `Finchley` branch or will fallback to `master` if there's no `Finchley` branch. +** for `spring-cloud-release`'s `Finchley.RELEASE` version will resolve either `Finchley` branch or will fallback to `main` if there's no `Finchley` branch. ** for `spring-cloud-sleuth`'s `2.1.0.RELEASE` version will resolve `2.1.x` branch - Performs the release tasks per each project - Performs the post release tasks at the end of the release @@ -604,7 +605,7 @@ Below you can find a table with all the releaser options. |releaser.meta-release.release-train-dependency-names | | All the names of dependencies that should be updated with the release train project version. |releaser.meta-release.release-train-project-name | | Name of the release train project. |releaser.pom.bom-version-pattern | | The pattern to match a version property in a BOM. Remember to catch the dependency name in a group. E.g. "^(spring-cloud-.*)\\.version$". -|releaser.pom.branch | master | Which branch of release train BOM should be checked out. Defaults to {@code master}. +|releaser.pom.branch | main | Which branch of release train BOM should be checked out. Defaults to {@code main}. |releaser.pom.ignored-pom-regex | ^.*\.git/.*$ | List of regular expressions of ignored poms. Defaults to test projects and samples. |releaser.pom.pom-with-boot-starter-parent | | Subfolder of the pom that contains the {@code spring-boot-starer-parent} dependency. |releaser.pom.this-train-bom | | Subfolder of the pom that contains the versions for the release train. @@ -652,7 +653,7 @@ IMPORTANT: For the meta-releaser to work we assume that the path to the configur ==== Specifying A Branch -By deafult the releaser will default to using the `master` branch of `spring-cloud-release`. +By deafult the releaser will default to using the `main` branch of `spring-cloud-release`. If you would like to use another branch you can specify it using the `releaser.pom.branch` property. [source,bash] @@ -721,7 +722,7 @@ If you know what you're doing and want to skip snapshot / milestone version chec == Building -:jdkversion: 1.8 +:jdkversion: 17 === Basic Compile and Test @@ -747,23 +748,9 @@ the `.mvn` configuration, so if you find you have to do it to make a build succeed, please raise a ticket to get the settings added to source control. -For hints on how to build the project look in `.travis.yml` if there -is one. There should be a "script" and maybe "install" command. Also -look at the "services" section to see if any services need to be -running locally (e.g. mongo or rabbit). Ignore the git-related bits -that you might find in "before_install" since they're related to setting git -credentials and you already have those. +The projects that require middleware (i.e. Redis) for testing generally +require that a local instance of [Docker](https://www.docker.com/get-started) is installed and running. -The projects that require middleware generally include a -`docker-compose.yml`, so consider using -https://docs.docker.com/compose/[Docker Compose] to run the middeware servers -in Docker containers. See the README in the -https://github.com/spring-cloud-samples/scripts[scripts demo -repository] for specific instructions about the common cases of mongo, -rabbit and redis. - -NOTE: If all else fails, build with the command from `.travis.yml` (usually -`./mvnw install`). === Documentation @@ -821,6 +808,120 @@ When importing your project to an IDE please activate the `ide` Maven profile to Of course remember that you MUST NOT use Java 1.8 features in the main sources. If you do so your app will break during the Maven build. +== Spring Cloud Release Process +== Spring Cloud Release Process + +This section contains the instructions on releasiong the Spring Cloud project using the Spring Cloud Releaser. + +=== Before you get started +1. Create the Spring Cloud Release project on your local machine. For example: + +```bash +git clone git@github.com:spring-cloud/spring-cloud-release.git +cd spring-cloud-release +``` +[start=2] +. Pull all Spring Cloud projects to your local machine so that if there is a problem during release, you can make the tweaks to the affected project quickly. + +=== Spring Cloud Build Releaser Instructions + +. Go to the spring-cloud-release project and checkout the `jenkins-releaser-config` branch. Then pull the latest from the repository. +```bash +cd spring-cloud-release +git checkout jenkins-releaser-config +git pull origin jenkins-releaser-config +``` +[start=2] +. Find the most recent release in the desired release train. In this document we will use: 2020_0_x.properties +. Create a copy of that file and set the name of the copy to .properties (for example: 2020_0_2.properties) +. Edit this file and update all project versions to their latest release. +.. The latest release for each project can be determined by navigating to the individual Github project and checking for commits since the last release, where the last release is marked by a commit from spring-cloud-issues. If there are commits since the last release, change the value in the properties file. If there are no commits since the last release (i.e. the last commit is from spring-cloud-issues) then do not increment the value. +. Make a note of the projects that did not increment their version number, as those projects will need to be specified later in the “RELEASER_PROJECTS_TO_SKIP” field in the Jenkins project spring-cloud-meta-releaser + +NOTE: Sometimes the release value for a project will need to be incremented by more than one, +for example if there was a release for an individual project due to a CVE and there were commits made after that release. To determine the new version number, look for the latest version in the commit history from spring-cloud-issues. + +[start=6] +. Commit the change +. Push the changes back to github. For example: +```bash +git push origin jenkins-releaser-config +``` +[start=8] +. Request that project owners verify versions in the Spring Cloud Slack room by sharing a github link to the 2020_0_x.properties you just pushed. +. Now go to the `spring-cloud-build-releaser` job on Jenkins + +NOTE: The builder project is required to run first because it is required for spring-cloud-function and spring-cloud-stream. All other spring-cloud builds will run after spring-cloud-function and spring-cloud-stream have performed a successful release + +[start=10] +. Click `Build With Parameters` on the left side of page + +image::https://raw.githubusercontent.com/spring-cloud/spring-cloud-release-tools/RELEASE-DOC-UPDATE/docs/src/main/asciidoc/images/build-releaser-buildwithparams.png[Build With Params] + +[start=11] +. In the RELEASE_VERSION column enter the name of the file you created without the properties extension + +image::https://raw.githubusercontent.com/spring-cloud/spring-cloud-release-tools/RELEASE-DOC-UPDATE/docs/src/main/asciidoc/images/build-releaser-setreleaseversion.png[Set The Version] + +[start=12] +. Click the “DRY_RUN” option and then click `Build` button as shown below: + +image::https://raw.githubusercontent.com/spring-cloud/spring-cloud-release-tools/RELEASE-DOC-UPDATE/docs/src/main/asciidoc/images/build-releaser-selectdryrun.png[Set Dry Run] +[start=13] +. Once the dry run is successfully complete we need to remove all of the artifacts from the dry run. +To do this select the `spring-cloud-purge-worker-artifacts-releaser` job from the list of jobs. +. Once the purge work has completed successfully, +. Select Rebuild Last option on the left side of the page. +. Now go to the `spring-cloud-build-releaser` job on Jenkins +, Select the last build +. When build page appears click the `Rebuild` option. + +image::https://raw.githubusercontent.com/spring-cloud/spring-cloud-release-tools/RELEASE-DOC-UPDATE/docs/src/main/asciidoc/images/build-releaser-selectlastrun.png[Select Last Run] + +[start=18] +. Deselect “DRY_RUN” then click the `Build` button. + +=== Full Spring Cloud Release + +. Once Spring Cloud Stream and Function projects are released verify that all other builds are succeeding +. Now go to the `Spring-cloud-meta-releaser` job on Jenkins +. Click `Build With Parameters` on the left side of page + +image::https://raw.githubusercontent.com/spring-cloud/spring-cloud-release-tools/RELEASE-DOC-UPDATE/docs/src/main/asciidoc/images/meta-releaser-buildwithparameters.png[Build With Params] + +[start=4] +. Update RELEASE_VERSION with the current release and corresponds to the release file. + +image::https://raw.githubusercontent.com/spring-cloud/spring-cloud-release-tools/RELEASE-DOC-UPDATE/docs/src/main/asciidoc/images/meta-releaser-setreleaseversion.png[Set The Version] + +[start=5] +. Add spring-cloud-build to RELEASER_PROJECTS_TO_SKIP, so it won’t be rebuilt. +Also any other projects that did not change in the properties files, add it to the RELEASER_PROJECTS_TO_SKIP so they can be excluded. +. Select Dry Run option +. Click Build + +image::https://raw.githubusercontent.com/spring-cloud/spring-cloud-release-tools/RELEASE-DOC-UPDATE/docs/src/main/asciidoc/images/build-releaser-selectdryrun.png[Set Dry Run] + + +TIP: If there is a failure you can launch the build from the failed project. To do this: +Click the Rebuild_Last option, then in the START FROM field insert the name of the project. +Then click the Build. + +NOTE: Spring Cloud K8’s Integration tests may time out. Restart the build. + Select Rebuild Last option on the left side of the page. + +[start=8] +. Upon a successful "DRY_RUN". +. Click "Rebuild Last" option on the left side of the page. + +image::https://raw.githubusercontent.com/spring-cloud/spring-cloud-release-tools/RELEASE-DOC-UPDATE/docs/src/main/asciidoc/images/meta-releaser-rebuildlast.png[Rebuild Last] + +[start=10] +. When the build page is rendered. +. Deselect “DRY_RUN” then click the build button. +. Clear the Start_From field +. Click Rebuild + == Contributing :spring-cloud-build-branch: master @@ -1001,4 +1102,54 @@ Go to `File` -> `Settings` -> `Other settings` -> `Checkstyle`. There click on t - `checkstyle.suppressions.file` - default suppressions. Please point it to the Spring Cloud Build's, `spring-cloud-build-tools/src/checkstyle/checkstyle-suppressions.xml` file either in your cloned repo or via the `https://raw.githubusercontent.com/spring-cloud/spring-cloud-build/master/spring-cloud-build-tools/src/checkstyle/checkstyle-suppressions.xml` URL. - `checkstyle.additional.suppressions.file` - this variable corresponds to suppressions in your local project. E.g. you're working on `spring-cloud-contract`. Then point to the `project-root/src/checkstyle/checkstyle-suppressions.xml` folder. Example for `spring-cloud-contract` would be: `/home/username/spring-cloud-contract/src/checkstyle/checkstyle-suppressions.xml`. -IMPORTANT: Remember to set the `Scan Scope` to `All sources` since we apply checkstyle rules for production and test sources. \ No newline at end of file +IMPORTANT: Remember to set the `Scan Scope` to `All sources` since we apply checkstyle rules for production and test sources. + +=== Duplicate Finder + +Spring Cloud Build brings along the `basepom:duplicate-finder-maven-plugin`, that enables flagging duplicate and conflicting classes and resources on the java classpath. + +==== Duplicate Finder configuration + +Duplicate finder is *enabled by default* and will run in the `verify` phase of your Maven build, but it will only take effect in your project if you add the `duplicate-finder-maven-plugin` to the `build` section of the projecst's `pom.xml`. + +.pom.xml +[source,xml] +---- + + + + org.basepom.maven + duplicate-finder-maven-plugin + + + +---- + +For other properties, we have set defaults as listed in the https://github.com/basepom/duplicate-finder-maven-plugin/wiki[plugin documentation]. + +You can easily override them but setting the value of the selected property prefixed with `duplicate-finder-maven-plugin`. For example, set `duplicate-finder-maven-plugin.skip` to `true` in order to skip duplicates check in your build. + +If you need to add `ignoredClassPatterns` or `ignoredResourcePatterns` to your setup, make sure to add them in the plugin configuration section of your project: + +[source,xml] +---- + + + + org.basepom.maven + duplicate-finder-maven-plugin + + + org.joda.time.base.BaseDateTime + .*module-info + + + changelog.txt + + + + + + + +---- diff --git a/docs/src/main/asciidoc/README.adoc b/docs/src/main/asciidoc/README.adoc index 81e41ace..a8789f6d 100644 --- a/docs/src/main/asciidoc/README.adoc +++ b/docs/src/main/asciidoc/README.adoc @@ -17,6 +17,9 @@ When importing your project to an IDE please activate the `ide` Maven profile to Of course remember that you MUST NOT use Java 1.8 features in the main sources. If you do so your app will break during the Maven build. +== Spring Cloud Release Process +include::/Users/glennrenfro/project/spring-cloud-release-tools/docs/src/main/asciidoc/spring-cloud-release-process.adoc[] + == Contributing include::https://raw.githubusercontent.com/spring-cloud/spring-cloud-build/main/docs/src/main/asciidoc/contributing.adoc[] diff --git a/docs/src/main/asciidoc/images/build-releaser-buildwithparams.png b/docs/src/main/asciidoc/images/build-releaser-buildwithparams.png new file mode 100644 index 00000000..208bd616 Binary files /dev/null and b/docs/src/main/asciidoc/images/build-releaser-buildwithparams.png differ diff --git a/docs/src/main/asciidoc/images/build-releaser-selectdryrun.png b/docs/src/main/asciidoc/images/build-releaser-selectdryrun.png new file mode 100644 index 00000000..af944a1a Binary files /dev/null and b/docs/src/main/asciidoc/images/build-releaser-selectdryrun.png differ diff --git a/docs/src/main/asciidoc/images/build-releaser-selectlastrun.png b/docs/src/main/asciidoc/images/build-releaser-selectlastrun.png new file mode 100644 index 00000000..7afba932 Binary files /dev/null and b/docs/src/main/asciidoc/images/build-releaser-selectlastrun.png differ diff --git a/docs/src/main/asciidoc/images/build-releaser-setreleaseversion.png b/docs/src/main/asciidoc/images/build-releaser-setreleaseversion.png new file mode 100644 index 00000000..e3708cf9 Binary files /dev/null and b/docs/src/main/asciidoc/images/build-releaser-setreleaseversion.png differ diff --git a/docs/src/main/asciidoc/images/meta-releaser-buildwithparameters.png b/docs/src/main/asciidoc/images/meta-releaser-buildwithparameters.png new file mode 100644 index 00000000..32d6485d Binary files /dev/null and b/docs/src/main/asciidoc/images/meta-releaser-buildwithparameters.png differ diff --git a/docs/src/main/asciidoc/images/meta-releaser-rebuildlast.png b/docs/src/main/asciidoc/images/meta-releaser-rebuildlast.png new file mode 100644 index 00000000..530d063d Binary files /dev/null and b/docs/src/main/asciidoc/images/meta-releaser-rebuildlast.png differ diff --git a/docs/src/main/asciidoc/images/meta-releaser-setreleaseversion.png b/docs/src/main/asciidoc/images/meta-releaser-setreleaseversion.png new file mode 100644 index 00000000..f45bc957 Binary files /dev/null and b/docs/src/main/asciidoc/images/meta-releaser-setreleaseversion.png differ diff --git a/docs/src/main/asciidoc/spring-cloud-release-process.adoc b/docs/src/main/asciidoc/spring-cloud-release-process.adoc new file mode 100644 index 00000000..37758cf3 --- /dev/null +++ b/docs/src/main/asciidoc/spring-cloud-release-process.adoc @@ -0,0 +1,112 @@ +== Spring Cloud Release Process + +This section contains the instructions on releasiong the Spring Cloud project using the Spring Cloud Releaser. + +=== Before you get started +1. Create the Spring Cloud Release project on your local machine. For example: + +```bash +git clone git@github.com:spring-cloud/spring-cloud-release.git +cd spring-cloud-release +``` +[start=2] +. Pull all Spring Cloud projects to your local machine so that if there is a problem during release, you can make the tweaks to the affected project quickly. + +=== Spring Cloud Build Releaser Instructions + +. Go to the spring-cloud-release project and checkout the `jenkins-releaser-config` branch. Then pull the latest from the repository. +```bash +cd spring-cloud-release +git checkout jenkins-releaser-config +git pull origin jenkins-releaser-config +``` +[start=2] +. Find the most recent release in the desired release train. In this document we will use: 2020_0_x.properties +. Create a copy of that file and set the name of the copy to .properties (for example: 2020_0_2.properties) +. Edit this file and update all project versions to their latest release. +.. The latest release for each project can be determined by navigating to the individual Github project and checking for commits since the last release, where the last release is marked by a commit from spring-cloud-issues. If there are commits since the last release, change the value in the properties file. If there are no commits since the last release (i.e. the last commit is from spring-cloud-issues) then do not increment the value. +. Make a note of the projects that did not increment their version number, as those projects will need to be specified later in the “RELEASER_PROJECTS_TO_SKIP” field in the Jenkins project spring-cloud-meta-releaser + +NOTE: Sometimes the release value for a project will need to be incremented by more than one, +for example if there was a release for an individual project due to a CVE and there were commits made after that release. To determine the new version number, look for the latest version in the commit history from spring-cloud-issues. + +[start=6] +. Commit the change +. Push the changes back to github. For example: +```bash +git push origin jenkins-releaser-config +``` +[start=8] +. Request that project owners verify versions in the Spring Cloud Slack room by sharing a github link to the 2020_0_x.properties you just pushed. +. Now go to the `spring-cloud-build-releaser` job on Jenkins + +NOTE: The builder project is required to run first because it is required for spring-cloud-function and spring-cloud-stream. All other spring-cloud builds will run after spring-cloud-function and spring-cloud-stream have performed a successful release + +[start=10] +. Click `Build With Parameters` on the left side of page + +image::https://raw.githubusercontent.com/spring-cloud/spring-cloud-release-tools/RELEASE-DOC-UPDATE/docs/src/main/asciidoc/images/build-releaser-buildwithparams.png[Build With Params] + +[start=11] +. In the RELEASE_VERSION column enter the name of the file you created without the properties extension + +image::https://raw.githubusercontent.com/spring-cloud/spring-cloud-release-tools/RELEASE-DOC-UPDATE/docs/src/main/asciidoc/images/build-releaser-setreleaseversion.png[Set The Version] + +[start=12] +. Click the “DRY_RUN” option and then click `Build` button as shown below: + +image::https://raw.githubusercontent.com/spring-cloud/spring-cloud-release-tools/RELEASE-DOC-UPDATE/docs/src/main/asciidoc/images/build-releaser-selectdryrun.png[Set Dry Run] +[start=13] +. Once the dry run is successfully complete we need to remove all of the artifacts from the dry run. +To do this select the `spring-cloud-purge-worker-artifacts-releaser` job from the list of jobs. +. Once the purge work has completed successfully, +. Select Rebuild Last option on the left side of the page. +. Now go to the `spring-cloud-build-releaser` job on Jenkins +, Select the last build +. When build page appears click the `Rebuild` option. + +image::https://raw.githubusercontent.com/spring-cloud/spring-cloud-release-tools/RELEASE-DOC-UPDATE/docs/src/main/asciidoc/images/build-releaser-selectlastrun.png[Select Last Run] + +[start=18] +. Deselect “DRY_RUN” then click the `Build` button. + +=== Full Spring Cloud Release + +. Once Spring Cloud Stream and Function projects are released verify that all other builds are succeeding +. Now go to the `Spring-cloud-meta-releaser` job on Jenkins +. Click `Build With Parameters` on the left side of page + +image::https://raw.githubusercontent.com/spring-cloud/spring-cloud-release-tools/RELEASE-DOC-UPDATE/docs/src/main/asciidoc/images/meta-releaser-buildwithparameters.png[Build With Params] + +[start=4] +. Update RELEASE_VERSION with the current release and corresponds to the release file. + +image::https://raw.githubusercontent.com/spring-cloud/spring-cloud-release-tools/RELEASE-DOC-UPDATE/docs/src/main/asciidoc/images/meta-releaser-setreleaseversion.png[Set The Version] + +[start=5] +. Add spring-cloud-build to RELEASER_PROJECTS_TO_SKIP, so it won’t be rebuilt. +Also any other projects that did not change in the properties files, add it to the RELEASER_PROJECTS_TO_SKIP so they can be excluded. +. Select Dry Run option +. Click Build + +image::https://raw.githubusercontent.com/spring-cloud/spring-cloud-release-tools/RELEASE-DOC-UPDATE/docs/src/main/asciidoc/images/build-releaser-selectdryrun.png[Set Dry Run] + + +TIP: If there is a failure you can launch the build from the failed project. To do this: +Click the Rebuild_Last option, then in the START FROM field insert the name of the project. +Then click the Build. + +NOTE: Spring Cloud K8’s Integration tests may time out. Restart the build. + Select Rebuild Last option on the left side of the page. + +[start=8] +. Upon a successful "DRY_RUN". +. Click "Rebuild Last" option on the left side of the page. + +image::https://raw.githubusercontent.com/spring-cloud/spring-cloud-release-tools/RELEASE-DOC-UPDATE/docs/src/main/asciidoc/images/meta-releaser-rebuildlast.png[Rebuild Last] + +[start=10] +. When the build page is rendered. +. Deselect “DRY_RUN” then click the build button. +. Clear the Start_From field +. Click Rebuild diff --git a/docs/src/main/asciidoc/spring-cloud-release-tools.adoc b/docs/src/main/asciidoc/spring-cloud-release-tools.adoc index 11e76bb6..befe4d98 100644 --- a/docs/src/main/asciidoc/spring-cloud-release-tools.adoc +++ b/docs/src/main/asciidoc/spring-cloud-release-tools.adoc @@ -5,8 +5,9 @@ That's why this tool makes it easy to automate the release / dependency update p === Releasing through Jenkins -NOTE: Whenever a release process is broken, Jenkins marks it with a red ball and breaks the build. -Whenever a post-release action went wrong but the release is successful, Jenkins marks the build with a yellow ball and marks the build as unstable. +NOTE: Whenever a release process is broken, Jenkins marks it with a red 'X' and breaks the build. +Whenever a post-release action went wrong but the release is successful, Jenkins marks the build with a yellow exclamation and marks the build as unstable. + ==== Releasing a Single Project @@ -621,4 +622,4 @@ If you know what you're doing and want to skip snapshot / milestone version chec 1.19.2-M2 0.6.12 ----- \ No newline at end of file +---- diff --git a/pom.xml b/pom.xml index 584bbcbd..de5f9ede 100644 --- a/pom.xml +++ b/pom.xml @@ -12,7 +12,7 @@ org.springframework.cloud spring-cloud-build - 3.1.0 + 3.1.1 @@ -21,7 +21,7 @@ releaser-core releaser-spring releaser-test - spring-cloud-info + projects docs @@ -41,7 +41,7 @@ 4.3.0 0.12.0 4.1.1 - 1.0.0.BUILD-SNAPSHOT + 1.0.0-SNAPSHOT 1.1.4 5.0.4 1.1.0 diff --git a/projects/reactor/src/main/java/releaser/ReleaserApplication.java b/projects/reactor/src/main/java/releaser/ReleaserApplication.java index cb2f3aa4..cafb9dd5 100644 --- a/projects/reactor/src/main/java/releaser/ReleaserApplication.java +++ b/projects/reactor/src/main/java/releaser/ReleaserApplication.java @@ -27,8 +27,7 @@ import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class ReleaserApplication extends ReleaserCommandLineRunner { - public ReleaserApplication(SpringReleaser releaser, - ExecutionResultHandler executionResultHandler, Parser parser) { + public ReleaserApplication(SpringReleaser releaser, ExecutionResultHandler executionResultHandler, Parser parser) { super(releaser, executionResultHandler, parser); } diff --git a/projects/reactor/src/main/java/releaser/reactor/CfConfiguration.java b/projects/reactor/src/main/java/releaser/reactor/CfConfiguration.java index 2c8335ac..baa95d95 100644 --- a/projects/reactor/src/main/java/releaser/reactor/CfConfiguration.java +++ b/projects/reactor/src/main/java/releaser/reactor/CfConfiguration.java @@ -48,39 +48,31 @@ class CfConfiguration { @Bean PasswordGrantTokenProvider tokenProvider(@Value("${cf.username}") String username, @Value("${cf.password}") String password) { - return PasswordGrantTokenProvider.builder().password(password).username(username) + return PasswordGrantTokenProvider.builder().password(password).username(username).build(); + } + + @Bean + ReactorCloudFoundryClient cloudFoundryClient(ConnectionContext connectionContext, TokenProvider tokenProvider) { + return ReactorCloudFoundryClient.builder().connectionContext(connectionContext).tokenProvider(tokenProvider) .build(); } @Bean - ReactorCloudFoundryClient cloudFoundryClient(ConnectionContext connectionContext, - TokenProvider tokenProvider) { - return ReactorCloudFoundryClient.builder().connectionContext(connectionContext) - .tokenProvider(tokenProvider).build(); + ReactorDopplerClient dopplerClient(ConnectionContext connectionContext, TokenProvider tokenProvider) { + return ReactorDopplerClient.builder().connectionContext(connectionContext).tokenProvider(tokenProvider).build(); } @Bean - ReactorDopplerClient dopplerClient(ConnectionContext connectionContext, - TokenProvider tokenProvider) { - return ReactorDopplerClient.builder().connectionContext(connectionContext) - .tokenProvider(tokenProvider).build(); + ReactorUaaClient uaaClient(ConnectionContext connectionContext, TokenProvider tokenProvider) { + return ReactorUaaClient.builder().connectionContext(connectionContext).tokenProvider(tokenProvider).build(); } @Bean - ReactorUaaClient uaaClient(ConnectionContext connectionContext, - TokenProvider tokenProvider) { - return ReactorUaaClient.builder().connectionContext(connectionContext) - .tokenProvider(tokenProvider).build(); - } - - @Bean - DefaultCloudFoundryOperations defaultCloudFoundryOperations( - CloudFoundryClient cloudFoundryClient, DopplerClient dopplerClient, - UaaClient uaaClient, @Value("${cf.organization}") String organizationId, + DefaultCloudFoundryOperations defaultCloudFoundryOperations(CloudFoundryClient cloudFoundryClient, + DopplerClient dopplerClient, UaaClient uaaClient, @Value("${cf.organization}") String organizationId, @Value("${cf.space}") String spaceId) { - return DefaultCloudFoundryOperations.builder() - .cloudFoundryClient(cloudFoundryClient).dopplerClient(dopplerClient) - .uaaClient(uaaClient).organization(organizationId).space(spaceId).build(); + return DefaultCloudFoundryOperations.builder().cloudFoundryClient(cloudFoundryClient) + .dopplerClient(dopplerClient).uaaClient(uaaClient).organization(organizationId).space(spaceId).build(); } } diff --git a/projects/reactor/src/main/java/releaser/reactor/GenerateReleaseNotesTask.java b/projects/reactor/src/main/java/releaser/reactor/GenerateReleaseNotesTask.java index d58c1ad8..0caebefa 100644 --- a/projects/reactor/src/main/java/releaser/reactor/GenerateReleaseNotesTask.java +++ b/projects/reactor/src/main/java/releaser/reactor/GenerateReleaseNotesTask.java @@ -61,11 +61,9 @@ import releaser.internal.tech.ExecutionResult; /** * @author Simon Baslé */ -public class GenerateReleaseNotesTask - implements ProjectPostReleaseReleaserTask, DryRunReleaseReleaserTask { +public class GenerateReleaseNotesTask implements ProjectPostReleaseReleaserTask, DryRunReleaseReleaserTask { - private static final Logger log = LoggerFactory - .getLogger(GenerateReleaseNotesTask.class); + private static final Logger log = LoggerFactory.getLogger(GenerateReleaseNotesTask.class); private static final String NAME = "releaseNotes"; @@ -106,20 +104,18 @@ public class GenerateReleaseNotesTask } @Override - public ExecutionResult runTask(Arguments args) - throws BuildUnstableException, RuntimeException { + public ExecutionResult runTask(Arguments args) throws BuildUnstableException, RuntimeException { if (args.versionFromBom.isSnapshot()) { log.info("\nWon't generate notes for a snapshot version"); return ExecutionResult.success(); } - Repo repo = github.repos().get(new Coordinates.Simple( - args.properties.getGit().getOrgName(), args.projectToRun.name())); + Repo repo = github.repos() + .get(new Coordinates.Simple(args.properties.getGit().getOrgName(), args.projectToRun.name())); String releaseTag = "v" + args.versionFromBom.version; if (args.options.dryRun != Boolean.TRUE) { - Optional maybeTagSha1 = gitHandler.findTagSha1(args.project, - releaseTag); + Optional maybeTagSha1 = gitHandler.findTagSha1(args.project, releaseTag); if (maybeTagSha1.isPresent()) { String tagSha1 = maybeTagSha1.get(); try { @@ -127,16 +123,13 @@ public class GenerateReleaseNotesTask repo.git().references().get("tags/" + tagSha1).json(); } catch (IOException e) { - return ExecutionResult.failure(new IllegalStateException( - "Shouldn't create a release if tag " + releaseTag + " (sha1=" - + tagSha1 + ") not visible in Github", - e)); + return ExecutionResult.failure(new IllegalStateException("Shouldn't create a release if tag " + + releaseTag + " (sha1=" + tagSha1 + ") not visible in Github", e)); } } else { return ExecutionResult.failure(new IllegalStateException( - "Attempting to draft release note but tag not found in repository: " - + releaseTag)); + "Attempting to draft release note but tag not found in repository: " + releaseTag)); } } @@ -144,34 +137,26 @@ public class GenerateReleaseNotesTask EnumMap> entries = new EnumMap<>(Type.class); String toVersionTag = "v" + args.versionFromBom.version; - if (args.options.dryRun == Boolean.TRUE - && !gitHandler.findTagSha1(args.project, toVersionTag).isPresent()) { + if (args.options.dryRun == Boolean.TRUE && !gitHandler.findTagSha1(args.project, toVersionTag).isPresent()) { toVersionTag = "HEAD"; } // eg. 3.2.1 for current 3.2.2 - String fromVersionTag = args.versionFromBom - .computePreviousPatchTag("v", "RELEASE").orElseGet(() -> { - Pattern pattern = args.versionFromBom - .computePreviousMinorTagPattern("v", "RELEASE") - .orElseGet(() -> args.versionFromBom - .computePreviousMajorTagPattern("v", "RELEASE")); - // eg. v3.2.*.RELEASE or v3.*.*.RELEASE - log.info( - "Couldn't simply compute previous version of {}, looking through tag list with pattern {}", - args.versionFromBom.version, pattern.pattern()); + String fromVersionTag = args.versionFromBom.computePreviousPatchTag("v", "RELEASE").orElseGet(() -> { + Pattern pattern = args.versionFromBom.computePreviousMinorTagPattern("v", "RELEASE") + .orElseGet(() -> args.versionFromBom.computePreviousMajorTagPattern("v", "RELEASE")); + // eg. v3.2.*.RELEASE or v3.*.*.RELEASE + log.info("Couldn't simply compute previous version of {}, looking through tag list with pattern {}", + args.versionFromBom.version, pattern.pattern()); - List sortedTags = gitHandler - .findTagNamesMatching(args.project, pattern) - .collect(Collectors.toList()); - if (sortedTags.isEmpty()) { - throw new IllegalStateException( - "Couldn't find a tag that matches pattern " - + pattern.pattern()); - } - sortedTags.forEach(System.out::println); - return sortedTags.get(0); - }); + List sortedTags = gitHandler.findTagNamesMatching(args.project, pattern) + .collect(Collectors.toList()); + if (sortedTags.isEmpty()) { + throw new IllegalStateException("Couldn't find a tag that matches pattern " + pattern.pattern()); + } + sortedTags.forEach(System.out::println); + return sortedTags.get(0); + }); if (Boolean.TRUE == args.options.interactive) { log.info("\nComputed log range is {}..{}", fromVersionTag, toVersionTag); @@ -189,8 +174,7 @@ public class GenerateReleaseNotesTask log.info("Will fetch the log for range {}..{}", fromVersionTag, toVersionTag); // gather commits. we use tags in the format `vVERSION` - final List revCommits = gitHandler.commitsBetween(args.project, - fromVersionTag, toVersionTag); + final List revCommits = gitHandler.commitsBetween(args.project, fromVersionTag, toVersionTag); // parse and link to issues if possible, determining type for (SimpleCommit revCommit : revCommits) { @@ -202,8 +186,7 @@ public class GenerateReleaseNotesTask } // generate the notes - String notes = generateNotes(args, entries, - extractContributorMentions(repo, revCommits)); + String notes = generateNotes(args, entries, extractContributorMentions(repo, revCommits)); if (args.options.dryRun != null && args.options.dryRun) { // print out @@ -220,8 +203,7 @@ public class GenerateReleaseNotesTask JsonObject draftReleaseJson = null; try { // attempt to find gh release with this tag. stop at 2 month old releases - Instant oldestReleaseToConsider = ZonedDateTime.now().minusMonths(2) - .toInstant(); + Instant oldestReleaseToConsider = ZonedDateTime.now().minusMonths(2).toInstant(); for (Release release : repo.releases().iterate()) { JsonObject releaseJson = release.json(); // seems the created release has a wrong tag "untagged-xxxxx", we also @@ -229,8 +211,8 @@ public class GenerateReleaseNotesTask if (releaseJson.getString("tag_name").equals(releaseTag) || releaseJson.getString("name").equals(releaseTag)) { if (!releaseJson.getBoolean("draft")) { - return ExecutionResult.failure(new IllegalStateException( - "Release already exists for tag " + releaseTag)); + return ExecutionResult + .failure(new IllegalStateException("Release already exists for tag " + releaseTag)); } else { draftRelease = new Release.Smart(release); @@ -252,16 +234,14 @@ public class GenerateReleaseNotesTask } } catch (Throwable e) { - return ExecutionResult.failure(new IllegalStateException( - "Unable to try to match github releases with tag " + releaseTag, - e)); + return ExecutionResult.failure( + new IllegalStateException("Unable to try to match github releases with tag " + releaseTag, e)); } if (draftReleaseJson == null) { // create a draft release for the tag try { - Release.Smart release = new Release.Smart( - repo.releases().create(releaseTag)); + Release.Smart release = new Release.Smart(repo.releases().create(releaseTag)); release.draft(true); release.tag(releaseTag); release.name(releaseTag); @@ -279,8 +259,7 @@ public class GenerateReleaseNotesTask // update the existing draft try { // edit the release - String oldAndNewNotes = draftReleaseJson.getString("body") - + "\n\n----\nNew draft added " + String oldAndNewNotes = draftReleaseJson.getString("body") + "\n\n----\nNew draft added " + LocalDateTime.now().toString() + "\n----\n" + notes; draftRelease.body(oldAndNewNotes); return ExecutionResult.success(); @@ -295,18 +274,15 @@ public class GenerateReleaseNotesTask /** * Generate the release notes. */ - protected String generateNotes(Arguments args, - EnumMap> entries, + protected String generateNotes(Arguments args, EnumMap> entries, List contributorGithubMentions) { // TODO use a template? handlebars ! - StringBuilder notes = new StringBuilder().append(args.projectToRun.name()) - .append(" `").append(args.versionFromBom.version) - .append("` is part of **`").append(args.releaseTrain().version) + StringBuilder notes = new StringBuilder().append(args.projectToRun.name()).append(" `") + .append(args.versionFromBom.version).append("` is part of **`").append(args.releaseTrain().version) .append("` Release Train**."); notes.append("\n\n## :warning: Update considerations and deprecations"); - for (ChangelogEntry noteworthy : entries.getOrDefault(Type.NOTEWORTHY, - Collections.emptyList())) { + for (ChangelogEntry noteworthy : entries.getOrDefault(Type.NOTEWORTHY, Collections.emptyList())) { notes.append("\n - ").append(noteworthy.description); for (String issueTitle : noteworthy.associatedIssueLinksAndTitles.values()) { notes.append("\n\t - ").append(cleanupShortMessage(issueTitle)); @@ -314,8 +290,7 @@ public class GenerateReleaseNotesTask } notes.append("\n\n## :sparkles: New features and improvements"); - for (ChangelogEntry feature : entries.getOrDefault(Type.FEATURE, - Collections.emptyList())) { + for (ChangelogEntry feature : entries.getOrDefault(Type.FEATURE, Collections.emptyList())) { notes.append("\n - ").append(feature.description); for (String issueTitle : feature.associatedIssueLinksAndTitles.values()) { notes.append("\n\t - ").append(cleanupShortMessage(issueTitle)); @@ -323,8 +298,7 @@ public class GenerateReleaseNotesTask } notes.append("\n\n## :beetle: Bug fixes"); - for (ChangelogEntry bug : entries.getOrDefault(Type.BUG, - Collections.emptyList())) { + for (ChangelogEntry bug : entries.getOrDefault(Type.BUG, Collections.emptyList())) { notes.append("\n - ").append(bug.description); for (String issueTitle : bug.associatedIssueLinksAndTitles.values()) { notes.append("\n\t - ").append(cleanupShortMessage(issueTitle)); @@ -332,8 +306,7 @@ public class GenerateReleaseNotesTask } notes.append("\n\n## :book: Documentation, Tests and Build"); - for (ChangelogEntry misc : entries.getOrDefault(Type.DOC_MISC, - Collections.emptyList())) { + for (ChangelogEntry misc : entries.getOrDefault(Type.DOC_MISC, Collections.emptyList())) { notes.append("\n - ").append(misc.description); for (String issueTitle : misc.associatedIssueLinksAndTitles.values()) { notes.append("\n\t - ").append(cleanupShortMessage(issueTitle)); @@ -341,18 +314,15 @@ public class GenerateReleaseNotesTask } notes.append("\n\n## **TODO DISPATCH THESE**"); - for (ChangelogEntry unclassified : entries.getOrDefault(Type.UNCLASSIFIED, - Collections.emptyList())) { + for (ChangelogEntry unclassified : entries.getOrDefault(Type.UNCLASSIFIED, Collections.emptyList())) { notes.append("\n - ").append(unclassified.description); - for (String issueTitle : unclassified.associatedIssueLinksAndTitles - .values()) { + for (String issueTitle : unclassified.associatedIssueLinksAndTitles.values()) { notes.append("\n\t - ").append(cleanupShortMessage(issueTitle)); } } // contributors - notes.append( - "\n\n## :+1: Thanks to the following contributors that also participated to this release\n"); + notes.append("\n\n## :+1: Thanks to the following contributors that also participated to this release\n"); notes.append(String.join(", ", contributorGithubMentions)); return notes.toString(); @@ -400,8 +370,7 @@ public class GenerateReleaseNotesTask return EnumSet.copyOf(types); } - protected String commitToGithubMention(RepoCommits commitsClient, - SimpleCommit revCommit) { + protected String commitToGithubMention(RepoCommits commitsClient, SimpleCommit revCommit) { RepoCommit dumbCommit = commitsClient.get(revCommit.fullSha1); RepoCommit.Smart smartCommit = new RepoCommit.Smart(dumbCommit); try { @@ -412,17 +381,14 @@ public class GenerateReleaseNotesTask } else if (authorType == JsonValue.ValueType.NULL) { // assume author+committer, look under commit.author.name - if (commitJson.containsKey("commit") - && commitJson.getJsonObject("commit").containsKey("author")) { - return "@" + commitJson.getJsonObject("commit") - .getJsonObject("author").getString("name"); + if (commitJson.containsKey("commit") && commitJson.getJsonObject("commit").containsKey("author")) { + return "@" + commitJson.getJsonObject("commit").getJsonObject("author").getString("name"); } } // in case unexpected json, output the "sha", "commit", "author" and // "committer" - return "@RAW{\"sha\", " + commitJson.get("sha") + ", \"author\", \"" - + commitJson.get("author") + ", \"committer\", \"" - + commitJson.get("committer") + ", \"commit\", \"" + return "@RAW{\"sha\", " + commitJson.get("sha") + ", \"author\", \"" + commitJson.get("author") + + ", \"committer\", \"" + commitJson.get("committer") + ", \"commit\", \"" + commitJson.get("commit") + "}"; } catch (IOException e) { @@ -437,9 +403,8 @@ public class GenerateReleaseNotesTask */ List extractContributorMentions(Repo repo, List revCommits) { RepoCommits commitsClient = repo.commits(); - return revCommits.stream().map(c -> commitToGithubMention(commitsClient, c)) - .filter(Objects::nonNull).distinct().sorted(String.CASE_INSENSITIVE_ORDER) - .collect(Collectors.toList()); + return revCommits.stream().map(c -> commitToGithubMention(commitsClient, c)).filter(Objects::nonNull).distinct() + .sorted(String.CASE_INSENSITIVE_ORDER).collect(Collectors.toList()); } /** @@ -487,8 +452,7 @@ public class GenerateReleaseNotesTask * The labels and titles are injected in a {@link Set} of labels and {@link Map} of * hashtag issue links to issue titles. */ - protected void fetchIssueLabelsAndTitles(Issues issueClient, - Set issueNumbers, Set labelsTarget, + protected void fetchIssueLabelsAndTitles(Issues issueClient, Set issueNumbers, Set labelsTarget, Map referencedIssuesTarget) { issueNumbers.forEach(i -> { try { @@ -496,10 +460,9 @@ public class GenerateReleaseNotesTask // we have everything handy in the JSON Issue issue = issueClient.get(i); JsonObject issueJson = issue.json(); - issueJson.getJsonArray("labels").forEach(label -> labelsTarget - .add(((JsonObject) label).getString("name"))); - referencedIssuesTarget.put("#" + issueJson.getInt("number"), - issueJson.getString("title")); + issueJson.getJsonArray("labels") + .forEach(label -> labelsTarget.add(((JsonObject) label).getString("name"))); + referencedIssuesTarget.put("#" + issueJson.getInt("number"), issueJson.getString("title")); } catch (Exception e) { log.warn("Could not fetch issue information for #" + i, e); @@ -510,20 +473,17 @@ public class GenerateReleaseNotesTask /** * Extract issue information from the commit and generate the {@link ChangelogEntry}. */ - protected ChangelogEntry parseChangeLogEntry(Issues issueClient, - SimpleCommit commit) { + protected ChangelogEntry parseChangeLogEntry(Issues issueClient, SimpleCommit commit) { String cleanShortMessage = cleanupShortMessage(commit); Set issueNumbers = extractIssueNumbers(commit); Set labelsTarget = new HashSet<>(); Map referencedIssuesTarget = new LinkedHashMap<>(); - fetchIssueLabelsAndTitles(issueClient, issueNumbers, labelsTarget, - referencedIssuesTarget); + fetchIssueLabelsAndTitles(issueClient, issueNumbers, labelsTarget, referencedIssuesTarget); EnumSet types = extractTypes(labelsTarget, commit.title); - return new ChangelogEntry(types, commit.abbreviatedSha1, cleanShortMessage, - referencedIssuesTarget); + return new ChangelogEntry(types, commit.abbreviatedSha1, cleanShortMessage, referencedIssuesTarget); } /* @@ -534,8 +494,7 @@ public class GenerateReleaseNotesTask * reflecting the PR number in case there has been extensive review/discussion in that * PR. Both references would be caught by ISSUE_REF pattern below. */ - static Pattern SHORT_MESSAGE = Pattern - .compile("(?:[a-zA-Z]+ #[0-9]+)?([^\\(]+)(?:\\(#[0-9]+\\))?"); + static Pattern SHORT_MESSAGE = Pattern.compile("(?:[a-zA-Z]+ #[0-9]+)?([^\\(]+)(?:\\(#[0-9]+\\))?"); /** * A {@link Pattern} to find issue/pr numbers in a commit message, by detecting @@ -607,8 +566,7 @@ public class GenerateReleaseNotesTask } else { this.description = cleanShortMessage + " (" - + String.join(", ", this.associatedIssueLinksAndTitles.keySet()) - + ")"; + + String.join(", ", this.associatedIssueLinksAndTitles.keySet()) + ")"; } } diff --git a/projects/reactor/src/main/java/releaser/reactor/ReactorConfiguration.java b/projects/reactor/src/main/java/releaser/reactor/ReactorConfiguration.java index 43b86b74..f6d68fee 100644 --- a/projects/reactor/src/main/java/releaser/reactor/ReactorConfiguration.java +++ b/projects/reactor/src/main/java/releaser/reactor/ReactorConfiguration.java @@ -41,27 +41,24 @@ class ReactorConfiguration { } @Bean - RestartSiteProjectPostReleaseTask restartSiteProjectPostReleaseTask(Releaser releaser, - CfClient cfClient, @Value("${cf.reactorAppName}") String reactorAppName) { + RestartSiteProjectPostReleaseTask restartSiteProjectPostReleaseTask(Releaser releaser, CfClient cfClient, + @Value("${cf.reactorAppName}") String reactorAppName) { return new RestartSiteProjectPostReleaseTask(releaser, cfClient, reactorAppName); } @Bean Github githubClient(ReleaserProperties properties) { if (!StringUtils.hasText(properties.getGit().getOauthToken())) { - throw new BeanInitializationException( - "You must set the value of the OAuth token. You can do it " - + "either via the command line [--releaser.git.oauth-token=...] " - + "or put it as an env variable in [~/.bashrc] or " - + "[~/.zshrc] e.g. [export RELEASER_GIT_OAUTH_TOKEN=...]"); + throw new BeanInitializationException("You must set the value of the OAuth token. You can do it " + + "either via the command line [--releaser.git.oauth-token=...] " + + "or put it as an env variable in [~/.bashrc] or " + + "[~/.zshrc] e.g. [export RELEASER_GIT_OAUTH_TOKEN=...]"); } - return new RtGithub(new RtGithub(properties.getGit().getOauthToken()).entry() - .through(RetryWire.class)); + return new RtGithub(new RtGithub(properties.getGit().getOauthToken()).entry().through(RetryWire.class)); } @Bean - GenerateReleaseNotesTask releaseNotesTask(Github github, - ProjectGitHandler gitHandler) { + GenerateReleaseNotesTask releaseNotesTask(Github github, ProjectGitHandler gitHandler) { return new GenerateReleaseNotesTask(github, gitHandler); } diff --git a/projects/reactor/src/main/java/releaser/reactor/RestartSiteProjectPostReleaseTask.java b/projects/reactor/src/main/java/releaser/reactor/RestartSiteProjectPostReleaseTask.java index f5e51b95..8fcc4cc3 100644 --- a/projects/reactor/src/main/java/releaser/reactor/RestartSiteProjectPostReleaseTask.java +++ b/projects/reactor/src/main/java/releaser/reactor/RestartSiteProjectPostReleaseTask.java @@ -31,8 +31,7 @@ public class RestartSiteProjectPostReleaseTask extends PublishDocsReleaseTask { private final String reactorAppName; - public RestartSiteProjectPostReleaseTask(Releaser releaser, CfClient cfClient, - String reactorAppName) { + public RestartSiteProjectPostReleaseTask(Releaser releaser, CfClient cfClient, String reactorAppName) { super(releaser); this.cfClient = cfClient; this.reactorAppName = reactorAppName; @@ -58,8 +57,7 @@ class CfClient { } void restartApp(String name) { - this.cloudFoundryOperations.applications() - .restart(RestartApplicationRequest.builder().name(name).build()); + this.cloudFoundryOperations.applications().restart(RestartApplicationRequest.builder().name(name).build()); } } diff --git a/projects/reactor/src/test/java/releaser/ReleaserApplicationTests.java b/projects/reactor/src/test/java/releaser/ReleaserApplicationTests.java index 9f880058..2243e494 100644 --- a/projects/reactor/src/test/java/releaser/ReleaserApplicationTests.java +++ b/projects/reactor/src/test/java/releaser/ReleaserApplicationTests.java @@ -49,13 +49,11 @@ class ReleaserApplicationTests { @Test void should_load_generate_release_notes_in_dry_run() { - Map beans = context - .getBeansOfType(DryRunReleaseReleaserTask.class); + Map beans = context.getBeansOfType(DryRunReleaseReleaserTask.class); List inOrder = new LinkedList<>(beans.values()); inOrder.sort(AnnotationAwareOrderComparator.INSTANCE); - assertThat(inOrder).anySatisfy( - task -> assertThat(task).isInstanceOf(GenerateReleaseNotesTask.class)); + assertThat(inOrder).anySatisfy(task -> assertThat(task).isInstanceOf(GenerateReleaseNotesTask.class)); } @Test @@ -64,11 +62,9 @@ class ReleaserApplicationTests { List inOrder = new LinkedList<>(beans.values()); inOrder.sort(AnnotationAwareOrderComparator.INSTANCE); - assertThat(inOrder).anySatisfy(task -> assertThat(task) - .isInstanceOf(RestartSiteProjectPostReleaseTask.class)); - assertThat(inOrder).noneSatisfy( - task -> assertThat(task).isInstanceOf(PublishDocsReleaseTask.class) - .isNotInstanceOf(RestartSiteProjectPostReleaseTask.class)); + assertThat(inOrder).anySatisfy(task -> assertThat(task).isInstanceOf(RestartSiteProjectPostReleaseTask.class)); + assertThat(inOrder).noneSatisfy(task -> assertThat(task).isInstanceOf(PublishDocsReleaseTask.class) + .isNotInstanceOf(RestartSiteProjectPostReleaseTask.class)); } diff --git a/projects/reactor/src/test/java/releaser/reactor/GenerateReleaseNotesTaskTest.java b/projects/reactor/src/test/java/releaser/reactor/GenerateReleaseNotesTaskTest.java index fd2f7063..352d8320 100644 --- a/projects/reactor/src/test/java/releaser/reactor/GenerateReleaseNotesTaskTest.java +++ b/projects/reactor/src/test/java/releaser/reactor/GenerateReleaseNotesTaskTest.java @@ -60,23 +60,22 @@ class GenerateReleaseNotesTaskTest { @Test void extractTypeFromLabel() { - assertThat(task.extractTypes(Collections.singleton("type/bug"), "")) - .as("type/bug").containsOnly(Type.BUG); + assertThat(task.extractTypes(Collections.singleton("type/bug"), "")).as("type/bug").containsOnly(Type.BUG); - assertThat(task.extractTypes(Collections.singleton("type/enhancement"), "")) - .as("type/enhancement").containsOnly(Type.FEATURE); + assertThat(task.extractTypes(Collections.singleton("type/enhancement"), "")).as("type/enhancement") + .containsOnly(Type.FEATURE); - assertThat(task.extractTypes(Collections.singleton("type/documentation"), "")) - .as("type/documentation").containsOnly(Type.DOC_MISC); + assertThat(task.extractTypes(Collections.singleton("type/documentation"), "")).as("type/documentation") + .containsOnly(Type.DOC_MISC); - assertThat(task.extractTypes(Collections.singleton("type/chores"), "")) - .as("type/chores").containsOnly(Type.DOC_MISC); + assertThat(task.extractTypes(Collections.singleton("type/chores"), "")).as("type/chores") + .containsOnly(Type.DOC_MISC); - assertThat(task.extractTypes(Collections.singleton("warn/something"), "")) - .as("warn/*").containsOnly(Type.NOTEWORTHY); + assertThat(task.extractTypes(Collections.singleton("warn/something"), "")).as("warn/*") + .containsOnly(Type.NOTEWORTHY); - assertThat(task.extractTypes(Collections.singleton("type/whatever"), "")) - .as("type/whatever").containsOnly(Type.UNCLASSIFIED); + assertThat(task.extractTypes(Collections.singleton("type/whatever"), "")).as("type/whatever") + .containsOnly(Type.UNCLASSIFIED); } @Test @@ -87,179 +86,158 @@ class GenerateReleaseNotesTaskTest { labels.add("type/documentation"); labels.add("whatever"); - assertThat(task.extractTypes(labels, "")).as("multiple labels") - .containsOnly(Type.BUG, Type.FEATURE, Type.DOC_MISC); + assertThat(task.extractTypes(labels, "")).as("multiple labels").containsOnly(Type.BUG, Type.FEATURE, + Type.DOC_MISC); } @Test void extractMiscTypeFromBuildMessagePrefix() { String message = "[build] Foo"; - assertThat(task.extractTypes(Collections.emptySet(), message)) - .containsOnly(Type.DOC_MISC); + assertThat(task.extractTypes(Collections.emptySet(), message)).containsOnly(Type.DOC_MISC); } @Test void extractMiscTypeFromPolishMessagePrefix() { String message = "[polish] Foo"; - assertThat(task.extractTypes(Collections.emptySet(), message)) - .containsOnly(Type.DOC_MISC); + assertThat(task.extractTypes(Collections.emptySet(), message)).containsOnly(Type.DOC_MISC); } @Test void extractMiscTypeFromDocMessagePrefix() { String message = "[doc] Foo"; - assertThat(task.extractTypes(Collections.emptySet(), message)) - .containsOnly(Type.DOC_MISC); + assertThat(task.extractTypes(Collections.emptySet(), message)).containsOnly(Type.DOC_MISC); } @Test void extractUnclassifiedTypeFromRandomMessagePrefix() { String message = "fix #123 There was a [bug], needed to [polish] the [doc]"; - assertThat(task.extractTypes(Collections.emptySet(), message)) - .containsOnly(Type.UNCLASSIFIED); + assertThat(task.extractTypes(Collections.emptySet(), message)).containsOnly(Type.UNCLASSIFIED); } @Test void noTitleCleanupFromMergeCommit() { - SimpleCommit mergeCommit = new SimpleCommit("sha1", "fullsha1", - "merge #123 into 3.3 (#123)", "merge #123 into 3.3", "Simon Baslé", - "sbasle@pivotal.io", "Simon Baslé", "sbasle@pivotal.io", true); + SimpleCommit mergeCommit = new SimpleCommit("sha1", "fullsha1", "merge #123 into 3.3 (#123)", + "merge #123 into 3.3", "Simon Baslé", "sbasle@pivotal.io", "Simon Baslé", "sbasle@pivotal.io", true); - assertThat(task.cleanupShortMessage(mergeCommit)) - .isEqualTo("merge #123 into 3.3 (#123)"); + assertThat(task.cleanupShortMessage(mergeCommit)).isEqualTo("merge #123 into 3.3 (#123)"); } @Test void titleCleanupFixPrefix() { - SimpleCommit commit = new SimpleCommit("sha1", "fullsha1", - "fix #123 Text from title", "fix #123 Some more text", "Simon Baslé", - "sbasle@pivotal.io", "Simon Baslé", "sbasle@pivotal.io", false); + SimpleCommit commit = new SimpleCommit("sha1", "fullsha1", "fix #123 Text from title", + "fix #123 Some more text", "Simon Baslé", "sbasle@pivotal.io", "Simon Baslé", "sbasle@pivotal.io", + false); assertThat(task.cleanupShortMessage(commit)).isEqualTo("Text from title"); } @Test void titleCleanupSeePrefix() { - SimpleCommit commit = new SimpleCommit("sha1", "fullsha1", - "see #123 Text from title", "see #123 Some more text", "Simon Baslé", - "sbasle@pivotal.io", "Simon Baslé", "sbasle@pivotal.io", false); + SimpleCommit commit = new SimpleCommit("sha1", "fullsha1", "see #123 Text from title", + "see #123 Some more text", "Simon Baslé", "sbasle@pivotal.io", "Simon Baslé", "sbasle@pivotal.io", + false); assertThat(task.cleanupShortMessage(commit)).isEqualTo("Text from title"); } @Test void titleCleanupPrStyleSuffix() { - SimpleCommit commit = new SimpleCommit("sha1", "fullsha1", - "Commit without issue (#123)", "fullMessage", "Simon Baslé", - "sbasle@pivotal.io", "Simon Baslé", "sbasle@pivotal.io", false); + SimpleCommit commit = new SimpleCommit("sha1", "fullsha1", "Commit without issue (#123)", "fullMessage", + "Simon Baslé", "sbasle@pivotal.io", "Simon Baslé", "sbasle@pivotal.io", false); assertThat(task.cleanupShortMessage(commit)).isEqualTo("Commit without issue"); } @Test void titleCleanupPrStyleSuffixNoSpace() { - SimpleCommit commit = new SimpleCommit("sha1", "fullsha1", - "Commit without issue(#123)", "fullMessage", "Simon Baslé", - "sbasle@pivotal.io", "Simon Baslé", "sbasle@pivotal.io", false); + SimpleCommit commit = new SimpleCommit("sha1", "fullsha1", "Commit without issue(#123)", "fullMessage", + "Simon Baslé", "sbasle@pivotal.io", "Simon Baslé", "sbasle@pivotal.io", false); assertThat(task.cleanupShortMessage(commit)).isEqualTo("Commit without issue"); } @Test void titleCleanupBothPrefixAndSuffix() { - SimpleCommit commit = new SimpleCommit("sha1", "fullsha1", - "prefix #123 Commit title (#123)", "fullMessage", "Simon Baslé", - "sbasle@pivotal.io", "Simon Baslé", "sbasle@pivotal.io", false); + SimpleCommit commit = new SimpleCommit("sha1", "fullsha1", "prefix #123 Commit title (#123)", "fullMessage", + "Simon Baslé", "sbasle@pivotal.io", "Simon Baslé", "sbasle@pivotal.io", false); assertThat(task.cleanupShortMessage(commit)).isEqualTo("Commit title"); } @Test void issueNumberTitlePrefix() { - SimpleCommit commit = new SimpleCommit("sha1", "fullsha1", - "prefix #123 Commit title", "fullMessage", "Simon Baslé", - "sbasle@pivotal.io", "Simon Baslé", "sbasle@pivotal.io", false); + SimpleCommit commit = new SimpleCommit("sha1", "fullsha1", "prefix #123 Commit title", "fullMessage", + "Simon Baslé", "sbasle@pivotal.io", "Simon Baslé", "sbasle@pivotal.io", false); assertThat(task.extractIssueNumbers(commit)).containsOnly(123); } @Test void issueNumberTitlePrStyleSuffix() { - SimpleCommit commit = new SimpleCommit("sha1", "fullsha1", "Commit title (#123)", - "fullMessage", "Simon Baslé", "sbasle@pivotal.io", "Simon Baslé", - "sbasle@pivotal.io", false); + SimpleCommit commit = new SimpleCommit("sha1", "fullsha1", "Commit title (#123)", "fullMessage", "Simon Baslé", + "sbasle@pivotal.io", "Simon Baslé", "sbasle@pivotal.io", false); assertThat(task.extractIssueNumbers(commit)).containsOnly(123); } @Test void issueNumberTitlePrefixAndSuffix() { - SimpleCommit commit = new SimpleCommit("sha1", "fullsha1", - "prefix #123 Commit title (#456)", "fullMessage", "Simon Baslé", - "sbasle@pivotal.io", "Simon Baslé", "sbasle@pivotal.io", false); + SimpleCommit commit = new SimpleCommit("sha1", "fullsha1", "prefix #123 Commit title (#456)", "fullMessage", + "Simon Baslé", "sbasle@pivotal.io", "Simon Baslé", "sbasle@pivotal.io", false); assertThat(task.extractIssueNumbers(commit)).containsOnly(123, 456); } @Test void issueNumberTitleNotSeparatedBySpace() { - SimpleCommit commit = new SimpleCommit("sha1", "fullsha1", - "prefix#123Commit title(#456)", "fullMessage", "Simon Baslé", - "sbasle@pivotal.io", "Simon Baslé", "sbasle@pivotal.io", false); + SimpleCommit commit = new SimpleCommit("sha1", "fullsha1", "prefix#123Commit title(#456)", "fullMessage", + "Simon Baslé", "sbasle@pivotal.io", "Simon Baslé", "sbasle@pivotal.io", false); assertThat(task.extractIssueNumbers(commit)).containsOnly(123, 456); } - static final VoidAnswer4, Set, Map> MOCK_FETCH_ISSUES = ( - ignore1, issues, ignore2, resolved) -> issues - .forEach(i -> resolved.put("#" + i, "alternative title for " + i)); + static final VoidAnswer4, Set, Map> MOCK_FETCH_ISSUES = (ignore1, + issues, ignore2, resolved) -> issues.forEach(i -> resolved.put("#" + i, "alternative title for " + i)); static final Issues MOCK_ISSUES = Mockito.mock(Issues.class); @Test void generateChangelogDescriptionSingleIssueTwice() throws IOException { final GenerateReleaseNotesTask spy = Mockito.spy(task); - doAnswer(answerVoid(MOCK_FETCH_ISSUES)).when(spy).fetchIssueLabelsAndTitles(any(), - any(), any(), any()); + doAnswer(answerVoid(MOCK_FETCH_ISSUES)).when(spy).fetchIssueLabelsAndTitles(any(), any(), any(), any()); - SimpleCommit commit = new SimpleCommit("sha1", "fullsha1", - "prefix #123 Commit title (#123)", "fullMessage", "Simon Baslé", - "sbasle@pivotal.io", "Simon Baslé", "sbasle@pivotal.io", false); + SimpleCommit commit = new SimpleCommit("sha1", "fullsha1", "prefix #123 Commit title (#123)", "fullMessage", + "Simon Baslé", "sbasle@pivotal.io", "Simon Baslé", "sbasle@pivotal.io", false); - assertThat(spy.parseChangeLogEntry(githubClient.randomRepo().issues(), - commit).description).isEqualTo("Commit title (#123)"); + assertThat(spy.parseChangeLogEntry(githubClient.randomRepo().issues(), commit).description) + .isEqualTo("Commit title (#123)"); } @Test void generateChangelogDescriptionTwoIssues() throws IOException { final GenerateReleaseNotesTask spy = Mockito.spy(task); - doAnswer(answerVoid(MOCK_FETCH_ISSUES)).when(spy).fetchIssueLabelsAndTitles(any(), - any(), any(), any()); + doAnswer(answerVoid(MOCK_FETCH_ISSUES)).when(spy).fetchIssueLabelsAndTitles(any(), any(), any(), any()); - SimpleCommit commit = new SimpleCommit("sha1", "fullsha1", - "prefix #123 Commit title (#456)", "fullMessage", "Simon Baslé", - "sbasle@pivotal.io", "Simon Baslé", "sbasle@pivotal.io", false); + SimpleCommit commit = new SimpleCommit("sha1", "fullsha1", "prefix #123 Commit title (#456)", "fullMessage", + "Simon Baslé", "sbasle@pivotal.io", "Simon Baslé", "sbasle@pivotal.io", false); - assertThat(spy.parseChangeLogEntry(MOCK_ISSUES, commit).description) - .isEqualTo("Commit title (#123, #456)"); + assertThat(spy.parseChangeLogEntry(MOCK_ISSUES, commit).description).isEqualTo("Commit title (#123, #456)"); } @Test void generateChangelogDescriptionTwoIssuesNoSpace() throws IOException { final GenerateReleaseNotesTask spy = Mockito.spy(task); - doAnswer(answerVoid(MOCK_FETCH_ISSUES)).when(spy).fetchIssueLabelsAndTitles(any(), - any(), any(), any()); + doAnswer(answerVoid(MOCK_FETCH_ISSUES)).when(spy).fetchIssueLabelsAndTitles(any(), any(), any(), any()); - SimpleCommit commit = new SimpleCommit("sha1", "fullsha1", - "prefix #123Commit title no space(#456)", "fullMessage", "Simon Baslé", - "sbasle@pivotal.io", "Simon Baslé", "sbasle@pivotal.io", false); + SimpleCommit commit = new SimpleCommit("sha1", "fullsha1", "prefix #123Commit title no space(#456)", + "fullMessage", "Simon Baslé", "sbasle@pivotal.io", "Simon Baslé", "sbasle@pivotal.io", false); - assertThat(spy.parseChangeLogEntry(githubClient.randomRepo().issues(), - commit).description).isEqualTo("Commit title no space (#123, #456)"); + assertThat(spy.parseChangeLogEntry(githubClient.randomRepo().issues(), commit).description) + .isEqualTo("Commit title no space (#123, #456)"); } @Test @@ -267,12 +245,11 @@ class GenerateReleaseNotesTaskTest { final GenerateReleaseNotesTask spy = Mockito.spy(task); doNothing().when(spy).fetchIssueLabelsAndTitles(any(), any(), any(), any()); - SimpleCommit commit = new SimpleCommit("sha1", "fullsha1", - "prefix #123 Commit title no space(#456)", "fullMessage", "Simon Baslé", - "sbasle@pivotal.io", "Simon Baslé", "sbasle@pivotal.io", false); + SimpleCommit commit = new SimpleCommit("sha1", "fullsha1", "prefix #123 Commit title no space(#456)", + "fullMessage", "Simon Baslé", "sbasle@pivotal.io", "Simon Baslé", "sbasle@pivotal.io", false); - assertThat(spy.parseChangeLogEntry(githubClient.randomRepo().issues(), - commit).description).isEqualTo("Commit title no space (sha1)"); + assertThat(spy.parseChangeLogEntry(githubClient.randomRepo().issues(), commit).description) + .isEqualTo("Commit title no space (sha1)"); } @Test @@ -284,9 +261,8 @@ class GenerateReleaseNotesTaskTest { assertThatExceptionOfType(Exception.class).as("github client fails") .isThrownBy(() -> new Issue.Smart(issuesClient.get(123)).title()); - assertThatCode(() -> task.fetchIssueLabelsAndTitles(issuesClient, - Collections.singleton(123), labels, associatedIssues)) - .as("fetching just does nothing").doesNotThrowAnyException(); + assertThatCode(() -> task.fetchIssueLabelsAndTitles(issuesClient, Collections.singleton(123), labels, + associatedIssues)).as("fetching just does nothing").doesNotThrowAnyException(); assertThat(labels).as("labels").isEmpty(); assertThat(associatedIssues).as("associated issues").isEmpty(); diff --git a/projects/reactor/src/test/java/releaser/reactor/ReactorTestConfiguration.java b/projects/reactor/src/test/java/releaser/reactor/ReactorTestConfiguration.java index 53d3d88b..e0afcd95 100644 --- a/projects/reactor/src/test/java/releaser/reactor/ReactorTestConfiguration.java +++ b/projects/reactor/src/test/java/releaser/reactor/ReactorTestConfiguration.java @@ -46,14 +46,13 @@ import org.springframework.context.annotation.Profile; public class ReactorTestConfiguration { @Bean - RestartSiteProjectPostReleaseTask restartSiteProjectPostReleaseTask(Releaser releaser, - CfClient cfClient, @Value("${cf.reactorAppName}") String reactorAppName) { + RestartSiteProjectPostReleaseTask restartSiteProjectPostReleaseTask(Releaser releaser, CfClient cfClient, + @Value("${cf.reactorAppName}") String reactorAppName) { return new RestartSiteProjectPostReleaseTask(releaser, cfClient, reactorAppName); } @Bean - GenerateReleaseNotesTask releaseNotesTask(Github github, - ProjectGitHandler gitHandler) { + GenerateReleaseNotesTask releaseNotesTask(Github github, ProjectGitHandler gitHandler) { return new GenerateReleaseNotesTask(github, gitHandler); } diff --git a/projects/reactor/src/test/java/releaser/reactor/RestartSiteProjectPostReleaseTaskTests.java b/projects/reactor/src/test/java/releaser/reactor/RestartSiteProjectPostReleaseTaskTests.java index 5c63cf29..099ef13f 100644 --- a/projects/reactor/src/test/java/releaser/reactor/RestartSiteProjectPostReleaseTaskTests.java +++ b/projects/reactor/src/test/java/releaser/reactor/RestartSiteProjectPostReleaseTaskTests.java @@ -16,8 +16,6 @@ package releaser.reactor; -import static org.junit.jupiter.api.Assertions.fail; - import org.assertj.core.api.BDDAssertions; import org.junit.jupiter.api.Test; import org.mockito.BDDMockito; @@ -34,6 +32,8 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.ActiveProfiles; +import static org.junit.jupiter.api.Assertions.fail; + @SpringBootTest @ActiveProfiles("test") class RestartSiteProjectPostReleaseTaskTests { @@ -51,16 +51,13 @@ class RestartSiteProjectPostReleaseTaskTests { ExecutionResult result = task.runTask(arguments); BDDAssertions.then(result.isSuccess()).isTrue(); - BDDMockito.then(this.cfClient).should() - .restartApp(BDDMockito.eq("projectreactor")); + BDDMockito.then(this.cfClient).should().restartApp(BDDMockito.eq("projectreactor")); } @Test void should_fail_if_original_version_is_null() { - ProjectToRun p = new ProjectToRun(null, - new ProjectsFromBom(new Projects(), new ProjectVersion("foo", "1.0.0")), - null, new ReleaserProperties(), - BDDMockito.mock(Options.class)) { + ProjectToRun p = new ProjectToRun(null, new ProjectsFromBom(new Projects(), new ProjectVersion("foo", "1.0.0")), + null, new ReleaserProperties(), BDDMockito.mock(Options.class)) { @Override public String name() { return "reactor-core"; @@ -86,10 +83,8 @@ class RestartSiteProjectPostReleaseTaskTests { } private ProjectToRun reactorCoreProject() { - return new ProjectToRun(null, - new ProjectsFromBom(new Projects(), new ProjectVersion("foo", "1.0.0")), - new ProjectVersion("foo", "1.0.0"), new ReleaserProperties(), - BDDMockito.mock(Options.class)) { + return new ProjectToRun(null, new ProjectsFromBom(new Projects(), new ProjectVersion("foo", "1.0.0")), + new ProjectVersion("foo", "1.0.0"), new ReleaserProperties(), BDDMockito.mock(Options.class)) { @Override public String name() { return "reactor-core"; @@ -98,10 +93,8 @@ class RestartSiteProjectPostReleaseTaskTests { } private ProjectToRun nonReactorCoreProject() { - return new ProjectToRun(null, - new ProjectsFromBom(new Projects(), new ProjectVersion("foo", "1.0.0")), - new ProjectVersion("foo", "1.0.0"), new ReleaserProperties(), - BDDMockito.mock(Options.class)) { + return new ProjectToRun(null, new ProjectsFromBom(new Projects(), new ProjectVersion("foo", "1.0.0")), + new ProjectVersion("foo", "1.0.0"), new ReleaserProperties(), BDDMockito.mock(Options.class)) { @Override public String name() { return "whatever"; diff --git a/projects/reactor/src/test/resources/application-test.yml b/projects/reactor/src/test/resources/application-test.yml index f6d7d3f2..79678c85 100644 --- a/projects/reactor/src/test/resources/application-test.yml +++ b/projects/reactor/src/test/resources/application-test.yml @@ -1,6 +1,3 @@ cf: username: foo - password: bar -spring: - profiles: - active: test \ No newline at end of file + password: bar \ No newline at end of file diff --git a/projects/spring-cloud-stream/src/main/java/releaser/ReleaserApplication.java b/projects/spring-cloud-stream/src/main/java/releaser/ReleaserApplication.java index cb2f3aa4..cafb9dd5 100644 --- a/projects/spring-cloud-stream/src/main/java/releaser/ReleaserApplication.java +++ b/projects/spring-cloud-stream/src/main/java/releaser/ReleaserApplication.java @@ -27,8 +27,7 @@ import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class ReleaserApplication extends ReleaserCommandLineRunner { - public ReleaserApplication(SpringReleaser releaser, - ExecutionResultHandler executionResultHandler, Parser parser) { + public ReleaserApplication(SpringReleaser releaser, ExecutionResultHandler executionResultHandler, Parser parser) { super(releaser, executionResultHandler, parser); } diff --git a/projects/spring-cloud-stream/src/main/java/releaser/cloud/buildsystem/SpringCloudBomConstants.java b/projects/spring-cloud-stream/src/main/java/releaser/cloud/buildsystem/SpringCloudBomConstants.java index a3698d1e..ca887bcb 100644 --- a/projects/spring-cloud-stream/src/main/java/releaser/cloud/buildsystem/SpringCloudBomConstants.java +++ b/projects/spring-cloud-stream/src/main/java/releaser/cloud/buildsystem/SpringCloudBomConstants.java @@ -24,8 +24,7 @@ final class SpringCloudBomConstants { // boot static final String SPRING_BOOT = "spring-boot"; static final String BOOT_STARTER_ARTIFACT_ID = "spring-boot-starter"; - static final String BOOT_STARTER_PARENT_ARTIFACT_ID = BOOT_STARTER_ARTIFACT_ID - + "-parent"; + static final String BOOT_STARTER_PARENT_ARTIFACT_ID = BOOT_STARTER_ARTIFACT_ID + "-parent"; static final String BOOT_DEPENDENCIES_ARTIFACT_ID = "spring-boot-dependencies"; // sc-build diff --git a/projects/spring-cloud-stream/src/main/java/releaser/cloud/buildsystem/SpringCloudStreamMavenBomParser.java b/projects/spring-cloud-stream/src/main/java/releaser/cloud/buildsystem/SpringCloudStreamMavenBomParser.java index 629448ad..6b42e6c9 100644 --- a/projects/spring-cloud-stream/src/main/java/releaser/cloud/buildsystem/SpringCloudStreamMavenBomParser.java +++ b/projects/spring-cloud-stream/src/main/java/releaser/cloud/buildsystem/SpringCloudStreamMavenBomParser.java @@ -51,17 +51,15 @@ import static releaser.cloud.buildsystem.SpringCloudBomConstants.STREAM_STARTER_ class SpringCloudStreamMavenBomParser implements CustomBomParser { - private static final Logger log = LoggerFactory - .getLogger(SpringCloudStreamMavenBomParser.class); + private static final Logger log = LoggerFactory.getLogger(SpringCloudStreamMavenBomParser.class); @Override public VersionsFromBom parseBom(File root, ReleaserProperties properties) { VersionsFromBom springCloudBuild = springCloudBuild(root, properties); VersionsFromBom boot = bootVersion(root, properties); - log.debug("Added Spring Cloud Build [{}] and boot versions [{}]", - springCloudBuild, boot); - return new VersionsFromBomBuilder().thisProjectRoot(root) - .releaserProperties(properties).projects(springCloudBuild, boot).merged(); + log.debug("Added Spring Cloud Build [{}] and boot versions [{}]", springCloudBuild, boot); + return new VersionsFromBomBuilder().thisProjectRoot(root).releaserProperties(properties) + .projects(springCloudBuild, boot).merged(); } private VersionsFromBom springCloudBuild(File root, ReleaserProperties properties) { @@ -69,8 +67,8 @@ class SpringCloudStreamMavenBomParser implements CustomBomParser { if (StringUtils.isEmpty(buildVersion)) { return VersionsFromBom.EMPTY_VERSION; } - VersionsFromBom scBuild = new VersionsFromBomBuilder().thisProjectRoot(root) - .releaserProperties(properties).merged(); + VersionsFromBom scBuild = new VersionsFromBomBuilder().thisProjectRoot(root).releaserProperties(properties) + .merged(); scBuild.add(BUILD_ARTIFACT_ID, buildVersion); scBuild.add(CLOUD_DEPENDENCIES_PARENT_ARTIFACT_ID, buildVersion); return scBuild; @@ -87,11 +85,9 @@ class SpringCloudStreamMavenBomParser implements CustomBomParser { } Model model = PomReader.pom(root, properties.getPom().getThisTrainBom()); String buildArtifact = model.getParent().getArtifactId(); - log.debug("[{}] artifact id is equal to [{}]", - CLOUD_DEPENDENCIES_PARENT_ARTIFACT_ID, buildArtifact); + log.debug("[{}] artifact id is equal to [{}]", CLOUD_DEPENDENCIES_PARENT_ARTIFACT_ID, buildArtifact); if (!CLOUD_DEPENDENCIES_PARENT_ARTIFACT_ID.equals(buildArtifact)) { - throw new IllegalStateException( - "The pom doesn't have a [spring-cloud-dependencies-parent] artifact id"); + throw new IllegalStateException("The pom doesn't have a [spring-cloud-dependencies-parent] artifact id"); } buildVersion = model.getParent().getVersion(); log.debug("Spring Cloud Build version is equal to [{}]", buildVersion); @@ -103,8 +99,7 @@ class SpringCloudStreamMavenBomParser implements CustomBomParser { if (StringUtils.hasText(bootVersion)) { return bootVersion; } - String pomWithBootStarterParent = properties.getPom() - .getPomWithBootStarterParent(); + String pomWithBootStarterParent = properties.getPom().getPomWithBootStarterParent(); File pom = new File(root, pomWithBootStarterParent); if (!pom.exists()) { return ""; @@ -117,8 +112,8 @@ class SpringCloudStreamMavenBomParser implements CustomBomParser { log.debug("Boot artifact id is equal to [{}]", bootArtifactId); if (!BOOT_STARTER_PARENT_ARTIFACT_ID.equals(bootArtifactId)) { if (log.isDebugEnabled()) { - throw new IllegalStateException("The pom doesn't have a [" - + BOOT_STARTER_PARENT_ARTIFACT_ID + "] artifact id"); + throw new IllegalStateException( + "The pom doesn't have a [" + BOOT_STARTER_PARENT_ARTIFACT_ID + "] artifact id"); } return ""; } @@ -131,8 +126,8 @@ class SpringCloudStreamMavenBomParser implements CustomBomParser { return VersionsFromBom.EMPTY_VERSION; } log.debug("Boot version is equal to [{}]", bootVersion); - VersionsFromBom versionsFromBom = new VersionsFromBomBuilder() - .thisProjectRoot(root).releaserProperties(properties).merged(); + VersionsFromBom versionsFromBom = new VersionsFromBomBuilder().thisProjectRoot(root) + .releaserProperties(properties).merged(); versionsFromBom.add(SPRING_BOOT, bootVersion); versionsFromBom.add(BOOT_STARTER_PARENT_ARTIFACT_ID, bootVersion); versionsFromBom.add(BOOT_DEPENDENCIES_ARTIFACT_ID, bootVersion); @@ -140,8 +135,7 @@ class SpringCloudStreamMavenBomParser implements CustomBomParser { } @Override - public Set setVersion(Set projects, String projectName, - String version) { + public Set setVersion(Set projects, String projectName, String version) { Set newProjects = new LinkedHashSet<>(projects); switch (projectName) { case SPRING_BOOT: diff --git a/projects/spring-cloud-stream/src/test/java/releaser/ReleaserApplicationTests.java b/projects/spring-cloud-stream/src/test/java/releaser/ReleaserApplicationTests.java index 21e3527a..c3dd22bc 100644 --- a/projects/spring-cloud-stream/src/test/java/releaser/ReleaserApplicationTests.java +++ b/projects/spring-cloud-stream/src/test/java/releaser/ReleaserApplicationTests.java @@ -27,8 +27,7 @@ import org.springframework.boot.test.context.SpringBootTest; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -@SpringBootTest( - classes = { ReleaserApplicationTests.Config.class, ReleaserApplication.class }, +@SpringBootTest(classes = { ReleaserApplicationTests.Config.class, ReleaserApplication.class }, properties = { "releaser.sagan.update-sagan=false" }) class ReleaserApplicationTests { diff --git a/projects/spring-cloud/src/main/java/releaser/ReleaserApplication.java b/projects/spring-cloud/src/main/java/releaser/ReleaserApplication.java index cb2f3aa4..cafb9dd5 100644 --- a/projects/spring-cloud/src/main/java/releaser/ReleaserApplication.java +++ b/projects/spring-cloud/src/main/java/releaser/ReleaserApplication.java @@ -27,8 +27,7 @@ import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class ReleaserApplication extends ReleaserCommandLineRunner { - public ReleaserApplication(SpringReleaser releaser, - ExecutionResultHandler executionResultHandler, Parser parser) { + public ReleaserApplication(SpringReleaser releaser, ExecutionResultHandler executionResultHandler, Parser parser) { super(releaser, executionResultHandler, parser); } diff --git a/projects/spring-cloud/src/main/java/releaser/cloud/buildsystem/SpringCloudBomConstants.java b/projects/spring-cloud/src/main/java/releaser/cloud/buildsystem/SpringCloudBomConstants.java index 46973e09..d7341ff8 100644 --- a/projects/spring-cloud/src/main/java/releaser/cloud/buildsystem/SpringCloudBomConstants.java +++ b/projects/spring-cloud/src/main/java/releaser/cloud/buildsystem/SpringCloudBomConstants.java @@ -24,8 +24,7 @@ final class SpringCloudBomConstants { // boot static final String SPRING_BOOT = "spring-boot"; static final String BOOT_STARTER_ARTIFACT_ID = "spring-boot-starter"; - static final String BOOT_STARTER_PARENT_ARTIFACT_ID = BOOT_STARTER_ARTIFACT_ID - + "-parent"; + static final String BOOT_STARTER_PARENT_ARTIFACT_ID = BOOT_STARTER_ARTIFACT_ID + "-parent"; static final String BOOT_DEPENDENCIES_ARTIFACT_ID = "spring-boot-dependencies"; // sc-build diff --git a/projects/spring-cloud/src/main/java/releaser/cloud/buildsystem/SpringCloudMavenBomParser.java b/projects/spring-cloud/src/main/java/releaser/cloud/buildsystem/SpringCloudMavenBomParser.java index a04dba99..48c9af0d 100644 --- a/projects/spring-cloud/src/main/java/releaser/cloud/buildsystem/SpringCloudMavenBomParser.java +++ b/projects/spring-cloud/src/main/java/releaser/cloud/buildsystem/SpringCloudMavenBomParser.java @@ -52,17 +52,15 @@ import static releaser.cloud.buildsystem.SpringCloudBomConstants.STREAM_STARTER_ class SpringCloudMavenBomParser implements CustomBomParser { - private static final Logger log = LoggerFactory - .getLogger(SpringCloudMavenBomParser.class); + private static final Logger log = LoggerFactory.getLogger(SpringCloudMavenBomParser.class); @Override public VersionsFromBom parseBom(File root, ReleaserProperties properties) { VersionsFromBom springCloudBuild = springCloudBuild(root, properties); VersionsFromBom boot = bootVersion(root, properties); - log.debug("Added Spring Cloud Build [{}] and boot versions [{}]", - springCloudBuild, boot); - return new VersionsFromBomBuilder().thisProjectRoot(root) - .releaserProperties(properties).projects(springCloudBuild, boot).merged(); + log.debug("Added Spring Cloud Build [{}] and boot versions [{}]", springCloudBuild, boot); + return new VersionsFromBomBuilder().thisProjectRoot(root).releaserProperties(properties) + .projects(springCloudBuild, boot).merged(); } private VersionsFromBom springCloudBuild(File root, ReleaserProperties properties) { @@ -70,8 +68,8 @@ class SpringCloudMavenBomParser implements CustomBomParser { if (StringUtils.isEmpty(buildVersion)) { return VersionsFromBom.EMPTY_VERSION; } - VersionsFromBom scBuild = new VersionsFromBomBuilder().thisProjectRoot(root) - .releaserProperties(properties).merged(); + VersionsFromBom scBuild = new VersionsFromBomBuilder().thisProjectRoot(root).releaserProperties(properties) + .merged(); scBuild.add(BUILD_ARTIFACT_ID, buildVersion); scBuild.add(CLOUD_DEPENDENCIES_PARENT_ARTIFACT_ID, buildVersion); return scBuild; @@ -88,11 +86,9 @@ class SpringCloudMavenBomParser implements CustomBomParser { } Model model = PomReader.pom(root, properties.getPom().getThisTrainBom()); String buildArtifact = model.getParent().getArtifactId(); - log.debug("[{}] artifact id is equal to [{}]", - CLOUD_DEPENDENCIES_PARENT_ARTIFACT_ID, buildArtifact); + log.debug("[{}] artifact id is equal to [{}]", CLOUD_DEPENDENCIES_PARENT_ARTIFACT_ID, buildArtifact); if (!CLOUD_DEPENDENCIES_PARENT_ARTIFACT_ID.equals(buildArtifact)) { - throw new IllegalStateException( - "The pom doesn't have a [spring-cloud-dependencies-parent] artifact id"); + throw new IllegalStateException("The pom doesn't have a [spring-cloud-dependencies-parent] artifact id"); } buildVersion = model.getParent().getVersion(); log.debug("Spring Cloud Build version is equal to [{}]", buildVersion); @@ -104,8 +100,7 @@ class SpringCloudMavenBomParser implements CustomBomParser { if (StringUtils.hasText(bootVersion)) { return bootVersion; } - String pomWithBootStarterParent = properties.getPom() - .getPomWithBootStarterParent(); + String pomWithBootStarterParent = properties.getPom().getPomWithBootStarterParent(); File pom = new File(root, pomWithBootStarterParent); if (!pom.exists()) { return ""; @@ -118,8 +113,8 @@ class SpringCloudMavenBomParser implements CustomBomParser { log.debug("Boot artifact id is equal to [{}]", bootArtifactId); if (!BOOT_STARTER_PARENT_ARTIFACT_ID.equals(bootArtifactId)) { if (log.isDebugEnabled()) { - throw new IllegalStateException("The pom doesn't have a [" - + BOOT_STARTER_PARENT_ARTIFACT_ID + "] artifact id"); + throw new IllegalStateException( + "The pom doesn't have a [" + BOOT_STARTER_PARENT_ARTIFACT_ID + "] artifact id"); } return ""; } @@ -132,8 +127,8 @@ class SpringCloudMavenBomParser implements CustomBomParser { return VersionsFromBom.EMPTY_VERSION; } log.debug("Boot version is equal to [{}]", bootVersion); - VersionsFromBom versionsFromBom = new VersionsFromBomBuilder() - .thisProjectRoot(root).releaserProperties(properties).merged(); + VersionsFromBom versionsFromBom = new VersionsFromBomBuilder().thisProjectRoot(root) + .releaserProperties(properties).merged(); versionsFromBom.add(SPRING_BOOT, bootVersion); versionsFromBom.add(BOOT_STARTER_PARENT_ARTIFACT_ID, bootVersion); versionsFromBom.add(BOOT_DEPENDENCIES_ARTIFACT_ID, bootVersion); @@ -141,8 +136,7 @@ class SpringCloudMavenBomParser implements CustomBomParser { } @Override - public Set setVersion(Set projects, String projectName, - String version) { + public Set setVersion(Set projects, String projectName, String version) { Set newProjects = new LinkedHashSet<>(projects); switch (projectName) { case SPRING_BOOT: diff --git a/projects/spring-cloud/src/main/java/releaser/cloud/docs/SpringCloudCustomProjectDocumentationUpdater.java b/projects/spring-cloud/src/main/java/releaser/cloud/docs/SpringCloudCustomProjectDocumentationUpdater.java index f996909b..d79639a3 100644 --- a/projects/spring-cloud/src/main/java/releaser/cloud/docs/SpringCloudCustomProjectDocumentationUpdater.java +++ b/projects/spring-cloud/src/main/java/releaser/cloud/docs/SpringCloudCustomProjectDocumentationUpdater.java @@ -35,18 +35,15 @@ import org.springframework.util.StringUtils; /** * @author Marcin Grzejszczak */ -class SpringCloudCustomProjectDocumentationUpdater - implements CustomProjectDocumentationUpdater { +class SpringCloudCustomProjectDocumentationUpdater implements CustomProjectDocumentationUpdater { - private static final Logger log = LoggerFactory - .getLogger(SpringCloudCustomProjectDocumentationUpdater.class); + private static final Logger log = LoggerFactory.getLogger(SpringCloudCustomProjectDocumentationUpdater.class); private final ProjectGitHandler gitHandler; private final ReleaserProperties releaserProperties; - SpringCloudCustomProjectDocumentationUpdater(ProjectGitHandler gitHandler, - ReleaserProperties releaserProperties) { + SpringCloudCustomProjectDocumentationUpdater(ProjectGitHandler gitHandler, ReleaserProperties releaserProperties) { this.gitHandler = gitHandler; this.releaserProperties = releaserProperties; } @@ -60,11 +57,10 @@ class SpringCloudCustomProjectDocumentationUpdater * used */ @Override - public File updateDocsRepoForReleaseTrain(File clonedDocumentationProject, - ProjectVersion currentProject, Projects projects, String bomBranch) { + public File updateDocsRepoForReleaseTrain(File clonedDocumentationProject, ProjectVersion currentProject, + Projects projects, String bomBranch) { if (!currentProject.projectName.startsWith("spring-cloud")) { - log.info( - "Skipping updating docs for project [{}] that does not start with spring-cloud prefix", + log.info("Skipping updating docs for project [{}] that does not start with spring-cloud prefix", currentProject.projectName); return clonedDocumentationProject; } @@ -72,12 +68,10 @@ class SpringCloudCustomProjectDocumentationUpdater ProjectVersion releaseTrainProject = new ProjectVersion( this.releaserProperties.getMetaRelease().getReleaseTrainProjectName(), branchToReleaseVersion(bomBranch)); - File currentReleaseFolder = new File(clonedDocumentationProject, - currentFolder(releaseTrainProject)); + File currentReleaseFolder = new File(clonedDocumentationProject, currentFolder(releaseTrainProject)); // remove the old way removeAFolderWithRedirection(currentReleaseFolder); - File docsRepo = updateTheDocsRepo(releaseTrainProject, clonedDocumentationProject, - currentReleaseFolder); + File docsRepo = updateTheDocsRepo(releaseTrainProject, clonedDocumentationProject, currentReleaseFolder); return pushChanges(docsRepo); } @@ -89,8 +83,8 @@ class SpringCloudCustomProjectDocumentationUpdater * used */ @Override - public File updateDocsRepoForSingleProject(File clonedDocumentationProject, - ProjectVersion currentProject, Projects projects) { + public File updateDocsRepoForSingleProject(File clonedDocumentationProject, ProjectVersion currentProject, + Projects projects) { if (!projects.containsProject(currentProject.projectName)) { log.warn( "Can't update the documentation repo for project [{}] cause it's not present on the projects list {}", @@ -98,23 +92,18 @@ class SpringCloudCustomProjectDocumentationUpdater return clonedDocumentationProject; } if (!currentProject.projectName.startsWith("spring-cloud")) { - log.info( - "Skipping updating docs for project [{}] that does not start with spring-cloud prefix", + log.info("Skipping updating docs for project [{}] that does not start with spring-cloud prefix", currentProject.projectName); return clonedDocumentationProject; } - log.info("Updating link to documentation for project [{}]", - currentProject.projectName); - ProjectVersion currentProjectVersion = projects - .forName(currentProject.projectName); - File currentProjectReleaseFolder = new File(clonedDocumentationProject, - currentFolder(currentProjectVersion)); + log.info("Updating link to documentation for project [{}]", currentProject.projectName); + ProjectVersion currentProjectVersion = projects.forName(currentProject.projectName); + File currentProjectReleaseFolder = new File(clonedDocumentationProject, currentFolder(currentProjectVersion)); removeAFolderWithRedirection(currentProjectReleaseFolder); try { - updateTheDocsRepo(currentProjectVersion, clonedDocumentationProject, - currentProjectReleaseFolder); - log.info("Processed [{}] for project with name [{}]", - currentProjectReleaseFolder, currentProjectVersion.projectName); + updateTheDocsRepo(currentProjectVersion, clonedDocumentationProject, currentProjectReleaseFolder); + log.info("Processed [{}] for project with name [{}]", currentProjectReleaseFolder, + currentProjectVersion.projectName); } catch (Exception ex) { log.warn("Exception occurred while trying o update the symlink of a project [" @@ -140,14 +129,13 @@ class SpringCloudCustomProjectDocumentationUpdater releaseTrain = currentProjectVersion.isReleaseTrain(); } catch (IllegalStateException ex) { - log.warn("Exception occurred while trying to resolve if version [" - + currentProjectVersion + "] is a release train", ex); + log.warn("Exception occurred while trying to resolve if version [" + currentProjectVersion + + "] is a release train", ex); releaseTrain = false; } // release train -> static/current // project -> static/spring-cloud-sleuth/current - return releaseTrain ? "current" - : (StringUtils.hasText(projectName) ? projectName : "") + "/current"; + return releaseTrain ? "current" : (StringUtils.hasText(projectName) ? projectName : "") + "/current"; } String linkToVersion(File file) { @@ -176,33 +164,28 @@ class SpringCloudCustomProjectDocumentationUpdater return docsRepo; } - private File updateTheDocsRepo(ProjectVersion projectVersion, - File documentationProject, File currentVersionFolder) { + private File updateTheDocsRepo(ProjectVersion projectVersion, File documentationProject, + File currentVersionFolder) { try { String storedVersion = linkToVersion(currentVersionFolder); String currentVersion = projectVersion.version; - boolean newerVersion = StringUtils.isEmpty(storedVersion) - || isMoreMature(storedVersion, currentVersion); + boolean newerVersion = StringUtils.isEmpty(storedVersion) || isMoreMature(storedVersion, currentVersion); if (!newerVersion) { - log.info("Current version [{}] is not newer than the stored one [{}]", - currentVersion, storedVersion); + log.info("Current version [{}] is not newer than the stored one [{}]", currentVersion, storedVersion); return documentationProject; } boolean deleted = Files.deleteIfExists(currentVersionFolder.toPath()) || FileSystemUtils.deleteRecursively(currentVersionFolder.toPath()); if (deleted) { - log.info("Deleted current version folder link at [{}]", - currentVersionFolder); + log.info("Deleted current version folder link at [{}]", currentVersionFolder); } boolean creatingParentDirs = currentVersionFolder.getParentFile().mkdirs(); if (!creatingParentDirs) { - log.warn("Failed to create parent directory of [{}]", - currentVersionFolder); + log.warn("Failed to create parent directory of [{}]", currentVersionFolder); } File newTarget = new File(projectVersion.version); Files.createSymbolicLink(currentVersionFolder.toPath(), newTarget.toPath()); - log.info("Updated the link [{}] to point to [{}]", - currentVersionFolder.toPath(), + log.info("Updated the link [{}] to point to [{}]", currentVersionFolder.toPath(), Files.readSymbolicLink(currentVersionFolder.toPath())); return commitChanges(currentVersion, documentationProject); } @@ -212,8 +195,7 @@ class SpringCloudCustomProjectDocumentationUpdater } private boolean isMoreMature(String storedVersion, String currentVersion) { - return new ProjectVersion("project", currentVersion) - .isMoreMature(new ProjectVersion("project", storedVersion)); + return new ProjectVersion("project", currentVersion).isMoreMature(new ProjectVersion("project", storedVersion)); } private String branchToReleaseVersion(String branch) { @@ -223,8 +205,7 @@ class SpringCloudCustomProjectDocumentationUpdater return branch; } - private File commitChanges(String currentVersion, File documentationProject) - throws IOException { + private File commitChanges(String currentVersion, File documentationProject) throws IOException { log.info("Updated the symbolic links"); this.gitHandler.commit(documentationProject, "Updating the link to the current version to [" + currentVersion + "]"); diff --git a/projects/spring-cloud/src/main/java/releaser/cloud/docs/SpringCloudDocsConfiguration.java b/projects/spring-cloud/src/main/java/releaser/cloud/docs/SpringCloudDocsConfiguration.java index 64004340..c81c12c8 100644 --- a/projects/spring-cloud/src/main/java/releaser/cloud/docs/SpringCloudDocsConfiguration.java +++ b/projects/spring-cloud/src/main/java/releaser/cloud/docs/SpringCloudDocsConfiguration.java @@ -26,10 +26,9 @@ import org.springframework.context.annotation.Configuration; class SpringCloudDocsConfiguration { @Bean - SpringCloudCustomProjectDocumentationUpdater springCloudCustomProjectDocumentationUpdater( - ProjectGitHandler handler, ReleaserProperties releaserProperties) { - return new SpringCloudCustomProjectDocumentationUpdater(handler, - releaserProperties); + SpringCloudCustomProjectDocumentationUpdater springCloudCustomProjectDocumentationUpdater(ProjectGitHandler handler, + ReleaserProperties releaserProperties) { + return new SpringCloudCustomProjectDocumentationUpdater(handler, releaserProperties); } } diff --git a/projects/spring-cloud/src/main/java/releaser/cloud/github/SpringCloudGithubConfiguration.java b/projects/spring-cloud/src/main/java/releaser/cloud/github/SpringCloudGithubConfiguration.java index 3e6f00c0..4bcb04c6 100644 --- a/projects/spring-cloud/src/main/java/releaser/cloud/github/SpringCloudGithubConfiguration.java +++ b/projects/spring-cloud/src/main/java/releaser/cloud/github/SpringCloudGithubConfiguration.java @@ -25,8 +25,7 @@ import org.springframework.context.annotation.Configuration; class SpringCloudGithubConfiguration { @Bean - SpringCloudGithubIssues springCloudGithubIssues( - ReleaserProperties releaserProperties) { + SpringCloudGithubIssues springCloudGithubIssues(ReleaserProperties releaserProperties) { return new SpringCloudGithubIssues(releaserProperties); } diff --git a/projects/spring-cloud/src/main/java/releaser/cloud/github/SpringCloudGithubIssues.java b/projects/spring-cloud/src/main/java/releaser/cloud/github/SpringCloudGithubIssues.java index b0261b42..76c0d99b 100644 --- a/projects/spring-cloud/src/main/java/releaser/cloud/github/SpringCloudGithubIssues.java +++ b/projects/spring-cloud/src/main/java/releaser/cloud/github/SpringCloudGithubIssues.java @@ -47,16 +47,14 @@ class SpringCloudGithubIssues implements CustomGithubIssues { public void fileIssueInSpringGuides(Projects projects, ProjectVersion version) { String user = "spring-guides"; String repo = "getting-started-guides"; - this.githubIssueFiler.fileAGitHubIssue(user, repo, version, issueTitle(), - guidesIssueText(projects)); + this.githubIssueFiler.fileAGitHubIssue(user, repo, version, issueTitle(), guidesIssueText(projects)); } @Override public void fileIssueInStartSpringIo(Projects projects, ProjectVersion version) { String user = "spring-io"; String repo = "start.spring.io"; - this.githubIssueFiler.fileAGitHubIssue(user, repo, version, issueTitle(), - startSpringIoIssueText(projects)); + this.githubIssueFiler.fileAGitHubIssue(user, repo, version, issueTitle(), startSpringIoIssueText(projects)); } private String issueTitle() { @@ -72,21 +70,18 @@ class SpringCloudGithubIssues implements CustomGithubIssues { } private String startSpringIoIssueText(Projects projects) { - String springBootVersion = projects.containsProject("spring-boot") - ? projects.forName("spring-boot").version : ""; - return "Release train [" - + this.properties.getMetaRelease().getReleaseTrainProjectName() - + "] in version [" + parsedVersion() - + "] released with the Spring Boot version [`" + springBootVersion + "`]"; + String springBootVersion = projects.containsProject("spring-boot") ? projects.forName("spring-boot").version + : ""; + return "Release train [" + this.properties.getMetaRelease().getReleaseTrainProjectName() + "] in version [" + + parsedVersion() + "] released with the Spring Boot version [`" + springBootVersion + "`]"; } private String guidesIssueText(Projects projects) { StringBuilder builder = new StringBuilder().append("Release train [") - .append(this.properties.getMetaRelease().getReleaseTrainProjectName()) - .append("] in version [").append(parsedVersion()) - .append("] released with the following projects:").append("\n\n"); - projects.forEach(project -> builder.append(project.projectName).append(" : ") - .append("`").append(project.version).append("`").append("\n")); + .append(this.properties.getMetaRelease().getReleaseTrainProjectName()).append("] in version [") + .append(parsedVersion()).append("] released with the following projects:").append("\n\n"); + projects.forEach(project -> builder.append(project.projectName).append(" : ").append("`") + .append(project.version).append("`").append("\n")); return builder.toString(); } diff --git a/projects/spring-cloud/src/test/java/releaser/ReleaserApplicationTests.java b/projects/spring-cloud/src/test/java/releaser/ReleaserApplicationTests.java index 21e3527a..c3dd22bc 100644 --- a/projects/spring-cloud/src/test/java/releaser/ReleaserApplicationTests.java +++ b/projects/spring-cloud/src/test/java/releaser/ReleaserApplicationTests.java @@ -27,8 +27,7 @@ import org.springframework.boot.test.context.SpringBootTest; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -@SpringBootTest( - classes = { ReleaserApplicationTests.Config.class, ReleaserApplication.class }, +@SpringBootTest(classes = { ReleaserApplicationTests.Config.class, ReleaserApplication.class }, properties = { "releaser.sagan.update-sagan=false" }) class ReleaserApplicationTests { diff --git a/projects/spring-cloud/src/test/java/releaser/cloud/SpringCloudReleaserProperties.java b/projects/spring-cloud/src/test/java/releaser/cloud/SpringCloudReleaserProperties.java index a950b984..97db06dc 100644 --- a/projects/spring-cloud/src/test/java/releaser/cloud/SpringCloudReleaserProperties.java +++ b/projects/spring-cloud/src/test/java/releaser/cloud/SpringCloudReleaserProperties.java @@ -32,17 +32,13 @@ public class SpringCloudReleaserProperties { public static ReleaserProperties get() { try { - File releaserConfig = new File(SpringCloudReleaserProperties.class - .getResource("/application.yml").toURI()); + File releaserConfig = new File(SpringCloudReleaserProperties.class.getResource("/application.yml").toURI()); YamlPropertiesFactoryBean yamlProcessor = new YamlPropertiesFactoryBean(); yamlProcessor.setResources(new FileSystemResource(releaserConfig)); Properties properties = yamlProcessor.getObject(); - ReleaserProperties releaserProperties = new Binder( - new MapConfigurationPropertySource(properties.entrySet().stream() - .collect(Collectors.toMap(e -> e.getKey().toString(), - e -> e.getValue().toString())))) - .bind("releaser", ReleaserProperties.class) - .get(); + ReleaserProperties releaserProperties = new Binder(new MapConfigurationPropertySource(properties.entrySet() + .stream().collect(Collectors.toMap(e -> e.getKey().toString(), e -> e.getValue().toString())))) + .bind("releaser", ReleaserProperties.class).get(); return releaserProperties; } catch (URISyntaxException e) { diff --git a/projects/spring-cloud/src/test/java/releaser/cloud/buildsystem/SpringCloudCustomMavenBomTests.java b/projects/spring-cloud/src/test/java/releaser/cloud/buildsystem/SpringCloudCustomMavenBomTests.java index be2711da..607e9510 100644 --- a/projects/spring-cloud/src/test/java/releaser/cloud/buildsystem/SpringCloudCustomMavenBomTests.java +++ b/projects/spring-cloud/src/test/java/releaser/cloud/buildsystem/SpringCloudCustomMavenBomTests.java @@ -37,80 +37,59 @@ public class SpringCloudCustomMavenBomTests { @Test public void should_add_boot_to_versions_when_version_is_created() { - List bomParsers = Collections - .singletonList(new SpringCloudMavenBomParser()); + List bomParsers = Collections.singletonList(new SpringCloudMavenBomParser()); VersionsFromBom customVersionsFromBom = new VersionsFromBomBuilder() - .releaserProperties(SpringCloudReleaserProperties.get()) - .parsers(bomParsers).projects(springCloudBuildProjects()) - .retrieveFromBom(); + .releaserProperties(SpringCloudReleaserProperties.get()).parsers(bomParsers) + .projects(springCloudBuildProjects()).retrieveFromBom(); customVersionsFromBom.setVersion("spring-boot", "1.2.3.RELEASE"); - then(customVersionsFromBom.versionForProject("spring-boot")) - .isEqualTo("1.2.3.RELEASE"); - then(customVersionsFromBom.versionForProject("spring-boot-starter-parent")) - .isEqualTo("1.2.3.RELEASE"); - then(customVersionsFromBom.versionForProject("spring-boot-dependencies")) - .isEqualTo("1.2.3.RELEASE"); + then(customVersionsFromBom.versionForProject("spring-boot")).isEqualTo("1.2.3.RELEASE"); + then(customVersionsFromBom.versionForProject("spring-boot-starter-parent")).isEqualTo("1.2.3.RELEASE"); + then(customVersionsFromBom.versionForProject("spring-boot-dependencies")).isEqualTo("1.2.3.RELEASE"); } @Test public void should_update_projects_for_boot() { - VersionsFromBom versionsFromBom = mixedVersions().setVersion("spring-boot", - "3.0.0"); + VersionsFromBom versionsFromBom = mixedVersions().setVersion("spring-boot", "3.0.0"); then(versionsFromBom.versionForProject("spring-boot")).isEqualTo("3.0.0"); - then(versionsFromBom.versionForProject("spring-boot-starter-parent")) - .isEqualTo("3.0.0"); - then(versionsFromBom.versionForProject("spring-boot-dependencies")) - .isEqualTo("3.0.0"); + then(versionsFromBom.versionForProject("spring-boot-starter-parent")).isEqualTo("3.0.0"); + then(versionsFromBom.versionForProject("spring-boot-dependencies")).isEqualTo("3.0.0"); - versionsFromBom = mixedVersions().setVersion("spring-boot-starter-parent", - "3.0.0"); + versionsFromBom = mixedVersions().setVersion("spring-boot-starter-parent", "3.0.0"); then(versionsFromBom.versionForProject("spring-boot")).isEqualTo("3.0.0"); - then(versionsFromBom.versionForProject("spring-boot-starter-parent")) - .isEqualTo("3.0.0"); - then(versionsFromBom.versionForProject("spring-boot-dependencies")) - .isEqualTo("3.0.0"); + then(versionsFromBom.versionForProject("spring-boot-starter-parent")).isEqualTo("3.0.0"); + then(versionsFromBom.versionForProject("spring-boot-dependencies")).isEqualTo("3.0.0"); versionsFromBom = mixedVersions().setVersion("spring-boot-dependencies", "3.0.0"); then(versionsFromBom.versionForProject("spring-boot")).isEqualTo("3.0.0"); - then(versionsFromBom.versionForProject("spring-boot-starter-parent")) - .isEqualTo("3.0.0"); - then(versionsFromBom.versionForProject("spring-boot-dependencies")) - .isEqualTo("3.0.0"); + then(versionsFromBom.versionForProject("spring-boot-starter-parent")).isEqualTo("3.0.0"); + then(versionsFromBom.versionForProject("spring-boot-dependencies")).isEqualTo("3.0.0"); } @Test public void should_update_projects_for_build() { - VersionsFromBom versionsFromBom = mixedVersions().setVersion("spring-cloud-build", - "3.0.0"); + VersionsFromBom versionsFromBom = mixedVersions().setVersion("spring-cloud-build", "3.0.0"); then(versionsFromBom.versionForProject("spring-cloud-build")).isEqualTo("3.0.0"); versionsFromBom = mixedVersions().setVersion("spring-cloud-build", "3.0.0"); - then(versionsFromBom.versionForProject("spring-cloud-dependencies-parent")) - .isEqualTo("3.0.0"); - then(versionsFromBom.versionForProject("spring-cloud-dependencies")) - .isEqualTo("Greenwich.RELEASE"); + then(versionsFromBom.versionForProject("spring-cloud-dependencies-parent")).isEqualTo("3.0.0"); + then(versionsFromBom.versionForProject("spring-cloud-dependencies")).isEqualTo("Greenwich.RELEASE"); - versionsFromBom = mixedVersions().setVersion("spring-cloud-dependencies-parent", - "3.0.0"); + versionsFromBom = mixedVersions().setVersion("spring-cloud-dependencies-parent", "3.0.0"); then(versionsFromBom.versionForProject("spring-cloud-build")).isEqualTo("3.0.0"); - then(versionsFromBom.versionForProject("spring-cloud-dependencies-parent")) - .isEqualTo("3.0.0"); - then(versionsFromBom.versionForProject("spring-cloud-dependencies")) - .isEqualTo("Greenwich.RELEASE"); + then(versionsFromBom.versionForProject("spring-cloud-dependencies-parent")).isEqualTo("3.0.0"); + then(versionsFromBom.versionForProject("spring-cloud-dependencies")).isEqualTo("Greenwich.RELEASE"); } private VersionsFromBom mixedVersions() { - return new VersionsFromBomBuilder() - .releaserProperties(SpringCloudReleaserProperties.get()) - .parsers(Collections.singletonList(new SpringCloudMavenBomParser())) - .projects(mixedProjects()).merged(); + return new VersionsFromBomBuilder().releaserProperties(SpringCloudReleaserProperties.get()) + .parsers(Collections.singletonList(new SpringCloudMavenBomParser())).projects(mixedProjects()).merged(); } Set springCloudBuildProjects() { diff --git a/projects/spring-cloud/src/test/java/releaser/cloud/buildsystem/SpringCloudMavenBomParserTests.java b/projects/spring-cloud/src/test/java/releaser/cloud/buildsystem/SpringCloudMavenBomParserTests.java index 17311f6b..0b8b9316 100644 --- a/projects/spring-cloud/src/test/java/releaser/cloud/buildsystem/SpringCloudMavenBomParserTests.java +++ b/projects/spring-cloud/src/test/java/releaser/cloud/buildsystem/SpringCloudMavenBomParserTests.java @@ -57,31 +57,26 @@ public class SpringCloudMavenBomParserTests { this.tmpFolder = this.tmp.newFolder(); TestUtils.prepareLocalRepo(); FileSystemUtils.copyRecursively(file("/projects"), this.tmpFolder); - this.springCloudReleaseProject = new File(this.tmpFolder, - "/spring-cloud-release"); + this.springCloudReleaseProject = new File(this.tmpFolder, "/spring-cloud-release"); } private File file(String relativePath) throws URISyntaxException { - return new File( - SpringCloudMavenBomParserTests.class.getResource(relativePath).toURI()); + return new File(SpringCloudMavenBomParserTests.class.getResource(relativePath).toURI()); } @Test public void should_throw_exception_when_null_is_passed_to_boot() { this.properties.getPom().setPomWithBootStarterParent(null); this.properties.getPom().setThisTrainBom(null); - BomParser parser = MavenBomParserAccessor.bomParser(this.properties, - new SpringCloudMavenBomParser()); + BomParser parser = MavenBomParserAccessor.bomParser(this.properties, new SpringCloudMavenBomParser()); thenThrownBy(() -> parser.versionsFromBom(this.springCloudReleaseProject)) - .isInstanceOf(IllegalStateException.class) - .hasMessageContaining("Pom is not present"); + .isInstanceOf(IllegalStateException.class).hasMessageContaining("Pom is not present"); } @Test public void should_populate_sc_release_version() { - BomParser parser = MavenBomParserAccessor.bomParser(this.properties, - new SpringCloudMavenBomParser()); + BomParser parser = MavenBomParserAccessor.bomParser(this.properties, new SpringCloudMavenBomParser()); String scReleaseVersion = parser.versionsFromBom(this.springCloudReleaseProject) .versionForProject("spring-cloud-release"); @@ -91,22 +86,18 @@ public class SpringCloudMavenBomParserTests { @Test public void should_populate_boot_version() { - BomParser parser = MavenBomParserAccessor.bomParser(this.properties, - new SpringCloudMavenBomParser()); + BomParser parser = MavenBomParserAccessor.bomParser(this.properties, new SpringCloudMavenBomParser()); - String bootVersion = parser.versionsFromBom(this.springCloudReleaseProject) - .versionForProject("spring-boot"); + String bootVersion = parser.versionsFromBom(this.springCloudReleaseProject).versionForProject("spring-boot"); then(bootVersion).isNotBlank(); } @Test public void should_throw_exception_when_cloud_pom_is_missing() { - BomParser parser = MavenBomParserAccessor.bomParser(this.properties, - new SpringCloudMavenBomParser()); + BomParser parser = MavenBomParserAccessor.bomParser(this.properties, new SpringCloudMavenBomParser()); - thenThrownBy(() -> parser.versionsFromBom(new File("."))) - .isInstanceOf(IllegalStateException.class) + thenThrownBy(() -> parser.versionsFromBom(new File("."))).isInstanceOf(IllegalStateException.class) .hasMessageContaining("Pom is not present"); } @@ -114,54 +105,44 @@ public class SpringCloudMavenBomParserTests { public void should_throw_exception_when_null_is_passed_to_cloud() { this.properties.getPom().setPomWithBootStarterParent(null); this.properties.getPom().setThisTrainBom(null); - BomParser parser = MavenBomParserAccessor.bomParser(this.properties, - new SpringCloudMavenBomParser()); + BomParser parser = MavenBomParserAccessor.bomParser(this.properties, new SpringCloudMavenBomParser()); thenThrownBy(() -> parser.versionsFromBom(this.springCloudReleaseProject)) - .isInstanceOf(IllegalStateException.class) - .hasMessageContaining("Pom is not present"); + .isInstanceOf(IllegalStateException.class).hasMessageContaining("Pom is not present"); } @Test public void should_throw_exception_when_cloud_version_is_missing_in_pom() { this.properties.getPom().setPomWithBootStarterParent("pom.xml"); this.properties.getPom().setThisTrainBom("pom.xml"); - BomParser parser = MavenBomParserAccessor.bomParser(this.properties, - new SpringCloudMavenBomParser()); + BomParser parser = MavenBomParserAccessor.bomParser(this.properties, new SpringCloudMavenBomParser()); thenThrownBy(() -> parser.versionsFromBom(this.springCloudReleaseProject)) - .isInstanceOf(IllegalStateException.class).hasMessageContaining( - "The pom doesn't have a [spring-cloud-dependencies-parent] artifact id"); + .isInstanceOf(IllegalStateException.class) + .hasMessageContaining("The pom doesn't have a [spring-cloud-dependencies-parent] artifact id"); } @Test public void should_populate_cloud_version() { - BomParser parser = MavenBomParserAccessor.bomParser(this.properties, - new SpringCloudMavenBomParser()); + BomParser parser = MavenBomParserAccessor.bomParser(this.properties, new SpringCloudMavenBomParser()); - VersionsFromBom cloudVersionsFromBom = parser - .versionsFromBom(this.springCloudReleaseProject); + VersionsFromBom cloudVersionsFromBom = parser.versionsFromBom(this.springCloudReleaseProject); thenAllCloudVersionsSet(cloudVersionsFromBom); } private void thenAllCloudVersionsSet(VersionsFromBom cloudVersionsFromBom) { - Arrays.asList("spring-cloud-bus", "spring-cloud-contract", - "spring-cloud-cloudfoundry", "spring-cloud-commons", - "spring-cloud-config", "spring-cloud-netflix", "spring-cloud-security", - "spring-cloud-consul", "spring-cloud-sleuth", "spring-cloud-stream", - "spring-cloud-task", "spring-cloud-vault", "spring-cloud-zookeeper") - .forEach(s -> then(cloudVersionsFromBom.versionForProject(s)) - .isNotBlank()); + Arrays.asList("spring-cloud-bus", "spring-cloud-contract", "spring-cloud-cloudfoundry", "spring-cloud-commons", + "spring-cloud-config", "spring-cloud-netflix", "spring-cloud-security", "spring-cloud-consul", + "spring-cloud-sleuth", "spring-cloud-stream", "spring-cloud-task", "spring-cloud-vault", + "spring-cloud-zookeeper").forEach(s -> then(cloudVersionsFromBom.versionForProject(s)).isNotBlank()); } @Test public void should_populate_boot_and_cloud_version() { - BomParser parser = MavenBomParserAccessor.bomParser(this.properties, - new SpringCloudMavenBomParser()); + BomParser parser = MavenBomParserAccessor.bomParser(this.properties, new SpringCloudMavenBomParser()); - VersionsFromBom cloudVersionsFromBom = parser - .versionsFromBom(this.springCloudReleaseProject); + VersionsFromBom cloudVersionsFromBom = parser.versionsFromBom(this.springCloudReleaseProject); then(cloudVersionsFromBom.versionForProject("spring-boot")).isNotBlank(); then(cloudVersionsFromBom.versionForProject("spring-cloud-build")).isNotBlank(); diff --git a/projects/spring-cloud/src/test/java/releaser/cloud/buildsystem/SpringCloudProjectPomUpdaterTests.java b/projects/spring-cloud/src/test/java/releaser/cloud/buildsystem/SpringCloudProjectPomUpdaterTests.java index 77d2cc2e..c2f9acb3 100644 --- a/projects/spring-cloud/src/test/java/releaser/cloud/buildsystem/SpringCloudProjectPomUpdaterTests.java +++ b/projects/spring-cloud/src/test/java/releaser/cloud/buildsystem/SpringCloudProjectPomUpdaterTests.java @@ -36,41 +36,31 @@ public class SpringCloudProjectPomUpdaterTests { public void should_convert_fixed_versions_to_updated_fixed_versions() { ReleaserProperties properties = SpringCloudReleaserProperties.get(); properties.getFixedVersions().put("spring-cloud-task", "2.0.0.RELEASE"); - properties.getFixedVersions().put("spring-cloud-openfeign", - "2.0.1.BUILD-SNAPSHOT"); + properties.getFixedVersions().put("spring-cloud-openfeign", "2.0.1.BUILD-SNAPSHOT"); properties.getFixedVersions().put("spring-cloud-consul", "2.0.1.BUILD-SNAPSHOT"); - properties.getFixedVersions().put("spring-cloud-zookeeper", - "2.0.1.BUILD-SNAPSHOT"); + properties.getFixedVersions().put("spring-cloud-zookeeper", "2.0.1.BUILD-SNAPSHOT"); properties.getFixedVersions().put("spring-cloud-stream", "Elmhurst.RELEASE"); properties.getFixedVersions().put("spring-cloud-config", "2.0.1.BUILD-SNAPSHOT"); - properties.getFixedVersions().put("spring-cloud-cloudfoundry", - "2.0.1.BUILD-SNAPSHOT"); + properties.getFixedVersions().put("spring-cloud-cloudfoundry", "2.0.1.BUILD-SNAPSHOT"); properties.getFixedVersions().put("spring-cloud-netflix", "2.0.1.BUILD-SNAPSHOT"); properties.getFixedVersions().put("spring-cloud-vault", "2.0.1.BUILD-SNAPSHOT"); - properties.getFixedVersions().put("spring-cloud-security", - "2.0.1.BUILD-SNAPSHOT"); + properties.getFixedVersions().put("spring-cloud-security", "2.0.1.BUILD-SNAPSHOT"); properties.getFixedVersions().put("spring-cloud-commons", "2.0.1.BUILD-SNAPSHOT"); properties.getFixedVersions().put("spring-cloud-sleuth", "2.0.1.BUILD-SNAPSHOT"); properties.getFixedVersions().put("spring-cloud-aws", "2.0.1.BUILD-SNAPSHOT"); - properties.getFixedVersions().put("spring-cloud-contract", - "2.0.1.BUILD-SNAPSHOT"); - properties.getFixedVersions().put("spring-cloud-release", - "Finchley.BUILD-SNAPSHOT"); + properties.getFixedVersions().put("spring-cloud-contract", "2.0.1.BUILD-SNAPSHOT"); + properties.getFixedVersions().put("spring-cloud-release", "Finchley.BUILD-SNAPSHOT"); properties.getFixedVersions().put("spring-cloud-build", "2.0.3.BUILD-SNAPSHOT"); properties.getFixedVersions().put("spring-cloud-bus", "2.0.1.BUILD-SNAPSHOT"); - properties.getFixedVersions().put("spring-cloud-function", - "1.0.0.BUILD-SNAPSHOT"); - properties.getFixedVersions().put("spring-cloud-starter-build", - "Finchley.BUILD-SNAPSHOT"); + properties.getFixedVersions().put("spring-cloud-function", "1.0.0.BUILD-SNAPSHOT"); + properties.getFixedVersions().put("spring-cloud-starter-build", "Finchley.BUILD-SNAPSHOT"); properties.getFixedVersions().put("spring-boot", "2.0.3.RELEASE"); properties.getFixedVersions().put("spring-cloud-gateway", "2.0.1.BUILD-SNAPSHOT"); - ProjectPomUpdater updater = new ProjectPomUpdater(properties, - Collections.singletonList(MavenBomParserAccessor.bomParser(properties, - new SpringCloudMavenBomParser()))); + ProjectPomUpdater updater = new ProjectPomUpdater(properties, Collections + .singletonList(MavenBomParserAccessor.bomParser(properties, new SpringCloudMavenBomParser()))); - Map fixedVersions = updater.fixedVersions().stream() - .collect(Collectors.toMap(projectVersion -> projectVersion.projectName, - projectVersion -> projectVersion.version)); + Map fixedVersions = updater.fixedVersions().stream().collect(Collectors + .toMap(projectVersion -> projectVersion.projectName, projectVersion -> projectVersion.version)); BDDAssertions.then(fixedVersions).containsEntry("spring-boot", "2.0.3.RELEASE") .containsEntry("spring-boot-dependencies", "2.0.3.RELEASE") diff --git a/projects/spring-cloud/src/test/java/releaser/cloud/docs/SpringCloudCustomProjectDocumentationUpdaterTests.java b/projects/spring-cloud/src/test/java/releaser/cloud/docs/SpringCloudCustomProjectDocumentationUpdaterTests.java index 1da8166c..0bad9e18 100644 --- a/projects/spring-cloud/src/test/java/releaser/cloud/docs/SpringCloudCustomProjectDocumentationUpdaterTests.java +++ b/projects/spring-cloud/src/test/java/releaser/cloud/docs/SpringCloudCustomProjectDocumentationUpdaterTests.java @@ -70,23 +70,17 @@ public class SpringCloudCustomProjectDocumentationUpdaterTests { .getResource("/projects/spring-cloud-static").toURI()); TestUtils.prepareLocalRepo(); FileSystemUtils.copyRecursively(file("/projects"), this.tmpFolder); - this.properties.getGit().setDocumentationUrl( - file("/projects/spring-cloud-static/").toURI().toString()); + this.properties.getGit().setDocumentationUrl(file("/projects/spring-cloud-static/").toURI().toString()); this.handler = new ProjectGitHandler(this.properties); this.clonedDocProject = this.handler.cloneDocumentationProject(); this.gitHubHandler = new ProjectGitHubHandler(this.properties, - Collections.singletonList( - SpringCloudGithubIssuesAccessor.springCloud(this.properties))); + Collections.singletonList(SpringCloudGithubIssuesAccessor.springCloud(this.properties))); } @NotNull - private DocumentationUpdater projectDocumentationUpdater( - ReleaserProperties properties) { - return new DocumentationUpdater(this.handler, properties, - templateGenerator(properties), - Collections.singletonList( - new SpringCloudCustomProjectDocumentationUpdater(this.handler, - properties))); + private DocumentationUpdater projectDocumentationUpdater(ReleaserProperties properties) { + return new DocumentationUpdater(this.handler, properties, templateGenerator(properties), + Collections.singletonList(new SpringCloudCustomProjectDocumentationUpdater(this.handler, properties))); } @NotNull @@ -97,56 +91,43 @@ public class SpringCloudCustomProjectDocumentationUpdaterTests { @Test public void should_not_update_current_version_in_the_docs_if_current_release_starts_with_v_and_then_lower_letter_than_the_stored_release() throws URISyntaxException, IOException { - ProjectVersion releaseTrainVersion = new ProjectVersion("spring-cloud-release", - "Finchley.SR33"); + ProjectVersion releaseTrainVersion = new ProjectVersion("spring-cloud-release", "Finchley.SR33"); ReleaserProperties properties = new ReleaserProperties(); - properties.getGit().setDocumentationUrl( - file("/projects/spring-cloud-static/").toURI().toString()); + properties.getGit().setDocumentationUrl(file("/projects/spring-cloud-static/").toURI().toString()); - File updatedDocs = new SpringCloudCustomProjectDocumentationUpdater( - new ProjectGitHandler(properties), properties) - .updateDocsRepoForReleaseTrain(this.clonedDocProject, - releaseTrainVersion, projects(), "vFinchley.SR33"); + File updatedDocs = new SpringCloudCustomProjectDocumentationUpdater(new ProjectGitHandler(properties), + properties).updateDocsRepoForReleaseTrain(this.clonedDocProject, releaseTrainVersion, projects(), + "vFinchley.SR33"); - BDDAssertions.then(new File(updatedDocs, "current/index.html").toPath()) - .doesNotExist(); + BDDAssertions.then(new File(updatedDocs, "current/index.html").toPath()).doesNotExist(); Path current = new File(updatedDocs, "current/").toPath(); BDDAssertions.then(current).isSymbolicLink(); - BDDAssertions.then(Files.readSymbolicLink(current).toString()) - .isEqualTo("Finchley.SR33"); + BDDAssertions.then(Files.readSymbolicLink(current).toString()).isEqualTo("Finchley.SR33"); releaseTrainVersion = new ProjectVersion("spring-cloud-release", "Angel.SR33"); properties = new ReleaserProperties(); - properties.getGit().setDocumentationUrl( - file("/projects/spring-cloud-static/").toURI().toString()); + properties.getGit().setDocumentationUrl(file("/projects/spring-cloud-static/").toURI().toString()); - updatedDocs = new SpringCloudCustomProjectDocumentationUpdater( - new ProjectGitHandler(properties), properties) - .updateDocsRepoForReleaseTrain(this.clonedDocProject, - releaseTrainVersion, projects(), "vAngel.SR33"); + updatedDocs = new SpringCloudCustomProjectDocumentationUpdater(new ProjectGitHandler(properties), properties) + .updateDocsRepoForReleaseTrain(this.clonedDocProject, releaseTrainVersion, projects(), "vAngel.SR33"); - BDDAssertions.then(new File(updatedDocs, "current/index.html").toPath()) - .doesNotExist(); + BDDAssertions.then(new File(updatedDocs, "current/index.html").toPath()).doesNotExist(); current = new File(updatedDocs, "current/").toPath(); BDDAssertions.then(current).isSymbolicLink(); - BDDAssertions.then(Files.readSymbolicLink(current).toString()) - .isNotEqualTo("Angel.SR33"); + BDDAssertions.then(Files.readSymbolicLink(current).toString()).isNotEqualTo("Angel.SR33"); } @Test public void should_not_commit_if_the_same_version_is_already_there() { - ProjectVersion releaseTrainVersion = new ProjectVersion("spring-cloud-release", - "Dalston.SR3"); + ProjectVersion releaseTrainVersion = new ProjectVersion("spring-cloud-release", "Dalston.SR3"); ReleaserProperties properties = new ReleaserProperties(); properties.getGit().setDocumentationUrl(this.clonedDocProject.toURI().toString()); ProjectGitHandler handler = BDDMockito.spy(new ProjectGitHandler(properties)); new SpringCloudCustomProjectDocumentationUpdater(handler, properties) - .updateDocsRepoForReleaseTrain(this.clonedDocProject, releaseTrainVersion, - projects(), "vDalston.SR3"); + .updateDocsRepoForReleaseTrain(this.clonedDocProject, releaseTrainVersion, projects(), "vDalston.SR3"); - BDDMockito.then(handler).should(BDDMockito.never()) - .commit(BDDMockito.any(File.class), BDDMockito.anyString()); + BDDMockito.then(handler).should(BDDMockito.never()).commit(BDDMockito.any(File.class), BDDMockito.anyString()); } @Test @@ -157,11 +138,9 @@ public class SpringCloudCustomProjectDocumentationUpdaterTests { ProjectGitHandler handler = BDDMockito.spy(new ProjectGitHandler(properties)); new SpringCloudCustomProjectDocumentationUpdater(handler, properties) - .updateDocsRepoForReleaseTrain(this.clonedDocProject, springBootVersion, - bootProject(), "vDalston.SR3"); + .updateDocsRepoForReleaseTrain(this.clonedDocProject, springBootVersion, bootProject(), "vDalston.SR3"); - BDDMockito.then(handler).should(BDDMockito.never()) - .commit(BDDMockito.any(File.class), BDDMockito.anyString()); + BDDMockito.then(handler).should(BDDMockito.never()).commit(BDDMockito.any(File.class), BDDMockito.anyString()); } @Test @@ -172,37 +151,30 @@ public class SpringCloudCustomProjectDocumentationUpdaterTests { ProjectGitHandler handler = BDDMockito.spy(new ProjectGitHandler(properties)); new SpringCloudCustomProjectDocumentationUpdater(handler, properties) - .updateDocsRepoForSingleProject(this.clonedDocProject, springBootVersion, - bootProject()); + .updateDocsRepoForSingleProject(this.clonedDocProject, springBootVersion, bootProject()); - BDDMockito.then(handler).should(BDDMockito.never()) - .commit(BDDMockito.any(File.class), BDDMockito.anyString()); + BDDMockito.then(handler).should(BDDMockito.never()).commit(BDDMockito.any(File.class), BDDMockito.anyString()); } @Test public void should_not_update_current_version_in_the_docs_if_current_release_starts_with_lower_letter_than_the_stored_release() throws IOException { - ProjectVersion releaseTrainVersion = new ProjectVersion("spring-cloud-release", - "Angel.SR33"); + ProjectVersion releaseTrainVersion = new ProjectVersion("spring-cloud-release", "Angel.SR33"); ReleaserProperties properties = new ReleaserProperties(); properties.getGit().setDocumentationUrl(this.clonedDocProject.toURI().toString()); - File updatedDocs = new SpringCloudCustomProjectDocumentationUpdater( - new ProjectGitHandler(properties), properties) - .updateDocsRepoForReleaseTrain(this.clonedDocProject, - releaseTrainVersion, projects(), "Angel.SR33"); + File updatedDocs = new SpringCloudCustomProjectDocumentationUpdater(new ProjectGitHandler(properties), + properties).updateDocsRepoForReleaseTrain(this.clonedDocProject, releaseTrainVersion, projects(), + "Angel.SR33"); - BDDAssertions.then(new File(updatedDocs, "current/index.html").toPath()) - .doesNotExist(); + BDDAssertions.then(new File(updatedDocs, "current/index.html").toPath()).doesNotExist(); Path current = new File(updatedDocs, "current/").toPath(); BDDAssertions.then(current).isSymbolicLink(); - BDDAssertions.then(Files.readSymbolicLink(current).toString()) - .isNotEqualTo("Angel.SR33"); + BDDAssertions.then(Files.readSymbolicLink(current).toString()).isNotEqualTo("Angel.SR33"); } private File file(String relativePath) throws URISyntaxException { - return new File(SpringCloudCustomProjectDocumentationUpdater.class - .getResource(relativePath).toURI()); + return new File(SpringCloudCustomProjectDocumentationUpdater.class.getResource(relativePath).toURI()); } private Projects projects() { diff --git a/projects/spring-cloud/src/test/java/releaser/cloud/docs/TestUtils.java b/projects/spring-cloud/src/test/java/releaser/cloud/docs/TestUtils.java index c7427e57..10a25694 100644 --- a/projects/spring-cloud/src/test/java/releaser/cloud/docs/TestUtils.java +++ b/projects/spring-cloud/src/test/java/releaser/cloud/docs/TestUtils.java @@ -36,8 +36,7 @@ public final class TestUtils { prepareLocalRepo("target/test-classes/projects/", "spring-cloud-static"); } - private static void prepareLocalRepo(String buildDir, String repoPath) - throws IOException { + private static void prepareLocalRepo(String buildDir, String repoPath) throws IOException { File dotGit = new File(buildDir + repoPath + "/.git"); File git = new File(buildDir + repoPath + "/git"); if (git.exists()) { diff --git a/projects/spring-cloud/src/test/java/releaser/cloud/github/SpringCloudGithubIssuesAccessor.java b/projects/spring-cloud/src/test/java/releaser/cloud/github/SpringCloudGithubIssuesAccessor.java index 6690e67b..d8e9c03c 100644 --- a/projects/spring-cloud/src/test/java/releaser/cloud/github/SpringCloudGithubIssuesAccessor.java +++ b/projects/spring-cloud/src/test/java/releaser/cloud/github/SpringCloudGithubIssuesAccessor.java @@ -22,8 +22,7 @@ import releaser.internal.github.CustomGithubIssues; public class SpringCloudGithubIssuesAccessor { - public static CustomGithubIssues springCloud(Github github, - ReleaserProperties releaserProperties) { + public static CustomGithubIssues springCloud(Github github, ReleaserProperties releaserProperties) { return new SpringCloudGithubIssues(github, releaserProperties); } diff --git a/projects/spring-cloud/src/test/java/releaser/cloud/github/SpringCloudGithubIssuesTests.java b/projects/spring-cloud/src/test/java/releaser/cloud/github/SpringCloudGithubIssuesTests.java index 298fb5c4..2fa374a6 100644 --- a/projects/spring-cloud/src/test/java/releaser/cloud/github/SpringCloudGithubIssuesTests.java +++ b/projects/spring-cloud/src/test/java/releaser/cloud/github/SpringCloudGithubIssuesTests.java @@ -74,12 +74,10 @@ public class SpringCloudGithubIssuesTests { Github github = BDDMockito.mock(Github.class); CustomGithubIssues githubIssues = new SpringCloudGithubIssues(github, properties); - githubIssues - .fileIssueInSpringGuides( - new Projects(new ProjectVersion("foo", "1.0.0.BUILD-SNAPSHOT"), - new ProjectVersion("spring-cloud-build", - "2.0.0.BUILD-SNAPSHOT")), - new ProjectVersion("sc-release", "Edgware.BUILD-SNAPSHOT")); + githubIssues.fileIssueInSpringGuides( + new Projects(new ProjectVersion("foo", "1.0.0.BUILD-SNAPSHOT"), + new ProjectVersion("spring-cloud-build", "2.0.0.BUILD-SNAPSHOT")), + new ProjectVersion("sc-release", "Edgware.BUILD-SNAPSHOT")); BDDMockito.then(github).shouldHaveNoInteractions(); } @@ -92,20 +90,18 @@ public class SpringCloudGithubIssuesTests { issues.fileIssueInSpringGuides( new Projects(new ProjectVersion("spring-cloud-foo", "1.0.0.RELEASE"), new ProjectVersion("spring-cloud-build", "2.0.0.RELEASE"), - new ProjectVersion("bar", "2.0.0.RELEASE"), - new ProjectVersion("baz", "3.0.0.RELEASE")), + new ProjectVersion("bar", "2.0.0.RELEASE"), new ProjectVersion("baz", "3.0.0.RELEASE")), new ProjectVersion("sc-release", "Edgware.RELEASE")); - Issue issue = this.github.repos() - .get(new Coordinates.Simple("spring-guides", "getting-started-guides")) + Issue issue = this.github.repos().get(new Coordinates.Simple("spring-guides", "getting-started-guides")) .issues().get(1); then(issue.exists()).isTrue(); Issue.Smart smartIssue = new Issue.Smart(issue); then(smartIssue.title()).isEqualTo("Upgrade to Spring Cloud Edgware.RELEASE"); then(smartIssue.body()).contains( "Release train [spring-cloud-release] in version [Edgware.RELEASE] released with the following projects") - .contains("spring-cloud-foo : `1.0.0.RELEASE`") - .contains("bar : `2.0.0.RELEASE`").contains("baz : `3.0.0.RELEASE`"); + .contains("spring-cloud-foo : `1.0.0.RELEASE`").contains("bar : `2.0.0.RELEASE`") + .contains("baz : `3.0.0.RELEASE`"); } @Test @@ -114,16 +110,13 @@ public class SpringCloudGithubIssuesTests { CustomGithubIssues issues = new SpringCloudGithubIssues(github, properties); thenThrownBy(() -> issues.fileIssueInSpringGuides( - new Projects(Collections.singletonList( - new ProjectVersion("spring-cloud-build", "2.0.0.RELEASE"))), - nonGaSleuthProject())).isInstanceOf(IllegalArgumentException.class) - .hasMessageContaining( - "You have to pass Github OAuth token for milestone closing to be operational"); + new Projects(Collections.singletonList(new ProjectVersion("spring-cloud-build", "2.0.0.RELEASE"))), + nonGaSleuthProject())).isInstanceOf(IllegalArgumentException.class).hasMessageContaining( + "You have to pass Github OAuth token for milestone closing to be operational"); } @Test - public void should_not_do_anything_for_non_release_train_version_when_updating_startspringio() - throws IOException { + public void should_not_do_anything_for_non_release_train_version_when_updating_startspringio() throws IOException { setupStartSpringIo(); Github github = BDDMockito.mock(Github.class); CustomGithubIssues issues = new SpringCloudGithubIssues(github, properties); @@ -137,23 +130,17 @@ public class SpringCloudGithubIssuesTests { } @Test - public void should_file_an_issue_for_release_version_when_updating_startspringio() - throws IOException { + public void should_file_an_issue_for_release_version_when_updating_startspringio() throws IOException { setupStartSpringIo(); CustomGithubIssues issues = new SpringCloudGithubIssues(github, properties); properties.getPom().setBranch("vEdgware.RELEASE"); - issues.fileIssueInStartSpringIo( - new Projects(new ProjectVersion("spring-cloud-foo", "1.0.0.RELEASE"), - new ProjectVersion("spring-cloud-build", "2.0.0.RELEASE"), - new ProjectVersion("bar", "2.0.0.RELEASE"), - new ProjectVersion("baz", "3.0.0.RELEASE"), - new ProjectVersion("spring-boot", "1.2.3.RELEASE")), + issues.fileIssueInStartSpringIo(new Projects(new ProjectVersion("spring-cloud-foo", "1.0.0.RELEASE"), + new ProjectVersion("spring-cloud-build", "2.0.0.RELEASE"), new ProjectVersion("bar", "2.0.0.RELEASE"), + new ProjectVersion("baz", "3.0.0.RELEASE"), new ProjectVersion("spring-boot", "1.2.3.RELEASE")), new ProjectVersion("sc-release", "Edgware.RELEASE")); - Issue issue = this.github.repos() - .get(new Coordinates.Simple("spring-io", "start.spring.io")).issues() - .get(1); + Issue issue = this.github.repos().get(new Coordinates.Simple("spring-io", "start.spring.io")).issues().get(1); then(issue.exists()).isTrue(); Issue.Smart smartIssue = new Issue.Smart(issue); then(smartIssue.title()).isEqualTo("Upgrade to Spring Cloud Edgware.RELEASE"); @@ -162,23 +149,19 @@ public class SpringCloudGithubIssuesTests { } @Test - public void should_throw_exception_when_no_token_was_passed_when_updating_startspringio() - throws IOException { + public void should_throw_exception_when_no_token_was_passed_when_updating_startspringio() throws IOException { setupStartSpringIo(); properties.getGit().setOauthToken(""); CustomGithubIssues issues = new SpringCloudGithubIssues(github, properties); thenThrownBy(() -> issues.fileIssueInStartSpringIo( - new Projects(Collections.singletonList( - new ProjectVersion("spring-cloud-build", "2.0.0.RELEASE"))), - nonGaSleuthProject())).isInstanceOf(IllegalArgumentException.class) - .hasMessageContaining( - "You have to pass Github OAuth token for milestone closing to be operational"); + new Projects(Collections.singletonList(new ProjectVersion("spring-cloud-build", "2.0.0.RELEASE"))), + nonGaSleuthProject())).isInstanceOf(IllegalArgumentException.class).hasMessageContaining( + "You have to pass Github OAuth token for milestone closing to be operational"); } private Repo createGettingStartedGuides(MkGithub github) throws IOException { - return github.repos() - .create(new Repos.RepoCreate("getting-started-guides", false)); + return github.repos().create(new Repos.RepoCreate("getting-started-guides", false)); } private Repo createStartSpringIo(MkGithub github) throws IOException { diff --git a/projects/spring-cloud/src/test/java/releaser/cloud/spring/AbstractSpringCloudAcceptanceTests.java b/projects/spring-cloud/src/test/java/releaser/cloud/spring/AbstractSpringCloudAcceptanceTests.java index aaf39b6b..5491a754 100644 --- a/projects/spring-cloud/src/test/java/releaser/cloud/spring/AbstractSpringCloudAcceptanceTests.java +++ b/projects/spring-cloud/src/test/java/releaser/cloud/spring/AbstractSpringCloudAcceptanceTests.java @@ -36,10 +36,10 @@ public class AbstractSpringCloudAcceptanceTests extends AbstractSpringAcceptance @BeforeEach public void setupCloud() throws Exception { this.temporaryFolder = this.tmp.newFolder(); - this.springCloudConsulProject = new File(AbstractSpringAcceptanceTests.class - .getResource("/projects/spring-cloud-consul").toURI()); - this.springCloudBuildProject = new File(AbstractSpringAcceptanceTests.class - .getResource("/projects/spring-cloud-build").toURI()); + this.springCloudConsulProject = new File( + AbstractSpringAcceptanceTests.class.getResource("/projects/spring-cloud-consul").toURI()); + this.springCloudBuildProject = new File( + AbstractSpringAcceptanceTests.class.getResource("/projects/spring-cloud-build").toURI()); TestUtils.prepareLocalRepo(); FileSystemUtils.copyRecursively(file("/projects/"), this.temporaryFolder); } @@ -51,12 +51,9 @@ public class AbstractSpringCloudAcceptanceTests extends AbstractSpringAcceptance public void thenAllDryRunStepsWereExecutedForEachProject( NonAssertingTestProjectGitHandler nonAssertingTestProjectGitHandler) { nonAssertingTestProjectGitHandler.clonedProjects.stream() - .filter(f -> !f.getName().contains("angel") - && !f.getName().equals("spring-cloud")) - .forEach(project -> { - then(Arrays.asList("spring-cloud-starter-build", - "spring-cloud-consul")) - .contains(pom(project).getArtifactId()); + .filter(f -> !f.getName().contains("angel") && !f.getName().equals("spring-cloud")).forEach(project -> { + then(Arrays.asList("spring-cloud-starter-build", "spring-cloud-consul")) + .contains(pom(project).getArtifactId()); then(new File("/tmp/executed_build")).exists(); then(new File("/tmp/executed_deploy")).doesNotExist(); then(new File("/tmp/executed_docs")).doesNotExist(); diff --git a/projects/spring-cloud/src/test/java/releaser/cloud/spring/meta/AbstractSpringCloudMetaAcceptanceTests.java b/projects/spring-cloud/src/test/java/releaser/cloud/spring/meta/AbstractSpringCloudMetaAcceptanceTests.java index 98d687bd..d8c2ee76 100644 --- a/projects/spring-cloud/src/test/java/releaser/cloud/spring/meta/AbstractSpringCloudMetaAcceptanceTests.java +++ b/projects/spring-cloud/src/test/java/releaser/cloud/spring/meta/AbstractSpringCloudMetaAcceptanceTests.java @@ -24,8 +24,7 @@ import releaser.internal.spring.meta.AbstractSpringMetaReleaseAcceptanceTests; import static org.assertj.core.api.BDDAssertions.then; -public class AbstractSpringCloudMetaAcceptanceTests - extends AbstractSpringMetaReleaseAcceptanceTests { +public class AbstractSpringCloudMetaAcceptanceTests extends AbstractSpringMetaReleaseAcceptanceTests { public File springCloudConsulProject; @@ -34,11 +33,9 @@ public class AbstractSpringCloudMetaAcceptanceTests @BeforeEach public void setupCloud() throws Exception { this.springCloudConsulProject = new File( - AbstractSpringCloudMetaAcceptanceTests.class - .getResource("/projects/spring-cloud-consul").toURI()); + AbstractSpringCloudMetaAcceptanceTests.class.getResource("/projects/spring-cloud-consul").toURI()); this.springCloudBuildProject = new File( - AbstractSpringCloudMetaAcceptanceTests.class - .getResource("/projects/spring-cloud-build").toURI()); + AbstractSpringCloudMetaAcceptanceTests.class.getResource("/projects/spring-cloud-build").toURI()); } public void consulPomParentVersionIsEqualTo(File project, String expected) { @@ -48,12 +45,9 @@ public class AbstractSpringCloudMetaAcceptanceTests public void thenAllDryRunStepsWereExecutedForEachProject( NonAssertingTestProjectGitHandler nonAssertingTestProjectGitHandler) { nonAssertingTestProjectGitHandler.clonedProjects.stream() - .filter(f -> !f.getName().contains("angel") - && !f.getName().equals("spring-cloud")) - .forEach(project -> { - then(Arrays.asList("spring-cloud-starter-build", - "spring-cloud-consul")) - .contains(pom(project).getArtifactId()); + .filter(f -> !f.getName().contains("angel") && !f.getName().equals("spring-cloud")).forEach(project -> { + then(Arrays.asList("spring-cloud-starter-build", "spring-cloud-consul")) + .contains(pom(project).getArtifactId()); then(new File("/tmp/executed_build")).exists(); then(new File("/tmp/executed_deploy")).doesNotExist(); then(new File("/tmp/executed_docs")).doesNotExist(); diff --git a/projects/spring-cloud/src/test/java/releaser/cloud/spring/meta/SpringMetaReleaseAcceptanceTests.java b/projects/spring-cloud/src/test/java/releaser/cloud/spring/meta/SpringMetaReleaseAcceptanceTests.java index 6e745b74..16fe360c 100644 --- a/projects/spring-cloud/src/test/java/releaser/cloud/spring/meta/SpringMetaReleaseAcceptanceTests.java +++ b/projects/spring-cloud/src/test/java/releaser/cloud/spring/meta/SpringMetaReleaseAcceptanceTests.java @@ -54,18 +54,18 @@ import org.springframework.context.annotation.Configuration; import org.springframework.util.FileSystemUtils; import static org.assertj.core.api.BDDAssertions.then; +import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.ArgumentMatchers.argThat; +import static org.mockito.BDDMockito.given; /** * @author Marcin Grzejszczak */ -public class SpringMetaReleaseAcceptanceTests - extends AbstractSpringCloudMetaAcceptanceTests { +public class SpringMetaReleaseAcceptanceTests extends AbstractSpringCloudMetaAcceptanceTests { @Test - public void should_perform_a_meta_release_of_sc_release_and_consul() - throws Exception { + public void should_perform_a_meta_release_of_sc_release_and_consul() throws Exception { checkoutReleaseTrainBranch("/projects/spring-cloud-release/", "Greenwich"); File origin = cloneToTemporaryDirectory(this.springCloudConsulProject); assertThatClonedConsulProjectIsInSnapshots(origin); @@ -73,21 +73,18 @@ public class SpringMetaReleaseAcceptanceTests GitTestUtils.setOriginOnProjectToTmp(origin, project); run(defaultRunner(), - properties("debug=true").properties("test.metarelease=true") - .properties(metaReleaseArgs(project).bomBranch("vGreenwich.SR2") - .addFixedVersions(edgwareSr10()).build()), + properties("debugx=true").properties("test.metarelease=true").properties( + metaReleaseArgs(project).bomBranch("vGreenwich.SR2").addFixedVersions(edgwareSr10()).build()), context -> { SpringReleaser releaser = context.getBean(SpringReleaser.class); NonAssertingTestProjectGitHandler nonAssertingTestProjectGitHandler = context .getBean(NonAssertingTestProjectGitHandler.class); SaganUpdater saganUpdater = context.getBean(SaganUpdater.class); - PostReleaseActions postReleaseActions = context - .getBean(PostReleaseActions.class); + PostReleaseActions postReleaseActions = context.getBean(PostReleaseActions.class); TestExecutionResultHandler testExecutionResultHandler = context .getBean(TestExecutionResultHandler.class); - ExecutionResult result = releaser - .release(new OptionsBuilder().metaRelease(true).options()); + ExecutionResult result = releaser.release(new OptionsBuilder().metaRelease(true).options()); // print results testExecutionResultHandler.accept(result); @@ -97,46 +94,41 @@ public class SpringMetaReleaseAcceptanceTests // consul, release then(nonAssertingTestProjectGitHandler.clonedProjects).hasSize(2); // don't want to verify the docs - thenAllStepsWereExecutedForEachProject( - nonAssertingTestProjectGitHandler); + thenAllStepsWereExecutedForEachProject(nonAssertingTestProjectGitHandler); thenSaganWasCalled(saganUpdater); - then(clonedProject(nonAssertingTestProjectGitHandler, - "spring-cloud-consul").tagList().call()).extracting("name") - .contains("refs/tags/v5.3.5.RELEASE"); + then(clonedProject(nonAssertingTestProjectGitHandler, "spring-cloud-consul").tagList().call()) + .extracting("name").contains("refs/tags/v5.3.5.RELEASE"); thenRunUpdatedTestsWereCalled(postReleaseActions); thenUpdateReleaseTrainDocsWasCalled(postReleaseActions); }); } @Test - public void should_perform_a_meta_release_of_sc_release_and_consul_in_parallel() - throws Exception { + public void should_perform_a_meta_release_of_sc_release_and_consul_in_parallel() throws Exception { checkoutReleaseTrainBranch("/projects/spring-cloud-release/", "Greenwich"); File origin = cloneToTemporaryDirectory(this.springCloudConsulProject); assertThatClonedConsulProjectIsInSnapshots(origin); File project = cloneToTemporaryDirectory(tmpFile("spring-cloud-consul")); GitTestUtils.setOriginOnProjectToTmp(origin, project); - run(defaultRunner(), properties("debug=true").properties("test.metarelease=true") - .properties(metaReleaseArgsForParallel(project) - .bomBranch("vGreenwich.SR2").addFixedVersions(edgwareSr10()) - .metaReleaseGroups("example1,example2", - "spring-cloud-build,spring-cloud-consul,spring-cloud-release") - .build()), + run(defaultRunner(), + properties("debugx=true").properties("test.metarelease=true") + .properties(metaReleaseArgsForParallel(project).bomBranch("vGreenwich.SR2") + .addFixedVersions(edgwareSr10()) + .metaReleaseGroups("example1,example2", + "spring-cloud-build,spring-cloud-consul,spring-cloud-release") + .build()), context -> { SpringReleaser releaser = context.getBean(SpringReleaser.class); NonAssertingTestProjectGitHandler nonAssertingTestProjectGitHandler = context .getBean(NonAssertingTestProjectGitHandler.class); SaganUpdater saganUpdater = context.getBean(SaganUpdater.class); - DocumentationUpdater testDocumentationUpdater = context - .getBean(DocumentationUpdater.class); - PostReleaseActions postReleaseActions = context - .getBean(PostReleaseActions.class); + DocumentationUpdater testDocumentationUpdater = context.getBean(DocumentationUpdater.class); + PostReleaseActions postReleaseActions = context.getBean(PostReleaseActions.class); TestExecutionResultHandler testExecutionResultHandler = context .getBean(TestExecutionResultHandler.class); - ExecutionResult result = releaser - .release(new OptionsBuilder().metaRelease(true).options()); + ExecutionResult result = releaser.release(new OptionsBuilder().metaRelease(true).options()); // print results testExecutionResultHandler.accept(result); @@ -150,17 +142,15 @@ public class SpringMetaReleaseAcceptanceTests // thenAllStepsWereExecutedForEachProject( // nonAssertingTestProjectGitHandler); thenSaganWasCalled(saganUpdater); - then(clonedProject(nonAssertingTestProjectGitHandler, - "spring-cloud-consul").tagList().call()).extracting("name") - .contains("refs/tags/v5.3.5.RELEASE"); + then(clonedProject(nonAssertingTestProjectGitHandler, "spring-cloud-consul").tagList().call()) + .extracting("name").contains("refs/tags/v5.3.5.RELEASE"); thenRunUpdatedTestsWereCalled(postReleaseActions); thenUpdateReleaseTrainDocsWasCalled(postReleaseActions); }); } @Test - public void should_perform_a_meta_release_dry_run_of_sc_release_and_consul() - throws Exception { + public void should_perform_a_meta_release_dry_run_of_sc_release_and_consul() throws Exception { checkoutReleaseTrainBranch("/projects/spring-cloud-release/", "Greenwich"); File origin = cloneToTemporaryDirectory(this.springCloudConsulProject); assertThatClonedConsulProjectIsInSnapshots(origin); @@ -168,23 +158,20 @@ public class SpringMetaReleaseAcceptanceTests GitTestUtils.setOriginOnProjectToTmp(origin, project); run(defaultRunner(), - properties("debug=true").properties("test.metarelease=true") - .properties(metaReleaseArgs(project).bomBranch("vGreenwich.SR2") - .addFixedVersions(edgwareSr10()).build()), + properties("debugx=true").properties("test.metarelease=true").properties( + metaReleaseArgs(project).bomBranch("vGreenwich.SR2").addFixedVersions(edgwareSr10()).build()), context -> { SpringReleaser releaser = context.getBean(SpringReleaser.class); NonAssertingTestProjectGitHandler nonAssertingTestProjectGitHandler = context .getBean(NonAssertingTestProjectGitHandler.class); SaganUpdater saganUpdater = context.getBean(SaganUpdater.class); - DocumentationUpdater testDocumentationUpdater = context - .getBean(DocumentationUpdater.class); - PostReleaseActions postReleaseActions = context - .getBean(PostReleaseActions.class); + DocumentationUpdater testDocumentationUpdater = context.getBean(DocumentationUpdater.class); + PostReleaseActions postReleaseActions = context.getBean(PostReleaseActions.class); TestExecutionResultHandler testExecutionResultHandler = context .getBean(TestExecutionResultHandler.class); - ExecutionResult result = releaser.release(new OptionsBuilder() - .metaRelease(true).dryRun(true).options()); + ExecutionResult result = releaser + .release(new OptionsBuilder().metaRelease(true).dryRun(true).options()); // print results testExecutionResultHandler.accept(result); @@ -194,20 +181,17 @@ public class SpringMetaReleaseAcceptanceTests // consul, release then(nonAssertingTestProjectGitHandler.clonedProjects).hasSize(2); // only dry run tasks were called - thenAllDryRunStepsWereExecutedForEachProject( - nonAssertingTestProjectGitHandler); + thenAllDryRunStepsWereExecutedForEachProject(nonAssertingTestProjectGitHandler); thenSaganWasNotCalled(saganUpdater); - then(clonedProject(nonAssertingTestProjectGitHandler, - "spring-cloud-consul").tagList().call()).extracting("name") - .doesNotContain("refs/tags/v5.3.5.RELEASE"); + then(clonedProject(nonAssertingTestProjectGitHandler, "spring-cloud-consul").tagList().call()) + .extracting("name").doesNotContain("refs/tags/v5.3.5.RELEASE"); thenRunUpdatedTestsWereNotCalled(postReleaseActions); thenUpdateReleaseTrainDocsWasNotCalled(postReleaseActions); }); } @Test - public void should_not_release_any_projects_when_they_are_on_list_of_projects_to_skip() - throws Exception { + public void should_not_release_any_projects_when_they_are_on_list_of_projects_to_skip() throws Exception { checkoutReleaseTrainBranch("/projects/spring-cloud-release/", "Greenwich"); File origin = cloneToTemporaryDirectory(this.springCloudConsulProject); assertThatClonedConsulProjectIsInSnapshots(origin); @@ -215,23 +199,17 @@ public class SpringMetaReleaseAcceptanceTests GitTestUtils.setOriginOnProjectToTmp(origin, project); File temporaryDestination = this.tmp.newFolder(); - run(defaultRunner(), - properties("debug=true") - .properties("test.metarelease=true", "test.mockBuild=true") - .properties(metaReleaseArgs(project).bomBranch("Greenwich") - .addFixedVersions(consulAndReleaseSnapshots()) - .updateReleaseTrainWiki(false) - .cloneDestinationDirectory(temporaryDestination) - .projectsToSkip("spring-cloud-consul").build()), + run(defaultRunner(), properties("debugx=true").properties("test.metarelease=true", "test.mockBuild=true") + .properties(metaReleaseArgs(project).bomBranch("Greenwich") + .addFixedVersions(consulAndReleaseSnapshots()).updateReleaseTrainWiki(false) + .cloneDestinationDirectory(temporaryDestination).projectsToSkip("spring-cloud-consul").build()), context -> { SpringReleaser releaser = context.getBean(SpringReleaser.class); - BuildProjectReleaseTask build = context - .getBean(BuildProjectReleaseTask.class); + BuildProjectReleaseTask build = context.getBean(BuildProjectReleaseTask.class); TestExecutionResultHandler testExecutionResultHandler = context .getBean(TestExecutionResultHandler.class); - ExecutionResult result = releaser - .release(new OptionsBuilder().metaRelease(true).options()); + ExecutionResult result = releaser.release(new OptionsBuilder().metaRelease(true).options()); // print results testExecutionResultHandler.accept(result); @@ -244,8 +222,7 @@ public class SpringMetaReleaseAcceptanceTests } @Test - public void should_perform_a_meta_release_of_consul_only_when_run_from_got_passed() - throws Exception { + public void should_perform_a_meta_release_of_consul_only_when_run_from_got_passed() throws Exception { checkoutReleaseTrainBranch("/projects/spring-cloud-release/", "Greenwich"); File origin = cloneToTemporaryDirectory(this.springCloudConsulProject); assertThatClonedConsulProjectIsInSnapshots(origin); @@ -254,24 +231,20 @@ public class SpringMetaReleaseAcceptanceTests File temporaryDestination = this.tmp.newFolder(); run(defaultRunner(), - properties("debug=true") - .properties("test.metarelease=true", "test.mockBuild=true") + properties("debugx=true").properties("test.metarelease=true", "test.mockBuild=true") .properties(metaReleaseArgs(project).bomBranch("Greenwich") .addFixedVersions(releaseConsulBuildSnapshots()) .cloneDestinationDirectory(temporaryDestination).build()), context -> { SpringReleaser releaser = context.getBean(SpringReleaser.class); - BuildProjectReleaseTask build = context - .getBean(BuildProjectReleaseTask.class); + BuildProjectReleaseTask build = context.getBean(BuildProjectReleaseTask.class); SaganUpdater saganUpdater = context.getBean(SaganUpdater.class); - DocumentationUpdater testDocumentationUpdater = context - .getBean(DocumentationUpdater.class); + DocumentationUpdater testDocumentationUpdater = context.getBean(DocumentationUpdater.class); TestExecutionResultHandler testExecutionResultHandler = context .getBean(TestExecutionResultHandler.class); ExecutionResult result = releaser - .release(new OptionsBuilder().startFrom("spring-cloud-consul") - .metaRelease(true).options()); + .release(new OptionsBuilder().startFrom("spring-cloud-consul").metaRelease(true).options()); // print results testExecutionResultHandler.accept(result); @@ -290,8 +263,7 @@ public class SpringMetaReleaseAcceptanceTests } @Test - public void should_perform_a_meta_release_of_consul_only_when_task_names_got_passed() - throws Exception { + public void should_perform_a_meta_release_of_consul_only_when_task_names_got_passed() throws Exception { checkoutReleaseTrainBranch("/projects/spring-cloud-release/", "Greenwich"); File origin = cloneToTemporaryDirectory(this.springCloudConsulProject); assertThatClonedConsulProjectIsInSnapshots(origin); @@ -300,24 +272,20 @@ public class SpringMetaReleaseAcceptanceTests File temporaryDestination = this.tmp.newFolder(); run(defaultRunner(), - properties("debug=true") - .properties("test.metarelease=true", "test.mockBuild=true") + properties("debugx=true").properties("test.metarelease=true", "test.mockBuild=true") .properties(metaReleaseArgs(project).bomBranch("Greenwich") .addFixedVersions(releaseConsulBuildSnapshots()) .cloneDestinationDirectory(temporaryDestination).build()), context -> { SpringReleaser releaser = context.getBean(SpringReleaser.class); - BuildProjectReleaseTask build = context - .getBean(BuildProjectReleaseTask.class); + BuildProjectReleaseTask build = context.getBean(BuildProjectReleaseTask.class); SaganUpdater saganUpdater = context.getBean(SaganUpdater.class); - DocumentationUpdater testDocumentationUpdater = context - .getBean(DocumentationUpdater.class); + DocumentationUpdater testDocumentationUpdater = context.getBean(DocumentationUpdater.class); TestExecutionResultHandler testExecutionResultHandler = context .getBean(TestExecutionResultHandler.class); ExecutionResult result = releaser.release(new OptionsBuilder() - .taskNames(Collections.singletonList("spring-cloud-consul")) - .metaRelease(true).options()); + .taskNames(Collections.singletonList("spring-cloud-consul")).metaRelease(true).options()); // print results testExecutionResultHandler.accept(result); @@ -336,19 +304,18 @@ public class SpringMetaReleaseAcceptanceTests } @Test - public void should_not_execute_any_subsequent_task_when_first_one_fails() - throws Exception { + public void should_not_execute_any_subsequent_task_when_first_one_fails() throws Exception { checkoutReleaseTrainBranch("/projects/spring-cloud-release/", "Greenwich"); File origin = cloneToTemporaryDirectory(this.springCloudConsulProject); assertThatClonedConsulProjectIsInSnapshots(origin); File project = cloneToTemporaryDirectory(tmpFile("spring-cloud-consul")); GitTestUtils.setOriginOnProjectToTmp(origin, project); - run(failingBuildRunner(), properties("debug=true") + run(failingBuildRunner(), properties("debugx=true") .properties("test.metarelease=true", "test.metarelease.failing=true", "releaser.flow.default-enabled=false") - .properties(metaReleaseArgs(project).bomBranch("vGreenwich.SR2") - .addFixedVersions(edgwareSr10()).build()), + .properties( + metaReleaseArgs(project).bomBranch("vGreenwich.SR2").addFixedVersions(edgwareSr10()).build()), context -> { SpringReleaser releaser = context.getBean(SpringReleaser.class); NonAssertingTestProjectGitHandler nonAssertingTestProjectGitHandler = context @@ -357,11 +324,9 @@ public class SpringMetaReleaseAcceptanceTests .getBean(TestExecutionResultHandler.class); FirstTask firstTask = context.getBean(FirstTask.class); SecondTask secondTask = context.getBean(SecondTask.class); - PostReleaseTask postReleaseTask = context - .getBean(PostReleaseTask.class); + PostReleaseTask postReleaseTask = context.getBean(PostReleaseTask.class); - ExecutionResult result = releaser - .release(new OptionsBuilder().metaRelease(true).options()); + ExecutionResult result = releaser.release(new OptionsBuilder().metaRelease(true).options()); // print results testExecutionResultHandler.accept(result); @@ -370,48 +335,40 @@ public class SpringMetaReleaseAcceptanceTests then(result.isFailureOrUnstable()).isTrue(); // consul then(nonAssertingTestProjectGitHandler.clonedProjects).hasSize(1); - BDDMockito.then(firstTask).should().runTask(BDDMockito.argThat( - arg -> arg.project.getName().equals("spring-cloud-consul"))); + BDDMockito.then(firstTask).should() + .runTask(BDDMockito.argThat(arg -> arg.project.getName().equals("spring-cloud-consul"))); BDDMockito.then(firstTask).should(BDDMockito.never()) - .runTask(BDDMockito.argThat(arg -> arg.project.getName() - .equals("spring-cloud-release"))); - BDDMockito.then(secondTask).should(BDDMockito.never()) - .runTask(BDDMockito.any(Arguments.class)); + .runTask(BDDMockito.argThat(arg -> arg.project.getName().equals("spring-cloud-release"))); + BDDMockito.then(secondTask).should(BDDMockito.never()).runTask(BDDMockito.any(Arguments.class)); BDDMockito.then(postReleaseTask).should(BDDMockito.never()) .runTask(BDDMockito.any(Arguments.class)); }); } private SpringApplicationBuilder defaultRunner() { - return new SpringApplicationBuilder(MetaReleaseConfig.class, - MetaReleaseScanningConfiguration.class).web(WebApplicationType.NONE) - .properties("spring.jmx.enabled=false"); + return new SpringApplicationBuilder(MetaReleaseConfig.class, MetaReleaseScanningConfiguration.class) + .web(WebApplicationType.NONE).properties("spring.jmx.enabled=false"); } private SpringApplicationBuilder failingBuildRunner() { - return new SpringApplicationBuilder( - SpringMetaReleaseAcceptanceTests.MetaReleaseConfig.class, + return new SpringApplicationBuilder(SpringMetaReleaseAcceptanceTests.MetaReleaseConfig.class, SpringMetaReleaseAcceptanceTests.MetaReleaseFailingTasksScanningConfiguration.class) - .web(WebApplicationType.NONE) - .properties("spring.jmx.enabled=false"); + .web(WebApplicationType.NONE).properties("spring.jmx.enabled=false"); } private void thenWikiPageWasUpdated(DocumentationUpdater documentationUpdater) { - BDDMockito.then(documentationUpdater).should() - .updateReleaseTrainWiki(BDDMockito.any(Projects.class)); + BDDMockito.then(documentationUpdater).should().updateReleaseTrainWiki(BDDMockito.any(Projects.class)); } - private void thenBuildWasCalledFor(BuildProjectReleaseTask build, - String projectName) { - BDDMockito.then(build).should().apply(argThat( - argument -> argument.originalVersion.projectName.equals(projectName) + private void thenBuildWasCalledFor(BuildProjectReleaseTask build, String projectName) { + BDDMockito.then(build).should() + .apply(argThat(argument -> argument.originalVersion.projectName.equals(projectName) || argument.project.getAbsolutePath().endsWith(projectName))); } - private void thenBuildWasNeverCalledFor(BuildProjectReleaseTask build, - String projectName) { - BDDMockito.then(build).should(BDDMockito.never()).apply(argThat( - argument -> argument.originalVersion.projectName.equals(projectName) + private void thenBuildWasNeverCalledFor(BuildProjectReleaseTask build, String projectName) { + BDDMockito.then(build).should(BDDMockito.never()) + .apply(argThat(argument -> argument.originalVersion.projectName.equals(projectName) || argument.project.getAbsolutePath().endsWith(projectName))); } @@ -438,8 +395,9 @@ public class SpringMetaReleaseAcceptanceTests @Bean SaganClient testSaganClient() { SaganClient saganClient = BDDMockito.mock(SaganClient.class); - BDDMockito.given(saganClient.getProject(anyString())) - .willReturn(newProject()); + given(saganClient.getProject(anyString())).willReturn(newProject()); + given(saganClient.addRelease(anyString(), any())).willReturn(true); + given(saganClient.deleteRelease(anyString(), anyString())).willReturn(true); return saganClient; } @@ -450,33 +408,27 @@ public class SpringMetaReleaseAcceptanceTests } @Bean - SaganUpdater testSaganUpdater(SaganClient saganClient, - ReleaserProperties properties) { + SaganUpdater testSaganUpdater(SaganClient saganClient, ReleaserProperties properties) { return BDDMockito.spy(new SaganUpdater(saganClient, properties)); } @Bean PostReleaseActions myPostReleaseActions() { - return BDDMockito - .mock(PostReleaseActions.class, - invocation -> invocation.getMethod().getReturnType() - .equals(ExecutionResult.class) - ? ExecutionResult.success() : null); + return BDDMockito.mock(PostReleaseActions.class, + invocation -> invocation.getMethod().getReturnType().equals(ExecutionResult.class) + ? ExecutionResult.success() : null); } @Bean - NonAssertingTestProjectGitHubHandler testProjectGitHubHandler( - ReleaserProperties releaserProperties) { + NonAssertingTestProjectGitHubHandler testProjectGitHubHandler(ReleaserProperties releaserProperties) { return new NonAssertingTestProjectGitHubHandler(releaserProperties); } @Bean - NonAssertingTestProjectGitHandler nonAssertingTestProjectGitHandler( - ReleaserProperties releaserProperties, + NonAssertingTestProjectGitHandler nonAssertingTestProjectGitHandler(ReleaserProperties releaserProperties, @Value("${test.projectName}") String projectName) { return new NonAssertingTestProjectGitHandler(releaserProperties, - file -> FileSystemUtils - .deleteRecursively(new File(file, projectName))); + file -> FileSystemUtils.deleteRecursively(new File(file, projectName))); } @Bean @@ -487,8 +439,7 @@ public class SpringMetaReleaseAcceptanceTests } @Configuration - @ConditionalOnProperty(value = "test.metarelease", havingValue = "true", - matchIfMissing = true) + @ConditionalOnProperty(value = "test.metarelease", havingValue = "true", matchIfMissing = true) @ComponentScan({ "releaser.internal", "releaser.cloud" }) static class MetaReleaseScanningConfiguration { @@ -551,8 +502,7 @@ class FirstTask implements ReleaseReleaserTask { } @Override - public ExecutionResult runTask(Arguments args) - throws BuildUnstableException, RuntimeException { + public ExecutionResult runTask(Arguments args) throws BuildUnstableException, RuntimeException { return ExecutionResult.failure(new IllegalStateException("Failure")); } @@ -586,8 +536,7 @@ class SecondTask implements ReleaseReleaserTask { } @Override - public ExecutionResult runTask(Arguments args) - throws BuildUnstableException, RuntimeException { + public ExecutionResult runTask(Arguments args) throws BuildUnstableException, RuntimeException { return ExecutionResult.success(); } @@ -621,8 +570,7 @@ class PostReleaseTask implements TrainPostReleaseReleaserTask { } @Override - public ExecutionResult runTask(Arguments args) - throws BuildUnstableException, RuntimeException { + public ExecutionResult runTask(Arguments args) throws BuildUnstableException, RuntimeException { return ExecutionResult.success(); } diff --git a/projects/spring-cloud/src/test/java/releaser/cloud/spring/single/SpringSingleProjectAcceptanceTests.java b/projects/spring-cloud/src/test/java/releaser/cloud/spring/single/SpringSingleProjectAcceptanceTests.java index bbd46cd5..4a284afe 100644 --- a/projects/spring-cloud/src/test/java/releaser/cloud/spring/single/SpringSingleProjectAcceptanceTests.java +++ b/projects/spring-cloud/src/test/java/releaser/cloud/spring/single/SpringSingleProjectAcceptanceTests.java @@ -49,34 +49,33 @@ import org.springframework.context.annotation.Configuration; import org.springframework.util.FileSystemUtils; import static org.assertj.core.api.BDDAssertions.then; +import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.BDDMockito.given; +import static org.mockito.Mockito.times; /** * @author Marcin Grzejszczak */ -public class SpringSingleProjectAcceptanceTests - extends AbstractSpringCloudAcceptanceTests { +public class SpringSingleProjectAcceptanceTests extends AbstractSpringCloudAcceptanceTests { SpringApplicationBuilder runner = new SpringApplicationBuilder( SpringSingleProjectAcceptanceTests.SingleProjectReleaseConfig.class, - SpringSingleProjectAcceptanceTests.SingleProjectScanningConfiguration.class) - .web(WebApplicationType.NONE).properties("spring.jmx.enabled=false"); + SpringSingleProjectAcceptanceTests.SingleProjectScanningConfiguration.class).web(WebApplicationType.NONE) + .properties("spring.jmx.enabled=false"); @Test - public void should_fail_to_perform_a_release_of_consul_when_sc_release_contains_snapshots() - throws Exception { - checkoutReleaseTrainBranch("/projects/spring-cloud-release-with-snapshot/", - "vCamden.SR5.BROKEN"); + public void should_fail_to_perform_a_release_of_consul_when_sc_release_contains_snapshots() throws Exception { + checkoutReleaseTrainBranch("/projects/spring-cloud-release-with-snapshot/", "vCamden.SR5.BROKEN"); File origin = cloneToTemporaryDirectory(this.springCloudConsulProject); assertThatClonedConsulProjectIsInSnapshots(origin); File project = cloneToTemporaryDirectory(tmpFile("spring-cloud-consul")); GitTestUtils.setOriginOnProjectToTmp(origin, project); run(this.runner, - properties("debug=true").properties(new ArgsBuilder(project, this.tmp) + properties("debugx=true").properties(new ArgsBuilder(project, this.tmp) .releaseTrainUrl("/projects/spring-cloud-release-with-snapshot/") - .bomBranch("vCamden.SR5.BROKEN").expectedVersion("1.1.2.RELEASE") - .build()), + .bomBranch("vCamden.SR5.BROKEN").expectedVersion("1.1.2.RELEASE").build()), context -> { SpringReleaser releaser = context.getBean(SpringReleaser.class); BDDAssertions.thenThrownBy(releaser::release).hasMessageContaining( @@ -94,28 +93,23 @@ public class SpringSingleProjectAcceptanceTests GitTestUtils.setOriginOnProjectToTmp(origin, project); run(this.runner, - properties("debug=true").properties(new ArgsBuilder(project, this.tmp) - .releaseTrainUrl("/projects/spring-cloud-release/") - .bomBranch("vGreenwich.SR2").expectedVersion("2.1.2.RELEASE") - .build()), + properties("debugx=true").properties( + new ArgsBuilder(project, this.tmp).releaseTrainUrl("/projects/spring-cloud-release/") + .bomBranch("vGreenwich.SR2").expectedVersion("2.1.2.RELEASE").build()), context -> { SpringReleaser releaser = context.getBean(SpringReleaser.class); - TestProjectGitHubHandler gitHubHandler = context - .getBean(TestProjectGitHubHandler.class); + TestProjectGitHubHandler gitHubHandler = context.getBean(TestProjectGitHubHandler.class); SaganClient saganClient = context.getBean(SaganClient.class); - PostReleaseActions postReleaseActions = context - .getBean(PostReleaseActions.class); + PostReleaseActions postReleaseActions = context.getBean(PostReleaseActions.class); TestExecutionResultHandler testExecutionResultHandler = context .getBean(TestExecutionResultHandler.class); - ExecutionResult result = releaser - .release(new OptionsBuilder().interactive(true).options()); + ExecutionResult result = releaser.release(new OptionsBuilder().interactive(true).options()); Iterable commits = listOfCommits(project); Iterator iterator = commits.iterator(); tagIsPresentInOrigin(origin, "v2.1.2.RELEASE"); - commitIsPresent(iterator, - "Bumping versions to 2.1.3.SNAPSHOT after release"); + commitIsPresent(iterator, "Bumping versions to 2.1.3.SNAPSHOT after release"); commitIsPresent(iterator, "Going back to snapshots"); commitIsPresent(iterator, "Update SNAPSHOT to 2.1.2.RELEASE"); pomVersionIsEqualTo(project, "2.1.3.SNAPSHOT"); @@ -127,11 +121,10 @@ public class SpringSingleProjectAcceptanceTests then(releaseNotesTemplate()).doesNotExist(); // once for updating GA // second time to update SNAPSHOT - BDDMockito.then(saganClient).should(BDDMockito.times(2)) - .updateRelease(BDDMockito.eq("spring-cloud-consul"), - BDDMockito.anyList()); - BDDMockito.then(saganClient).should() - .deleteRelease("spring-cloud-consul", "2.1.2.BUILD-SNAPSHOT"); + BDDMockito.then(saganClient).should(times(2)).addRelease(BDDMockito.eq("spring-cloud-consul"), + BDDMockito.any()); + BDDMockito.then(saganClient).should(times(2)).getProject("spring-cloud-consul"); + BDDMockito.then(saganClient).should().deleteRelease("spring-cloud-consul", "2.1.2.BUILD-SNAPSHOT"); then(gitHubHandler.issueCreatedInSpringGuides).isFalse(); then(gitHubHandler.issueCreatedInStartSpringIo).isFalse(); thenRunUpdatedTestsWereNotCalled(postReleaseActions); @@ -152,34 +145,28 @@ public class SpringSingleProjectAcceptanceTests GitTestUtils.setOriginOnProjectToTmp(origin, project); run(this.runner, - properties("debug=true").properties(new ArgsBuilder(project, this.tmp) - .releaseTrainUrl("/projects/spring-cloud-release/") - .bomBranch("vGreenwich.SR2").projectName("spring-cloud-build") - .expectedVersion("2.1.6.RELEASE").build()), + properties("debugx=true").properties(new ArgsBuilder(project, this.tmp) + .releaseTrainUrl("/projects/spring-cloud-release/").bomBranch("vGreenwich.SR2") + .projectName("spring-cloud-build").expectedVersion("2.1.6.RELEASE").build()), context -> { SpringReleaser releaser = context.getBean(SpringReleaser.class); - TestProjectGitHubHandler gitHubHandler = context - .getBean(TestProjectGitHubHandler.class); + TestProjectGitHubHandler gitHubHandler = context.getBean(TestProjectGitHubHandler.class); SaganClient saganClient = context.getBean(SaganClient.class); - PostReleaseActions postReleaseActions = context - .getBean(PostReleaseActions.class); + PostReleaseActions postReleaseActions = context.getBean(PostReleaseActions.class); TestExecutionResultHandler testExecutionResultHandler = context .getBean(TestExecutionResultHandler.class); - ExecutionResult result = releaser - .release(new OptionsBuilder().interactive(true).options()); + ExecutionResult result = releaser.release(new OptionsBuilder().interactive(true).options()); Iterable commits = listOfCommits(project); Iterator iterator = commits.iterator(); tagIsPresentInOrigin(origin, "v2.1.6.RELEASE"); // we're running against camden sc-release - commitIsPresent(iterator, - "Bumping versions to 2.1.7.SNAPSHOT after release"); + commitIsPresent(iterator, "Bumping versions to 2.1.7.SNAPSHOT after release"); commitIsPresent(iterator, "Going back to snapshots"); commitIsPresent(iterator, "Update SNAPSHOT to 2.1.6.RELEASE"); pomVersionIsEqualTo(project, "2.1.7.SNAPSHOT"); - pomParentVersionIsEqualTo(project, "spring-cloud-build-dependencies", - "2.1.6.RELEASE"); + pomParentVersionIsEqualTo(project, "spring-cloud-build-dependencies", "2.1.6.RELEASE"); then(gitHubHandler.closedMilestones).isTrue(); then(emailTemplate()).doesNotExist(); then(blogTemplate()).doesNotExist(); @@ -187,11 +174,9 @@ public class SpringSingleProjectAcceptanceTests then(releaseNotesTemplate()).doesNotExist(); // once for updating GA // second time to update SNAPSHOT - BDDMockito.then(saganClient).should(BDDMockito.times(2)) - .updateRelease(BDDMockito.eq("spring-cloud-build"), - BDDMockito.anyList()); - BDDMockito.then(saganClient).should() - .deleteRelease("spring-cloud-build", "2.1.6.BUILD-SNAPSHOT"); + BDDMockito.then(saganClient).should(times(2)).addRelease(BDDMockito.eq("spring-cloud-build"), + BDDMockito.any()); + BDDMockito.then(saganClient).should().deleteRelease("spring-cloud-build", "2.1.6.BUILD-SNAPSHOT"); then(gitHubHandler.issueCreatedInSpringGuides).isFalse(); then(gitHubHandler.issueCreatedInStartSpringIo).isFalse(); thenRunUpdatedTestsWereNotCalled(postReleaseActions); @@ -211,26 +196,22 @@ public class SpringSingleProjectAcceptanceTests GitTestUtils.setOriginOnProjectToTmp(origin, project); run(this.runner, - properties("debug=true").properties(new ArgsBuilder(project, this.tmp) - .releaseTrainUrl("/projects/spring-cloud-release/") - .bomBranch("vDalston.RC1").expectedVersion("1.2.0.RC1").build()), + properties("debugx=true").properties( + new ArgsBuilder(project, this.tmp).releaseTrainUrl("/projects/spring-cloud-release/") + .bomBranch("vDalston.RC1").expectedVersion("1.2.0.RC1").build()), context -> { SpringReleaser releaser = context.getBean(SpringReleaser.class); - TestProjectGitHubHandler gitHubHandler = context - .getBean(TestProjectGitHubHandler.class); + TestProjectGitHubHandler gitHubHandler = context.getBean(TestProjectGitHubHandler.class); SaganClient saganClient = context.getBean(SaganClient.class); - PostReleaseActions postReleaseActions = context - .getBean(PostReleaseActions.class); + PostReleaseActions postReleaseActions = context.getBean(PostReleaseActions.class); TestExecutionResultHandler testExecutionResultHandler = context .getBean(TestExecutionResultHandler.class); - ExecutionResult result = releaser - .release(new OptionsBuilder().interactive(true).options()); + ExecutionResult result = releaser.release(new OptionsBuilder().interactive(true).options()); Iterable commits = listOfCommits(project); tagIsPresentInOrigin(origin, "v1.2.0.RC1"); - commitIsNotPresent(commits, - "Bumping versions to 1.2.1.SNAPSHOT after release"); + commitIsNotPresent(commits, "Bumping versions to 1.2.1.SNAPSHOT after release"); Iterator iterator = listOfCommits(project).iterator(); commitIsPresent(iterator, "Going back to snapshots"); commitIsPresent(iterator, "Update SNAPSHOT to 1.2.0.RC1"); @@ -241,12 +222,11 @@ public class SpringSingleProjectAcceptanceTests then(blogTemplate()).doesNotExist(); then(tweetTemplate()).doesNotExist(); then(releaseNotesTemplate()).doesNotExist(); - BDDMockito.then(saganClient).should().updateRelease( - BDDMockito.eq("spring-cloud-consul"), BDDMockito.anyList()); - BDDMockito.then(saganClient).should() - .deleteRelease("spring-cloud-consul", "1.2.0.M8"); - BDDMockito.then(saganClient).should() - .deleteRelease("spring-cloud-consul", "1.2.0.RC1"); + BDDMockito.then(saganClient).should().addRelease(BDDMockito.eq("spring-cloud-consul"), + BDDMockito.any()); + BDDMockito.then(saganClient).should(times(2)).getProject("spring-cloud-consul"); + BDDMockito.then(saganClient).should().deleteRelease("spring-cloud-consul", "1.2.0.M8"); + BDDMockito.then(saganClient).should().deleteRelease("spring-cloud-consul", "1.2.0.SNAPSHOT"); // we update guides only for SR / RELEASE then(gitHubHandler.issueCreatedInSpringGuides).isFalse(); then(gitHubHandler.issueCreatedInStartSpringIo).isFalse(); @@ -259,8 +239,7 @@ public class SpringSingleProjectAcceptanceTests } @Test - public void should_not_clone_when_option_not_to_clone_was_switched_on() - throws Exception { + public void should_not_clone_when_option_not_to_clone_was_switched_on() throws Exception { checkoutReleaseTrainBranch("/projects/spring-cloud-release/", "master"); File origin = cloneToTemporaryDirectory(this.springCloudConsulProject); assertThatClonedConsulProjectIsInSnapshots(origin); @@ -269,12 +248,11 @@ public class SpringSingleProjectAcceptanceTests final File temporaryDestination = this.tmp.newFolder(); run(this.runner, - properties("debug=true").properties(new ArgsBuilder(project, this.tmp) - .releaseTrainUrl("/projects/spring-cloud-release/") - .bomBranch("vCamden.SR5").expectedVersion("1.1.2.RELEASE") + properties("debugx=true").properties(new ArgsBuilder(project, this.tmp) + .releaseTrainUrl("/projects/spring-cloud-release/").bomBranch("vCamden.SR5") + .expectedVersion("1.1.2.RELEASE") // just build - .chosenOption("6").fetchVersionsFromGit(false) - .cloneDestinationDirectory(temporaryDestination) + .chosenOption("6").fetchVersionsFromGit(false).cloneDestinationDirectory(temporaryDestination) .addFixedVersion("spring-cloud-release", "Finchley.RELEASE") .addFixedVersion("spring-cloud-consul", "2.3.4.RELEASE").build()), context -> { @@ -288,8 +266,7 @@ public class SpringSingleProjectAcceptanceTests private void assertThatClonedBuildProjectIsInSnapshots(File origin) { pomVersionIsEqualTo(origin, "1.3.7.BUILD-SNAPSHOT"); - pomParentVersionIsEqualTo(origin, "spring-cloud-build-dependencies", - "1.5.9.RELEASE"); + pomParentVersionIsEqualTo(origin, "spring-cloud-build-dependencies", "1.5.9.RELEASE"); } // @formatter:on @@ -305,8 +282,7 @@ public class SpringSingleProjectAcceptanceTests boolean issueCreatedInStartSpringIo = false; - TestProjectGitHubHandler(ReleaserProperties properties, String expectedVersion, - String projectName) { + TestProjectGitHubHandler(ReleaserProperties properties, String expectedVersion, String projectName) { super(properties, Collections.emptyList()); this.expectedVersion = expectedVersion; this.projectName = projectName; @@ -325,8 +301,7 @@ public class SpringSingleProjectAcceptanceTests } @Override - public void createIssueInStartSpringIo(Projects projects, - ProjectVersion version) { + public void createIssueInStartSpringIo(Projects projects, ProjectVersion version) { this.issueCreatedInStartSpringIo = true; } @@ -339,15 +314,15 @@ public class SpringSingleProjectAcceptanceTests @Configuration @EnableAutoConfiguration - @ConditionalOnProperty(value = "test.metarelease", havingValue = "false", - matchIfMissing = true) + @ConditionalOnProperty(value = "test.metarelease", havingValue = "false", matchIfMissing = true) static class SingleProjectReleaseConfig extends DefaultTestConfiguration { @Bean SaganClient testSaganClient() { SaganClient saganClient = BDDMockito.mock(SaganClient.class); - BDDMockito.given(saganClient.getProject(anyString())) - .willReturn(newProject()); + given(saganClient.getProject(anyString())).willReturn(newProject()); + given(saganClient.addRelease(anyString(), any())).willReturn(true); + given(saganClient.deleteRelease(anyString(), anyString())).willReturn(true); return saganClient; } @@ -357,21 +332,17 @@ public class SpringSingleProjectAcceptanceTests } @Bean - TestProjectGitHubHandler testProjectGitHubHandler( - ReleaserProperties releaserProperties, + TestProjectGitHubHandler testProjectGitHubHandler(ReleaserProperties releaserProperties, @Value("${test.expectedVersion}") String expectedVersion, @Value("${test.projectName}") String projectName) { - return new TestProjectGitHubHandler(releaserProperties, expectedVersion, - projectName); + return new TestProjectGitHubHandler(releaserProperties, expectedVersion, projectName); } @Bean - NonAssertingTestProjectGitHandler nonAssertingTestProjectGitHandler( - ReleaserProperties releaserProperties, + NonAssertingTestProjectGitHandler nonAssertingTestProjectGitHandler(ReleaserProperties releaserProperties, @Value("${test.projectName}") String projectName) { return new NonAssertingTestProjectGitHandler(releaserProperties, - file -> FileSystemUtils - .deleteRecursively(new File(file, projectName))); + file -> FileSystemUtils.deleteRecursively(new File(file, projectName))); } @Bean @@ -382,8 +353,7 @@ public class SpringSingleProjectAcceptanceTests } @Configuration - @ConditionalOnProperty(value = "test.metarelease", havingValue = "false", - matchIfMissing = true) + @ConditionalOnProperty(value = "test.metarelease", havingValue = "false", matchIfMissing = true) @ComponentScan({ "releaser.internal", "releaser.cloud" }) static class SingleProjectScanningConfiguration { diff --git a/releaser-core/pom.xml b/releaser-core/pom.xml index 9939da45..c7ae8cf8 100644 --- a/releaser-core/pom.xml +++ b/releaser-core/pom.xml @@ -32,11 +32,6 @@ spring-boot-configuration-processor true - - org.hibernate - hibernate-validator - ${hibernate-validator.version} - org.eclipse.jgit org.eclipse.jgit @@ -120,9 +115,13 @@ ${awaitility.version} test - - sagan + org.junit.vintage + junit-vintage-engine + test + + + io.spring.sagan sagan-site stubs ${sagan-site.version} diff --git a/releaser-core/src/main/java/releaser/internal/project/ProjectVersion.java b/releaser-core/src/main/java/releaser/internal/project/ProjectVersion.java index 4063a059..be0a9394 100644 --- a/releaser-core/src/main/java/releaser/internal/project/ProjectVersion.java +++ b/releaser-core/src/main/java/releaser/internal/project/ProjectVersion.java @@ -597,11 +597,24 @@ public class ProjectVersion implements Comparable, Serializable return ""; } + /** + * @return the snapshot format of the current version. + */ + public String toSnapshotVersion() { + return assertVersion().withSnapshot().print(); + } + @Override public String toString() { return this.version; } + public String toPrettyString() { + return new ToStringCreator(this).append("projectName", projectName).append("version", version) + .append("groupId", groupId).append("artifactId", artifactId).append("releaseType", releaseType) + .toString(); + } + @Override public boolean equals(Object o) { if (this == o) { @@ -773,7 +786,7 @@ public class ProjectVersion implements Comparable, Serializable return StringUtils.isEmpty(minor) && StringUtils.isEmpty(patch) && StringUtils.isEmpty(suffix); } - private SplitVersion withSnapshot() { + public SplitVersion withSnapshot() { return new SplitVersion(major, minor, patch, delimiter, suffix()); } diff --git a/releaser-core/src/main/java/releaser/internal/sagan/Project.java b/releaser-core/src/main/java/releaser/internal/sagan/Project.java index d21a3e1e..17aa6087 100644 --- a/releaser-core/src/main/java/releaser/internal/sagan/Project.java +++ b/releaser-core/src/main/java/releaser/internal/sagan/Project.java @@ -16,61 +16,73 @@ package releaser.internal.sagan; -import java.util.ArrayList; import java.util.List; import com.fasterxml.jackson.annotation.JsonInclude; +import org.springframework.core.style.ToStringCreator; + /** * @author Marcin Grzejszczak */ @JsonInclude(JsonInclude.Include.NON_NULL) public class Project { - public String id; + private String name; - public String name; + private String slug; - public String repoUrl; + private String repositoryUrl; - public String siteUrl; + private String status; - public String category; + public List releases; - public String stackOverflowTags; + public String getName() { + return name; + } - public List projectReleases = new ArrayList<>(); + public void setName(String name) { + this.name = name; + } - public Object projectSamples = new Object(); + public String getSlug() { + return slug; + } - public Object nonMostCurrentReleases = new ArrayList<>(); + public void setSlug(String slug) { + this.slug = slug; + } - public List stackOverflowTagList = new ArrayList<>(); + public String getRepositoryUrl() { + return repositoryUrl; + } - public Object mostCurrentRelease = new MostCurrentRelease(); + public void setRepositoryUrl(String repositoryUrl) { + this.repositoryUrl = repositoryUrl; + } - public Boolean aggregator; + public String getStatus() { + return status; + } - public String rawBootConfig; + public void setStatus(String status) { + this.status = status; + } - public String rawOverview; + public List getReleases() { + return this.releases; + } - public int displayOrder = Integer.MAX_VALUE; - - public boolean topLevelProject = true; + public void setReleases(List releases) { + this.releases = releases; + } @Override public String toString() { - return "Project{" + "id='" + this.id + '\'' + ", name='" + this.name + '\'' + ", repoUrl='" + this.repoUrl - + '\'' + ", siteUrl='" + this.siteUrl + '\'' + ", category='" + this.category + '\'' - + ", stackOverflowTags='" + this.stackOverflowTags + '\'' + ", projectReleases=" + this.projectReleases - + ", stackOverflowTagList=" + this.stackOverflowTagList + ", aggregator=" + this.aggregator - + ", rawBootConfig='" + this.rawBootConfig + '\'' + ", rawOverview='" + this.rawOverview + '\'' + '}'; - } - - static class MostCurrentRelease { - - public boolean present; + return new ToStringCreator(this).append("name", name).append("slug", slug) + .append("repositoryUrl", repositoryUrl).append("status", status).append("releases", releases) + .toString(); } diff --git a/releaser-core/src/main/java/releaser/internal/sagan/Release.java b/releaser-core/src/main/java/releaser/internal/sagan/Release.java index 41c47055..6dd1caa4 100644 --- a/releaser-core/src/main/java/releaser/internal/sagan/Release.java +++ b/releaser-core/src/main/java/releaser/internal/sagan/Release.java @@ -18,44 +18,69 @@ package releaser.internal.sagan; import com.fasterxml.jackson.annotation.JsonInclude; +import org.springframework.core.style.ToStringCreator; + /** * @author Marcin Grzejszczak */ @JsonInclude(JsonInclude.Include.NON_NULL) public class Release { - public String releaseStatus = ""; + private String version; - public String refDocUrl = ""; + private String status; - public String apiDocUrl = ""; + private boolean current; - public String groupId = ""; + private String referenceDocUrl; - public String artifactId = ""; + private String apiDocUrl; - public Repository repository; + public String getVersion() { + return version; + } - public String version = ""; + public void setVersion(String version) { + this.version = version; + } - public boolean current; + public String getStatus() { + return status; + } - public boolean generalAvailability; + public void setStatus(String status) { + this.status = status; + } - public boolean preRelease; + public boolean isCurrent() { + return current; + } - public String versionDisplayName = ""; + public void setCurrent(boolean current) { + this.current = current; + } - public boolean snapshot; + public String getReferenceDocUrl() { + return referenceDocUrl; + } + + public void setReferenceDocUrl(String referenceDocUrl) { + this.referenceDocUrl = referenceDocUrl; + } + + public String getApiDocUrl() { + return apiDocUrl; + } + + public void setApiDocUrl(String apiDocUrl) { + this.apiDocUrl = apiDocUrl; + } @Override public String toString() { - return "Release{" + "releaseStatus='" + this.releaseStatus + '\'' + ", refDocUrl='" + this.refDocUrl + '\'' - + ", apiDocUrl='" + this.apiDocUrl + '\'' + ", groupId='" + this.groupId + '\'' + ", artifactId='" - + this.artifactId + '\'' + ", repository=" + this.repository + ", version='" + this.version + '\'' - + ", current=" + this.current + ", generalAvailability=" + this.generalAvailability + ", preRelease=" - + this.preRelease + ", versionDisplayName='" + this.versionDisplayName + '\'' + ", snapshot=" - + this.snapshot + '}'; + return new ToStringCreator(this).append("version", version).append("status", status).append("current", current) + .append("referenceDocUrl", referenceDocUrl).append("apiDocUrl", apiDocUrl).toString(); + } } diff --git a/releaser-core/src/main/java/releaser/internal/sagan/ReleaseUpdate.java b/releaser-core/src/main/java/releaser/internal/sagan/ReleaseInput.java similarity index 52% rename from releaser-core/src/main/java/releaser/internal/sagan/ReleaseUpdate.java rename to releaser-core/src/main/java/releaser/internal/sagan/ReleaseInput.java index e4b38f18..359957b1 100644 --- a/releaser-core/src/main/java/releaser/internal/sagan/ReleaseUpdate.java +++ b/releaser-core/src/main/java/releaser/internal/sagan/ReleaseInput.java @@ -18,34 +18,49 @@ package releaser.internal.sagan; import com.fasterxml.jackson.annotation.JsonInclude; +import org.springframework.core.style.ToStringCreator; + /** * @author Marcin Grzejszczak */ @JsonInclude(JsonInclude.Include.NON_NULL) -public class ReleaseUpdate { +public class ReleaseInput { - public String groupId = ""; + private String version = ""; - public String artifactId = ""; + private String referenceDocUrl = ""; - public String version = ""; + private String apiDocUrl = ""; - public String releaseStatus = ""; + public String getVersion() { + return this.version; + } - public String refDocUrl = ""; + public void setVersion(String version) { + this.version = version; + } - public String apiDocUrl = ""; + public String getReferenceDocUrl() { + return this.referenceDocUrl; + } - public Boolean current; + public void setReferenceDocUrl(String referenceDocUrl) { + this.referenceDocUrl = referenceDocUrl; + } - public Repository repository; + public String getApiDocUrl() { + return this.apiDocUrl; + } + + public void setApiDocUrl(String apiDocUrl) { + this.apiDocUrl = apiDocUrl; + } @Override public String toString() { - return "ReleaseUpdate{" + "groupId='" + this.groupId + '\'' + ", artifactId='" + this.artifactId + '\'' - + ", version='" + this.version + '\'' + ", releaseStatus='" + this.releaseStatus + '\'' - + ", refDocUrl='" + this.refDocUrl + '\'' + ", apiDocUrl='" + this.apiDocUrl + '\'' + ", repository=" - + this.repository + '}'; + return new ToStringCreator(this).append("version", version).append("referenceDocUrl", referenceDocUrl) + .append("apiDocUrl", apiDocUrl).toString(); + } } diff --git a/releaser-core/src/main/java/releaser/internal/sagan/RestTemplateSaganClient.java b/releaser-core/src/main/java/releaser/internal/sagan/RestTemplateSaganClient.java index a86d23d6..d90068d4 100644 --- a/releaser-core/src/main/java/releaser/internal/sagan/RestTemplateSaganClient.java +++ b/releaser-core/src/main/java/releaser/internal/sagan/RestTemplateSaganClient.java @@ -17,6 +17,7 @@ package releaser.internal.sagan; import java.net.URI; +import java.util.Collections; import java.util.List; import org.slf4j.Logger; @@ -49,47 +50,91 @@ class RestTemplateSaganClient implements SaganClient { @Override public Project getProject(String projectName) { - return this.restTemplate.getForObject(this.baseUrl + "/project_metadata/{projectName}", Project.class, - projectName); - } + HttpHeaders headers = new HttpHeaders(); + headers.put("Accept", Collections.singletonList("application/hal+json")); + Project project = this.restTemplate.exchange(this.baseUrl + "/api/projects/{projectName}", HttpMethod.GET, + new HttpEntity<>(headers), Project.class, projectName).getBody(); + if (project == null) { + return null; + } - @Override - public Release getRelease(String projectName, String releaseVersion) { - return this.restTemplate.getForObject( - this.baseUrl + "/project_metadata/{projectName}/releases/{releaseVersion}", Release.class, projectName, - releaseVersion); - } - - @Override - public Release deleteRelease(String projectName, String releaseVersion) { - ResponseEntity entity = this.restTemplate.exchange( - this.baseUrl + "/project_metadata/{projectName}/releases/{releaseVersion}", HttpMethod.DELETE, - new HttpEntity<>(""), Release.class, projectName, releaseVersion); - Release release = entity.getBody(); - log.info("Response from Sagan\n\n[{}] \n with body [{}]", entity, release); - return release; - } - - @Override - public Project updateRelease(String projectName, List releaseUpdates) { - RequestEntity> request = RequestEntity - .put(URI.create(this.baseUrl + "/project_metadata/" + projectName + "/releases")) - .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_UTF8_VALUE).body(releaseUpdates); - ResponseEntity entity = this.restTemplate.exchange(request, Project.class); - Project project = entity.getBody(); - log.info("Response from Sagan\n\n[{}] \n with body [{}]", entity, project); + EmbeddedProjectReleases body = this.restTemplate.exchange(this.baseUrl + "/api/projects/{projectName}/releases", + HttpMethod.GET, new HttpEntity<>(headers), EmbeddedProjectReleases.class, projectName).getBody(); + project.setReleases(body._embedded.releases); return project; } @Override - public Project patchProject(Project project) { - RequestEntity request = RequestEntity - .patch(URI.create(this.baseUrl + "/project_metadata/" + project.id)) - .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_UTF8_VALUE).body(project); + public Release getRelease(String projectName, String releaseVersion) { + HttpHeaders headers = new HttpHeaders(); + headers.put("Accept", Collections.singletonList("application/hal+json")); + return this.restTemplate.exchange(this.baseUrl + "/api/projects/{projectName}/releases/{releaseVersion}", + HttpMethod.GET, new HttpEntity<>(headers), Release.class, projectName, releaseVersion).getBody(); + } + + @Override + public boolean deleteRelease(String projectName, String releaseVersion) { + ResponseEntity entity = this.restTemplate.exchange( + this.baseUrl + "/api/projects/{projectName}/releases/{releaseVersion}", HttpMethod.DELETE, + new HttpEntity<>(""), Release.class, projectName, releaseVersion); + boolean deleted = entity.getStatusCode().is2xxSuccessful(); + log.info("Response from Sagan\n\n[{}] \n with status [{}]", entity, entity.getStatusCode()); + return deleted; + } + + @Override + public boolean addRelease(String projectName, ReleaseInput releaseInput) { + RequestEntity request = RequestEntity + .post(URI.create(this.baseUrl + "/api/projects/" + projectName + "/releases")) + .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_UTF8_VALUE).body(releaseInput); ResponseEntity entity = this.restTemplate.exchange(request, Project.class); - Project updatedProject = entity.getBody(); - log.info("Response from Sagan\n\n[{}] \n with body [{}]", entity, updatedProject); - return updatedProject; + boolean added = entity.getStatusCode().is2xxSuccessful(); + log.info("Response from Sagan\n\n[{}]", entity); + return added; + } + + @Override + public Project patchProject(Project project) { + // RequestEntity request = RequestEntity + // .patch(URI.create(this.baseUrl + "/project_metadata/" + project.getSlug())) + // .header(HttpHeaders.CONTENT_TYPE, + // MediaType.APPLICATION_JSON_UTF8_VALUE).body(project); + // ResponseEntity entity = this.restTemplate.exchange(request, + // Project.class); + // Project updatedProject = entity.getBody(); + // log.info("Response from Sagan\n\n[{}] \n with body [{}]", entity, + // updatedProject); + // return updatedProject; + // FIXME: no api yet https://github.com/spring-io/sagan/issues/1052 + return null; + } + + private static class EmbeddedProjectReleases { + + private ProjectReleases _embedded; + + public ProjectReleases get_embedded() { + return this._embedded; + } + + public void set_embedded(ProjectReleases _embedded) { + this._embedded = _embedded; + } + + } + + private static class ProjectReleases { + + private List releases; + + public List getReleases() { + return this.releases; + } + + public void setReleases(List releases) { + this.releases = releases; + } + } } diff --git a/releaser-core/src/main/java/releaser/internal/sagan/SaganClient.java b/releaser-core/src/main/java/releaser/internal/sagan/SaganClient.java index a1a94186..79a7fa3a 100644 --- a/releaser-core/src/main/java/releaser/internal/sagan/SaganClient.java +++ b/releaser-core/src/main/java/releaser/internal/sagan/SaganClient.java @@ -16,8 +16,6 @@ package releaser.internal.sagan; -import java.util.List; - /** * @author Marcin Grzejszczak */ @@ -27,9 +25,9 @@ public interface SaganClient { Release getRelease(String projectName, String releaseVersion); - Release deleteRelease(String projectName, String releaseVersion); + boolean deleteRelease(String projectName, String releaseVersion); - Project updateRelease(String projectName, List releaseUpdate); + boolean addRelease(String projectName, ReleaseInput releaseInput); Project patchProject(Project project); diff --git a/releaser-core/src/main/java/releaser/internal/sagan/SaganUpdater.java b/releaser-core/src/main/java/releaser/internal/sagan/SaganUpdater.java index 74c2087d..7f525d85 100644 --- a/releaser-core/src/main/java/releaser/internal/sagan/SaganUpdater.java +++ b/releaser-core/src/main/java/releaser/internal/sagan/SaganUpdater.java @@ -19,7 +19,6 @@ package releaser.internal.sagan; import java.io.File; import java.io.IOException; import java.nio.file.Files; -import java.util.Collections; import java.util.Comparator; import java.util.Optional; import java.util.stream.Collectors; @@ -57,13 +56,17 @@ public class SaganUpdater { + "is off. Set [releaser.sagan.update-sagan] to [true] to change that"); return ExecutionResult.skipped(); } - ReleaseUpdate update = releaseUpdate(branch, originalVersion, currentVersion, projects); + ReleaseInput update = releaseUpdate(branch, originalVersion, currentVersion, projects); Exception updateReleaseException = updateSaganForNonSnapshot(branch, originalVersion, currentVersion, projects); if (updateReleaseException == null) { log.info("Updating Sagan releases with \n\n{}", update); try { - Project project = this.saganClient.updateRelease(currentVersion.projectName, - Collections.singletonList(update)); + boolean added = this.saganClient.addRelease(currentVersion.projectName, update); + if (!added) { + return ExecutionResult.unstable( + new Exception("Unable to add release for project " + currentVersion.toPrettyString())); + } + Project project = saganClient.getProject(currentVersion.projectName); Optional projectVersion = latestVersion(currentVersion, project); log.info("Found the following latest project version [{}]", projectVersion); boolean present = projectVersion.isPresent(); @@ -95,20 +98,24 @@ public class SaganUpdater { if (indexDoc.exists()) { log.debug("Index adoc file exists"); String fileText = fileToText(indexDoc); - if (StringUtils.hasText(fileText) && !fileText.equals(project.rawOverview)) { - log.info("Index adoc content differs from the previously stored, will update it"); - project.rawOverview = fileText; - shouldUpdate = true; - } + // if (StringUtils.hasText(fileText) && !fileText.equals(project.rawOverview)) + // { + // log.info("Index adoc content differs from the previously stored, will + // update it"); + // project.rawOverview = fileText; + // shouldUpdate = true; + // } } if (bootDoc.exists()) { log.debug("Boot adoc file exists"); String fileText = fileToText(bootDoc); - if (StringUtils.hasText(fileText) && !fileText.equals(project.rawBootConfig)) { - log.info("Boot adoc content differs from the previously stored, will update it"); - project.rawBootConfig = fileText; - shouldUpdate = true; - } + // if (StringUtils.hasText(fileText) && + // !fileText.equals(project.rawBootConfig)) { + // log.info("Boot adoc content differs from the previously stored, will update + // it"); + // project.rawBootConfig = fileText; + // shouldUpdate = true; + // } } if (shouldUpdate) { this.saganClient.patchProject(project); @@ -136,8 +143,8 @@ public class SaganUpdater { if (project == null) { return Optional.empty(); } - return project.projectReleases.stream().filter(release -> release.current) - .map(release -> new ProjectVersion(currentVersion.projectName, release.version)) + return project.getReleases().stream().filter(Release::isCurrent) + .map(release -> new ProjectVersion(currentVersion.projectName, release.getVersion())) .max(Comparator.comparing(o -> o.version)); } @@ -154,15 +161,15 @@ public class SaganUpdater { if (project != null) { removeAllSameMinorVersions(version, project); } - String snapshot = toSnapshot(version.version); + String snapshot = toSnapshot(version); removeVersionFromSagan(version, snapshot); if (version.isRelease() || version.isServiceRelease()) { try { - String bumpedSnapshot = toSnapshot(version.bumpedVersion()); - ReleaseUpdate snapshotUpdate = releaseUpdate(branch, originalVersion, + String bumpedSnapshot = bumpedSnapshot(version); + ReleaseInput snapshotUpdate = releaseUpdate(branch, originalVersion, new ProjectVersion(version.projectName, bumpedSnapshot), projects); log.info("Updating Sagan with bumped snapshot \n\n[{}]", snapshotUpdate); - this.saganClient.updateRelease(version.projectName, Collections.singletonList(snapshotUpdate)); + this.saganClient.addRelease(version.projectName, snapshotUpdate); } catch (Exception e) { log.warn("Failed to update [" + version.projectName + "/" + snapshot + "] from Sagan", e); @@ -174,54 +181,46 @@ public class SaganUpdater { } private void removeAllSameMinorVersions(ProjectVersion version, Project project) { - project.projectReleases.stream().filter(release -> version.isSameMinor(release.version)) - .collect(Collectors.toList()).forEach(release -> removeVersionFromSagan(version, release.version)); + project.getReleases().stream().filter(release -> version.isSameMinor(release.getVersion())) + .collect(Collectors.toList()).forEach(release -> removeVersionFromSagan(version, release.getVersion())); } private void removeVersionFromSagan(ProjectVersion version, String snapshot) { log.info("Removing [{}/{}] from Sagan", version.projectName, snapshot); try { - this.saganClient.deleteRelease(version.projectName, snapshot); + boolean deleted = this.saganClient.deleteRelease(version.projectName, snapshot); + if (!deleted) { + log.warn("Failed to remove [" + version.projectName + "/" + snapshot + "] from Sagan"); + } } catch (Exception e) { log.warn("Failed to remove [" + version.projectName + "/" + snapshot + "] from Sagan", e); } } - private ReleaseUpdate releaseUpdate(String branch, ProjectVersion originalVersion, ProjectVersion version, + private ReleaseInput releaseUpdate(String branch, ProjectVersion originalVersion, ProjectVersion version, Projects projects) { - ReleaseUpdate update = new ReleaseUpdate(); - update.groupId = originalVersion.groupId(); - update.artifactId = version.projectName; - update.version = version.version; - update.releaseStatus = version(version); - update.apiDocUrl = referenceUrl(branch, version, projects); - update.refDocUrl = update.apiDocUrl; - update.current = true; + ReleaseInput update = new ReleaseInput(); + update.setVersion(version.version); + update.setReferenceDocUrl(referenceUrl(branch, version, projects)); + update.setApiDocUrl(null); return update; } - private String toSnapshot(String version) { + private String bumpedSnapshot(ProjectVersion projectVersion) { + String bumpedVersion = projectVersion.bumpedVersion(); + return toSnapshot(new ProjectVersion("", bumpedVersion)); + } + + private String toSnapshot(ProjectVersion projectVersion) { + String version = projectVersion.version; if (version.contains("RELEASE")) { return version.replace("RELEASE", "BUILD-SNAPSHOT"); } else if (version.matches(".*SR[0-9]+")) { return version.substring(0, version.lastIndexOf(".")) + ".BUILD-SNAPSHOT"; } - return version; - } - - private String version(ProjectVersion version) { - if (version.isSnapshot()) { - return "SNAPSHOT"; - } - else if (version.isMilestone() || version.isRc()) { - return "PRERELEASE"; - } - else if (version.isRelease() || version.isServiceRelease()) { - return "GENERAL_AVAILABILITY"; - } - return ""; + return projectVersion.toSnapshotVersion(); } private String releaseTrainVersion(Projects projects) { @@ -245,16 +244,7 @@ public class SaganUpdater { } private String newReferenceUrl(String branch, ProjectVersion version) { - if (!version.isSnapshot()) { - // static/sleuth/{version}/ - return "https://cloud.spring.io/spring-cloud-static/" + version.projectName + "/{version}/reference/html/"; - } - if (branch.toLowerCase().contains("main")) { - // sleuth/ - return "https://cloud.spring.io/" + version.projectName + "/reference/html/"; - } - // sleuth/1.1.x/ - return "https://cloud.spring.io/" + version.projectName + "/" + branch + "/reference/html/"; + return "https://docs.spring.io/" + version.projectName + "/docs/{version}/reference/html/"; } private String oldReferenceUrl(String branch, ProjectVersion version) { diff --git a/releaser-core/src/test/java/releaser/internal/project/ProjectCommandExecutorTests.java b/releaser-core/src/test/java/releaser/internal/project/ProjectCommandExecutorTests.java index 3525002e..17dcdb02 100644 --- a/releaser-core/src/test/java/releaser/internal/project/ProjectCommandExecutorTests.java +++ b/releaser-core/src/test/java/releaser/internal/project/ProjectCommandExecutorTests.java @@ -217,7 +217,7 @@ public class ProjectCommandExecutorTests { ProjectCommandExecutor builder = projectBuilder(properties); thenThrownBy(() -> builder.build(properties, original(), new ProjectVersion("foo", "1.0.0.BUILD-SNAPSHOT"))) - .hasMessageContaining("contains a tag that wasn't resolved properly"); + .hasStackTraceContaining("contains a tag that wasn't resolved properly"); } @Test @@ -229,7 +229,7 @@ public class ProjectCommandExecutorTests { ProjectCommandExecutor builder = projectBuilder(properties); thenThrownBy(() -> builder.build(properties, original(), new ProjectVersion("foo", "1.0.0.BUILD-SNAPSHOT"))) - .hasMessageContaining("Process waiting time of [0] minutes exceeded"); + .hasStackTraceContaining("Process waiting time of [0] minutes exceeded"); } @Test @@ -482,7 +482,7 @@ public class ProjectCommandExecutorTests { }; thenThrownBy(() -> builder.build(properties, original(), new ProjectVersion("foo", "1.0.0.BUILD-SNAPSHOT"))) - .hasMessageContaining("The process has exited with exit code [1]"); + .hasStackTraceContaining("The process has exited with exit code [1]"); } private TestReleaserProcessExecutor testExecutor(String workingDir) { diff --git a/releaser-core/src/test/java/releaser/internal/sagan/RestTemplateSaganClientTests.java b/releaser-core/src/test/java/releaser/internal/sagan/RestTemplateSaganClientTests.java index b309dcd1..064bed5d 100644 --- a/releaser-core/src/test/java/releaser/internal/sagan/RestTemplateSaganClientTests.java +++ b/releaser-core/src/test/java/releaser/internal/sagan/RestTemplateSaganClientTests.java @@ -17,12 +17,10 @@ package releaser.internal.sagan; import java.io.IOException; -import java.util.Arrays; -import java.util.List; import com.fasterxml.jackson.databind.ObjectMapper; +import org.junit.Ignore; import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; import releaser.internal.ReleaserProperties; @@ -41,7 +39,7 @@ import static org.assertj.core.api.BDDAssertions.then; * @author Marcin Grzejszczak */ @SpringBootTest(classes = RestTemplateSaganClientTests.Config.class) -@AutoConfigureStubRunner(ids = "sagan:sagan-site") +@AutoConfigureStubRunner(ids = "io.spring.sagan:sagan-site") public class RestTemplateSaganClientTests { @Value("${stubrunner.runningstubs.sagan-site.port}") @@ -61,134 +59,53 @@ public class RestTemplateSaganClientTests { } @Test - @Disabled("2 stubs point to the same endpoint") public void should_get_a_project() { - Project project = this.client.getProject("spring-framework"); + Project project = this.client.getProject("spring-boot"); - then(project.id).isEqualTo("spring-framework"); - then(project.name).isEqualTo("Spring Framework"); - then(project.repoUrl).isEqualTo("https://github.com/spring-projects/spring-framework"); - then(project.siteUrl).isEqualTo("https://projects.spring.io/spring-framework"); - then(project.category).isEqualTo("active"); - then(project.stackOverflowTags).isNotBlank(); - then(project.stackOverflowTagList).isNotEmpty(); - then(project.aggregator).isFalse(); - then(project.projectReleases).isNotEmpty(); - Release release = project.projectReleases.get(0); - then(release.releaseStatus).isEqualTo("PRERELEASE"); - then(release.refDocUrl).isEqualTo("http://docs.spring.io/spring/docs/5.0.0.RC4/spring-framework-reference/"); - then(release.apiDocUrl).isEqualTo("http://docs.spring.io/spring/docs/5.0.0.RC4/javadoc-api/"); - then(release.groupId).isEqualTo("org.springframework"); - then(release.artifactId).isEqualTo("spring-context"); - then(release.repository.id).isEqualTo("spring-milestones"); - then(release.repository.name).isEqualTo("Spring Milestones"); - then(release.repository.url).isEqualTo("https://repo.spring.io/libs-milestone"); - then(release.repository.snapshotsEnabled).isFalse(); - then(release.version).isEqualTo("5.0.0.RC4"); - then(release.current).isFalse(); - then(release.generalAvailability).isFalse(); - then(release.preRelease).isTrue(); - then(release.versionDisplayName).isEqualTo("5.0.0 RC4"); - then(release.snapshot).isFalse(); + then(project.getSlug()).isEqualTo("spring-boot"); + then(project.getName()).isEqualTo("Spring Boot"); + then(project.getRepositoryUrl()).isEqualTo("https://github.com/spring-projects/spring-boot"); + then(project.getStatus()).isEqualTo("ACTIVE"); + then(project.getReleases()).isNotEmpty(); + Release release = project.getReleases().get(0); + then(release.getStatus()).isEqualTo("PRERELEASE"); + then(release.getReferenceDocUrl()) + .isEqualTo("https://docs.spring.io/spring-boot/docs/2.4.0-M1/reference/html/"); + then(release.getApiDocUrl()).isEqualTo("https://docs.spring.io/spring-boot/docs/2.4.0-M1/api/"); + then(release.getVersion()).isEqualTo("2.4.0-M1"); } @Test public void should_get_a_release() { - Release release = this.client.getRelease("spring-framework", "5.0.0.RC4"); + Release release = this.client.getRelease("spring-boot", "2.3.0.RELEASE"); - then(release.releaseStatus).isEqualTo("PRERELEASE"); - then(release.refDocUrl).isEqualTo("http://docs.spring.io/spring/docs/{version}/spring-framework-reference/"); - then(release.apiDocUrl).isEqualTo("http://docs.spring.io/spring/docs/{version}/javadoc-api/"); - then(release.groupId).isEqualTo("org.springframework"); - then(release.artifactId).isEqualTo("spring-context"); - then(release.repository.id).isEqualTo("spring-milestones"); - then(release.repository.name).isEqualTo("Spring Milestones"); - then(release.repository.url).isEqualTo("https://repo.spring.io/libs-milestone"); - then(release.repository.snapshotsEnabled).isFalse(); - then(release.version).isEqualTo("5.0.0.RC4"); - then(release.current).isFalse(); - then(release.generalAvailability).isFalse(); - then(release.preRelease).isTrue(); - then(release.versionDisplayName).isEqualTo("5.0.0 RC4"); - then(release.snapshot).isFalse(); + then(release.getStatus()).isEqualTo("GENERAL_AVAILABILITY"); + then(release.getReferenceDocUrl()).isEqualTo("https://docs.spring.io/spring-boot/docs/current/reference/html/"); + then(release.getApiDocUrl()).isEqualTo("https://docs.spring.io/spring-boot/docs/current/api/"); + then(release.getVersion()).isEqualTo("2.3.0.RELEASE"); } @Test public void should_delete_a_release() { - Release release = this.client.deleteRelease("spring-framework", "5.0.0.RC4"); + boolean deleted = this.client.deleteRelease("spring-boot", "2.3.0.RELEASE"); - then(release).isNotNull(); - then(release.releaseStatus).isEqualTo("PRERELEASE"); + then(deleted).isTrue(); } @Test public void should_update_a_release() { - Repository snapshots = snapshots(); - Repository milestone = milestone(); - ReleaseUpdate firstRelease = new ReleaseUpdate(); - firstRelease.groupId = "org.springframework"; - firstRelease.artifactId = "spring-context"; - firstRelease.version = "1.2.8.RELEASE"; - firstRelease.releaseStatus = "PRERELEASE"; - firstRelease.refDocUrl = "http://docs.spring.io/spring/docs/{version}/spring-framework-reference/"; - firstRelease.apiDocUrl = "http://docs.spring.io/spring/docs/{version}/javadoc-api/"; - firstRelease.repository = milestone; + ReleaseInput releaseInput = new ReleaseInput(); + releaseInput.setVersion("2.2.0.RELEASE"); + releaseInput.setReferenceDocUrl("https://docs.spring.io/spring-boot/docs/{version}/reference/html/"); + releaseInput.setApiDocUrl("https://docs.spring.io/spring-boot/docs/{version}/api/"); - ReleaseUpdate secondRelease = new ReleaseUpdate(); - secondRelease.groupId = "org.springframework"; - secondRelease.artifactId = "spring-context"; - secondRelease.version = "5.0.0.BUILD-SNAPSHOT"; - secondRelease.releaseStatus = "SNAPSHOT"; - secondRelease.refDocUrl = "http://docs.spring.io/spring/docs/{version}/spring-framework-reference/"; - secondRelease.apiDocUrl = "http://docs.spring.io/spring/docs/{version}/javadoc-api/"; - secondRelease.repository = snapshots; - - ReleaseUpdate thirdRelease = new ReleaseUpdate(); - thirdRelease.groupId = "org.springframework"; - thirdRelease.artifactId = "spring-context"; - thirdRelease.version = "4.3.12.BUILD-SNAPSHOT"; - thirdRelease.releaseStatus = "SNAPSHOT"; - thirdRelease.refDocUrl = "http://docs.spring.io/spring/docs/{version}/spring-framework-reference/htmlsingle/"; - thirdRelease.apiDocUrl = "http://docs.spring.io/spring/docs/{version}/javadoc-api/"; - thirdRelease.repository = snapshots; - - ReleaseUpdate fourthRelease = new ReleaseUpdate(); - fourthRelease.groupId = "org.springframework"; - fourthRelease.artifactId = "spring-context"; - fourthRelease.version = "4.3.11.RELEASE"; - fourthRelease.releaseStatus = "GENERAL_AVAILABILITY"; - fourthRelease.current = true; - fourthRelease.refDocUrl = "http://docs.spring.io/spring/docs/current/spring-framework-reference/htmlsingle/"; - fourthRelease.apiDocUrl = "http://docs.spring.io/spring/docs/current/javadoc-api/"; - - ReleaseUpdate fithRelease = new ReleaseUpdate(); - fithRelease.groupId = "org.springframework"; - fithRelease.artifactId = "spring-context"; - fithRelease.version = "4.2.9.RELEASE"; - fithRelease.releaseStatus = "GENERAL_AVAILABILITY"; - fithRelease.refDocUrl = "http://docs.spring.io/spring/docs/{version}/spring-framework-reference/htmlsingle/"; - fithRelease.apiDocUrl = "http://docs.spring.io/spring/docs/{version}/javadoc-api/"; - - ReleaseUpdate sithRelease = new ReleaseUpdate(); - sithRelease.groupId = "org.springframework"; - sithRelease.artifactId = "spring-context"; - sithRelease.version = "3.2.18.RELEASE"; - sithRelease.releaseStatus = "GENERAL_AVAILABILITY"; - sithRelease.refDocUrl = "http://docs.spring.io/spring/docs/{version}/spring-framework-reference/htmlsingle/"; - sithRelease.apiDocUrl = "http://docs.spring.io/spring/docs/{version}/javadoc-api/"; - - List updates = Arrays.asList(firstRelease, secondRelease, thirdRelease, fourthRelease, - fithRelease, sithRelease); - - Project project = this.client.updateRelease("spring-framework", updates); - - then(project.id).isEqualTo("spring-framework"); - then(project.name).isEqualTo("Spring Framework"); - then(project.projectReleases).hasSize(7); + boolean added = this.client.addRelease("spring-boot", releaseInput); + then(added).isTrue(); } @Test + @Ignore("no api yet https://github.com/spring-io/sagan/issues/1052") public void should_patch_a_project() throws IOException { String projectJson = "{\n \"id\" : \"spring-framework\",\n " + "\"rawBootConfig\" : \"rawBootConfig\",\n \"rawOverview\" : \"rawOverview\",\n " @@ -199,10 +116,10 @@ public class RestTemplateSaganClientTests { Project patchedProject = this.client.patchProject(project); - then(patchedProject.id).isEqualTo("spring-framework"); - then(patchedProject.name).isEqualTo("Spring Framework"); - then(patchedProject.rawBootConfig).isEqualTo("rawBootConfig"); - then(patchedProject.rawOverview).isEqualTo("rawOverview"); + // then(patchedProject.id).isEqualTo("spring-framework"); + // then(patchedProject.name).isEqualTo("Spring Framework"); + // then(patchedProject.rawBootConfig).isEqualTo("rawBootConfig"); + // then(patchedProject.rawOverview).isEqualTo("rawOverview"); } private Repository milestone() { diff --git a/releaser-core/src/test/java/releaser/internal/sagan/SaganUpdaterOldDocsTest.java b/releaser-core/src/test/java/releaser/internal/sagan/SaganUpdaterOldDocsTest.java deleted file mode 100644 index 726bff5c..00000000 --- a/releaser-core/src/test/java/releaser/internal/sagan/SaganUpdaterOldDocsTest.java +++ /dev/null @@ -1,238 +0,0 @@ -/* - * Copyright 2013-2019 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package releaser.internal.sagan; - -import java.io.File; -import java.io.IOException; -import java.nio.file.Files; -import java.nio.file.Path; -import java.util.Arrays; -import java.util.Collections; -import java.util.List; - -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; -import org.mockito.ArgumentMatcher; -import org.mockito.BDDMockito; -import org.mockito.Mockito; -import releaser.internal.ReleaserProperties; -import releaser.internal.project.ProjectVersion; -import releaser.internal.project.Projects; - -import static org.mockito.ArgumentMatchers.anyString; -import static org.mockito.BDDMockito.given; -import static org.mockito.BDDMockito.then; -import static org.mockito.Mockito.never; - -/** - * @author Marcin Grzejszczak - */ -public class SaganUpdaterOldDocsTest { - - SaganClient saganClient = Mockito.mock(SaganClient.class); - - ReleaserProperties properties = new ReleaserProperties(); - - SaganUpdater saganUpdater; - - Projects projects = new Projects(); - - @BeforeEach - public void setup() { - Project project = new Project(); - project.projectReleases - .addAll(Arrays.asList(release("1.0.0.RC1"), release("1.1.0.BUILD-SNAPSHOT"), release("2.0.0.M4"))); - BDDMockito.given(this.saganClient.getProject(anyString())).willReturn(project); - this.properties.getSagan().setUpdateSagan(true); - this.saganUpdater = new SaganUpdater(this.saganClient, this.properties); - } - - private Release release(String version) { - Release release = new Release(); - release.version = version; - release.current = true; - return release; - } - - @Test - public void should_not_update_sagan_when_switch_is_off() { - this.properties.getSagan().setUpdateSagan(false); - - this.saganUpdater.updateSagan(new File("."), "master", version("2.2.0.M1"), version("2.2.0.M1"), projects); - - then(this.saganClient).shouldHaveNoInteractions(); - } - - @Test - public void should_update_sagan_releases_for_milestone() { - this.saganUpdater.updateSagan(new File("."), "master", version("1.0.0.M1"), version("1.0.0.M1"), projects); - - then(this.saganClient).should().updateRelease(BDDMockito.eq("foo"), - BDDMockito.argThat(withReleaseUpdate("1.0.0.M1", - "https://cloud.spring.io/spring-cloud-static/foo/{version}/", "PRERELEASE"))); - } - - @Test - public void should_update_sagan_releases_for_rc() { - this.saganUpdater.updateSagan(new File("."), "master", version("1.0.0.RC1"), version("1.0.0.RC1"), projects); - - then(this.saganClient).should().updateRelease(BDDMockito.eq("foo"), - BDDMockito.argThat(withReleaseUpdate("1.0.0.RC1", - "https://cloud.spring.io/spring-cloud-static/foo/{version}/", "PRERELEASE"))); - } - - @Test - public void should_not_update_docs_for_sagan_when_current_version_older() { - given(this.saganClient.updateRelease(BDDMockito.anyString(), BDDMockito.anyList())) - .willReturn(a2_0_0_ReleaseProject()); - - this.saganUpdater.updateSagan(new File("."), "master", version("1.0.0.RC1"), version("1.0.0.RC1"), projects); - - then(this.saganClient).should(BDDMockito.never()).patchProject(BDDMockito.any(Project.class)); - - } - - private Project a2_0_0_ReleaseProject() { - Project project = new Project(); - Release release = new Release(); - release.version = "2.0.0.RELEASE"; - release.current = true; - project.projectReleases = Collections.singletonList(release); - return project; - } - - @Test - public void should_not_update_docs_for_sagan_when_files_exist_but_content_does_not_differ() throws IOException { - Project project = a2_0_0_ReleaseProject(); - project.rawOverview = "new overview"; - project.rawBootConfig = "new boot"; - given(this.saganClient.updateRelease(BDDMockito.anyString(), BDDMockito.anyList())).willReturn(project); - - Path tmp = Files.createTempDirectory("releaser-test"); - createFile(tmp, "sagan-index.adoc", "new overview"); - createFile(tmp, "sagan-boot.adoc", "new boot"); - SaganUpdater saganUpdater = new SaganUpdater(this.saganClient, this.properties) { - @Override - File docsModule(File projectFile) { - return tmp.toFile(); - } - }; - - saganUpdater.updateSagan(new File("."), "master", version("3.0.0.RC1"), version("3.0.0.RC1"), projects); - - then(this.saganClient).should(BDDMockito.never()).patchProject(BDDMockito.any(Project.class)); - } - - @Test - public void should_update_docs_for_sagan_when_current_version_newer_and_only_overview_adoc_exists() - throws IOException { - given(this.saganClient.updateRelease(BDDMockito.anyString(), BDDMockito.anyList())) - .willReturn(a2_0_0_ReleaseProject()); - - Path tmp = Files.createTempDirectory("releaser-test"); - createFile(tmp, "sagan-index.adoc", "new text"); - SaganUpdater saganUpdater = new SaganUpdater(this.saganClient, this.properties) { - @Override - File docsModule(File projectFile) { - return tmp.toFile(); - } - }; - - saganUpdater.updateSagan(new File("."), "master", version("3.0.0.RC1"), version("3.0.0.RC1"), projects); - - then(this.saganClient).should() - .patchProject(BDDMockito.argThat(argument -> "new text".equals(argument.rawOverview))); - } - - @Test - public void should_update_docs_for_sagan_when_current_version_newer_and_only_boot_adoc_exists() throws IOException { - given(this.saganClient.updateRelease(BDDMockito.anyString(), BDDMockito.anyList())) - .willReturn(a2_0_0_ReleaseProject()); - - Path tmp = Files.createTempDirectory("releaser-test"); - createFile(tmp, "sagan-boot.adoc", "new text"); - SaganUpdater saganUpdater = new SaganUpdater(this.saganClient, this.properties) { - @Override - File docsModule(File projectFile) { - return tmp.toFile(); - } - }; - - saganUpdater.updateSagan(new File("."), "master", version("3.0.0.RC1"), version("3.0.0.RC1"), projects); - - then(this.saganClient).should() - .patchProject(BDDMockito.argThat(argument -> "new text".equals(argument.rawBootConfig))); - } - - private void createFile(Path tmp, String filename, String text) throws IOException { - File overviewAdoc = new File(tmp.toString(), filename); - overviewAdoc.createNewFile(); - Files.write(overviewAdoc.toPath(), text.getBytes()); - } - - private ProjectVersion version(String version) { - return new ProjectVersion("foo", version); - } - - @Test - public void should_update_sagan_from_main() { - ProjectVersion projectVersion = version("1.0.0.BUILD-SNAPSHOT"); - - this.saganUpdater.updateSagan(new File("."), "main", projectVersion, projectVersion, projects); - - then(this.saganClient).should().updateRelease(BDDMockito.eq("foo"), BDDMockito.argThat( - withReleaseUpdate("1.0.0.BUILD-SNAPSHOT", "https://cloud.spring.io/foo/foo.html", "SNAPSHOT"))); - } - - @Test - public void should_update_sagan_from_release_version() { - ProjectVersion projectVersion = version("1.0.0.RELEASE"); - - this.saganUpdater.updateSagan(new File("."), "main", projectVersion, projectVersion, projects); - - then(this.saganClient).should().deleteRelease("foo", "1.0.0.RC1"); - then(this.saganClient).should().deleteRelease("foo", "1.0.0.BUILD-SNAPSHOT"); - then(this.saganClient).should().updateRelease(BDDMockito.eq("foo"), - BDDMockito.argThat(withReleaseUpdate("1.0.0.RELEASE", - "https://cloud.spring.io/spring-cloud-static/foo/{version}/", "GENERAL_AVAILABILITY"))); - then(this.saganClient).should().deleteRelease("foo", "1.0.0.BUILD-SNAPSHOT"); - then(this.saganClient).should().updateRelease(BDDMockito.eq("foo"), BDDMockito.argThat( - withReleaseUpdate("1.0.1.BUILD-SNAPSHOT", "https://cloud.spring.io/foo/foo.html", "SNAPSHOT"))); - } - - @Test - public void should_update_sagan_from_non_main() { - ProjectVersion projectVersion = version("1.1.0.BUILD-SNAPSHOT"); - - this.saganUpdater.updateSagan(new File("."), "1.1.x", projectVersion, projectVersion, projects); - - then(this.saganClient).should(never()).deleteRelease(anyString(), anyString()); - then(this.saganClient).should().updateRelease(BDDMockito.eq("foo"), BDDMockito - .argThat(withReleaseUpdate("1.1.0.BUILD-SNAPSHOT", "https://cloud.spring.io/foo/1.1.x/", "SNAPSHOT"))); - } - - private ArgumentMatcher> withReleaseUpdate(final String version, final String refDocUrl, - final String releaseStatus) { - return argument -> { - ReleaseUpdate item = argument.get(0); - return "foo".equals(item.artifactId) && releaseStatus.equals(item.releaseStatus) - && version.equals(item.version) && refDocUrl.equals(item.apiDocUrl) - && refDocUrl.equals(item.refDocUrl) && item.current; - }; - } - -} diff --git a/releaser-core/src/test/java/releaser/internal/sagan/SaganUpdaterTest.java b/releaser-core/src/test/java/releaser/internal/sagan/SaganUpdaterTest.java index 5605b543..3078ba01 100644 --- a/releaser-core/src/test/java/releaser/internal/sagan/SaganUpdaterTest.java +++ b/releaser-core/src/test/java/releaser/internal/sagan/SaganUpdaterTest.java @@ -20,22 +20,25 @@ import java.io.File; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; +import java.util.ArrayList; import java.util.Arrays; -import java.util.Collections; -import java.util.List; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.mockito.ArgumentMatcher; -import org.mockito.BDDMockito; -import org.mockito.Mockito; import releaser.internal.ReleaserProperties; import releaser.internal.project.ProjectVersion; import releaser.internal.project.Projects; +import releaser.internal.tech.ExecutionResult; +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.ArgumentMatchers.argThat; +import static org.mockito.ArgumentMatchers.eq; import static org.mockito.BDDMockito.given; import static org.mockito.BDDMockito.then; +import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; /** @@ -43,7 +46,7 @@ import static org.mockito.Mockito.never; */ public class SaganUpdaterTest { - SaganClient saganClient = Mockito.mock(SaganClient.class); + SaganClient saganClient = mock(SaganClient.class); ReleaserProperties properties = new ReleaserProperties(); @@ -51,20 +54,20 @@ public class SaganUpdaterTest { Projects projects = new Projects(); + private Project project; + @BeforeEach public void setup() { - Project project = new Project(); - project.projectReleases - .addAll(Arrays.asList(release("2.2.0.RC1"), release("2.3.0.BUILD-SNAPSHOT"), release("2.2.0.M4"))); - BDDMockito.given(this.saganClient.getProject(anyString())).willReturn(project); + project = new Project(); + project.setReleases(Arrays.asList(release("2.2.0-RC1"), release("2.3.0-SNAPSHOT"), release("2.2.0-M4"))); this.properties.getSagan().setUpdateSagan(true); this.saganUpdater = new SaganUpdater(this.saganClient, this.properties); } private Release release(String version) { Release release = new Release(); - release.version = version; - release.current = true; + release.setVersion(version); + // release.setCurrent(true); return release; } @@ -72,55 +75,59 @@ public class SaganUpdaterTest { public void should_not_update_sagan_when_switch_is_off() { this.properties.getSagan().setUpdateSagan(false); - this.saganUpdater.updateSagan(new File("."), "master", version("2.2.0.M1"), version("2.2.0.M1"), projects); + ExecutionResult result = this.saganUpdater.updateSagan(new File("."), "main", version("2.2.0-M1"), + version("2.2.0-M1"), projects); + assertThat(result.isSkipped()).isTrue(); then(this.saganClient).shouldHaveNoInteractions(); } @Test public void should_update_sagan_releases_for_milestone() { - this.saganUpdater.updateSagan(new File("."), "master", version("2.2.0.M1"), version("2.2.0.M1"), projects); + given(this.saganClient.addRelease(eq("foo"), any())).willReturn(true); + given(this.saganClient.getProject("foo")).willReturn(projectWithNewRelease("2.2.0-M1")); - then(this.saganClient).should().updateRelease(BDDMockito.eq("foo"), - BDDMockito.argThat(withReleaseUpdate("2.2.0.M1", - "https://cloud.spring.io/spring-cloud-static/foo/{version}/reference/html/", "PRERELEASE"))); + ExecutionResult result = this.saganUpdater.updateSagan(new File("."), "main", version("2.2.0-M1"), + version("2.2.0-M1"), projects); + assertThat(result.isSkipped()).isFalse(); + assertThat(result.isSuccess()).isTrue(); + + then(this.saganClient).should().addRelease(eq("foo"), + argThat(withReleaseUpdate("2.2.0-M1", "https://docs.spring.io/foo/docs/{version}/reference/html/"))); } @Test public void should_update_sagan_releases_for_rc() { - this.saganUpdater.updateSagan(new File("."), "master", version("2.2.0.RC1"), version("2.2.0.RC1"), projects); + given(this.saganClient.addRelease(anyString(), any())).willReturn(true); + given(this.saganClient.getProject("foo")).willReturn(projectWithNewRelease("2.2.0-RC1")); - then(this.saganClient).should().updateRelease(BDDMockito.eq("foo"), - BDDMockito.argThat(withReleaseUpdate("2.2.0.RC1", - "https://cloud.spring.io/spring-cloud-static/foo/{version}/reference/html/", "PRERELEASE"))); + ExecutionResult result = this.saganUpdater.updateSagan(new File("."), "main", version("2.2.0-RC1"), + version("2.2.0-RC1"), projects); + assertThat(result.isSkipped()).isFalse(); + assertThat(result.isSuccess()).isTrue(); + + then(this.saganClient).should().addRelease(eq("foo"), + argThat(withReleaseUpdate("2.2.0-RC1", "https://docs.spring.io/foo/docs/{version}/reference/html/"))); } @Test public void should_not_update_docs_for_sagan_when_current_version_older() { - given(this.saganClient.updateRelease(BDDMockito.anyString(), BDDMockito.anyList())) - .willReturn(a2_0_0_ReleaseProject()); + given(this.saganClient.addRelease(anyString(), any())).willReturn(true); + given(this.saganClient.getProject("foo")).willReturn(projectWithNewRelease("2.2.0-RC1")); - this.saganUpdater.updateSagan(new File("."), "master", version("2.2.0.RC1"), version("2.2.0.RC1"), projects); + ExecutionResult result = this.saganUpdater.updateSagan(new File("."), "main", version("2.2.0-RC1"), + version("2.2.0-RC1"), projects); + assertThat(result.isSkipped()).isFalse(); + assertThat(result.isSuccess()).isTrue(); - then(this.saganClient).should(BDDMockito.never()).patchProject(BDDMockito.any(Project.class)); + then(this.saganClient).should(never()).patchProject(any(Project.class)); } - private Project a2_0_0_ReleaseProject() { - Project project = new Project(); - Release release = new Release(); - release.version = "2.0.0.RELEASE"; - release.current = true; - project.projectReleases = Collections.singletonList(release); - return project; - } - @Test public void should_not_update_docs_for_sagan_when_files_exist_but_content_does_not_differ() throws IOException { - Project project = a2_0_0_ReleaseProject(); - project.rawOverview = "new overview"; - project.rawBootConfig = "new boot"; - given(this.saganClient.updateRelease(BDDMockito.anyString(), BDDMockito.anyList())).willReturn(project); + given(this.saganClient.addRelease(anyString(), any())).willReturn(true); + given(this.saganClient.getProject("foo")).willReturn(projectWithNewRelease("3.0.0-RC1")); Path tmp = Files.createTempDirectory("releaser-test"); createFile(tmp, "sagan-index.adoc", "new overview"); @@ -132,16 +139,19 @@ public class SaganUpdaterTest { } }; - saganUpdater.updateSagan(new File("."), "master", version("3.0.0.RC1"), version("3.0.0.RC1"), projects); + ExecutionResult result = saganUpdater.updateSagan(new File("."), "main", version("3.0.0-RC1"), + version("3.0.0-RC1"), projects); + assertThat(result.isSkipped()).isFalse(); + assertThat(result.isSuccess()).isTrue(); - then(this.saganClient).should(BDDMockito.never()).patchProject(BDDMockito.any(Project.class)); + then(this.saganClient).should(never()).patchProject(any(Project.class)); } @Test public void should_update_docs_for_sagan_when_current_version_newer_and_only_overview_adoc_exists() throws IOException { - given(this.saganClient.updateRelease(BDDMockito.anyString(), BDDMockito.anyList())) - .willReturn(a2_0_0_ReleaseProject()); + given(this.saganClient.addRelease(anyString(), any())).willReturn(true); + given(this.saganClient.getProject("foo")).willReturn(projectWithNewRelease("3.0.0-RC1")); Path tmp = Files.createTempDirectory("releaser-test"); createFile(tmp, "sagan-index.adoc", "new text"); @@ -152,16 +162,19 @@ public class SaganUpdaterTest { } }; - saganUpdater.updateSagan(new File("."), "master", version("3.0.0.RC1"), version("3.0.0.RC1"), projects); + ExecutionResult result = saganUpdater.updateSagan(new File("."), "main", version("3.0.0-RC1"), + version("3.0.0-RC1"), projects); + assertThat(result.isSkipped()).isFalse(); + assertThat(result.isSuccess()).isTrue(); - then(this.saganClient).should() - .patchProject(BDDMockito.argThat(argument -> "new text".equals(argument.rawOverview))); + // FIXME: then(this.saganClient).should().patchProject(argThat(argument -> "new + // text".equals(argument.rawOverview))); } @Test public void should_update_docs_for_sagan_when_current_version_newer_and_only_boot_adoc_exists() throws IOException { - given(this.saganClient.updateRelease(BDDMockito.anyString(), BDDMockito.anyList())) - .willReturn(a2_0_0_ReleaseProject()); + given(this.saganClient.addRelease(anyString(), any())).willReturn(true); + given(this.saganClient.getProject("foo")).willReturn(projectWithNewRelease("3.0.0-RC1")); Path tmp = Files.createTempDirectory("releaser-test"); createFile(tmp, "sagan-boot.adoc", "new text"); @@ -172,10 +185,13 @@ public class SaganUpdaterTest { } }; - saganUpdater.updateSagan(new File("."), "master", version("3.0.0.RC1"), version("3.0.0.RC1"), projects); + ExecutionResult result = saganUpdater.updateSagan(new File("."), "main", version("3.0.0-RC1"), + version("3.0.0-RC1"), projects); + assertThat(result.isSkipped()).isFalse(); + assertThat(result.isSuccess()).isTrue(); - then(this.saganClient).should() - .patchProject(BDDMockito.argThat(argument -> "new text".equals(argument.rawBootConfig))); + // FIXME: then(this.saganClient).should().patchProject(argThat(argument -> "new + // text".equals(argument.rawBootConfig))); } private void createFile(Path tmp, String filename, String text) throws IOException { @@ -190,50 +206,80 @@ public class SaganUpdaterTest { @Test public void should_update_sagan_from_main() { - ProjectVersion projectVersion = version("2.2.0.BUILD-SNAPSHOT"); + ProjectVersion projectVersion = version("2.4.0-SNAPSHOT"); + given(this.saganClient.addRelease(anyString(), any())).willReturn(true); + given(this.saganClient.getProject("foo")).willReturn(projectWithNewRelease("2.4.0-SNAPSHOT")); - this.saganUpdater.updateSagan(new File("."), "main", projectVersion, projectVersion, projects); + Project updated = new Project(); + updated.setReleases(new ArrayList<>(project.getReleases())); + updated.getReleases().add(release(projectVersion.version)); + given(this.saganClient.getProject(anyString())).willReturn(updated); - then(this.saganClient).should().updateRelease(BDDMockito.eq("foo"), BDDMockito.argThat( - withReleaseUpdate("2.2.0.BUILD-SNAPSHOT", "https://cloud.spring.io/foo/reference/html/", "SNAPSHOT"))); + ExecutionResult result = this.saganUpdater.updateSagan(new File("."), "main", projectVersion, projectVersion, + projects); + // FIXME: assertThat(result.isSkipped()).isFalse(); + assertThat(result.isSuccess()).isTrue(); + + then(this.saganClient).should().addRelease(eq("foo"), argThat( + withReleaseUpdate("2.4.0-SNAPSHOT", "https://docs.spring.io/foo/docs/{version}/reference/html/"))); } @Test public void should_update_sagan_from_release_version() { - ProjectVersion projectVersion = version("2.2.0.RELEASE"); + ProjectVersion projectVersion = version("2.2.0"); + given(this.saganClient.addRelease(eq("foo"), any())).willReturn(true); + given(this.saganClient.deleteRelease("foo", "2.2.0-RC1")).willReturn(true); + given(this.saganClient.deleteRelease("foo", "2.2.0-SNAPSHOT")).willReturn(true); + given(this.saganClient.deleteRelease("foo", "2.2.0-M4")).willReturn(true); + given(this.saganClient.getProject("foo")).willReturn(projectWithNewRelease("2.2.0")); - this.saganUpdater.updateSagan(new File("."), "main", projectVersion, projectVersion, projects); + ExecutionResult result = this.saganUpdater.updateSagan(new File("."), "main", projectVersion, projectVersion, + projects); + assertThat(result.isSkipped()).isFalse(); + assertThat(result.isSuccess()).isTrue(); - then(this.saganClient).should().deleteRelease("foo", "2.2.0.RC1"); - then(this.saganClient).should().deleteRelease("foo", "2.2.0.BUILD-SNAPSHOT"); - then(this.saganClient).should().updateRelease(BDDMockito.eq("foo"), - BDDMockito.argThat(withReleaseUpdate("2.2.0.RELEASE", - "https://cloud.spring.io/spring-cloud-static/foo/{version}/reference/html/", - "GENERAL_AVAILABILITY"))); - then(this.saganClient).should().deleteRelease("foo", "2.2.0.BUILD-SNAPSHOT"); - then(this.saganClient).should().updateRelease(BDDMockito.eq("foo"), BDDMockito.argThat( - withReleaseUpdate("2.2.1.BUILD-SNAPSHOT", "https://cloud.spring.io/foo/reference/html/", "SNAPSHOT"))); + then(this.saganClient).should().deleteRelease("foo", "2.2.0-RC1"); + then(this.saganClient).should().deleteRelease("foo", "2.2.0-SNAPSHOT"); + then(this.saganClient).should().addRelease(eq("foo"), + argThat(withReleaseUpdate("2.2.0", "https://docs.spring.io/foo/docs/{version}/reference/html/"))); + then(this.saganClient).should().deleteRelease("foo", "2.2.0-SNAPSHOT"); + then(this.saganClient).should().addRelease(eq("foo"), argThat( + withReleaseUpdate("2.2.1-SNAPSHOT", "https://docs.spring.io/foo/docs/{version}/reference/html/"))); } @Test - public void should_update_sagan_from_non_master() { - ProjectVersion projectVersion = version("2.3.0.BUILD-SNAPSHOT"); + public void should_update_sagan_from_non_main() { + ProjectVersion projectVersion = version("2.3.0-SNAPSHOT"); + given(this.saganClient.addRelease(eq("foo"), any())).willReturn(true); + given(this.saganClient.getProject("foo")).willReturn(projectWithNewRelease("2.3.0-SNAPSHOT")); - this.saganUpdater.updateSagan(new File("."), "2.3.x", projectVersion, projectVersion, projects); + ExecutionResult result = this.saganUpdater.updateSagan(new File("."), "2.3.x", projectVersion, projectVersion, + projects); + assertThat(result.isSkipped()).isFalse(); + assertThat(result.isSuccess()).isTrue(); then(this.saganClient).should(never()).deleteRelease(anyString(), anyString()); - then(this.saganClient).should().updateRelease(BDDMockito.eq("foo"), - BDDMockito.argThat(withReleaseUpdate("2.3.0.BUILD-SNAPSHOT", - "https://cloud.spring.io/foo/2.3.x/reference/html/", "SNAPSHOT"))); + then(this.saganClient).should().addRelease(eq("foo"), argThat( + withReleaseUpdate("2.3.0-SNAPSHOT", "https://docs.spring.io/foo/docs/{version}/reference/html/"))); } - private ArgumentMatcher> withReleaseUpdate(final String version, final String refDocUrl, - final String releaseStatus) { + private Project projectWithNewRelease(String version) { + Project p = new Project(); + p.setName(project.getName()); + p.setSlug(project.getSlug()); + p.setRepositoryUrl(project.getRepositoryUrl()); + p.setReleases(new ArrayList<>(project.getReleases())); + Release release = release(version); + release.setCurrent(true); + p.getReleases().add(release); + return p; + } + + private ArgumentMatcher withReleaseUpdate(final String version, final String refDocUrl) { return argument -> { - ReleaseUpdate item = argument.get(0); - return "foo".equals(item.artifactId) && releaseStatus.equals(item.releaseStatus) - && version.equals(item.version) && refDocUrl.equals(item.apiDocUrl) - && refDocUrl.equals(item.refDocUrl) && item.current; + ReleaseInput item = argument; + return version.equals(item.getVersion()) && item.getApiDocUrl() == null + && refDocUrl.equals(item.getReferenceDocUrl()); }; } diff --git a/releaser-spring/pom.xml b/releaser-spring/pom.xml index e69f4558..5af6a319 100644 --- a/releaser-spring/pom.xml +++ b/releaser-spring/pom.xml @@ -59,6 +59,11 @@ spring-boot-starter-test test + + org.junit.vintage + junit-vintage-engine + test + diff --git a/releaser-spring/src/main/java/releaser/ReleaserCommandLineRunner.java b/releaser-spring/src/main/java/releaser/ReleaserCommandLineRunner.java index bb68dbc3..e1b6725a 100644 --- a/releaser-spring/src/main/java/releaser/ReleaserCommandLineRunner.java +++ b/releaser-spring/src/main/java/releaser/ReleaserCommandLineRunner.java @@ -32,8 +32,8 @@ public class ReleaserCommandLineRunner implements CommandLineRunner { private final Parser parser; - public ReleaserCommandLineRunner(SpringReleaser releaser, - ExecutionResultHandler executionResultHandler, Parser parser) { + public ReleaserCommandLineRunner(SpringReleaser releaser, ExecutionResultHandler executionResultHandler, + Parser parser) { this.releaser = releaser; this.executionResultHandler = executionResultHandler; this.parser = parser; diff --git a/releaser-spring/src/main/java/releaser/internal/buildsystem/BuildsystemConfiguration.java b/releaser-spring/src/main/java/releaser/internal/buildsystem/BuildsystemConfiguration.java index 247ba5d6..5cf26b30 100644 --- a/releaser-spring/src/main/java/releaser/internal/buildsystem/BuildsystemConfiguration.java +++ b/releaser-spring/src/main/java/releaser/internal/buildsystem/BuildsystemConfiguration.java @@ -36,8 +36,7 @@ class BuildsystemConfiguration { return new MavenBomParser(releaserProperties, customBomParsers(customBomParsers)); } - private List customBomParsers( - List customBomParsers) { + private List customBomParsers(List customBomParsers) { return customBomParsers == null ? new ArrayList<>() : customBomParsers; } @@ -45,14 +44,12 @@ class BuildsystemConfiguration { @ConditionalOnMissingBean BomParser gradleBomParser(ReleaserProperties releaserProperties, @Autowired(required = false) List customBomParsers) { - return new GradleBomParser(releaserProperties, - customBomParsers(customBomParsers)); + return new GradleBomParser(releaserProperties, customBomParsers(customBomParsers)); } @Bean @ConditionalOnMissingBean - ProjectPomUpdater pomUpdater(ReleaserProperties releaserProperties, - List bomParsers) { + ProjectPomUpdater pomUpdater(ReleaserProperties releaserProperties, List bomParsers) { return new ProjectPomUpdater(releaserProperties, bomParsers); } diff --git a/releaser-spring/src/main/java/releaser/internal/github/GithubConfiguration.java b/releaser-spring/src/main/java/releaser/internal/github/GithubConfiguration.java index 4160366e..a7ff9940 100644 --- a/releaser-spring/src/main/java/releaser/internal/github/GithubConfiguration.java +++ b/releaser-spring/src/main/java/releaser/internal/github/GithubConfiguration.java @@ -31,8 +31,7 @@ class GithubConfiguration { BeanPostProcessor cachingGithubBeanPostProcessor() { return new BeanPostProcessor() { @Override - public Object postProcessAfterInitialization(Object bean, String beanName) - throws BeansException { + public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { if (bean instanceof RtGithub) { return new CachingGithub((Github) bean); } diff --git a/releaser-spring/src/main/java/releaser/internal/options/Options.java b/releaser-spring/src/main/java/releaser/internal/options/Options.java index 9837df92..b566b61a 100644 --- a/releaser-spring/src/main/java/releaser/internal/options/Options.java +++ b/releaser-spring/src/main/java/releaser/internal/options/Options.java @@ -60,14 +60,13 @@ public class Options implements Serializable { */ public String range = ""; - Options(Boolean metaRelease, Boolean fullRelease, Boolean interactive, Boolean dryRun, - List taskNames, String startFrom, String range) { + Options(Boolean metaRelease, Boolean fullRelease, Boolean interactive, Boolean dryRun, List taskNames, + String startFrom, String range) { this.metaRelease = metaRelease; this.fullRelease = fullRelease; this.interactive = interactive; this.dryRun = dryRun; - this.taskNames = taskNames.stream().map(this::removeQuotingChars) - .collect(Collectors.toList()); + this.taskNames = taskNames.stream().map(this::removeQuotingChars).collect(Collectors.toList()); this.startFrom = removeQuotingChars(startFrom); this.range = removeQuotingChars(range); } @@ -81,9 +80,8 @@ public class Options implements Serializable { @Override public String toString() { - return "Options{" + "metaRelease=" + this.metaRelease + ", fullRelease=" - + this.fullRelease + ", interactive=" + this.interactive + ", dryRun=" - + this.dryRun + ", taskNames=" + this.taskNames + ", startFrom='" + return "Options{" + "metaRelease=" + this.metaRelease + ", fullRelease=" + this.fullRelease + ", interactive=" + + this.interactive + ", dryRun=" + this.dryRun + ", taskNames=" + this.taskNames + ", startFrom='" + this.startFrom + '\'' + ", range='" + this.range + '\'' + '}'; } diff --git a/releaser-spring/src/main/java/releaser/internal/options/OptionsBuilder.java b/releaser-spring/src/main/java/releaser/internal/options/OptionsBuilder.java index e1924395..f416aaf1 100644 --- a/releaser-spring/src/main/java/releaser/internal/options/OptionsBuilder.java +++ b/releaser-spring/src/main/java/releaser/internal/options/OptionsBuilder.java @@ -71,8 +71,8 @@ public class OptionsBuilder { } public Options options() { - return new Options(this.metaRelease, this.fullRelease, this.interactive, - this.dryRun, this.taskNames, this.startFrom, this.range); + return new Options(this.metaRelease, this.fullRelease, this.interactive, this.dryRun, this.taskNames, + this.startFrom, this.range); } } diff --git a/releaser-spring/src/main/java/releaser/internal/sagan/SaganConfiguration.java b/releaser-spring/src/main/java/releaser/internal/sagan/SaganConfiguration.java index d7ed76c9..88d4d7a1 100644 --- a/releaser-spring/src/main/java/releaser/internal/sagan/SaganConfiguration.java +++ b/releaser-spring/src/main/java/releaser/internal/sagan/SaganConfiguration.java @@ -16,8 +16,6 @@ package releaser.internal.sagan; -import java.util.List; - import releaser.internal.ReleaserProperties; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; @@ -44,8 +42,7 @@ class SaganConfiguration { @Bean @ConditionalOnMissingBean - @ConditionalOnProperty(value = "releaser.sagan.update-sagan", havingValue = "false", - matchIfMissing = true) + @ConditionalOnProperty(value = "releaser.sagan.update-sagan", havingValue = "false", matchIfMissing = true) SaganClient noOpSaganClient() { return new SaganClient() { @Override @@ -59,14 +56,13 @@ class SaganConfiguration { } @Override - public Release deleteRelease(String projectName, String releaseVersion) { - return null; + public boolean deleteRelease(String projectName, String releaseVersion) { + return false; } @Override - public Project updateRelease(String projectName, - List releaseUpdate) { - return null; + public boolean addRelease(String projectName, ReleaseInput releaseInput) { + return false; } @Override @@ -81,8 +77,7 @@ class SaganConfiguration { "In order to connect to Sagan you need to pass the Github OAuth token. " + "You can do it via the [--releaser.git.oauth-token=...] " + "command line argument or an env variable [export RELEASER_GIT_OAUTH_TOKEN=...]."); - return new RestTemplateBuilder() - .basicAuthentication(properties.getGit().getOauthToken(), "").build(); + return new RestTemplateBuilder().basicAuthentication(properties.getGit().getOauthToken(), "").build(); } } diff --git a/releaser-spring/src/main/java/releaser/internal/spring/Arguments.java b/releaser-spring/src/main/java/releaser/internal/spring/Arguments.java index f6875015..c5b4176e 100644 --- a/releaser-spring/src/main/java/releaser/internal/spring/Arguments.java +++ b/releaser-spring/src/main/java/releaser/internal/spring/Arguments.java @@ -80,34 +80,29 @@ public final class Arguments implements Serializable { */ public final List processedProjects; - private Arguments(ProjectToRun thisProject, Projects projects, - ProjectVersion currentProjectFromBom) { + private Arguments(ProjectToRun thisProject, Projects projects, ProjectVersion currentProjectFromBom) { this.project = thisProject.thisProjectFolder; this.projects = projects; this.originalVersion = thisProject.originalVersion; - log.info("Creating Arguments for: " + thisProject.name() + "; Original version: " - + this.originalVersion); + log.info("Creating Arguments for: " + thisProject.name() + "; Original version: " + this.originalVersion); Assert.isTrue(this.originalVersion != null && this.originalVersion.version != null, "Original Version must not be null for project: " + thisProject.name()); this.versionFromBom = currentProjectFromBom; this.properties = thisProject.thisProjectReleaserProperties; this.options = thisProject.options; this.projectToRun = thisProject; - this.processedProjects = new LinkedList<>(Collections.singletonList( - new ProcessedProject(thisProject.thisProjectReleaserProperties, - this.versionFromBom, this.originalVersion))); + this.processedProjects = new LinkedList<>(Collections.singletonList(new ProcessedProject( + thisProject.thisProjectReleaserProperties, this.versionFromBom, this.originalVersion))); } // in this case the project will be the BOM - private Arguments(ProjectToRun thisProject, - List processedProjects) { + private Arguments(ProjectToRun thisProject, List processedProjects) { this.project = thisProject.thisProjectFolder; - this.projects = new Projects(processedProjects.stream() - .map(p -> p.newProjectVersion).collect(Collectors.toSet())); + this.projects = new Projects( + processedProjects.stream().map(p -> p.newProjectVersion).collect(Collectors.toSet())); this.originalVersion = thisProject.originalVersion; - log.info("Creating Arguments for: " + thisProject.name() + "; Original version: " - + this.originalVersion); + log.info("Creating Arguments for: " + thisProject.name() + "; Original version: " + this.originalVersion); Assert.isTrue(this.originalVersion != null && this.originalVersion.version != null, "Original Version must not be null for project: " + thisProject.name()); this.versionFromBom = thisProject.thisProjectVersionFromBom; @@ -118,41 +113,28 @@ public final class Arguments implements Serializable { } public static Arguments forProject(ProjectToRun thisProject) { - return new Arguments(thisProject, - thisProject.allProjectsFromBom.allProjectVersionsFromBom, + return new Arguments(thisProject, thisProject.allProjectsFromBom.allProjectVersionsFromBom, thisProject.allProjectsFromBom.currentProjectFromBom); } - public static Arguments forPostRelease(ReleaserProperties properties, - ProjectsToRun projectsToRun) { - List projects = projectsToRun.stream() - .map(ProjectToRun.ProjectToRunSupplier::get) + public static Arguments forPostRelease(ReleaserProperties properties, ProjectsToRun projectsToRun) { + List projects = projectsToRun.stream().map(ProjectToRun.ProjectToRunSupplier::get) .collect(Collectors.toCollection(LinkedList::new)); - List processedProjects = projectsToRunToProcessedProject( - projects); - ProjectToRun releaseTrainProject = projects.stream() - .filter(p -> isReleaseTrainProject(properties, p)).findFirst() - .orElseThrow( - () -> new IllegalStateException("Missing release train version")); + List processedProjects = projectsToRunToProcessedProject(projects); + ProjectToRun releaseTrainProject = projects.stream().filter(p -> isReleaseTrainProject(properties, p)) + .findFirst().orElseThrow(() -> new IllegalStateException("Missing release train version")); return new Arguments(releaseTrainProject, processedProjects); } - private static boolean isReleaseTrainProject(ReleaserProperties properties, - ProjectToRun p) { - return p.originalVersion.projectName - .equals(properties.getMetaRelease().getReleaseTrainProjectName()) - || properties.getMetaRelease().getReleaseTrainDependencyNames() - .contains(p.originalVersion.projectName) - || p.name() - .equals(properties.getMetaRelease().getReleaseTrainProjectName()); + private static boolean isReleaseTrainProject(ReleaserProperties properties, ProjectToRun p) { + return p.originalVersion.projectName.equals(properties.getMetaRelease().getReleaseTrainProjectName()) + || properties.getMetaRelease().getReleaseTrainDependencyNames().contains(p.originalVersion.projectName) + || p.name().equals(properties.getMetaRelease().getReleaseTrainProjectName()); } - private static List projectsToRunToProcessedProject( - List projects) { - return projects.stream() - .map(p -> new ProcessedProject(p.thisProjectReleaserProperties, - p.thisProjectVersionFromBom, p.originalVersion)) - .collect(Collectors.toCollection(LinkedList::new)); + private static List projectsToRunToProcessedProject(List projects) { + return projects.stream().map(p -> new ProcessedProject(p.thisProjectReleaserProperties, + p.thisProjectVersionFromBom, p.originalVersion)).collect(Collectors.toCollection(LinkedList::new)); } public ProjectVersion releaseTrain() { @@ -161,11 +143,9 @@ public final class Arguments implements Serializable { @Override public String toString() { - return "Arguments{" + "project=" + project + ", projects=" + projects - + ", originalVersion=" + originalVersion + ", versionFromBom=" - + versionFromBom + ", properties=" + properties + ", options=" + options - + ", projectToRun=" + projectToRun + ", processedProjects=" - + processedProjects + '}'; + return "Arguments{" + "project=" + project + ", projects=" + projects + ", originalVersion=" + originalVersion + + ", versionFromBom=" + versionFromBom + ", properties=" + properties + ", options=" + options + + ", projectToRun=" + projectToRun + ", processedProjects=" + processedProjects + '}'; } } diff --git a/releaser-spring/src/main/java/releaser/internal/spring/BatchConfiguration.java b/releaser-spring/src/main/java/releaser/internal/spring/BatchConfiguration.java index 65ec95d0..0bc61646 100644 --- a/releaser-spring/src/main/java/releaser/internal/spring/BatchConfiguration.java +++ b/releaser-spring/src/main/java/releaser/internal/spring/BatchConfiguration.java @@ -62,8 +62,7 @@ class BatchConfiguration { @Bean @ConditionalOnMissingBean(ExecutionResultHandler.class) - SpringBatchExecutionResultHandler springBatchExecutionResultHandler( - BuildReportHandler buildReportHandler, + SpringBatchExecutionResultHandler springBatchExecutionResultHandler(BuildReportHandler buildReportHandler, ConfigurableApplicationContext context) { return new SpringBatchExecutionResultHandler(buildReportHandler, context); } @@ -77,15 +76,12 @@ class BatchConfiguration { @Bean @ConditionalOnMissingBean - FlowRunner flowRunner(StepBuilderFactory stepBuilderFactory, - JobBuilderFactory jobBuilderFactory, + FlowRunner flowRunner(StepBuilderFactory stepBuilderFactory, JobBuilderFactory jobBuilderFactory, ProjectsToRunFactory projectsToRunFactory, JobLauncher jobLauncher, - FlowRunnerTaskExecutorSupplier flowRunnerTaskExecutorSupplier, - ConfigurableApplicationContext context, ReleaserProperties releaserProperties, - BuildReportHandler reportHandler) { - return new SpringBatchFlowRunner(stepBuilderFactory, jobBuilderFactory, - projectsToRunFactory, jobLauncher, flowRunnerTaskExecutorSupplier, - context, releaserProperties, reportHandler); + FlowRunnerTaskExecutorSupplier flowRunnerTaskExecutorSupplier, ConfigurableApplicationContext context, + ReleaserProperties releaserProperties, BuildReportHandler reportHandler) { + return new SpringBatchFlowRunner(stepBuilderFactory, jobBuilderFactory, projectsToRunFactory, jobLauncher, + flowRunnerTaskExecutorSupplier, context, releaserProperties, reportHandler); } @Bean @@ -110,8 +106,7 @@ class BatchConfiguration { protected JobExplorer createJobExplorer() throws Exception { JobExplorerFactoryBean jobExplorerFactoryBean = new JobExplorerFactoryBean(); jobExplorerFactoryBean.setDataSource(dataSource); - jobExplorerFactoryBean - .setSerializer(myJackson2ExecutionContextStringSerializer); + jobExplorerFactoryBean.setSerializer(myJackson2ExecutionContextStringSerializer); jobExplorerFactoryBean.afterPropertiesSet(); return jobExplorerFactoryBean.getObject(); } @@ -120,8 +115,7 @@ class BatchConfiguration { protected JobRepository createJobRepository() throws Exception { JobRepositoryFactoryBean jobRepositoryFactoryBean = new JobRepositoryFactoryBean(); jobRepositoryFactoryBean.setDataSource(dataSource); - jobRepositoryFactoryBean - .setSerializer(myJackson2ExecutionContextStringSerializer); + jobRepositoryFactoryBean.setSerializer(myJackson2ExecutionContextStringSerializer); jobRepositoryFactoryBean.setTransactionManager(transactionManager); jobRepositoryFactoryBean.afterPropertiesSet(); return jobRepositoryFactoryBean.getObject(); diff --git a/releaser-spring/src/main/java/releaser/internal/spring/DefaultSpringReleaser.java b/releaser-spring/src/main/java/releaser/internal/spring/DefaultSpringReleaser.java index 114e0417..34a9e283 100644 --- a/releaser-spring/src/main/java/releaser/internal/spring/DefaultSpringReleaser.java +++ b/releaser-spring/src/main/java/releaser/internal/spring/DefaultSpringReleaser.java @@ -38,10 +38,8 @@ class DefaultSpringReleaser implements SpringReleaser { private final FlowRunner flowRunner; - DefaultSpringReleaser(ReleaserProperties properties, - OptionsAndPropertiesFactory optionsAndPropertiesFactory, - ProjectsToRunFactory projectsToRunFactory, - TasksToRunFactory tasksToRunFactory, FlowRunner flowRunner) { + DefaultSpringReleaser(ReleaserProperties properties, OptionsAndPropertiesFactory optionsAndPropertiesFactory, + ProjectsToRunFactory projectsToRunFactory, TasksToRunFactory tasksToRunFactory, FlowRunner flowRunner) { this.properties = properties; this.optionsAndPropertiesFactory = optionsAndPropertiesFactory; this.projectsToRunFactory = projectsToRunFactory; @@ -59,25 +57,22 @@ class DefaultSpringReleaser implements SpringReleaser { @Override public ExecutionResult release(Options options) { - OptionsAndProperties optionsAndProperties = prepareOptionsAndProperties(options, - this.properties); + OptionsAndProperties optionsAndProperties = prepareOptionsAndProperties(options, this.properties); // order matters! Tasks will mutate options and properties TasksToRun releaseTasksToRun = releaseTasksFromOptions(optionsAndProperties); ProjectsToRun projectsToRun = releaseProjects(optionsAndProperties); - ExecutionResult releaseTasksExecutionResult = runReleaseTasks( - optionsAndProperties, projectsToRun, releaseTasksToRun); + ExecutionResult releaseTasksExecutionResult = runReleaseTasks(optionsAndProperties, projectsToRun, + releaseTasksToRun); if (releaseTasksExecutionResult.isFailure()) { return releaseTasksExecutionResult; } - TasksToRun postReleaseTrainTasksToRun = postReleaseTrainTasksFromOptions( - optionsAndProperties); - ExecutionResult postReleaseTrainTasksExecutionResult = runPostReleaseTasks( - optionsAndProperties, postReleaseTrainTasksToRun); + TasksToRun postReleaseTrainTasksToRun = postReleaseTrainTasksFromOptions(optionsAndProperties); + ExecutionResult postReleaseTrainTasksExecutionResult = runPostReleaseTasks(optionsAndProperties, + postReleaseTrainTasksToRun); return releaseTasksExecutionResult.merge(postReleaseTrainTasksExecutionResult); } - private OptionsAndProperties prepareOptionsAndProperties(Options options, - ReleaserProperties properties) { + private OptionsAndProperties prepareOptionsAndProperties(Options options, ReleaserProperties properties) { return this.optionsAndPropertiesFactory.get(properties, options); } @@ -89,21 +84,20 @@ class DefaultSpringReleaser implements SpringReleaser { return this.tasksToRunFactory.release(options); } - private TasksToRun postReleaseTrainTasksFromOptions( - OptionsAndProperties optionsAndProperties) { + private TasksToRun postReleaseTrainTasksFromOptions(OptionsAndProperties optionsAndProperties) { return this.tasksToRunFactory.postRelease(optionsAndProperties.options); } - private ExecutionResult runReleaseTasks(OptionsAndProperties optionsAndProperties, - ProjectsToRun projectsToRun, TasksToRun tasksToRun) { - return this.flowRunner.runReleaseTasks(optionsAndProperties.options, - optionsAndProperties.properties, projectsToRun, tasksToRun); + private ExecutionResult runReleaseTasks(OptionsAndProperties optionsAndProperties, ProjectsToRun projectsToRun, + TasksToRun tasksToRun) { + return this.flowRunner.runReleaseTasks(optionsAndProperties.options, optionsAndProperties.properties, + projectsToRun, tasksToRun); } private ExecutionResult runPostReleaseTasks(OptionsAndProperties optionsAndProperties, TasksToRun postReleaseTasksToRun) { - return this.flowRunner.runPostReleaseTrainTasks(optionsAndProperties.options, - optionsAndProperties.properties, "postRelease", postReleaseTasksToRun); + return this.flowRunner.runPostReleaseTrainTasks(optionsAndProperties.options, optionsAndProperties.properties, + "postRelease", postReleaseTasksToRun); } } diff --git a/releaser-spring/src/main/java/releaser/internal/spring/ExecutionResultReport.java b/releaser-spring/src/main/java/releaser/internal/spring/ExecutionResultReport.java index ed07ef99..7330b3b3 100644 --- a/releaser-spring/src/main/java/releaser/internal/spring/ExecutionResultReport.java +++ b/releaser-spring/src/main/java/releaser/internal/spring/ExecutionResultReport.java @@ -42,8 +42,7 @@ public class ExecutionResultReport { } public ExecutionResultReport(String projectName, String shortName, String description, - Class releaserTaskType, String state, - List exceptions) { + Class releaserTaskType, String state, List exceptions) { this.projectName = projectName; this.shortName = shortName; this.description = description; diff --git a/releaser-spring/src/main/java/releaser/internal/spring/FlowRunner.java b/releaser-spring/src/main/java/releaser/internal/spring/FlowRunner.java index 9f685ca9..ab3f9765 100644 --- a/releaser-spring/src/main/java/releaser/internal/spring/FlowRunner.java +++ b/releaser-spring/src/main/java/releaser/internal/spring/FlowRunner.java @@ -33,8 +33,7 @@ public interface FlowRunner { * @param releaserTask - the task to run * @return the decision on what to do with the task */ - default Decision beforeTask(Options options, ReleaserProperties properties, - ReleaserTask releaserTask) { + default Decision beforeTask(Options options, ReleaserProperties properties, ReleaserTask releaserTask) { return Decision.CONTINUE; } @@ -45,8 +44,7 @@ public interface FlowRunner { * @param releaserTask - the task to run * @return the decision on what to do with the task */ - default Decision afterTask(Options options, ReleaserProperties properties, - ReleaserTask releaserTask) { + default Decision afterTask(Options options, ReleaserProperties properties, ReleaserTask releaserTask) { return Decision.CONTINUE; } @@ -58,8 +56,8 @@ public interface FlowRunner { * @param tasksToRun - set of release tasks to run for each project * @return the result of release execution */ - ExecutionResult runReleaseTasks(Options options, ReleaserProperties properties, - ProjectsToRun projectToRuns, TasksToRun tasksToRun); + ExecutionResult runReleaseTasks(Options options, ReleaserProperties properties, ProjectsToRun projectToRuns, + TasksToRun tasksToRun); /** * Runs the post release tasks. @@ -69,8 +67,7 @@ public interface FlowRunner { * @param tasksToRun - set of post release tasks to run for each project * @return the result of release execution */ - ExecutionResult runPostReleaseTrainTasks(Options options, - ReleaserProperties properties, String executingTaskName, + ExecutionResult runPostReleaseTrainTasks(Options options, ReleaserProperties properties, String executingTaskName, TasksToRun tasksToRun); /** diff --git a/releaser-spring/src/main/java/releaser/internal/spring/OptionsParser.java b/releaser-spring/src/main/java/releaser/internal/spring/OptionsParser.java index 50c09aaf..a30c8f1e 100644 --- a/releaser-spring/src/main/java/releaser/internal/spring/OptionsParser.java +++ b/releaser-spring/src/main/java/releaser/internal/spring/OptionsParser.java @@ -51,8 +51,7 @@ class OptionsParser implements Parser { private final ConfigurableApplicationContext context; - OptionsParser(List allTasks, - List singleProjectReleaserTasks, + OptionsParser(List allTasks, List singleProjectReleaserTasks, ConfigurableApplicationContext context) { this.allTasks = allTasks; this.singleProjectReleaserTasks = singleProjectReleaserTasks; @@ -66,39 +65,32 @@ class OptionsParser implements Parser { log.info("Got following args <{}>", (Object[]) args); try { ArgumentAcceptingOptionSpec metaReleaseOpt = parser - .acceptsAll(Arrays.asList("x", "meta-release"), - "Do you want to do the meta release?") + .acceptsAll(Arrays.asList("x", "meta-release"), "Do you want to do the meta release?") .withRequiredArg().ofType(Boolean.class).defaultsTo(false); ArgumentAcceptingOptionSpec fullReleaseOpt = parser .acceptsAll(Arrays.asList("f", "full-release"), "Do you want to do the full release of a single project?") .withOptionalArg().ofType(Boolean.class).defaultsTo(false); - ArgumentAcceptingOptionSpec interactiveOpt = parser.acceptsAll( - Arrays.asList("i", "interactive"), - "Do you want to set the properties from the command line of a single project?") + ArgumentAcceptingOptionSpec interactiveOpt = parser + .acceptsAll(Arrays.asList("i", "interactive"), + "Do you want to set the properties from the command line of a single project?") .withRequiredArg().ofType(Boolean.class).defaultsTo(true); - ArgumentAcceptingOptionSpec dryRunOpt = parser.acceptsAll( - Arrays.asList("dr", "dry-run"), + ArgumentAcceptingOptionSpec dryRunOpt = parser.acceptsAll(Arrays.asList("dr", "dry-run"), "Do you want to do the release / meta release with build and install projects locally only?") .withRequiredArg().ofType(Boolean.class).defaultsTo(false); LinkedList singleProjectReleaseTasks = this.allTasks.stream() .filter(releaserTask -> releaserTask instanceof SingleProjectReleaserTask) .collect(Collectors.toCollection(LinkedList::new)); singleProjectReleaseTasks.forEach(task -> parser - .acceptsAll(Arrays.asList(task.shortName(), task.name()), - task.description()) - .withOptionalArg()); - ArgumentAcceptingOptionSpec startFromOpt = parser.acceptsAll( - Arrays.asList("a", "start-from"), - "Starts all release task starting " + .acceptsAll(Arrays.asList(task.shortName(), task.name()), task.description()).withOptionalArg()); + ArgumentAcceptingOptionSpec startFromOpt = parser + .acceptsAll(Arrays.asList("a", "start-from"), "Starts all release task starting " + "from the given task. Requires passing the task name (either one letter or the full name)") .withRequiredArg().ofType(String.class); ArgumentAcceptingOptionSpec taskNamesOpt = parser - .acceptsAll(Arrays.asList("tn", "task-names"), - "Starts all release task for the given task names") + .acceptsAll(Arrays.asList("tn", "task-names"), "Starts all release task for the given task names") .withRequiredArg().ofType(String.class).defaultsTo(""); - ArgumentAcceptingOptionSpec rangeOpt = parser.acceptsAll( - Arrays.asList("r", "range"), + ArgumentAcceptingOptionSpec rangeOpt = parser.acceptsAll(Arrays.asList("r", "range"), "Runs release tasks from the given range. Requires passing " + "the task names with a hyphen. The first task is inclusive, " + "the second inclusive. E.g. 's-m' would mean running 'snapshot', " @@ -115,32 +107,25 @@ class OptionsParser implements Parser { Boolean interactive = options.valueOf(interactiveOpt); Boolean dryRun = options.valueOf(dryRunOpt); Boolean fullRelease = options.has(fullReleaseOpt); - List providedTaskNames = StringUtils.hasText(options - .valueOf(taskNamesOpt)) ? Arrays.asList( - removeQuotingChars(options.valueOf(taskNamesOpt)).split(",")) - : new ArrayList<>(); - providedTaskNames = providedTaskNames.stream().map(this::removeQuotingChars) - .collect(Collectors.toList()); + List providedTaskNames = StringUtils.hasText(options.valueOf(taskNamesOpt)) + ? Arrays.asList(removeQuotingChars(options.valueOf(taskNamesOpt)).split(",")) : new ArrayList<>(); + providedTaskNames = providedTaskNames.stream().map(this::removeQuotingChars).collect(Collectors.toList()); log.info("Passed tasks {} from command line", providedTaskNames); - List allTaskNames = singleProjectReleaseTasks.stream() - .map(ReleaserTask::name).collect(Collectors.toList()); - List tasksFromOptions = singleProjectReleaseTasks.stream().filter( - task -> options.has(task.name()) || options.has(task.shortName())) - .map(ReleaserTask::name).collect(Collectors.toList()); + List allTaskNames = singleProjectReleaseTasks.stream().map(ReleaserTask::name) + .collect(Collectors.toList()); + List tasksFromOptions = singleProjectReleaseTasks.stream() + .filter(task -> options.has(task.name()) || options.has(task.shortName())).map(ReleaserTask::name) + .collect(Collectors.toList()); if (providedTaskNames.isEmpty()) { - providedTaskNames.addAll(tasksFromOptions.isEmpty() && !metaRelease - ? allTaskNames : tasksFromOptions); + providedTaskNames.addAll(tasksFromOptions.isEmpty() && !metaRelease ? allTaskNames : tasksFromOptions); } - List taskNames = filterProvidedTaskNames(providedTaskNames, - allTaskNames, metaRelease); + List taskNames = filterProvidedTaskNames(providedTaskNames, allTaskNames, metaRelease); String startFrom = options.valueOf(startFromOpt); String range = options.valueOf(rangeOpt); - Options buildOptions = new OptionsBuilder().metaRelease(metaRelease) - .fullRelease(fullRelease).interactive(interactive).dryRun(dryRun) - .taskNames(taskNames).startFrom(startFrom).range(range).options(); - log.info( - "\n\nWill use the following options to process the project\n\n{}\n\n", - buildOptions); + Options buildOptions = new OptionsBuilder().metaRelease(metaRelease).fullRelease(fullRelease) + .interactive(interactive).dryRun(dryRun).taskNames(taskNames).startFrom(startFrom).range(range) + .options(); + log.info("\n\nWill use the following options to process the project\n\n{}\n\n", buildOptions); return buildOptions; } catch (Exception e) { @@ -149,8 +134,8 @@ class OptionsParser implements Parser { } } - List filterProvidedTaskNames(List providedTaskNames, - List allTaskNames, boolean metaRelease) { + List filterProvidedTaskNames(List providedTaskNames, List allTaskNames, + boolean metaRelease) { if (metaRelease) { return providedTaskNames; } @@ -170,8 +155,7 @@ class OptionsParser implements Parser { System.err.println(e.getMessage()); e.printStackTrace(); System.err.println(intro()); - System.err.println( - "java -jar releaser-spring-1.0.0.BUILD-SNAPSHOT.jar [options...] "); + System.err.println("java -jar releaser-spring-1.0.0.BUILD-SNAPSHOT.jar [options...] "); try { parser.printHelpOn(System.err); } @@ -194,15 +178,13 @@ class OptionsParser implements Parser { private String intro() { return "\nHere you can find the list of tasks in order for a single project\n\n[" - + this.singleProjectReleaserTasks.stream().map(ReleaserTask::name) - .collect(Collectors.joining(",")) + + this.singleProjectReleaserTasks.stream().map(ReleaserTask::name).collect(Collectors.joining(",")) + "]\n\n"; } private String examples() { - return "\nExamples of usage:\n\n" + "Run 'build' & 'commit' & 'deploy'\n" - + "java -jar jar.jar -b -c -d\n\n" + "Start from 'push'\n" - + "java -jar releaser.jar -a push\n\n" + "Range 'docs' -> 'push'\n" + return "\nExamples of usage:\n\n" + "Run 'build' & 'commit' & 'deploy'\n" + "java -jar jar.jar -b -c -d\n\n" + + "Start from 'push'\n" + "java -jar releaser.jar -a push\n\n" + "Range 'docs' -> 'push'\n" + "java -jar releaser.jar -r o-p\n\n" + "\n\n"; } diff --git a/releaser-spring/src/main/java/releaser/internal/spring/ProjectToRun.java b/releaser-spring/src/main/java/releaser/internal/spring/ProjectToRun.java index 2e29ca16..02c2f216 100644 --- a/releaser-spring/src/main/java/releaser/internal/spring/ProjectToRun.java +++ b/releaser-spring/src/main/java/releaser/internal/spring/ProjectToRun.java @@ -64,8 +64,7 @@ public class ProjectToRun implements Serializable { */ public final Options options; - public ProjectToRun(File thisProjectFolder, ProjectsFromBom allProjectsFromBom, - ProjectVersion originalVersion, + public ProjectToRun(File thisProjectFolder, ProjectsFromBom allProjectsFromBom, ProjectVersion originalVersion, ReleaserProperties thisProjectReleaserProperties, Options options) { this.thisProjectFolder = thisProjectFolder; this.allProjectsFromBom = allProjectsFromBom; @@ -100,8 +99,7 @@ public class ProjectToRun implements Serializable { * Supplier of a project to run. Since retrieval of a project may require cloning it, * we will cache the cloned location instead of cloning it each time. */ - public static class ProjectToRunSupplier - implements Supplier, Closeable { + public static class ProjectToRunSupplier implements Supplier, Closeable { private static final Map CACHE = new ConcurrentHashMap<>(); diff --git a/releaser-spring/src/main/java/releaser/internal/spring/ProjectsFromBom.java b/releaser-spring/src/main/java/releaser/internal/spring/ProjectsFromBom.java index 55d0035c..8d3466e6 100644 --- a/releaser-spring/src/main/java/releaser/internal/spring/ProjectsFromBom.java +++ b/releaser-spring/src/main/java/releaser/internal/spring/ProjectsFromBom.java @@ -34,8 +34,7 @@ public class ProjectsFromBom { */ public final ProjectVersion currentProjectFromBom; - public ProjectsFromBom(Projects allProjectVersionsFromBom, - ProjectVersion currentProjectFromBom) { + public ProjectsFromBom(Projects allProjectVersionsFromBom, ProjectVersion currentProjectFromBom) { this.allProjectVersionsFromBom = allProjectVersionsFromBom; this.currentProjectFromBom = currentProjectFromBom; } diff --git a/releaser-spring/src/main/java/releaser/internal/spring/ProjectsToRunFactory.java b/releaser-spring/src/main/java/releaser/internal/spring/ProjectsToRunFactory.java index 920f45a5..7e962b9a 100644 --- a/releaser-spring/src/main/java/releaser/internal/spring/ProjectsToRunFactory.java +++ b/releaser-spring/src/main/java/releaser/internal/spring/ProjectsToRunFactory.java @@ -62,19 +62,15 @@ class ProjectsToRunFactory implements Closeable { Options options = optionsAndProperties.options; ReleaserProperties properties = optionsAndProperties.properties; if (!options.metaRelease) { - log.info( - "Single project release picked. Will release only the current project"); + log.info("Single project release picked. Will release only the current project"); File projectFolder = projectFolder(properties); ProjectVersion version = new ProjectVersion(projectFolder); - ProjectsFromBom projectsFromBom = this.versionsToBumpFactory - .withProject(projectFolder); - return new ProjectsToRun( - new ProjectToRun.ProjectToRunSupplier(version.projectName, () -> { - ReleaserProperties changedProps = updatePropertiesIfCustomConfigPresent( - properties.copy(), projectFolder); - return new ProjectToRun(projectFolder, projectsFromBom, version, - changedProps, options); - })); + ProjectsFromBom projectsFromBom = this.versionsToBumpFactory.withProject(projectFolder); + return new ProjectsToRun(new ProjectToRun.ProjectToRunSupplier(version.projectName, () -> { + ReleaserProperties changedProps = updatePropertiesIfCustomConfigPresent(properties.copy(), + projectFolder); + return new ProjectToRun(projectFolder, projectsFromBom, version, changedProps, options); + })); } log.info("Meta release picked"); return metaReleaseProjectsToRun(options, properties); @@ -101,48 +97,39 @@ class ProjectsToRunFactory implements Closeable { return new File(workingDir); } - private ProjectsToRun metaReleaseProjectsToRun(Options options, - ReleaserProperties originalProps) { - return metaProjectsToRun(options, originalProps, - metaReleaseProjects(options, originalProps)); + private ProjectsToRun metaReleaseProjectsToRun(Options options, ReleaserProperties originalProps) { + return metaProjectsToRun(options, originalProps, metaReleaseProjects(options, originalProps)); } - private ProjectsToRun metaReleasePostReleaseProjectsToRun(Options options, - ReleaserProperties originalProps) { - return metaProjectsToRun(options, originalProps, - allButSkippedProjects(originalProps)); + private ProjectsToRun metaReleasePostReleaseProjectsToRun(Options options, ReleaserProperties originalProps) { + return metaProjectsToRun(options, originalProps, allButSkippedProjects(originalProps)); } - private ProjectsToRun metaProjectsToRun(Options options, - ReleaserProperties originalProps, List projectNames) { - return projectNames.stream() - .map(project -> projectSupplier(options, originalProps, project)) + private ProjectsToRun metaProjectsToRun(Options options, ReleaserProperties originalProps, + List projectNames) { + return projectNames.stream().map(project -> projectSupplier(options, originalProps, project)) .collect(Collectors.toCollection(ProjectsToRun::new)); } - private ProjectToRun.ProjectToRunSupplier projectSupplier(Options options, - ReleaserProperties originalProps, String project) { + private ProjectToRun.ProjectToRunSupplier projectSupplier(Options options, ReleaserProperties originalProps, + String project) { return new ProjectToRun.ProjectToRunSupplier(project, () -> { File clonedProjectFromOrg = this.releaser.clonedProjectFromOrg(project); - ReleaserProperties properties = updatePropertiesIfCustomConfigPresent( - originalProps.copy(), clonedProjectFromOrg); - log.info("Successfully cloned the project [{}] to [{}]", project, + ReleaserProperties properties = updatePropertiesIfCustomConfigPresent(originalProps.copy(), clonedProjectFromOrg); + log.info("Successfully cloned the project [{}] to [{}]", project, clonedProjectFromOrg); ProjectVersion originalVersion = new ProjectVersion(clonedProjectFromOrg); - ProjectsFromBom projectsFromBom = this.versionsToBumpFactory - .withProject(clonedProjectFromOrg); - return new ProjectToRun(clonedProjectFromOrg, projectsFromBom, - originalVersion, properties, options); + ProjectsFromBom projectsFromBom = this.versionsToBumpFactory.withProject(clonedProjectFromOrg); + return new ProjectToRun(clonedProjectFromOrg, projectsFromBom, originalVersion, properties, options); }); } - private ReleaserProperties updatePropertiesIfCustomConfigPresent( - ReleaserProperties copy, File clonedProjectFromOrg) { + private ReleaserProperties updatePropertiesIfCustomConfigPresent(ReleaserProperties copy, + File clonedProjectFromOrg) { return this.updater.updateProperties(copy, clonedProjectFromOrg); } - private List metaReleaseProjects(Options options, - ReleaserProperties properties) { + private List metaReleaseProjects(Options options, ReleaserProperties properties) { List filteredProjects = allButSkippedProjects(properties); if (StringUtils.hasText(options.startFrom)) { filteredProjects = filterStartFrom(options, filteredProjects); @@ -150,15 +137,13 @@ class ProjectsToRunFactory implements Closeable { else if (!options.taskNames.isEmpty()) { filteredProjects = filterTaskNames(options, filteredProjects); } - log.info("\n\n\nFor meta-release, will release the projects {}\n\n\n", - filteredProjects); + log.info("\n\n\nFor meta-release, will release the projects {}\n\n\n", filteredProjects); return filteredProjects; } private List allButSkippedProjects(ReleaserProperties properties) { List projects = new ArrayList<>(properties.getFixedVersions().keySet()); - log.info("List of projects that should not be cloned {}", - properties.getMetaRelease().getProjectsToSkip()); + log.info("List of projects that should not be cloned {}", properties.getMetaRelease().getProjectsToSkip()); List filteredProjects = filterProjectsToSkip(projects, properties); log.info("List of all projects to clone before filtering {}", filteredProjects); return filteredProjects; @@ -168,11 +153,8 @@ class ProjectsToRunFactory implements Closeable { return new ArrayList<>(properties.getFixedVersions().keySet()); } - private List filterProjectsToSkip(List projects, - ReleaserProperties properties) { - return projects - .stream().filter(project -> !properties.getMetaRelease() - .getProjectsToSkip().contains(project)) + private List filterProjectsToSkip(List projects, ReleaserProperties properties) { + return projects.stream().filter(project -> !properties.getMetaRelease().getProjectsToSkip().contains(project)) .collect(Collectors.toList()); } @@ -180,22 +162,19 @@ class ProjectsToRunFactory implements Closeable { log.info("Start from option provided [{}]", options.startFrom); int projectIndex = filteredProjects.indexOf(options.startFrom); if (projectIndex < 0) { - throw new IllegalStateException( - "Project [" + options.startFrom + "] not found"); + throw new IllegalStateException("Project [" + options.startFrom + "] not found"); } if (log.isDebugEnabled()) { log.debug("Index of project [{}] is [{}]", options.startFrom, projectIndex); } - filteredProjects = filteredProjects.subList(projectIndex, - filteredProjects.size()); + filteredProjects = filteredProjects.subList(projectIndex, filteredProjects.size()); options.startFrom = ""; return filteredProjects; } private List filterTaskNames(Options options, List filteredProjects) { log.info("Task names provided {}", options.taskNames); - filteredProjects = filteredProjects.stream() - .filter(project -> options.taskNames.contains(project)) + filteredProjects = filteredProjects.stream().filter(project -> options.taskNames.contains(project)) .collect(Collectors.toList()); options.taskNames = new ArrayList<>(); return filteredProjects; diff --git a/releaser-spring/src/main/java/releaser/internal/spring/ReleaserConfiguration.java b/releaser-spring/src/main/java/releaser/internal/spring/ReleaserConfiguration.java index d93aee81..dd1b20a9 100644 --- a/releaser-spring/src/main/java/releaser/internal/spring/ReleaserConfiguration.java +++ b/releaser-spring/src/main/java/releaser/internal/spring/ReleaserConfiguration.java @@ -59,15 +59,14 @@ class ReleaserConfiguration { @Bean @ConditionalOnMissingBean - VersionsToBumpFactory versionsToBumpFactory(Releaser releaser, - ReleaserProperties properties) { + VersionsToBumpFactory versionsToBumpFactory(Releaser releaser, ReleaserProperties properties) { return new VersionsToBumpFactory(releaser, properties); } @Bean @ConditionalOnMissingBean - ProjectsToRunFactory projectsToRunFactory(VersionsToBumpFactory versionsToBumpFactory, - Releaser releaser, ReleaserPropertiesUpdater updater) { + ProjectsToRunFactory projectsToRunFactory(VersionsToBumpFactory versionsToBumpFactory, Releaser releaser, + ReleaserPropertiesUpdater updater) { return new ProjectsToRunFactory(versionsToBumpFactory, releaser, updater); } @@ -80,11 +79,10 @@ class ReleaserConfiguration { @Bean @ConditionalOnMissingBean SpringReleaser springReleaser(OptionsAndPropertiesFactory optionsAndPropertiesFactory, - ProjectsToRunFactory projectsToRunFactory, - TasksToRunFactory tasksToRunFactory, FlowRunner flowRunner, + ProjectsToRunFactory projectsToRunFactory, TasksToRunFactory tasksToRunFactory, FlowRunner flowRunner, ReleaserProperties properties) { - return new DefaultSpringReleaser(properties, optionsAndPropertiesFactory, - projectsToRunFactory, tasksToRunFactory, flowRunner); + return new DefaultSpringReleaser(properties, optionsAndPropertiesFactory, projectsToRunFactory, + tasksToRunFactory, flowRunner); } @Bean @@ -95,8 +93,7 @@ class ReleaserConfiguration { @Bean @ConditionalOnMissingBean - VersionsFetcher versionsFetcher(ProjectPomUpdater updater, - ReleaserProperties properties) { + VersionsFetcher versionsFetcher(ProjectPomUpdater updater, ReleaserProperties properties) { return new VersionsFetcher(properties, updater); } @@ -108,8 +105,7 @@ class ReleaserConfiguration { @Bean @ConditionalOnMissingBean - ProjectGitHubHandler projectGitHubHandler( - @Autowired(required = false) List customGithubIssues, + ProjectGitHubHandler projectGitHubHandler(@Autowired(required = false) List customGithubIssues, ReleaserProperties properties) { return new ProjectGitHubHandler(properties, customGithubIssues != null ? customGithubIssues : new ArrayList<>()); @@ -117,8 +113,7 @@ class ReleaserConfiguration { @Bean @ConditionalOnMissingBean - TemplateGenerator templateGenerator(ProjectGitHubHandler handler, - ReleaserProperties properties) { + TemplateGenerator templateGenerator(ProjectGitHubHandler handler, ReleaserProperties properties) { return new TemplateGenerator(properties, handler); } @@ -130,47 +125,39 @@ class ReleaserConfiguration { @Bean @ConditionalOnMissingBean - SaganUpdater saganUpdater(SaganClient saganClient, - ReleaserProperties releaserProperties) { + SaganUpdater saganUpdater(SaganClient saganClient, ReleaserProperties releaserProperties) { return new SaganUpdater(saganClient, releaserProperties); } @Bean @ConditionalOnMissingBean - PostReleaseActions postReleaseActions(ProjectGitHandler handler, - ProjectPomUpdater pomUpdater, GradleUpdater gradleUpdater, - ProjectCommandExecutor projectCommandExecutor, + PostReleaseActions postReleaseActions(ProjectGitHandler handler, ProjectPomUpdater pomUpdater, + GradleUpdater gradleUpdater, ProjectCommandExecutor projectCommandExecutor, ReleaserProperties releaserProperties, VersionsFetcher versionsFetcher, ReleaserPropertiesUpdater releaserPropertiesUpdater) { - return new PostReleaseActions(handler, pomUpdater, gradleUpdater, - projectCommandExecutor, releaserProperties, versionsFetcher, - releaserPropertiesUpdater); + return new PostReleaseActions(handler, pomUpdater, gradleUpdater, projectCommandExecutor, releaserProperties, + versionsFetcher, releaserPropertiesUpdater); } @Bean @ConditionalOnMissingBean - DocumentationUpdater documentationUpdater(ProjectGitHandler projectGitHandler, - ReleaserProperties properties, TemplateGenerator templateGenerator, - @Autowired( - required = false) List customProjectDocumentationUpdaters) { + DocumentationUpdater documentationUpdater(ProjectGitHandler projectGitHandler, ReleaserProperties properties, + TemplateGenerator templateGenerator, + @Autowired(required = false) List customProjectDocumentationUpdaters) { return new DocumentationUpdater(projectGitHandler, properties, templateGenerator, - customProjectDocumentationUpdaters != null - ? customProjectDocumentationUpdaters : new ArrayList<>()); + customProjectDocumentationUpdaters != null ? customProjectDocumentationUpdaters : new ArrayList<>()); } @Bean @ConditionalOnMissingBean - Releaser releaser(ProjectPomUpdater projectPomUpdater, - ProjectCommandExecutor projectCommandExecutor, - ProjectGitHandler projectGitHandler, - ProjectGitHubHandler projectGitHubHandler, - TemplateGenerator templateGenerator, GradleUpdater gradleUpdater, - SaganUpdater saganUpdater, DocumentationUpdater documentationUpdater, - PostReleaseActions postReleaseActions, + Releaser releaser(ProjectPomUpdater projectPomUpdater, ProjectCommandExecutor projectCommandExecutor, + ProjectGitHandler projectGitHandler, ProjectGitHubHandler projectGitHubHandler, + TemplateGenerator templateGenerator, GradleUpdater gradleUpdater, SaganUpdater saganUpdater, + DocumentationUpdater documentationUpdater, PostReleaseActions postReleaseActions, ReleaserProperties releaserProperties) { - return new Releaser(releaserProperties, projectPomUpdater, projectCommandExecutor, - projectGitHandler, projectGitHubHandler, templateGenerator, gradleUpdater, - saganUpdater, documentationUpdater, postReleaseActions); + return new Releaser(releaserProperties, projectPomUpdater, projectCommandExecutor, projectGitHandler, + projectGitHubHandler, templateGenerator, gradleUpdater, saganUpdater, documentationUpdater, + postReleaseActions); } @Bean @@ -181,8 +168,7 @@ class ReleaserConfiguration { @Bean @ConditionalOnMissingBean - Parser optionsParser(List allTasks, - List singleProjectReleaserTasks, + Parser optionsParser(List allTasks, List singleProjectReleaserTasks, ConfigurableApplicationContext context) { return new OptionsParser(allTasks, singleProjectReleaserTasks, context); } diff --git a/releaser-spring/src/main/java/releaser/internal/spring/SpringBatchBuildReportHandler.java b/releaser-spring/src/main/java/releaser/internal/spring/SpringBatchBuildReportHandler.java index 1b2d4b5f..105776c8 100644 --- a/releaser-spring/src/main/java/releaser/internal/spring/SpringBatchBuildReportHandler.java +++ b/releaser-spring/src/main/java/releaser/internal/spring/SpringBatchBuildReportHandler.java @@ -39,8 +39,7 @@ import org.springframework.util.StringUtils; class SpringBatchBuildReportHandler implements BuildReportHandler { - private static final Logger log = LoggerFactory - .getLogger(SpringBatchExecutionResultHandler.class); + private static final Logger log = LoggerFactory.getLogger(SpringBatchExecutionResultHandler.class); private final JobExplorer jobExplorer; @@ -52,34 +51,27 @@ class SpringBatchBuildReportHandler implements BuildReportHandler { public void reportBuildSummary() { List jobNames = this.jobExplorer.getJobNames(); List sortedJobExecutions = jobNames.stream() - .flatMap(name -> this.jobExplorer.findJobInstancesByJobName(name, 0, 100) - .stream()) - .flatMap(instance -> this.jobExplorer.getJobExecutions(instance).stream()) - .filter(j -> !j.isRunning()) - .sorted(Comparator.comparing(JobExecution::getCreateTime)) - .collect(Collectors.toList()); - List stepContexts = sortedJobExecutions.stream() - .flatMap(j -> j.getStepExecutions().stream()) + .flatMap(name -> this.jobExplorer.findJobInstancesByJobName(name, 0, 100).stream()) + .flatMap(instance -> this.jobExplorer.getJobExecutions(instance).stream()).filter(j -> !j.isRunning()) + .sorted(Comparator.comparing(JobExecution::getCreateTime)).collect(Collectors.toList()); + List stepContexts = sortedJobExecutions.stream().flatMap(j -> j.getStepExecutions().stream()) .collect(Collectors.toCollection(LinkedList::new)); printTable(buildTable(stepContexts)); } private List buildTable(List stepContexts) { return stepContexts.stream().map(step -> { - String date = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS") - .format(step.getStartTime()); - long millis = ChronoUnit.MILLIS.between(step.getStartTime().toInstant(), - step.getEndTime().toInstant()); + String date = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS").format(step.getStartTime()); + long millis = ChronoUnit.MILLIS.between(step.getStartTime().toInstant(), step.getEndTime().toInstant()); ExecutionContext context = step.getExecutionContext(); ExecutionResultReport entity = (ExecutionResultReport) context.get("entity"); if (entity == null) { return null; } - String projectName = TrainPostReleaseReleaserTask.class - .isAssignableFrom(entity.getReleaserTaskType()) ? "postRelease" - : entity.getProjectName(); - return new Table(date, time(millis), projectName, entity.getShortName(), - entity.getDescription(), entity.getState(), entity.getExceptions()); + String projectName = TrainPostReleaseReleaserTask.class.isAssignableFrom(entity.getReleaserTaskType()) + ? "postRelease" : entity.getProjectName(); + return new Table(date, time(millis), projectName, entity.getShortName(), entity.getDescription(), + entity.getState(), entity.getExceptions()); }).filter(Objects::nonNull).collect(Collectors.toCollection(LinkedList::new)); } @@ -96,23 +88,20 @@ class SpringBatchBuildReportHandler implements BuildReportHandler { } private void printTable(List
table) { - String string = "\n\n***** BUILD REPORT *****\n\n" - + FlipTableConverters.fromIterable(table, Table.class) + String string = "\n\n***** BUILD REPORT *****\n\n" + FlipTableConverters.fromIterable(table, Table.class) + "\n\n***** BUILD REPORT *****\n\n"; - List
brokenTasks = table.stream() - .filter(table1 -> StringUtils.hasText(table1.thrownException)) + List
brokenTasks = table.stream().filter(table1 -> StringUtils.hasText(table1.thrownException)) .collect(Collectors.toList()); if (!brokenTasks.isEmpty()) { - String brokenBuilds = "\n\n[BUILD UNSTABLE] The following release tasks are failing!\n\n" - + brokenTasks.stream().map(table1 -> String.format( + String brokenBuilds = "\n\n[BUILD UNSTABLE] The following release tasks are failing!\n\n" + brokenTasks + .stream() + .map(table1 -> String.format( "***** Project / Task : <%s/%s> ***** \nTask Description <%s>\nException Stacktrace \n\n%s", - table1.projectName, table1.taskCaption, - table1.taskDescription, - table1.exceptions + "\n" + table1.exceptions.stream() - .map(Throwable::getStackTrace).flatMap(Arrays::stream) - .map(StackTraceElement::toString) - .collect(Collectors.joining("\n")))) - .collect(Collectors.joining("\n\n")); + table1.projectName, table1.taskCaption, table1.taskDescription, + table1.exceptions + "\n" + + table1.exceptions.stream().map(Throwable::getStackTrace).flatMap(Arrays::stream) + .map(StackTraceElement::toString).collect(Collectors.joining("\n")))) + .collect(Collectors.joining("\n\n")); log.warn(string + brokenBuilds); } else { @@ -138,9 +127,8 @@ class SpringBatchBuildReportHandler implements BuildReportHandler { List exceptions; - Table(String creationTime, String executionTime, String projectName, - String taskCaption, String taskDescription, String taskState, - List exceptions) { + Table(String creationTime, String executionTime, String projectName, String taskCaption, String taskDescription, + String taskState, List exceptions) { this.creationTime = creationTime; this.executionTime = executionTime; this.projectName = projectName; diff --git a/releaser-spring/src/main/java/releaser/internal/spring/SpringBatchExecutionResultHandler.java b/releaser-spring/src/main/java/releaser/internal/spring/SpringBatchExecutionResultHandler.java index 270b6d02..429ec11c 100644 --- a/releaser-spring/src/main/java/releaser/internal/spring/SpringBatchExecutionResultHandler.java +++ b/releaser-spring/src/main/java/releaser/internal/spring/SpringBatchExecutionResultHandler.java @@ -29,15 +29,13 @@ import org.springframework.context.ConfigurableApplicationContext; class SpringBatchExecutionResultHandler implements ExecutionResultHandler { - private static final Logger log = LoggerFactory - .getLogger(SpringBatchExecutionResultHandler.class); + private static final Logger log = LoggerFactory.getLogger(SpringBatchExecutionResultHandler.class); private final ConfigurableApplicationContext context; private final BuildReportHandler buildReportHandler; - SpringBatchExecutionResultHandler(BuildReportHandler buildReportHandler, - ConfigurableApplicationContext context) { + SpringBatchExecutionResultHandler(BuildReportHandler buildReportHandler, ConfigurableApplicationContext context) { this.buildReportHandler = buildReportHandler; this.context = context; } @@ -53,8 +51,7 @@ class SpringBatchExecutionResultHandler implements ExecutionResultHandler { return; } else if (executionResult.isUnstable()) { - log.warn( - "The release went fine, however at least one unstable post release task was found", + log.warn("The release went fine, however at least one unstable post release task was found", executionResult.foundExceptions()); handleUnstableException(); } @@ -77,12 +74,11 @@ class SpringBatchExecutionResultHandler implements ExecutionResultHandler { buildStatus.createNewFile(); String text = "[BUILD UNSTABLE] The release happened successfully, but there were post release issues"; Files.write(buildStatus.toPath(), text.getBytes()); - log.info( - "\n\n\n ___ _ _ ___ _ ___ _ _ _ _ ___ _____ _ ___ _ ___ \n" - + " | _ ) | | |_ _| | | \\ | | | | \\| / __|_ _/_\\ | _ ) | | __|\n" - + " | _ \\ |_| || || |__| |) | | |_| | .` \\__ \\ | |/ _ \\| _ \\ |__| _| \n" - + " |___/\\___/|___|____|___/ \\___/|_|\\_|___/ |_/_/ \\_\\___/____|___|\n" - + " "); + log.info("\n\n\n ___ _ _ ___ _ ___ _ _ _ _ ___ _____ _ ___ _ ___ \n" + + " | _ ) | | |_ _| | | \\ | | | | \\| / __|_ _/_\\ | _ ) | | __|\n" + + " | _ \\ |_| || || |__| |) | | |_| | .` \\__ \\ | |/ _ \\| _ \\ |__| _| \n" + + " |___/\\___/|___|____|___/ \\___/|_|\\_|___/ |_/_/ \\_\\___/____|___|\n" + + " "); } catch (IOException e) { throw new IllegalStateException( @@ -101,12 +97,11 @@ class SpringBatchExecutionResultHandler implements ExecutionResultHandler { buildStatus.createNewFile(); String text = "[BUILD STABLE] All the release steps have been successfully executed!"; Files.write(buildStatus.toPath(), text.getBytes()); - log.info( - "\n\n\n ___ _ _ ___ _ ___ ___ _ _ ___ ___ ___ ___ ___ ___ _ _ _ \n" - + " | _ ) | | |_ _| | | \\ / __| | | |/ __/ __| __/ __/ __| __| | | | | \n" - + " | _ \\ |_| || || |__| |) | \\__ \\ |_| | (_| (__| _|\\__ \\__ \\ _|| |_| | |__ \n" - + " |___/\\___/|___|____|___/ |___/\\___/ \\___\\___|___|___/___/_| \\___/|____|\n" - + " "); + log.info("\n\n\n ___ _ _ ___ _ ___ ___ _ _ ___ ___ ___ ___ ___ ___ _ _ _ \n" + + " | _ ) | | |_ _| | | \\ / __| | | |/ __/ __| __/ __/ __| __| | | | | \n" + + " | _ \\ |_| || || |__| |) | \\__ \\ |_| | (_| (__| _|\\__ \\__ \\ _|| |_| | |__ \n" + + " |___/\\___/|___|____|___/ |___/\\___/ \\___\\___|___|___/___/_| \\___/|____|\n" + + " "); } catch (IOException e) { log.info("Failed to store the file but the build was stable"); @@ -131,8 +126,7 @@ class SpringBatchExecutionResultHandler implements ExecutionResultHandler { + " "); } catch (IOException e) { - throw new IllegalStateException( - "[BUILD FAILED] Couldn't create a file to show that the build is unstable"); + throw new IllegalStateException("[BUILD FAILED] Couldn't create a file to show that the build is unstable"); } } diff --git a/releaser-spring/src/main/java/releaser/internal/spring/SpringBatchFlowRunner.java b/releaser-spring/src/main/java/releaser/internal/spring/SpringBatchFlowRunner.java index 1c56c370..72503b7c 100644 --- a/releaser-spring/src/main/java/releaser/internal/spring/SpringBatchFlowRunner.java +++ b/releaser-spring/src/main/java/releaser/internal/spring/SpringBatchFlowRunner.java @@ -67,8 +67,7 @@ import org.springframework.core.task.TaskExecutor; class SpringBatchFlowRunner implements FlowRunner, Closeable { - private static final Logger log = LoggerFactory - .getLogger(SpringBatchFlowRunner.class); + private static final Logger log = LoggerFactory.getLogger(SpringBatchFlowRunner.class); private static final String MSG = "\nPress 'q' to quit, 's' to skip, any key to continue\n\n"; @@ -90,12 +89,10 @@ class SpringBatchFlowRunner implements FlowRunner, Closeable { private final ReleaserProperties releaserProperties; - SpringBatchFlowRunner(StepBuilderFactory stepBuilderFactory, - JobBuilderFactory jobBuilderFactory, + SpringBatchFlowRunner(StepBuilderFactory stepBuilderFactory, JobBuilderFactory jobBuilderFactory, ProjectsToRunFactory projectsToRunFactory, JobLauncher jobLauncher, - FlowRunnerTaskExecutorSupplier flowRunnerTaskExecutorSupplier, - ConfigurableApplicationContext context, ReleaserProperties releaserProperties, - BuildReportHandler reportHandler) { + FlowRunnerTaskExecutorSupplier flowRunnerTaskExecutorSupplier, ConfigurableApplicationContext context, + ReleaserProperties releaserProperties, BuildReportHandler reportHandler) { this.stepBuilderFactory = stepBuilderFactory; this.jobBuilderFactory = jobBuilderFactory; this.projectsToRunFactory = projectsToRunFactory; @@ -103,58 +100,48 @@ class SpringBatchFlowRunner implements FlowRunner, Closeable { this.flowRunnerTaskExecutorSupplier = flowRunnerTaskExecutorSupplier; this.stepSkipper = new ConsoleInputStepSkipper(context, reportHandler); this.releaserProperties = releaserProperties; - this.executorService = Executors.newFixedThreadPool( - this.releaserProperties.getMetaRelease().getReleaseGroupThreadCount()); + this.executorService = Executors + .newFixedThreadPool(this.releaserProperties.getMetaRelease().getReleaseGroupThreadCount()); } @Override - public Decision beforeTask(Options options, ReleaserProperties properties, - ReleaserTask releaserTask) { + public Decision beforeTask(Options options, ReleaserProperties properties, ReleaserTask releaserTask) { return decide(options, releaserTask); } - private Step createStep(ReleaserTask releaserTask, - NamedArgumentsSupplier argsSupplier) { - return this.stepBuilderFactory - .get(argsSupplier.projectName + "_" + releaserTask.name()) + private Step createStep(ReleaserTask releaserTask, NamedArgumentsSupplier argsSupplier) { + return this.stepBuilderFactory.get(argsSupplier.projectName + "_" + releaserTask.name()) .tasklet((contribution, chunkContext) -> { Arguments args = argsSupplier.get(); - FlowRunner.Decision decision = beforeTask(args.options, - args.properties, releaserTask); + FlowRunner.Decision decision = beforeTask(args.options, args.properties, releaserTask); if (decision == FlowRunner.Decision.CONTINUE) { ExecutionResult result = runTask(releaserTask, args); - contribution.getStepExecution().getExecutionContext() - .put("result", result); - List errors = (List) contribution - .getStepExecution().getExecutionContext().get("errors"); + contribution.getStepExecution().getExecutionContext().put("result", result); + List errors = (List) contribution.getStepExecution().getExecutionContext() + .get("errors"); RuntimeException exception = result.foundExceptions(); errors = addExceptionToErrors(errors, exception); String status = result.toStringResult(); - ExecutionResultReport entity = buildEntity(releaserTask, args, - status, errors); - contribution.getStepExecution().getExecutionContext() - .put("entity", entity); + ExecutionResultReport entity = buildEntity(releaserTask, args, status, errors); + contribution.getStepExecution().getExecutionContext().put("entity", entity); if (result.isFailureOrUnstable()) { log.warn("The execution of [{}] failed [{}] / unstable [{}]", - entity.getReleaserTaskType().getSimpleName(), - result.isFailure(), result.isUnstable()); - contribution.getStepExecution().getExecutionContext() - .put("errors", errors); + entity.getReleaserTaskType().getSimpleName(), result.isFailure(), + result.isUnstable()); + contribution.getStepExecution().getExecutionContext().put("errors", errors); } } else { - ExecutionResultReport entity = buildEntity(releaserTask, args, - "SKIPPED", Collections.emptyList()); - contribution.getStepExecution().getExecutionContext() - .put("entity", entity); + ExecutionResultReport entity = buildEntity(releaserTask, args, "SKIPPED", + Collections.emptyList()); + contribution.getStepExecution().getExecutionContext().put("entity", entity); log.info("Skipping step [{}]", releaserTask.name()); } return RepeatStatus.FINISHED; }).listener(releaserListener(argsSupplier, releaserTask)).build(); } - private List addExceptionToErrors(List errors, - RuntimeException exception) { + private List addExceptionToErrors(List errors, RuntimeException exception) { if (errors == null) { errors = new LinkedList<>(); } @@ -164,14 +151,13 @@ class SpringBatchFlowRunner implements FlowRunner, Closeable { return errors; } - private ExecutionResultReport buildEntity(ReleaserTask releaserTask, Arguments args, - String state, List errors) { + private ExecutionResultReport buildEntity(ReleaserTask releaserTask, Arguments args, String state, + List errors) { String projectName = args.project.getName(); String shortName = releaserTask.getClass().getSimpleName(); String description = releaserTask.description(); Class releaseType = releaserTask.getClass(); - return new ExecutionResultReport(projectName, shortName, description, releaseType, - state, errors); + return new ExecutionResultReport(projectName, shortName, description, releaseType, state, errors); } private ExecutionResult runTask(ReleaserTask releaserTask, Arguments args) { @@ -197,25 +183,21 @@ class SpringBatchFlowRunner implements FlowRunner, Closeable { } } - private StepExecutionListener releaserListener(NamedArgumentsSupplier argsSupplier, - ReleaserTask releaserTask) { + private StepExecutionListener releaserListener(NamedArgumentsSupplier argsSupplier, ReleaserTask releaserTask) { return new StepExecutionListenerSupport() { @Override public ExitStatus afterStep(StepExecution stepExecution) { Arguments args = argsSupplier.get(); - FlowRunner.Decision decision = afterTask(args.options, args.properties, - releaserTask); + FlowRunner.Decision decision = afterTask(args.options, args.properties, releaserTask); if (decision == FlowRunner.Decision.ABORT) { return ExitStatus.FAILED; } - ExecutionResult result = (ExecutionResult) stepExecution - .getExecutionContext().get("result"); + ExecutionResult result = (ExecutionResult) stepExecution.getExecutionContext().get("result"); if (result == null || result.isSuccess()) { return stepExecution.getExitStatus(); } else if (result.isUnstable()) { - return ExitStatus.COMPLETED - .addExitDescription(BuildUnstableException.DESCRIPTION); + return ExitStatus.COMPLETED.addExitDescription(BuildUnstableException.DESCRIPTION); } else if (result.isFailure()) { return ExitStatus.FAILED; @@ -226,8 +208,8 @@ class SpringBatchFlowRunner implements FlowRunner, Closeable { } @Override - public ExecutionResult runReleaseTasks(Options options, ReleaserProperties properties, - ProjectsToRun projectsToRun, TasksToRun tasksToRun) { + public ExecutionResult runReleaseTasks(Options options, ReleaserProperties properties, ProjectsToRun projectsToRun, + TasksToRun tasksToRun) { if (properties.isPostReleaseTasksOnly() && options.metaRelease) { log.info("Only post release tasks will be executed for the meta release"); return ExecutionResult.skipped(); @@ -237,8 +219,7 @@ class SpringBatchFlowRunner implements FlowRunner, Closeable { if (groups.hasGroups()) { log.info("Found the following release groups {}", releaseGroups); } - List flows = releaseGroups.stream() - .map(group -> buildFlowForGroup(tasksToRun, group)) + List flows = releaseGroups.stream().map(group -> buildFlowForGroup(tasksToRun, group)) .collect(Collectors.toCollection(LinkedList::new)); Iterator flowsIterator = flows.iterator(); if (!flowsIterator.hasNext()) { @@ -252,16 +233,14 @@ class SpringBatchFlowRunner implements FlowRunner, Closeable { return runJob(buildJobForFlows(flowsIterator)); } - private ExecutionResult runComposites(List flows, - ProjectsToReleaseGroups groups) { + private ExecutionResult runComposites(List flows, ProjectsToReleaseGroups groups) { if (groups.hasGroups()) { // will run in parallel List results = new LinkedList<>(); for (StuffToRun flow : flows) { log.info("Releasing group [{}]", flow.releaseGroup); ExecutionResult executionResult = runInParallel(flow); - log.info("Group [{}] execution result is [{}]", flow.releaseGroup, - executionResult); + log.info("Group [{}] execution result is [{}]", flow.releaseGroup, executionResult); if (executionResult.isFailure()) { // stop running any additional flows when an release task exception // was found @@ -292,8 +271,7 @@ class SpringBatchFlowRunner implements FlowRunner, Closeable { log.info("Scheduling a build for project [{}]", s.projectName()); List> futures = new LinkedList<>(); futures.add(this.executorService.submit(() -> { - log.info("Running a composite task [{}] in parallel", - releaserTask.name()); + log.info("Running a composite task [{}] in parallel", releaserTask.name()); return releaserTask.apply(Arguments.forProject(s.get())); })); boolean atLeastOneFailure = false; @@ -305,8 +283,7 @@ class SpringBatchFlowRunner implements FlowRunner, Closeable { } } if (atLeastOneFailure) { - log.warn( - "At least one project failed within the group, will NOT continue with subsequent groups"); + log.warn("At least one project failed within the group, will NOT continue with subsequent groups"); break; } } @@ -317,8 +294,7 @@ class SpringBatchFlowRunner implements FlowRunner, Closeable { ExecutionResult result = ExecutionResult.success(); for (StuffToRun stuffToRun : stuffToRunList) { for (ProjectToRun.ProjectToRunSupplier s : stuffToRun.releaseGroup.projectsToRun) { - result = result - .merge(stuffToRun.task.apply(Arguments.forProject(s.get()))); + result = result.merge(stuffToRun.task.apply(Arguments.forProject(s.get()))); if (result.isFailure()) { return result; } @@ -328,8 +304,7 @@ class SpringBatchFlowRunner implements FlowRunner, Closeable { } private Job buildJobForFlows(Iterator flowsIterator) { - JobBuilder release = this.jobBuilderFactory - .get("release_" + System.currentTimeMillis()); + JobBuilder release = this.jobBuilderFactory.get("release_" + System.currentTimeMillis()); StuffToRun stuffToRun = flowsIterator.next(); Flow first = stuffToRun.flow; JobFlowBuilder start = release.start(first); @@ -344,21 +319,18 @@ class SpringBatchFlowRunner implements FlowRunner, Closeable { private StuffToRun buildFlowForGroup(TasksToRun tasksToRun, ReleaseGroup group) { FlowBuilder flowBuilder = new FlowBuilder<>( - group.flowName() + (group.shouldRunInParallel() ? "_Parallel" : "") + "_" - + System.currentTimeMillis()); + group.flowName() + (group.shouldRunInParallel() ? "_Parallel" : "") + "_" + System.currentTimeMillis()); Iterator iterator = group.iterator(); if (!iterator.hasNext() || tasksToRun.isEmpty()) { return new StuffToRun(group, flowBuilder.build()); } // only one project to run - run in sequence final ProjectToRun.ProjectToRunSupplier project = iterator.next(); - if (tasksToRun.size() == 1 - && tasksToRun.get(0) instanceof CompositeReleaserTask) { + if (tasksToRun.size() == 1 && tasksToRun.get(0) instanceof CompositeReleaserTask) { return new StuffToRun(group, (CompositeReleaserTask) tasksToRun.get(0)); } flowBuilder.start(toFlowOfTasks(tasksToRun, - new NamedArgumentsSupplier(project.projectName(), - () -> Arguments.forProject(project.get())), + new NamedArgumentsSupplier(project.projectName(), () -> Arguments.forProject(project.get())), flowBuilder(project.projectName()))); if (!iterator.hasNext()) { return new StuffToRun(group, flowBuilder.build()); @@ -370,8 +342,7 @@ class SpringBatchFlowRunner implements FlowRunner, Closeable { final ProjectToRun.ProjectToRunSupplier nextProject = iterator.next(); String projectName = project.projectName(); flows.add(toFlowOfTasks(tasksToRun, - new NamedArgumentsSupplier(project.projectName(), - () -> Arguments.forProject(nextProject.get())), + new NamedArgumentsSupplier(project.projectName(), () -> Arguments.forProject(nextProject.get())), flowBuilder(projectName))); } return new StuffToRun(group, split.add(flows.toArray(new Flow[0])).end()); @@ -382,10 +353,9 @@ class SpringBatchFlowRunner implements FlowRunner, Closeable { } @Override - public ExecutionResult runPostReleaseTrainTasks(Options options, - ReleaserProperties properties, String taskName, TasksToRun tasksToRun) { - ProjectsToRun projectsToRun = postReleaseTrainProjects( - new OptionsAndProperties(properties, options)); + public ExecutionResult runPostReleaseTrainTasks(Options options, ReleaserProperties properties, String taskName, + TasksToRun tasksToRun) { + ProjectsToRun projectsToRun = postReleaseTrainProjects(new OptionsAndProperties(properties, options)); Flow flow = postReleaseFlow(tasksToRun, properties, projectsToRun); String name = taskName + "_" + System.currentTimeMillis(); if (flow == null) { @@ -400,8 +370,7 @@ class SpringBatchFlowRunner implements FlowRunner, Closeable { return this.projectsToRunFactory.postReleaseTrain(options); } - private Flow toFlowOfTasks(TasksToRun tasksToRun, NamedArgumentsSupplier args, - FlowBuilder flowBuilder) { + private Flow toFlowOfTasks(TasksToRun tasksToRun, NamedArgumentsSupplier args, FlowBuilder flowBuilder) { Iterator iterator = tasksToRun.iterator(); ReleaserTask task = iterator.next(); flowBuilder.start(createStep(task, args)); @@ -415,10 +384,9 @@ class SpringBatchFlowRunner implements FlowRunner, Closeable { try { JobExecution execution = this.jobLauncher.run(job, new JobParameters()); if (!ExitStatus.COMPLETED.equals(execution.getExitStatus())) { - return ExecutionResult.failure(new IllegalStateException( - "Job failed to get executed successfully. Failed with exit code [" - + execution.getExitStatus().getExitCode() - + "] and description [" + return ExecutionResult.failure( + new IllegalStateException("Job failed to get executed successfully. Failed with exit code [" + + execution.getExitStatus().getExitCode() + "] and description [" + execution.getExitStatus().getExitDescription() + "]")); } List thrownExceptions = exceptionsThrownBySteps(execution); @@ -431,8 +399,8 @@ class SpringBatchFlowRunner implements FlowRunner, Closeable { @SuppressWarnings("unchecked") private List exceptionsThrownBySteps(JobExecution execution) { - return execution.getStepExecutions().stream() - .map(e -> e.getExecutionContext().get("errors") != null + return execution + .getStepExecutions().stream().map(e -> e.getExecutionContext().get("errors") != null ? (List) e.getExecutionContext().get("errors") : new LinkedList()) .reduce(new LinkedList(), (o, o2) -> { o.addAll(o2); @@ -440,16 +408,15 @@ class SpringBatchFlowRunner implements FlowRunner, Closeable { }); } - private Flow postReleaseFlow(TasksToRun tasksToRun, ReleaserProperties properties, - ProjectsToRun projectsToRun) { + private Flow postReleaseFlow(TasksToRun tasksToRun, ReleaserProperties properties, ProjectsToRun projectsToRun) { Iterator iterator = tasksToRun.iterator(); if (!iterator.hasNext()) { return null; } ReleaserTask task = iterator.next(); Flow flow = flow(properties, projectsToRun, task); - FlowBuilder flowBuilder = new FlowBuilder( - "parallelPostRelease_" + System.currentTimeMillis()).start(flow); + FlowBuilder flowBuilder = new FlowBuilder("parallelPostRelease_" + System.currentTimeMillis()) + .start(flow); if (!iterator.hasNext()) { return flowBuilder.build(); } @@ -468,11 +435,9 @@ class SpringBatchFlowRunner implements FlowRunner, Closeable { return taskExecutor; } - private Flow flow(ReleaserProperties properties, ProjectsToRun projectsToRun, - ReleaserTask task) { - return new FlowBuilder(task.name() + "Flow") - .start(createStep(task, new NamedArgumentsSupplier("postRelease", - () -> Arguments.forPostRelease(properties, projectsToRun)))) + private Flow flow(ReleaserProperties properties, ProjectsToRun projectsToRun, ReleaserTask task) { + return new FlowBuilder(task.name() + "Flow").start(createStep(task, + new NamedArgumentsSupplier("postRelease", () -> Arguments.forPostRelease(properties, projectsToRun)))) .build(); } @@ -487,10 +452,9 @@ class SpringBatchFlowRunner implements FlowRunner, Closeable { } private void printLog(boolean interactive, ReleaserTask task) { - String taskType = task instanceof PostReleaseReleaserTask ? "Post Release Task" - : "Release Task"; - log.info("\n\n\n=== {} [{}] ===\n\n{} {}\n\n", task.header(), taskType, - task.description(), interactive ? MSG : ""); + String taskType = task instanceof PostReleaseReleaserTask ? "Post Release Task" : "Release Task"; + log.info("\n\n\n=== {} [{}] ===\n\n{} {}\n\n", task.header(), taskType, task.description(), + interactive ? MSG : ""); } @Override @@ -539,8 +503,7 @@ class ConsoleInputStepSkipper { private final BuildReportHandler reportHandler; - ConsoleInputStepSkipper(ConfigurableApplicationContext context, - BuildReportHandler reportHandler) { + ConsoleInputStepSkipper(ConfigurableApplicationContext context, BuildReportHandler reportHandler) { this.context = context; this.reportHandler = reportHandler; } @@ -600,19 +563,16 @@ class ProjectsToReleaseGroups { } List toReleaseGroup(ProjectsToRun projectsToRun) { - ReleaseGroups releaseGroups = new ReleaseGroups( - this.releaserProperties.getMetaRelease().getReleaseGroups()); - return releaseGroup(releaseGroups, null, new LinkedList<>(), - projectsToRun.iterator()); + ReleaseGroups releaseGroups = new ReleaseGroups(this.releaserProperties.getMetaRelease().getReleaseGroups()); + return releaseGroup(releaseGroups, null, new LinkedList<>(), projectsToRun.iterator()); } boolean hasGroups() { return !this.releaserProperties.getMetaRelease().getReleaseGroups().isEmpty(); } - private List releaseGroup(ReleaseGroups releaseGroups, - ReleaseGroup currentGroup, List merged, - Iterator iterator) { + private List releaseGroup(ReleaseGroups releaseGroups, ReleaseGroup currentGroup, + List merged, Iterator iterator) { if (iterator.hasNext()) { // sleuth ProjectToRun.ProjectToRunSupplier supplier = iterator.next(); @@ -678,14 +638,12 @@ class ReleaseGroup { } private String projectName() { - return this.projectsToRun.isEmpty() ? "EMPTY" - : this.projectsToRun.get(0).projectName(); + return this.projectsToRun.isEmpty() ? "EMPTY" : this.projectsToRun.get(0).projectName(); } @Override public String toString() { - return "ReleaseGroup{" + "group=" - + (group.length > 0 ? Arrays.toString(group) : projectName()) + '}'; + return "ReleaseGroup{" + "group=" + (group.length > 0 ? Arrays.toString(group) : projectName()) + '}'; } } @@ -699,8 +657,7 @@ class ReleaseGroups { } String[] group(String name) { - String foundGroup = this.releaseGroups.stream().filter(s -> s.contains(name)) - .findFirst().orElse(null); + String foundGroup = this.releaseGroups.stream().filter(s -> s.contains(name)).findFirst().orElse(null); if (foundGroup == null) { return new String[0]; } diff --git a/releaser-spring/src/main/java/releaser/internal/spring/TasksToRunFactory.java b/releaser-spring/src/main/java/releaser/internal/spring/TasksToRunFactory.java index c2dc8a7c..a4e1be3e 100644 --- a/releaser-spring/src/main/java/releaser/internal/spring/TasksToRunFactory.java +++ b/releaser-spring/src/main/java/releaser/internal/spring/TasksToRunFactory.java @@ -51,11 +51,9 @@ class TasksToRunFactory { TasksToRun release(OptionsAndProperties optionsAndProperties) { TasksToRun tasks = releaseTasks(optionsAndProperties); - tasks.forEach(t -> t.setup(optionsAndProperties.options, - optionsAndProperties.properties)); - log.info("Will run the following tasks {}", - tasks.stream().map(t -> t.getClass().getSimpleName()).collect(Collectors - .toCollection((Supplier>) LinkedList::new))); + tasks.forEach(t -> t.setup(optionsAndProperties.options, optionsAndProperties.properties)); + log.info("Will run the following tasks {}", tasks.stream().map(t -> t.getClass().getSimpleName()) + .collect(Collectors.toCollection((Supplier>) LinkedList::new))); return tasks; } @@ -67,8 +65,7 @@ class TasksToRunFactory { } if (options.metaRelease) { if (options.dryRun) { - return new TasksToRun( - this.context.getBean(MetaReleaseDryRunCompositeTask.class)); + return new TasksToRun(this.context.getBean(MetaReleaseDryRunCompositeTask.class)); } return new TasksToRun(this.context.getBean(MetaReleaseCompositeTask.class)); } @@ -79,8 +76,7 @@ class TasksToRunFactory { return new TasksToRun(this.context.getBean(ReleaseCompositeTask.class)); } // A single project release - List tasks = new LinkedList<>( - this.context.getBeansOfType(ReleaserTask.class).values()); + List tasks = new LinkedList<>(this.context.getBeansOfType(ReleaserTask.class).values()); tasks.sort(AnnotationAwareOrderComparator.INSTANCE); return tasksToRunForSingleProject(options, tasks); } @@ -95,8 +91,7 @@ class TasksToRunFactory { return new TasksToRun(tasks); } - private TasksToRun tasksToRunForSingleProject(Options options, - List tasks) { + private TasksToRun tasksToRunForSingleProject(Options options, List tasks) { if (StringUtils.hasText(options.startFrom)) { return startFrom(tasks, options); } @@ -151,8 +146,7 @@ class TasksToRunFactory { private TasksToRun startFrom(List tasks, Options options) { TasksToRun tasksToRun = new TasksToRun(); for (ReleaserTask task : tasks) { - if (options.startFrom.trim().equals(task.name()) - || options.startFrom.trim().equals(task.shortName())) { + if (options.startFrom.trim().equals(task.name()) || options.startFrom.trim().equals(task.shortName())) { tasksToRun.add(task); } } @@ -165,13 +159,11 @@ class TasksToRunFactory { for (int i = 0; i < allTasks.size(); i++) { msg.append(i).append(") ").append(allTasks.get(i).description()).append("\n"); } - msg.append("\n").append( - "You can pick a range of options by using the hyphen - e.g. '2-4' will execute jobs [2,3,4]\n"); - msg.append("You can execute all tasks starting from a job " - + "by using a hyphen and providing only one " + msg.append("\n") + .append("You can pick a range of options by using the hyphen - e.g. '2-4' will execute jobs [2,3,4]\n"); + msg.append("You can execute all tasks starting from a job " + "by using a hyphen and providing only one " + "number - e.g. '8-' will execute jobs [8,9,10]\n"); - msg.append("You can execute given tasks by providing a " - + "comma separated list of tasks - e.g. " + msg.append("You can execute given tasks by providing a " + "comma separated list of tasks - e.g. " + "'3,7,8' will execute jobs [3,7,8]\n"); msg.append("\n").append("You can press 'q' to quit\n\n"); return msg; diff --git a/releaser-spring/src/main/java/releaser/internal/spring/VersionsToBumpFactory.java b/releaser-spring/src/main/java/releaser/internal/spring/VersionsToBumpFactory.java index 6296cacb..49a76f65 100644 --- a/releaser-spring/src/main/java/releaser/internal/spring/VersionsToBumpFactory.java +++ b/releaser-spring/src/main/java/releaser/internal/spring/VersionsToBumpFactory.java @@ -34,8 +34,7 @@ import org.springframework.util.StringUtils; class VersionsToBumpFactory implements Closeable { - private static final Logger log = LoggerFactory - .getLogger(VersionsToBumpFactory.class); + private static final Logger log = LoggerFactory.getLogger(VersionsToBumpFactory.class); private static final Map CACHE = new ConcurrentHashMap<>(); @@ -51,10 +50,9 @@ class VersionsToBumpFactory implements Closeable { ProjectsFromBom withProject(File project) { return CACHE.computeIfAbsent(project, file -> { log.info("Fetch from git [{}], meta release [{}], project [{}]", - this.properties.getGit().isFetchVersionsFromGit(), - this.properties.getMetaRelease().isEnabled(), project); - if (this.properties.getGit().isFetchVersionsFromGit() - && !this.properties.getMetaRelease().isEnabled()) { + this.properties.getGit().isFetchVersionsFromGit(), this.properties.getMetaRelease().isEnabled(), + project); + if (this.properties.getGit().isFetchVersionsFromGit() && !this.properties.getMetaRelease().isEnabled()) { return fetchVersionsFromGitForSingleProject(project); } return fetchVersionsFromFixedProjects(project); @@ -65,14 +63,12 @@ class VersionsToBumpFactory implements Closeable { ProjectVersion originalVersion = new ProjectVersion(project); Projects fixedVersions = this.releaser.fixedVersions(); log.info("Got the following fixed versions [{}]", fixedVersions); - String fixedVersionForProject = fixedVersions - .containsProject(originalVersion.projectName) - ? fixedVersions.forName(originalVersion.projectName).version : ""; - log.info("Found fixed version for this project [{}] is [{}]", - originalVersion.projectName, fixedVersionForProject); + String fixedVersionForProject = fixedVersions.containsProject(originalVersion.projectName) + ? fixedVersions.forName(originalVersion.projectName).version : ""; + log.info("Found fixed version for this project [{}] is [{}]", originalVersion.projectName, + fixedVersionForProject); ProjectVersion versionFromBom = StringUtils.hasText(fixedVersionForProject) - ? new ProjectVersion(originalVersion.projectName, fixedVersionForProject) - : new ProjectVersion(project); + ? new ProjectVersion(originalVersion.projectName, fixedVersionForProject) : new ProjectVersion(project); log.info("Version from bom [{}]", versionFromBom); fixedVersions.add(versionFromBom); printSettingVersionFromFixedVersions(fixedVersions); @@ -82,43 +78,35 @@ class VersionsToBumpFactory implements Closeable { private ProjectsFromBom fetchVersionsFromGitForSingleProject(File project) { printVersionRetrieval(); Projects projectsToUpdate = this.releaser.retrieveVersionsFromBom(); - ProjectVersion versionFromBom = assertNoSnapshotsForANonSnapshotProject(project, - projectsToUpdate); + ProjectVersion versionFromBom = assertNoSnapshotsForANonSnapshotProject(project, projectsToUpdate); return cachedProjectsFromBom(versionFromBom, projectsToUpdate); } - private ProjectsFromBom cachedProjectsFromBom(ProjectVersion versionFromBom, - Projects projectsToUpdate) { + private ProjectsFromBom cachedProjectsFromBom(ProjectVersion versionFromBom, Projects projectsToUpdate) { return new ProjectsFromBom(projectsToUpdate, versionFromBom); } - ProjectVersion assertNoSnapshotsForANonSnapshotProject(File project, - Projects projectsToUpdate) { + ProjectVersion assertNoSnapshotsForANonSnapshotProject(File project, Projects projectsToUpdate) { ProjectVersion versionFromBom; versionFromBom = projectsToUpdate.forFile(project); assertNoSnapshotsForANonSnapshotProject(projectsToUpdate, versionFromBom); return versionFromBom; } - private void assertNoSnapshotsForANonSnapshotProject(Projects projects, - ProjectVersion versionFromBom) { + private void assertNoSnapshotsForANonSnapshotProject(Projects projects, ProjectVersion versionFromBom) { if (!versionFromBom.isSnapshot() && projects.containsSnapshots()) { - throw new IllegalStateException("You are trying to release a non snapshot " - + "version [" + versionFromBom + "] of the project [" - + versionFromBom.projectName + "] but " + throw new IllegalStateException("You are trying to release a non snapshot " + "version [" + versionFromBom + + "] of the project [" + versionFromBom.projectName + "] but " + "there is at least one SNAPSHOT library version in the Spring Cloud Release project"); } } private void printVersionRetrieval() { - log.info("\n\n\n=== RETRIEVING VERSIONS ===\n\nWill clone the BOM project" - + " to retrieve all versions"); + log.info("\n\n\n=== RETRIEVING VERSIONS ===\n\nWill clone the BOM project" + " to retrieve all versions"); } private void printSettingVersionFromFixedVersions(Projects projectsToUpdate) { - log.info( - "\n\n\n=== RETRIEVED VERSIONS ===\n\nWill use the fixed versions" - + " of projects\n\n{}", + log.info("\n\n\n=== RETRIEVED VERSIONS ===\n\nWill use the fixed versions" + " of projects\n\n{}", projectsToUpdate.stream().map(p -> p.projectName + " => " + p.version) .collect(Collectors.joining("\n"))); } diff --git a/releaser-spring/src/main/java/releaser/internal/tasks/ProjectPostReleaseReleaserTask.java b/releaser-spring/src/main/java/releaser/internal/tasks/ProjectPostReleaseReleaserTask.java index 20206044..b1e60348 100644 --- a/releaser-spring/src/main/java/releaser/internal/tasks/ProjectPostReleaseReleaserTask.java +++ b/releaser-spring/src/main/java/releaser/internal/tasks/ProjectPostReleaseReleaserTask.java @@ -20,7 +20,6 @@ package releaser.internal.tasks; * Marker interface for a post release task for a single project. Example: update the * GitHub milestone for the project. */ -public interface ProjectPostReleaseReleaserTask - extends SingleProjectReleaserTask, PostReleaseReleaserTask { +public interface ProjectPostReleaseReleaserTask extends SingleProjectReleaserTask, PostReleaseReleaserTask { } diff --git a/releaser-spring/src/main/java/releaser/internal/tasks/ReleaserTask.java b/releaser-spring/src/main/java/releaser/internal/tasks/ReleaserTask.java index 826c750b..c9a3331c 100644 --- a/releaser-spring/src/main/java/releaser/internal/tasks/ReleaserTask.java +++ b/releaser-spring/src/main/java/releaser/internal/tasks/ReleaserTask.java @@ -92,7 +92,6 @@ public interface ReleaserTask extends Ordered, Function values = new LinkedList<>(dryRunTasks.values()); values.sort(AnnotationAwareOrderComparator.INSTANCE); - log.info("For project [{}], found the following dry run tasks {}", - args.project.getName(), - values.stream().map(r -> r.getClass().getSimpleName()) - .collect(Collectors.toCollection(LinkedList::new))); - return flowRunner().runReleaseTasks(args.options, args.properties, - new ProjectsToRun(new ProjectToRun.ProjectToRunSupplier( - args.originalVersion.projectName, () -> args.projectToRun)), + log.info("For project [{}], found the following dry run tasks {}", args.project.getName(), values.stream() + .map(r -> r.getClass().getSimpleName()).collect(Collectors.toCollection(LinkedList::new))); + return flowRunner().runReleaseTasks(args.options, args.properties, new ProjectsToRun( + new ProjectToRun.ProjectToRunSupplier(args.originalVersion.projectName, () -> args.projectToRun)), new TasksToRun(values)); } diff --git a/releaser-spring/src/main/java/releaser/internal/tasks/composite/MetaReleaseCompositeTask.java b/releaser-spring/src/main/java/releaser/internal/tasks/composite/MetaReleaseCompositeTask.java index 89aeb60a..e945af15 100644 --- a/releaser-spring/src/main/java/releaser/internal/tasks/composite/MetaReleaseCompositeTask.java +++ b/releaser-spring/src/main/java/releaser/internal/tasks/composite/MetaReleaseCompositeTask.java @@ -36,8 +36,7 @@ public class MetaReleaseCompositeTask implements CompositeReleaserTask { */ public static final int ORDER = -80; - private static final Logger log = LoggerFactory - .getLogger(MetaReleaseCompositeTask.class); + private static final Logger log = LoggerFactory.getLogger(MetaReleaseCompositeTask.class); private final ApplicationContext context; diff --git a/releaser-spring/src/main/java/releaser/internal/tasks/composite/MetaReleaseDryRunCompositeTask.java b/releaser-spring/src/main/java/releaser/internal/tasks/composite/MetaReleaseDryRunCompositeTask.java index 533697e6..35e4045e 100644 --- a/releaser-spring/src/main/java/releaser/internal/tasks/composite/MetaReleaseDryRunCompositeTask.java +++ b/releaser-spring/src/main/java/releaser/internal/tasks/composite/MetaReleaseDryRunCompositeTask.java @@ -36,8 +36,7 @@ public class MetaReleaseDryRunCompositeTask implements CompositeReleaserTask { */ public static final int ORDER = -70; - private static final Logger log = LoggerFactory - .getLogger(MetaReleaseDryRunCompositeTask.class); + private static final Logger log = LoggerFactory.getLogger(MetaReleaseDryRunCompositeTask.class); private final ApplicationContext context; diff --git a/releaser-spring/src/main/java/releaser/internal/tasks/composite/ReleaseCompositeTask.java b/releaser-spring/src/main/java/releaser/internal/tasks/composite/ReleaseCompositeTask.java index 01b3b8dd..e40f8c6a 100644 --- a/releaser-spring/src/main/java/releaser/internal/tasks/composite/ReleaseCompositeTask.java +++ b/releaser-spring/src/main/java/releaser/internal/tasks/composite/ReleaseCompositeTask.java @@ -82,23 +82,18 @@ public class ReleaseCompositeTask implements CompositeReleaserTask { @Override public ExecutionResult runTask(Arguments args) { - Map releaseTasks = this.context - .getBeansOfType(ReleaseReleaserTask.class); + Map releaseTasks = this.context.getBeansOfType(ReleaseReleaserTask.class); Map projectPostReleaseTasks = this.context .getBeansOfType(ProjectPostReleaseReleaserTask.class); - Collection allReleaseTasks = new LinkedList<>( - releaseTasks.values()); + Collection allReleaseTasks = new LinkedList<>(releaseTasks.values()); allReleaseTasks.addAll(projectPostReleaseTasks.values()); List values = new LinkedList<>(allReleaseTasks); values.sort(AnnotationAwareOrderComparator.INSTANCE); - log.info( - "For project [{}], found the following release and project post release tasks {}", - args.project.getName(), - values.stream().map(r -> r.getClass().getSimpleName()) + log.info("For project [{}], found the following release and project post release tasks {}", + args.project.getName(), values.stream().map(r -> r.getClass().getSimpleName()) .collect(Collectors.toCollection(LinkedList::new))); - return flowRunner().runReleaseTasks(args.options, args.properties, - new ProjectsToRun(new ProjectToRun.ProjectToRunSupplier( - args.originalVersion.projectName, () -> args.projectToRun)), + return flowRunner().runReleaseTasks(args.options, args.properties, new ProjectsToRun( + new ProjectToRun.ProjectToRunSupplier(args.originalVersion.projectName, () -> args.projectToRun)), new TasksToRun(values)); } diff --git a/releaser-spring/src/main/java/releaser/internal/tasks/composite/ReleaseVerboseCompositeTask.java b/releaser-spring/src/main/java/releaser/internal/tasks/composite/ReleaseVerboseCompositeTask.java index 49986272..8cc8f843 100644 --- a/releaser-spring/src/main/java/releaser/internal/tasks/composite/ReleaseVerboseCompositeTask.java +++ b/releaser-spring/src/main/java/releaser/internal/tasks/composite/ReleaseVerboseCompositeTask.java @@ -33,8 +33,7 @@ public class ReleaseVerboseCompositeTask implements CompositeReleaserTask { */ public static final int ORDER = -90; - private static final Logger log = LoggerFactory - .getLogger(ReleaseVerboseCompositeTask.class); + private static final Logger log = LoggerFactory.getLogger(ReleaseVerboseCompositeTask.class); private final ApplicationContext context; diff --git a/releaser-spring/src/main/java/releaser/internal/tasks/composite/TrainPostReleaseCompositeTask.java b/releaser-spring/src/main/java/releaser/internal/tasks/composite/TrainPostReleaseCompositeTask.java index 4769cbe9..510e896b 100644 --- a/releaser-spring/src/main/java/releaser/internal/tasks/composite/TrainPostReleaseCompositeTask.java +++ b/releaser-spring/src/main/java/releaser/internal/tasks/composite/TrainPostReleaseCompositeTask.java @@ -46,8 +46,7 @@ public class TrainPostReleaseCompositeTask implements CompositeReleaserTask { */ public static final int ORDER = -50; - private static final Logger log = LoggerFactory - .getLogger(TrainPostReleaseCompositeTask.class); + private static final Logger log = LoggerFactory.getLogger(TrainPostReleaseCompositeTask.class); private final ApplicationContext context; @@ -81,12 +80,11 @@ public class TrainPostReleaseCompositeTask implements CompositeReleaserTask { public ExecutionResult runTask(Arguments args) { Map trainPostReleaseReleaserTasks = this.context .getBeansOfType(TrainPostReleaseReleaserTask.class); - List values = new LinkedList<>( - trainPostReleaseReleaserTasks.values()); + List values = new LinkedList<>(trainPostReleaseReleaserTasks.values()); values.sort(AnnotationAwareOrderComparator.INSTANCE); log.info("Found the following post release tasks {}", values); - return flowRunner().runPostReleaseTrainTasks(args.options, args.properties, - this.name(), new TasksToRun(values)); + return flowRunner().runPostReleaseTrainTasks(args.options, args.properties, this.name(), + new TasksToRun(values)); } @Override diff --git a/releaser-spring/src/main/java/releaser/internal/tasks/postrelease/CloseMilestonesProjectPostReleaseTask.java b/releaser-spring/src/main/java/releaser/internal/tasks/postrelease/CloseMilestonesProjectPostReleaseTask.java index fcabdfca..904f772e 100644 --- a/releaser-spring/src/main/java/releaser/internal/tasks/postrelease/CloseMilestonesProjectPostReleaseTask.java +++ b/releaser-spring/src/main/java/releaser/internal/tasks/postrelease/CloseMilestonesProjectPostReleaseTask.java @@ -21,8 +21,7 @@ import releaser.internal.spring.Arguments; import releaser.internal.tasks.ProjectPostReleaseReleaserTask; import releaser.internal.tech.ExecutionResult; -public class CloseMilestonesProjectPostReleaseTask - implements ProjectPostReleaseReleaserTask { +public class CloseMilestonesProjectPostReleaseTask implements ProjectPostReleaseReleaserTask { /** * Order of this task. The higher value, the lower order. diff --git a/releaser-spring/src/main/java/releaser/internal/tasks/postrelease/CreateTemplatesTrainPostReleaseTask.java b/releaser-spring/src/main/java/releaser/internal/tasks/postrelease/CreateTemplatesTrainPostReleaseTask.java index 10b4de09..b1d6759d 100644 --- a/releaser-spring/src/main/java/releaser/internal/tasks/postrelease/CreateTemplatesTrainPostReleaseTask.java +++ b/releaser-spring/src/main/java/releaser/internal/tasks/postrelease/CreateTemplatesTrainPostReleaseTask.java @@ -59,8 +59,7 @@ public class CreateTemplatesTrainPostReleaseTask implements TrainPostReleaseRele return this.releaser.createEmail(args.versionFromBom, args.projects) .merge(this.releaser.createBlog(args.versionFromBom, args.projects)) .merge(this.releaser.createTweet(args.versionFromBom, args.projects)) - .merge(this.releaser.createReleaseNotes(args.versionFromBom, - args.projects)); + .merge(this.releaser.createReleaseNotes(args.versionFromBom, args.projects)); } @Override diff --git a/releaser-spring/src/main/java/releaser/internal/tasks/postrelease/PostReleaseTasksConfiguration.java b/releaser-spring/src/main/java/releaser/internal/tasks/postrelease/PostReleaseTasksConfiguration.java index 67739ce2..ce824c13 100644 --- a/releaser-spring/src/main/java/releaser/internal/tasks/postrelease/PostReleaseTasksConfiguration.java +++ b/releaser-spring/src/main/java/releaser/internal/tasks/postrelease/PostReleaseTasksConfiguration.java @@ -26,8 +26,7 @@ import org.springframework.context.annotation.Configuration; @Configuration @ConditionalOnDefaultFlowEnabled -@ConditionalOnProperty(value = "releaser.skip-post-release-tasks", havingValue = "false", - matchIfMissing = true) +@ConditionalOnProperty(value = "releaser.skip-post-release-tasks", havingValue = "false", matchIfMissing = true) class PostReleaseTasksConfiguration { @Bean @@ -40,24 +39,21 @@ class PostReleaseTasksConfiguration { @Bean @ConditionalOnMissingBean @ConditionalOnProperty("releaser.template.enabled") - CreateTemplatesTrainPostReleaseTask createTemplatesTrainPostReleaseTask( - Releaser releaser) { + CreateTemplatesTrainPostReleaseTask createTemplatesTrainPostReleaseTask(Releaser releaser) { return new CreateTemplatesTrainPostReleaseTask(releaser); } @Bean @ConditionalOnMissingBean @ConditionalOnProperty("releaser.git.run-updated-samples") - RunUpdatedSamplesTrainPostReleaseTask runUpdatedSamplesTrainPostReleaseTask( - Releaser releaser) { + RunUpdatedSamplesTrainPostReleaseTask runUpdatedSamplesTrainPostReleaseTask(Releaser releaser) { return new RunUpdatedSamplesTrainPostReleaseTask(releaser); } @Bean @ConditionalOnMissingBean @ConditionalOnProperty("releaser.git.update-all-test-samples") - UpdateAllTestSamplesTrainPostReleaseTask updateAllTestSamplesTrainPostReleaseTask( - Releaser releaser) { + UpdateAllTestSamplesTrainPostReleaseTask updateAllTestSamplesTrainPostReleaseTask(Releaser releaser) { return new UpdateAllTestSamplesTrainPostReleaseTask(releaser); } @@ -71,32 +67,28 @@ class PostReleaseTasksConfiguration { @Bean @ConditionalOnMissingBean @ConditionalOnProperty("releaser.git.update-release-train-docs") - UpdateReleaseTrainDocsTrainPostReleaseTask updateReleaseTrainDocsTrainPostReleaseTask( - Releaser releaser) { + UpdateReleaseTrainDocsTrainPostReleaseTask updateReleaseTrainDocsTrainPostReleaseTask(Releaser releaser) { return new UpdateReleaseTrainDocsTrainPostReleaseTask(releaser); } @Bean @ConditionalOnMissingBean @ConditionalOnProperty("releaser.git.update-release-train-wiki") - UpdateReleaseTrainWikiTrainPostReleaseTask updateReleaseTrainWikiTrainPostReleaseTask( - Releaser releaser) { + UpdateReleaseTrainWikiTrainPostReleaseTask updateReleaseTrainWikiTrainPostReleaseTask(Releaser releaser) { return new UpdateReleaseTrainWikiTrainPostReleaseTask(releaser); } @Bean @ConditionalOnMissingBean @ConditionalOnProperty("releaser.sagan.update-sagan") - UpdateSaganProjectPostReleaseTask updateSaganProjectPostReleaseTask( - Releaser releaser) { + UpdateSaganProjectPostReleaseTask updateSaganProjectPostReleaseTask(Releaser releaser) { return new UpdateSaganProjectPostReleaseTask(releaser); } @Bean @ConditionalOnMissingBean @ConditionalOnProperty("releaser.sagan.update-start-spring-io") - UpdateStartSpringIoTrainPostReleaseTask updateStartSpringIoTrainPostReleaseTask( - Releaser releaser) { + UpdateStartSpringIoTrainPostReleaseTask updateStartSpringIoTrainPostReleaseTask(Releaser releaser) { return new UpdateStartSpringIoTrainPostReleaseTask(releaser); } diff --git a/releaser-spring/src/main/java/releaser/internal/tasks/postrelease/RunUpdatedSamplesTrainPostReleaseTask.java b/releaser-spring/src/main/java/releaser/internal/tasks/postrelease/RunUpdatedSamplesTrainPostReleaseTask.java index 5e2c0080..9fb1e02d 100644 --- a/releaser-spring/src/main/java/releaser/internal/tasks/postrelease/RunUpdatedSamplesTrainPostReleaseTask.java +++ b/releaser-spring/src/main/java/releaser/internal/tasks/postrelease/RunUpdatedSamplesTrainPostReleaseTask.java @@ -21,8 +21,7 @@ import releaser.internal.spring.Arguments; import releaser.internal.tasks.TrainPostReleaseReleaserTask; import releaser.internal.tech.ExecutionResult; -public class RunUpdatedSamplesTrainPostReleaseTask - implements TrainPostReleaseReleaserTask { +public class RunUpdatedSamplesTrainPostReleaseTask implements TrainPostReleaseReleaserTask { /** * Order of this task. The higher value, the lower order. diff --git a/releaser-spring/src/main/java/releaser/internal/tasks/postrelease/UpdateAllTestSamplesTrainPostReleaseTask.java b/releaser-spring/src/main/java/releaser/internal/tasks/postrelease/UpdateAllTestSamplesTrainPostReleaseTask.java index d280dde3..10e431b8 100644 --- a/releaser-spring/src/main/java/releaser/internal/tasks/postrelease/UpdateAllTestSamplesTrainPostReleaseTask.java +++ b/releaser-spring/src/main/java/releaser/internal/tasks/postrelease/UpdateAllTestSamplesTrainPostReleaseTask.java @@ -21,8 +21,7 @@ import releaser.internal.spring.Arguments; import releaser.internal.tasks.TrainPostReleaseReleaserTask; import releaser.internal.tech.ExecutionResult; -public class UpdateAllTestSamplesTrainPostReleaseTask - implements TrainPostReleaseReleaserTask { +public class UpdateAllTestSamplesTrainPostReleaseTask implements TrainPostReleaseReleaserTask { /** * Order of this task. The higher value, the lower order. diff --git a/releaser-spring/src/main/java/releaser/internal/tasks/postrelease/UpdateGuidesTrainPostReleaseTask.java b/releaser-spring/src/main/java/releaser/internal/tasks/postrelease/UpdateGuidesTrainPostReleaseTask.java index b9c451bc..14d9e3f7 100644 --- a/releaser-spring/src/main/java/releaser/internal/tasks/postrelease/UpdateGuidesTrainPostReleaseTask.java +++ b/releaser-spring/src/main/java/releaser/internal/tasks/postrelease/UpdateGuidesTrainPostReleaseTask.java @@ -56,8 +56,7 @@ public class UpdateGuidesTrainPostReleaseTask implements TrainPostReleaseRelease @Override public ExecutionResult runTask(Arguments args) { - return this.releaser.updateSpringGuides(args.versionFromBom, args.projects, - args.processedProjects); + return this.releaser.updateSpringGuides(args.versionFromBom, args.projects, args.processedProjects); } @Override diff --git a/releaser-spring/src/main/java/releaser/internal/tasks/postrelease/UpdateReleaseTrainDocsTrainPostReleaseTask.java b/releaser-spring/src/main/java/releaser/internal/tasks/postrelease/UpdateReleaseTrainDocsTrainPostReleaseTask.java index dfa75c3d..5b979b61 100644 --- a/releaser-spring/src/main/java/releaser/internal/tasks/postrelease/UpdateReleaseTrainDocsTrainPostReleaseTask.java +++ b/releaser-spring/src/main/java/releaser/internal/tasks/postrelease/UpdateReleaseTrainDocsTrainPostReleaseTask.java @@ -21,8 +21,7 @@ import releaser.internal.spring.Arguments; import releaser.internal.tasks.TrainPostReleaseReleaserTask; import releaser.internal.tech.ExecutionResult; -public class UpdateReleaseTrainDocsTrainPostReleaseTask - implements TrainPostReleaseReleaserTask { +public class UpdateReleaseTrainDocsTrainPostReleaseTask implements TrainPostReleaseReleaserTask { /** * Order of this task. The higher value, the lower order. diff --git a/releaser-spring/src/main/java/releaser/internal/tasks/postrelease/UpdateReleaseTrainWikiTrainPostReleaseTask.java b/releaser-spring/src/main/java/releaser/internal/tasks/postrelease/UpdateReleaseTrainWikiTrainPostReleaseTask.java index d4ffaca3..df8a6957 100644 --- a/releaser-spring/src/main/java/releaser/internal/tasks/postrelease/UpdateReleaseTrainWikiTrainPostReleaseTask.java +++ b/releaser-spring/src/main/java/releaser/internal/tasks/postrelease/UpdateReleaseTrainWikiTrainPostReleaseTask.java @@ -21,8 +21,7 @@ import releaser.internal.spring.Arguments; import releaser.internal.tasks.TrainPostReleaseReleaserTask; import releaser.internal.tech.ExecutionResult; -public class UpdateReleaseTrainWikiTrainPostReleaseTask - implements TrainPostReleaseReleaserTask { +public class UpdateReleaseTrainWikiTrainPostReleaseTask implements TrainPostReleaseReleaserTask { /** * Order of this task. The higher value, the lower order. diff --git a/releaser-spring/src/main/java/releaser/internal/tasks/postrelease/UpdateSaganProjectPostReleaseTask.java b/releaser-spring/src/main/java/releaser/internal/tasks/postrelease/UpdateSaganProjectPostReleaseTask.java index b0e2c8f0..b11d5a83 100644 --- a/releaser-spring/src/main/java/releaser/internal/tasks/postrelease/UpdateSaganProjectPostReleaseTask.java +++ b/releaser-spring/src/main/java/releaser/internal/tasks/postrelease/UpdateSaganProjectPostReleaseTask.java @@ -56,8 +56,7 @@ public class UpdateSaganProjectPostReleaseTask implements ProjectPostReleaseRele @Override public ExecutionResult runTask(Arguments args) { - return this.releaser.updateSagan(args.project, args.versionFromBom, - args.projects); + return this.releaser.updateSagan(args.project, args.versionFromBom, args.projects); } @Override diff --git a/releaser-spring/src/main/java/releaser/internal/tasks/postrelease/UpdateStartSpringIoTrainPostReleaseTask.java b/releaser-spring/src/main/java/releaser/internal/tasks/postrelease/UpdateStartSpringIoTrainPostReleaseTask.java index 08269344..ad055a8f 100644 --- a/releaser-spring/src/main/java/releaser/internal/tasks/postrelease/UpdateStartSpringIoTrainPostReleaseTask.java +++ b/releaser-spring/src/main/java/releaser/internal/tasks/postrelease/UpdateStartSpringIoTrainPostReleaseTask.java @@ -21,8 +21,7 @@ import releaser.internal.spring.Arguments; import releaser.internal.tasks.TrainPostReleaseReleaserTask; import releaser.internal.tech.ExecutionResult; -public class UpdateStartSpringIoTrainPostReleaseTask - implements TrainPostReleaseReleaserTask { +public class UpdateStartSpringIoTrainPostReleaseTask implements TrainPostReleaseReleaserTask { /** * Order of this task. The higher value, the lower order. diff --git a/releaser-spring/src/main/java/releaser/internal/tasks/release/BuildProjectReleaseTask.java b/releaser-spring/src/main/java/releaser/internal/tasks/release/BuildProjectReleaseTask.java index 3b48840a..719276f8 100644 --- a/releaser-spring/src/main/java/releaser/internal/tasks/release/BuildProjectReleaseTask.java +++ b/releaser-spring/src/main/java/releaser/internal/tasks/release/BuildProjectReleaseTask.java @@ -25,8 +25,7 @@ import releaser.internal.tech.ExecutionResult; public class BuildProjectReleaseTask implements DryRunReleaseReleaserTask { - private static final Logger log = LoggerFactory - .getLogger(BuildProjectReleaseTask.class); + private static final Logger log = LoggerFactory.getLogger(BuildProjectReleaseTask.class); /** * Order of this task. The higher value, the lower order. @@ -62,8 +61,7 @@ public class BuildProjectReleaseTask implements DryRunReleaseReleaserTask { @Override public ExecutionResult runTask(Arguments args) { log.info("Arguments for this release task: " + args); - return this.releaser.buildProject(args.properties, args.originalVersion, - args.versionFromBom); + return this.releaser.buildProject(args.properties, args.originalVersion, args.versionFromBom); } @Override diff --git a/releaser-spring/src/main/java/releaser/internal/tasks/release/BumpBackToSnapshotReleaseTask.java b/releaser-spring/src/main/java/releaser/internal/tasks/release/BumpBackToSnapshotReleaseTask.java index c9e67ffe..0e28de30 100644 --- a/releaser-spring/src/main/java/releaser/internal/tasks/release/BumpBackToSnapshotReleaseTask.java +++ b/releaser-spring/src/main/java/releaser/internal/tasks/release/BumpBackToSnapshotReleaseTask.java @@ -56,8 +56,7 @@ public class BumpBackToSnapshotReleaseTask implements ReleaseReleaserTask { @Override public ExecutionResult runTask(Arguments args) { - return this.releaser.rollbackReleaseVersion(args.project, args.projects, - args.versionFromBom); + return this.releaser.rollbackReleaseVersion(args.project, args.projects, args.versionFromBom); } @Override diff --git a/releaser-spring/src/main/java/releaser/internal/tasks/release/DeployArtifactsReleaseTask.java b/releaser-spring/src/main/java/releaser/internal/tasks/release/DeployArtifactsReleaseTask.java index b3fb47da..db2958d0 100644 --- a/releaser-spring/src/main/java/releaser/internal/tasks/release/DeployArtifactsReleaseTask.java +++ b/releaser-spring/src/main/java/releaser/internal/tasks/release/DeployArtifactsReleaseTask.java @@ -56,8 +56,7 @@ public class DeployArtifactsReleaseTask implements ReleaseReleaserTask { @Override public ExecutionResult runTask(Arguments args) { - return this.releaser.deploy(args.properties, args.originalVersion, - args.versionFromBom); + return this.releaser.deploy(args.properties, args.originalVersion, args.versionFromBom); } @Override diff --git a/releaser-spring/src/main/java/releaser/internal/tasks/release/PublishDocsReleaseTask.java b/releaser-spring/src/main/java/releaser/internal/tasks/release/PublishDocsReleaseTask.java index 16014c56..76e8b872 100644 --- a/releaser-spring/src/main/java/releaser/internal/tasks/release/PublishDocsReleaseTask.java +++ b/releaser-spring/src/main/java/releaser/internal/tasks/release/PublishDocsReleaseTask.java @@ -56,8 +56,7 @@ public class PublishDocsReleaseTask implements ReleaseReleaserTask { @Override public ExecutionResult runTask(Arguments args) { - return this.releaser.publishDocs(args.properties, args.originalVersion, - args.versionFromBom); + return this.releaser.publishDocs(args.properties, args.originalVersion, args.versionFromBom); } @Override diff --git a/releaser-spring/src/main/java/releaser/internal/tasks/release/UpdatingPomsReleaseTask.java b/releaser-spring/src/main/java/releaser/internal/tasks/release/UpdatingPomsReleaseTask.java index 978c18d0..00158c01 100644 --- a/releaser-spring/src/main/java/releaser/internal/tasks/release/UpdatingPomsReleaseTask.java +++ b/releaser-spring/src/main/java/releaser/internal/tasks/release/UpdatingPomsReleaseTask.java @@ -56,8 +56,7 @@ public class UpdatingPomsReleaseTask implements DryRunReleaseReleaserTask { @Override public ExecutionResult runTask(Arguments args) { - return this.releaser.updateProjectFromBom(args.project, args.projects, - args.versionFromBom); + return this.releaser.updateProjectFromBom(args.project, args.projects, args.versionFromBom); } @Override diff --git a/releaser-spring/src/test/java/releaser/internal/buildsystem/TestUtils.java b/releaser-spring/src/test/java/releaser/internal/buildsystem/TestUtils.java index 1996a573..e1a66c5f 100644 --- a/releaser-spring/src/test/java/releaser/internal/buildsystem/TestUtils.java +++ b/releaser-spring/src/test/java/releaser/internal/buildsystem/TestUtils.java @@ -31,15 +31,13 @@ public final class TestUtils { prepareLocalRepo("target/test-classes/projects/", "spring-cloud"); prepareLocalRepo("target/test-classes/projects/", "spring-cloud-wiki"); prepareLocalRepo("target/test-classes/projects/", "spring-cloud-release"); - prepareLocalRepo("target/test-classes/projects/", - "spring-cloud-release-with-snapshot"); + prepareLocalRepo("target/test-classes/projects/", "spring-cloud-release-with-snapshot"); prepareLocalRepo("target/test-classes/projects/", "spring-cloud-consul"); prepareLocalRepo("target/test-classes/projects/", "spring-cloud-build"); prepareLocalRepo("target/test-classes/projects/", "spring-cloud-static-angel"); } - private static void prepareLocalRepo(String buildDir, String repoPath) - throws IOException { + private static void prepareLocalRepo(String buildDir, String repoPath) throws IOException { File dotGit = new File(buildDir + repoPath + "/.git"); File git = new File(buildDir + repoPath + "/git"); if (git.exists()) { diff --git a/releaser-spring/src/test/java/releaser/internal/docs/TestDocumentationUpdater.java b/releaser-spring/src/test/java/releaser/internal/docs/TestDocumentationUpdater.java index 2b9927ae..7afa4e0e 100644 --- a/releaser-spring/src/test/java/releaser/internal/docs/TestDocumentationUpdater.java +++ b/releaser-spring/src/test/java/releaser/internal/docs/TestDocumentationUpdater.java @@ -25,11 +25,9 @@ import releaser.internal.git.ProjectGitHandler; */ public class TestDocumentationUpdater extends DocumentationUpdater { - public TestDocumentationUpdater(ReleaserProperties properties, - CustomProjectDocumentationUpdater updater, ProjectGitHandler handler, - TestReleaseContentsUpdater testRelease) { - super(new ProjectDocumentationUpdater(properties, handler, - Collections.singletonList(updater)), testRelease); + public TestDocumentationUpdater(ReleaserProperties properties, CustomProjectDocumentationUpdater updater, + ProjectGitHandler handler, TestReleaseContentsUpdater testRelease) { + super(new ProjectDocumentationUpdater(properties, handler, Collections.singletonList(updater)), testRelease); } } diff --git a/releaser-spring/src/test/java/releaser/internal/docs/TestReleaseContentsUpdater.java b/releaser-spring/src/test/java/releaser/internal/docs/TestReleaseContentsUpdater.java index b54ddf77..2c084df5 100644 --- a/releaser-spring/src/test/java/releaser/internal/docs/TestReleaseContentsUpdater.java +++ b/releaser-spring/src/test/java/releaser/internal/docs/TestReleaseContentsUpdater.java @@ -25,8 +25,8 @@ import releaser.internal.template.TemplateGenerator; */ public class TestReleaseContentsUpdater extends ReleaseTrainContentsUpdater { - public TestReleaseContentsUpdater(ReleaserProperties properties, - ProjectGitHandler handler, TemplateGenerator templateGenerator) { + public TestReleaseContentsUpdater(ReleaserProperties properties, ProjectGitHandler handler, + TemplateGenerator templateGenerator) { super(properties, handler, templateGenerator); } diff --git a/releaser-spring/src/test/java/releaser/internal/git/GitTestUtils.java b/releaser-spring/src/test/java/releaser/internal/git/GitTestUtils.java index 6d2cc492..1a8d508e 100644 --- a/releaser-spring/src/test/java/releaser/internal/git/GitTestUtils.java +++ b/releaser-spring/src/test/java/releaser/internal/git/GitTestUtils.java @@ -53,8 +53,7 @@ public final class GitTestUtils { return new GitRepo.JGitFactory().open(project); } - public static File clonedProject(File baseDir, File projectToClone) - throws IOException { + public static File clonedProject(File baseDir, File projectToClone) throws IOException { GitRepo projectRepo = new GitRepo(baseDir); return projectRepo.cloneProject(new URIish(projectToClone.toURI().toURL())); } diff --git a/releaser-spring/src/test/java/releaser/internal/spring/ProjectsToReleaseGroupsTests.java b/releaser-spring/src/test/java/releaser/internal/spring/ProjectsToReleaseGroupsTests.java index 718f7fb0..fcca159f 100644 --- a/releaser-spring/src/test/java/releaser/internal/spring/ProjectsToReleaseGroupsTests.java +++ b/releaser-spring/src/test/java/releaser/internal/spring/ProjectsToReleaseGroupsTests.java @@ -33,8 +33,7 @@ class ProjectsToReleaseGroupsTests { properties.getMetaRelease().setReleaseGroups(Arrays.asList("c,d", "e,f,g")); ProjectsToRun projectsToRun = projectsToRun(); - List groups = new ProjectsToReleaseGroups(properties) - .toReleaseGroup(projectsToRun); + List groups = new ProjectsToReleaseGroups(properties).toReleaseGroup(projectsToRun); BDDAssertions.then(groups).hasSize(5); BDDAssertions.then(projectNames(0, groups)).containsExactly("a"); @@ -45,8 +44,7 @@ class ProjectsToReleaseGroupsTests { } private List projectNames(int index, List groups) { - return groups.get(index).projectsToRun.stream() - .map(ProjectToRun.ProjectToRunSupplier::projectName) + return groups.get(index).projectsToRun.stream().map(ProjectToRun.ProjectToRunSupplier::projectName) .collect(Collectors.toCollection(LinkedList::new)); } diff --git a/releaser-spring/src/test/java/releaser/internal/spring/ReleaserPropertiesUpdaterTests.java b/releaser-spring/src/test/java/releaser/internal/spring/ReleaserPropertiesUpdaterTests.java index 1fe2b544..a8cf7f0c 100644 --- a/releaser-spring/src/test/java/releaser/internal/spring/ReleaserPropertiesUpdaterTests.java +++ b/releaser-spring/src/test/java/releaser/internal/spring/ReleaserPropertiesUpdaterTests.java @@ -32,8 +32,8 @@ public class ReleaserPropertiesUpdaterTests { File relaserUpdater; public ReleaserPropertiesUpdaterTests() throws URISyntaxException { - this.relaserUpdater = new File(ReleaserPropertiesUpdaterTests.class - .getResource("/projects/releaser-updater/").toURI()); + this.relaserUpdater = new File( + ReleaserPropertiesUpdaterTests.class.getResource("/projects/releaser-updater/").toURI()); } @Test @@ -41,8 +41,7 @@ public class ReleaserPropertiesUpdaterTests { ReleaserProperties original = originalReleaserProperties(); ReleaserPropertiesUpdater updater = new ReleaserPropertiesUpdater(); - ReleaserProperties props = updater.updateProperties(original, - this.relaserUpdater); + ReleaserProperties props = updater.updateProperties(original, this.relaserUpdater); BDDAssertions.then(props.getMaven().getBuildCommand()).isEqualTo("maven_build"); BDDAssertions.then(props.getGradle().getBuildCommand()).isEqualTo("gradle_build"); diff --git a/releaser-spring/src/test/java/releaser/internal/spring/SpringBatchFlowRunnerTests.java b/releaser-spring/src/test/java/releaser/internal/spring/SpringBatchFlowRunnerTests.java index 99ecd885..45604f26 100644 --- a/releaser-spring/src/test/java/releaser/internal/spring/SpringBatchFlowRunnerTests.java +++ b/releaser-spring/src/test/java/releaser/internal/spring/SpringBatchFlowRunnerTests.java @@ -48,52 +48,42 @@ class SpringBatchFlowRunnerTests { ReleaserProperties releaserProperties = new ReleaserProperties(); @Test - void should_not_fail_the_release_when_project_post_release_task_fails( - @Autowired SpringBatchFlowRunner runner) { + void should_not_fail_the_release_when_project_post_release_task_fails(@Autowired SpringBatchFlowRunner runner) { Options options = new OptionsBuilder().interactive(false).options(); ProjectsToRun projectsToRun = projectsToRun(options, releaserProperties); TasksToRun tasks = new TasksToRun(new MyProjectPostReleaseTask()); - ExecutionResult executionResult = runner.runReleaseTasks(options, - releaserProperties, projectsToRun, tasks); + ExecutionResult executionResult = runner.runReleaseTasks(options, releaserProperties, projectsToRun, tasks); BDDAssertions.then(executionResult.isUnstable()).isTrue(); } @Test - void should_execute_post_train_tasks_when_such_property_is_set( - @Autowired SpringBatchFlowRunner runner, + void should_execute_post_train_tasks_when_such_property_is_set(@Autowired SpringBatchFlowRunner runner, @Autowired ProjectsToRunFactory factory) { - Options options = new OptionsBuilder().interactive(false).metaRelease(true) - .options(); + Options options = new OptionsBuilder().interactive(false).metaRelease(true).options(); releaserProperties.setPostReleaseTasksOnly(true); releaserProperties.getMetaRelease().setReleaseTrainProjectName("foo"); ProjectsToRun projectsToRun = projectsToRun(options, releaserProperties); - BDDMockito.given(factory.postReleaseTrain(BDDMockito.any())) - .willReturn(projectsToRun); + BDDMockito.given(factory.postReleaseTrain(BDDMockito.any())).willReturn(projectsToRun); TasksToRun tasks = new TasksToRun(new MyPostTrainReleaseTask()); - ExecutionResult executionResult = runner.runReleaseTasks(options, - releaserProperties, projectsToRun, tasks); + ExecutionResult executionResult = runner.runReleaseTasks(options, releaserProperties, projectsToRun, tasks); BDDAssertions.then(executionResult.isSkipped()).isTrue(); - executionResult = runner.runPostReleaseTrainTasks(options, releaserProperties, - "post-release", tasks); + executionResult = runner.runPostReleaseTrainTasks(options, releaserProperties, "post-release", tasks); BDDAssertions.then(executionResult.isSuccess()).isTrue(); } - private ProjectsToRun projectsToRun(Options options, - ReleaserProperties releaserProperties) { - return new ProjectsToRun(new ProjectToRun.ProjectToRunSupplier("test", - () -> projectToRun(options, releaserProperties))); + private ProjectsToRun projectsToRun(Options options, ReleaserProperties releaserProperties) { + return new ProjectsToRun( + new ProjectToRun.ProjectToRunSupplier("test", () -> projectToRun(options, releaserProperties))); } - private ProjectToRun projectToRun(Options options, - ReleaserProperties releaserProperties) { - return new ProjectToRun(new File("."), - new ProjectsFromBom(new Projects(), new ProjectVersion("foo", "0.0.1")), + private ProjectToRun projectToRun(Options options, ReleaserProperties releaserProperties) { + return new ProjectToRun(new File("."), new ProjectsFromBom(new Projects(), new ProjectVersion("foo", "0.0.1")), new ProjectVersion("foo", "0.0.1"), releaserProperties, options); } @@ -139,9 +129,8 @@ class MyProjectPostReleaseTask implements ProjectPostReleaseReleaserTask { @Override public ExecutionResult runTask(Arguments args) { - return ExecutionResult.unstable( - HttpServerErrorException.create(HttpStatus.INTERNAL_SERVER_ERROR, "foo", - new HttpHeaders(), "".getBytes(), Charset.defaultCharset())); + return ExecutionResult.unstable(HttpServerErrorException.create(HttpStatus.INTERNAL_SERVER_ERROR, "foo", + new HttpHeaders(), "".getBytes(), Charset.defaultCharset())); } @Override diff --git a/releaser-test/pom.xml b/releaser-test/pom.xml index 0de13123..88a91e34 100644 --- a/releaser-test/pom.xml +++ b/releaser-test/pom.xml @@ -40,6 +40,11 @@ spring-boot-starter-test compile + + org.junit.vintage + junit-vintage-engine + compile + diff --git a/releaser-test/src/main/java/releaser/internal/buildsystem/MavenBomParserAccessor.java b/releaser-test/src/main/java/releaser/internal/buildsystem/MavenBomParserAccessor.java index 048cd052..12f776ad 100644 --- a/releaser-test/src/main/java/releaser/internal/buildsystem/MavenBomParserAccessor.java +++ b/releaser-test/src/main/java/releaser/internal/buildsystem/MavenBomParserAccessor.java @@ -21,8 +21,7 @@ import releaser.internal.ReleaserProperties; public class MavenBomParserAccessor { - public static BomParser bomParser(ReleaserProperties properties, - CustomBomParser parser) { + public static BomParser bomParser(ReleaserProperties properties, CustomBomParser parser) { return new MavenBomParser(properties, Collections.singletonList(parser)); } diff --git a/releaser-test/src/main/java/releaser/internal/buildsystem/TestUtils.java b/releaser-test/src/main/java/releaser/internal/buildsystem/TestUtils.java index 1996a573..e1a66c5f 100644 --- a/releaser-test/src/main/java/releaser/internal/buildsystem/TestUtils.java +++ b/releaser-test/src/main/java/releaser/internal/buildsystem/TestUtils.java @@ -31,15 +31,13 @@ public final class TestUtils { prepareLocalRepo("target/test-classes/projects/", "spring-cloud"); prepareLocalRepo("target/test-classes/projects/", "spring-cloud-wiki"); prepareLocalRepo("target/test-classes/projects/", "spring-cloud-release"); - prepareLocalRepo("target/test-classes/projects/", - "spring-cloud-release-with-snapshot"); + prepareLocalRepo("target/test-classes/projects/", "spring-cloud-release-with-snapshot"); prepareLocalRepo("target/test-classes/projects/", "spring-cloud-consul"); prepareLocalRepo("target/test-classes/projects/", "spring-cloud-build"); prepareLocalRepo("target/test-classes/projects/", "spring-cloud-static-angel"); } - private static void prepareLocalRepo(String buildDir, String repoPath) - throws IOException { + private static void prepareLocalRepo(String buildDir, String repoPath) throws IOException { File dotGit = new File(buildDir + repoPath + "/.git"); File git = new File(buildDir + repoPath + "/git"); if (git.exists()) { diff --git a/releaser-test/src/main/java/releaser/internal/docs/TestReleaseContentsUpdater.java b/releaser-test/src/main/java/releaser/internal/docs/TestReleaseContentsUpdater.java index b54ddf77..2c084df5 100644 --- a/releaser-test/src/main/java/releaser/internal/docs/TestReleaseContentsUpdater.java +++ b/releaser-test/src/main/java/releaser/internal/docs/TestReleaseContentsUpdater.java @@ -25,8 +25,8 @@ import releaser.internal.template.TemplateGenerator; */ public class TestReleaseContentsUpdater extends ReleaseTrainContentsUpdater { - public TestReleaseContentsUpdater(ReleaserProperties properties, - ProjectGitHandler handler, TemplateGenerator templateGenerator) { + public TestReleaseContentsUpdater(ReleaserProperties properties, ProjectGitHandler handler, + TemplateGenerator templateGenerator) { super(properties, handler, templateGenerator); } diff --git a/releaser-test/src/main/java/releaser/internal/git/GitTestUtils.java b/releaser-test/src/main/java/releaser/internal/git/GitTestUtils.java index 38b80e13..9ad4f806 100644 --- a/releaser-test/src/main/java/releaser/internal/git/GitTestUtils.java +++ b/releaser-test/src/main/java/releaser/internal/git/GitTestUtils.java @@ -57,8 +57,7 @@ public final class GitTestUtils { return new GitRepo.JGitFactory().init(project); } - public static File clonedProject(File baseDir, File projectToClone) - throws IOException { + public static File clonedProject(File baseDir, File projectToClone) throws IOException { GitRepo projectRepo = new GitRepo(baseDir); return projectRepo.cloneProject(new URIish(projectToClone.toURI().toURL())); } diff --git a/releaser-test/src/main/java/releaser/internal/spring/AbstractSpringAcceptanceTests.java b/releaser-test/src/main/java/releaser/internal/spring/AbstractSpringAcceptanceTests.java index 6c1d0f34..9f229d15 100644 --- a/releaser-test/src/main/java/releaser/internal/spring/AbstractSpringAcceptanceTests.java +++ b/releaser-test/src/main/java/releaser/internal/spring/AbstractSpringAcceptanceTests.java @@ -77,15 +77,15 @@ public abstract class AbstractSpringAcceptanceTests { public static Project newProject() { Project project = new Project(); - project.projectReleases.addAll(Arrays.asList(release("1.0.0.M8"), - release("1.1.0.M8"), release("1.2.0.M8"), release("2.0.0.M8"))); + project.setReleases( + Arrays.asList(release("1.0.0.M8"), release("1.1.0.M8"), release("1.2.0.M8"), release("2.0.0.M8"))); return project; } public static Release release(String version) { Release release = new Release(); - release.version = version; - release.current = true; + release.setVersion(version); + release.setCurrent(true); return release; } @@ -114,13 +114,11 @@ public abstract class AbstractSpringAcceptanceTests { } public void thenRunUpdatedTestsWereCalled(PostReleaseActions postReleaseActions) { - BDDMockito.then(postReleaseActions).should() - .runUpdatedTests(BDDMockito.any(Projects.class)); + BDDMockito.then(postReleaseActions).should().runUpdatedTests(BDDMockito.any(Projects.class)); } public void thenRunUpdatedTestsWereNotCalled(PostReleaseActions postReleaseActions) { - BDDMockito.then(postReleaseActions).should(BDDMockito.never()) - .runUpdatedTests(BDDMockito.any(Projects.class)); + BDDMockito.then(postReleaseActions).should(BDDMockito.never()).runUpdatedTests(BDDMockito.any(Projects.class)); } public Iterable listOfCommits(File project) throws GitAPIException { @@ -146,10 +144,8 @@ public abstract class AbstractSpringAcceptanceTests { } } - public void tagIsPresentInOrigin(File origin, String expectedTag) - throws GitAPIException { - then(GitTestUtils.openGitProject(origin).tagList().call().iterator().next() - .getName()).endsWith(expectedTag); + public void tagIsPresentInOrigin(File origin, String expectedTag) throws GitAPIException { + then(GitTestUtils.openGitProject(origin).tagList().call().iterator().next().getName()).endsWith(expectedTag); } public Model pom(File dir) { @@ -197,8 +193,7 @@ public abstract class AbstractSpringAcceptanceTests { } public File file(String relativePath) throws URISyntaxException { - return new File( - AbstractSpringAcceptanceTests.class.getResource(relativePath).toURI()); + return new File(AbstractSpringAcceptanceTests.class.getResource(relativePath).toURI()); } public String text(File file) throws IOException { @@ -221,13 +216,12 @@ public abstract class AbstractSpringAcceptanceTests { } public Git clonedProject(NonAssertingTestProjectGitHandler handler, String name) { - return GitTestUtils.openGitProject(handler.clonedProjects.stream() - .filter(file -> file.getName().equals(name)).findFirst().get()); + return GitTestUtils.openGitProject( + handler.clonedProjects.stream().filter(file -> file.getName().equals(name)).findFirst().get()); } public void thenUpdateReleaseTrainDocsWasCalled(PostReleaseActions actions) { - BDDMockito.then(actions).should() - .generateReleaseTrainDocumentation(BDDMockito.any(Projects.class)); + BDDMockito.then(actions).should().generateReleaseTrainDocumentation(BDDMockito.any(Projects.class)); } public void thenUpdateReleaseTrainDocsWasNotCalled(PostReleaseActions actions) { @@ -241,8 +235,7 @@ public abstract class AbstractSpringAcceptanceTests { public void run(SpringApplicationBuilder application, Props properties, CatchingConsumer consumer) { - try (ConfigurableApplicationContext context = application.build() - .run(properties.toCommandLineProps())) { + try (ConfigurableApplicationContext context = application.build().run(properties.toCommandLineProps())) { consumer.accept(context); } catch (Exception e) { @@ -262,8 +255,7 @@ public abstract class AbstractSpringAcceptanceTests { public Set clonedProjects = new HashSet<>(); - public NonAssertingTestProjectGitHandler(ReleaserProperties properties, - Consumer docsConsumer) { + public NonAssertingTestProjectGitHandler(ReleaserProperties properties, Consumer docsConsumer) { super(properties); this.docsConsumer = docsConsumer; } @@ -306,8 +298,7 @@ public abstract class AbstractSpringAcceptanceTests { } - public static class TestExecutionResultHandler - extends SpringBatchExecutionResultHandler { + public static class TestExecutionResultHandler extends SpringBatchExecutionResultHandler { public boolean exitedSuccessOrUnstable; @@ -333,16 +324,12 @@ public abstract class AbstractSpringAcceptanceTests { public static class DefaultTestConfiguration { @Bean - SpringBatchFlowRunner mySpringBatchFlowRunner( - StepBuilderFactory stepBuilderFactory, - JobBuilderFactory jobBuilderFactory, - ProjectsToRunFactory projectsToRunFactory, JobLauncher jobLauncher, - FlowRunnerTaskExecutorSupplier flowRunnerTaskExecutorSupplier, - ConfigurableApplicationContext context, + SpringBatchFlowRunner mySpringBatchFlowRunner(StepBuilderFactory stepBuilderFactory, + JobBuilderFactory jobBuilderFactory, ProjectsToRunFactory projectsToRunFactory, JobLauncher jobLauncher, + FlowRunnerTaskExecutorSupplier flowRunnerTaskExecutorSupplier, ConfigurableApplicationContext context, ReleaserProperties releaserProperties, BuildReportHandler reportHandler) { - return new SpringBatchFlowRunner(stepBuilderFactory, jobBuilderFactory, - projectsToRunFactory, jobLauncher, flowRunnerTaskExecutorSupplier, - context, releaserProperties, reportHandler) { + return new SpringBatchFlowRunner(stepBuilderFactory, jobBuilderFactory, projectsToRunFactory, jobLauncher, + flowRunnerTaskExecutorSupplier, context, releaserProperties, reportHandler) { @Override Decision decide(Options options, ReleaserTask task) { return Decision.CONTINUE; @@ -362,8 +349,7 @@ public abstract class AbstractSpringAcceptanceTests { } @Bean - TestExecutionResultHandler testExecutionResultHandler( - BuildReportHandler buildReportHandler, + TestExecutionResultHandler testExecutionResultHandler(BuildReportHandler buildReportHandler, ConfigurableApplicationContext context) { return new TestExecutionResultHandler(buildReportHandler, context); } @@ -384,8 +370,7 @@ public abstract class AbstractSpringAcceptanceTests { } public String[] toCommandLineProps() { - return this.args.stream().map(s -> "--" + s).collect(Collectors.toList()) - .toArray(new String[0]); + return this.args.stream().map(s -> "--" + s).collect(Collectors.toList()).toArray(new String[0]); } } diff --git a/releaser-test/src/main/java/releaser/internal/spring/ArgsBuilder.java b/releaser-test/src/main/java/releaser/internal/spring/ArgsBuilder.java index b26c6005..00a4a5e2 100644 --- a/releaser-test/src/main/java/releaser/internal/spring/ArgsBuilder.java +++ b/releaser-test/src/main/java/releaser/internal/spring/ArgsBuilder.java @@ -83,14 +83,12 @@ public class ArgsBuilder { } private void removeIfPresent(String string) { - this.args.stream().filter(s -> s.startsWith(string)).findAny() - .ifPresent(s -> this.args.remove(s)); + this.args.stream().filter(s -> s.startsWith(string)).findAny().ifPresent(s -> this.args.remove(s)); } public ArgsBuilder projectsToSkip(String... toSkip) throws Exception { removeIfPresent("releaser.meta-release.projects-to-skip"); - this.args.add( - "releaser.meta-release.projects-to-skip=" + String.join(",", toSkip)); + this.args.add("releaser.meta-release.projects-to-skip=" + String.join(",", toSkip)); return this; } @@ -149,18 +147,15 @@ public class ArgsBuilder { return this; } - public ArgsBuilder cloneDestinationDirectory(File cloneDestinationDirectory) - throws Exception { + public ArgsBuilder cloneDestinationDirectory(File cloneDestinationDirectory) throws Exception { removeIfPresent("releaser.git.clone-destination-dir"); - this.args.add("releaser.git.clone-destination-dir=" - + cloneDestinationDirectory.toString()); + this.args.add("releaser.git.clone-destination-dir=" + cloneDestinationDirectory.toString()); return this; } public ArgsBuilder releaseTrainUrl(String relativePath) throws Exception { removeIfPresent("releaser.git.release-train-bom-url"); - this.args.add("releaser.git.release-train-bom-url=" - + file(relativePath).toURI().toString()); + this.args.add("releaser.git.release-train-bom-url=" + file(relativePath).toURI().toString()); return this; } diff --git a/releaser-test/src/main/java/releaser/internal/spring/meta/AbstractSpringMetaReleaseAcceptanceTests.java b/releaser-test/src/main/java/releaser/internal/spring/meta/AbstractSpringMetaReleaseAcceptanceTests.java index 7cd5d863..765f7aa7 100644 --- a/releaser-test/src/main/java/releaser/internal/spring/meta/AbstractSpringMetaReleaseAcceptanceTests.java +++ b/releaser-test/src/main/java/releaser/internal/spring/meta/AbstractSpringMetaReleaseAcceptanceTests.java @@ -36,45 +36,34 @@ import static org.assertj.core.api.BDDAssertions.then; /** * @author Marcin Grzejszczak */ -public abstract class AbstractSpringMetaReleaseAcceptanceTests - extends AbstractSpringAcceptanceTests { +public abstract class AbstractSpringMetaReleaseAcceptanceTests extends AbstractSpringAcceptanceTests { public ArgsBuilder metaReleaseArgs(File project) throws Exception { - return new ArgsBuilder(project, this.tmp) - .releaseTrainUrl("/projects/spring-cloud-release/") - .projectsToSkip("spring-boot", "spring-cloud-build", - "spring-cloud-commons", "spring-cloud-stream", - "spring-cloud-task", "spring-cloud-function", "spring-cloud-aws", - "spring-cloud-bus", "spring-cloud-config", "spring-cloud-netflix", - "spring-cloud-cloudfoundry", "spring-cloud-gateway", - "spring-cloud-security", "spring-cloud-zookeeper", - "spring-cloud-sleuth", "spring-cloud-contract", - "spring-cloud-vault") + return new ArgsBuilder(project, this.tmp).releaseTrainUrl("/projects/spring-cloud-release/") + .projectsToSkip("spring-boot", "spring-cloud-build", "spring-cloud-commons", "spring-cloud-stream", + "spring-cloud-task", "spring-cloud-function", "spring-cloud-aws", "spring-cloud-bus", + "spring-cloud-config", "spring-cloud-netflix", "spring-cloud-cloudfoundry", + "spring-cloud-gateway", "spring-cloud-security", "spring-cloud-zookeeper", + "spring-cloud-sleuth", "spring-cloud-contract", "spring-cloud-vault") .mavenBuildCommand("echo '{{profiles}}' > /tmp/executed_build") .mavenPublishCommand("echo '{{profiles}}' > /tmp/executed_docs") .mavenDeployCommand("echo '{{profiles}}' > /tmp/executed_deploy") .gitOrgUrl("file://" + this.temporaryFolder.getAbsolutePath()) - .releaseTrainBomUrl( - file("/projects/spring-cloud-release/").toURI().toString()); + .releaseTrainBomUrl(file("/projects/spring-cloud-release/").toURI().toString()); } public ArgsBuilder metaReleaseArgsForParallel(File project) throws Exception { - return new ArgsBuilder(project, this.tmp) - .releaseTrainUrl("/projects/spring-cloud-release/") - .projectsToSkip("spring-boot", "spring-cloud-commons", - "spring-cloud-stream", "spring-cloud-task", - "spring-cloud-function", "spring-cloud-aws", "spring-cloud-bus", - "spring-cloud-config", "spring-cloud-netflix", - "spring-cloud-cloudfoundry", "spring-cloud-gateway", - "spring-cloud-security", "spring-cloud-zookeeper", - "spring-cloud-sleuth", "spring-cloud-contract", - "spring-cloud-vault") + return new ArgsBuilder(project, this.tmp).releaseTrainUrl("/projects/spring-cloud-release/") + .projectsToSkip("spring-boot", "spring-cloud-commons", "spring-cloud-stream", "spring-cloud-task", + "spring-cloud-function", "spring-cloud-aws", "spring-cloud-bus", "spring-cloud-config", + "spring-cloud-netflix", "spring-cloud-cloudfoundry", "spring-cloud-gateway", + "spring-cloud-security", "spring-cloud-zookeeper", "spring-cloud-sleuth", + "spring-cloud-contract", "spring-cloud-vault") .mavenBuildCommand("echo '{{profiles}}' > /tmp/executed_build") .mavenPublishCommand("echo '{{profiles}}' > /tmp/executed_docs") .mavenDeployCommand("echo '{{profiles}}' > /tmp/executed_deploy") .gitOrgUrl("file://" + this.temporaryFolder.getAbsolutePath()) - .releaseTrainBomUrl( - file("/projects/spring-cloud-release/").toURI().toString()); + .releaseTrainBomUrl(file("/projects/spring-cloud-release/").toURI().toString()); } public Map edgwareSr10() { @@ -104,12 +93,9 @@ public abstract class AbstractSpringMetaReleaseAcceptanceTests public void thenAllStepsWereExecutedForEachProject( NonAssertingTestProjectGitHandler nonAssertingTestProjectGitHandler) { nonAssertingTestProjectGitHandler.clonedProjects.stream() - .filter(f -> !f.getName().contains("angel") - && !f.getName().equals("spring-cloud")) - .forEach(project -> { - then(Arrays.asList("spring-cloud-starter-build", - "spring-cloud-consul")) - .contains(pom(project).getArtifactId()); + .filter(f -> !f.getName().contains("angel") && !f.getName().equals("spring-cloud")).forEach(project -> { + then(Arrays.asList("spring-cloud-starter-build", "spring-cloud-consul")) + .contains(pom(project).getArtifactId()); then(new File("/tmp/executed_build")).exists(); then(new File("/tmp/executed_deploy")).exists(); then(new File("/tmp/executed_docs")).exists(); @@ -117,21 +103,18 @@ public abstract class AbstractSpringMetaReleaseAcceptanceTests } public void thenSaganWasCalled(SaganUpdater saganUpdater) { - BDDMockito.then(saganUpdater).should(BDDMockito.atLeastOnce()).updateSagan( - BDDMockito.any(File.class), BDDMockito.anyString(), - BDDMockito.any(ProjectVersion.class), - BDDMockito.any(ProjectVersion.class), BDDMockito.any(Projects.class)); + BDDMockito.then(saganUpdater).should(BDDMockito.atLeastOnce()).updateSagan(BDDMockito.any(File.class), + BDDMockito.anyString(), BDDMockito.any(ProjectVersion.class), BDDMockito.any(ProjectVersion.class), + BDDMockito.any(Projects.class)); } public void thenSaganWasNotCalled(SaganUpdater saganUpdater) { - BDDMockito.then(saganUpdater).should(BDDMockito.never()).updateSagan( - BDDMockito.any(File.class), BDDMockito.anyString(), - BDDMockito.any(ProjectVersion.class), - BDDMockito.any(ProjectVersion.class), BDDMockito.any(Projects.class)); + BDDMockito.then(saganUpdater).should(BDDMockito.never()).updateSagan(BDDMockito.any(File.class), + BDDMockito.anyString(), BDDMockito.any(ProjectVersion.class), BDDMockito.any(ProjectVersion.class), + BDDMockito.any(Projects.class)); } - public static class NonAssertingTestProjectGitHubHandler - extends ProjectGitHubHandler { + public static class NonAssertingTestProjectGitHubHandler extends ProjectGitHubHandler { boolean closedMilestones = false; @@ -154,8 +137,7 @@ public abstract class AbstractSpringMetaReleaseAcceptanceTests } @Override - public void createIssueInStartSpringIo(Projects projects, - ProjectVersion version) { + public void createIssueInStartSpringIo(Projects projects, ProjectVersion version) { this.issueCreatedInStartSpringIo = true; } diff --git a/spring-cloud-info/pom.xml b/spring-cloud-info/pom.xml index 27d5be6a..9024ef61 100644 --- a/spring-cloud-info/pom.xml +++ b/spring-cloud-info/pom.xml @@ -17,8 +17,9 @@ 1.1.4 3.6.3 3.1.6.RELEASE - Greenwich.RELEASE - 2.0.5.RELEASE + 0.2.0-RELEASE + 2021.0.0 + 2.0.6.RELEASE @@ -58,6 +59,10 @@ org.springframework.boot spring-boot-starter-actuator + + org.springframework.cloud + spring-cloud-starter-bootstrap + org.springframework.boot @@ -69,6 +74,11 @@ spring-restdocs-mockmvc test + + org.junit.vintage + junit-vintage-engine + test + diff --git a/spring-cloud-info/src/main/java/org/springframework/cloud/info/InitializrSpringCloudInfoService.java b/spring-cloud-info/src/main/java/org/springframework/cloud/info/InitializrSpringCloudInfoService.java index 1b79d37c..6992ccfc 100644 --- a/spring-cloud-info/src/main/java/org/springframework/cloud/info/InitializrSpringCloudInfoService.java +++ b/spring-cloud-info/src/main/java/org/springframework/cloud/info/InitializrSpringCloudInfoService.java @@ -35,8 +35,7 @@ public class InitializrSpringCloudInfoService extends SpringCloudRelease { private RestTemplate rest; - public InitializrSpringCloudInfoService(RestTemplate rest, Github github, - GithubPomReader reader) { + public InitializrSpringCloudInfoService(RestTemplate rest, Github github, GithubPomReader reader) { super(github, reader); this.rest = rest; } @@ -48,17 +47,16 @@ public class InitializrSpringCloudInfoService extends SpringCloudRelease { Map cache = new HashMap<>(); Map response = rest.getForObject(INITIALIZR_URL, Map.class); if (!response.containsKey("bom-ranges")) { - throw new SpringCloudVersionNotFoundException(new InitializrParseException( - "bom-ranges key not found in Initializr info endpoint")); + throw new SpringCloudVersionNotFoundException( + new InitializrParseException("bom-ranges key not found in Initializr info endpoint")); } Map bomRanges = (Map) response.get("bom-ranges"); if (!bomRanges.containsKey("spring-cloud")) { - throw new SpringCloudVersionNotFoundException(new InitializrParseException( - "spring-cloud key not found in Initializr info endpoint")); + throw new SpringCloudVersionNotFoundException( + new InitializrParseException("spring-cloud key not found in Initializr info endpoint")); } - Map springCloud = (Map) bomRanges - .get("spring-cloud"); + Map springCloud = (Map) bomRanges.get("spring-cloud"); for (String key : springCloud.keySet()) { String rangeString = springCloud.get(key); cache.put(key, parseRangeString(rangeString, key)); @@ -71,8 +69,7 @@ public class InitializrSpringCloudInfoService extends SpringCloudRelease { throw new SpringCloudVersionNotFoundException(springBootVersion); } - private SpringBootAndCloudVersion parseRangeString(String rangeString, - String springCloudVersion) { + private SpringBootAndCloudVersion parseRangeString(String rangeString, String springCloudVersion) { // Example of rangeString Spring Boot >=2.0.0.M3 and <2.0.0.M5 String versions = rangeString.substring(13); boolean startVersionInclusive = true; @@ -94,12 +91,11 @@ public class InitializrSpringCloudInfoService extends SpringCloudRelease { cleanedVersions = versions.split(" and <"); } if (cleanedVersions.length == 1) { - return new SpringBootAndCloudVersion(cleanedVersions[0], - startVersionInclusive, "99999.99999.99999.RELEASE", + return new SpringBootAndCloudVersion(cleanedVersions[0], startVersionInclusive, "99999.99999.99999.RELEASE", endVersionInclusive, springCloudVersion); } - return new SpringBootAndCloudVersion(cleanedVersions[0], startVersionInclusive, - cleanedVersions[1], endVersionInclusive, springCloudVersion); + return new SpringBootAndCloudVersion(cleanedVersions[0], startVersionInclusive, cleanedVersions[1], + endVersionInclusive, springCloudVersion); } } diff --git a/spring-cloud-info/src/main/java/org/springframework/cloud/info/SpringBootAndCloudVersion.java b/spring-cloud-info/src/main/java/org/springframework/cloud/info/SpringBootAndCloudVersion.java index 56930aa6..f3ebe0a0 100644 --- a/spring-cloud-info/src/main/java/org/springframework/cloud/info/SpringBootAndCloudVersion.java +++ b/spring-cloud-info/src/main/java/org/springframework/cloud/info/SpringBootAndCloudVersion.java @@ -37,8 +37,7 @@ public class SpringBootAndCloudVersion { private String springCloudVersion; - public SpringBootAndCloudVersion(String bootStartVersion, - boolean statVersionInclusive, String bootEndVersion, + public SpringBootAndCloudVersion(String bootStartVersion, boolean statVersionInclusive, String bootEndVersion, boolean endVersionInclusive, String springCloudVersion) { this.bootEndVersion = bootEndVersion; this.comparableBootEndVersion = new ComparableVersion(bootEndVersion); @@ -80,10 +79,8 @@ public class SpringBootAndCloudVersion { boolean matchesSpringBootVersion(ComparableVersion versionToCheck) { int startVersionComparison = comparableBootStartVersion.compareTo(versionToCheck); int endVersionComparison = versionToCheck.compareTo(comparableBootEndVersion); - return ((startVersionInclusive && startVersionComparison == 0) - || startVersionComparison <= -1) - && ((endVersionInclusive && endVersionComparison == 0) - || endVersionComparison <= -1); + return ((startVersionInclusive && startVersionComparison == 0) || startVersionComparison <= -1) + && ((endVersionInclusive && endVersionComparison == 0) || endVersionComparison <= -1); } } diff --git a/spring-cloud-info/src/main/java/org/springframework/cloud/info/SpringCloudInfoApplication.java b/spring-cloud-info/src/main/java/org/springframework/cloud/info/SpringCloudInfoApplication.java index 093567bb..8de2b467 100644 --- a/spring-cloud-info/src/main/java/org/springframework/cloud/info/SpringCloudInfoApplication.java +++ b/spring-cloud-info/src/main/java/org/springframework/cloud/info/SpringCloudInfoApplication.java @@ -45,8 +45,7 @@ public class SpringCloudInfoApplication { SpringCloudInfoConfigurationProperties properties) { Github github = new RtGithub(properties.getGit().getOauthToken()); RestTemplate rest = new RestTemplateBuilder().build(); - return new InitializrSpringCloudInfoService(rest, github, - new GithubPomReader(new MavenXpp3Reader(), rest)); + return new InitializrSpringCloudInfoService(rest, github, new GithubPomReader(new MavenXpp3Reader(), rest)); } @Configuration @@ -54,8 +53,7 @@ public class SpringCloudInfoApplication { @Override protected void configure(HttpSecurity http) throws Exception { - http.authorizeRequests().anyRequest().permitAll().and().httpBasic().disable() - .csrf().disable(); + http.authorizeRequests().anyRequest().permitAll().and().httpBasic().disable().csrf().disable(); } } diff --git a/spring-cloud-info/src/main/java/org/springframework/cloud/info/SpringCloudInfoRestController.java b/spring-cloud-info/src/main/java/org/springframework/cloud/info/SpringCloudInfoRestController.java index 85639a5a..e9394e6e 100644 --- a/spring-cloud-info/src/main/java/org/springframework/cloud/info/SpringCloudInfoRestController.java +++ b/spring-cloud-info/src/main/java/org/springframework/cloud/info/SpringCloudInfoRestController.java @@ -57,8 +57,7 @@ public class SpringCloudInfoRestController { } @GetMapping("/bomversions/{bomVersion}") - public Map bomVersions(@PathVariable String bomVersion) - throws IOException { + public Map bomVersions(@PathVariable String bomVersion) throws IOException { try { return versionService.getReleaseVersions(bomVersion); } @@ -74,8 +73,7 @@ public class SpringCloudInfoRestController { } @GetMapping("/milestones/{name}/duedate") - public SpringCloudInfoService.Milestone milestoneDueDate(@PathVariable String name) - throws IOException { + public SpringCloudInfoService.Milestone milestoneDueDate(@PathVariable String name) throws IOException { try { return versionService.getMilestoneDueDate(name); } diff --git a/spring-cloud-info/src/main/java/org/springframework/cloud/info/SpringCloudInfoService.java b/spring-cloud-info/src/main/java/org/springframework/cloud/info/SpringCloudInfoService.java index 1540b7c8..d435174a 100644 --- a/spring-cloud-info/src/main/java/org/springframework/cloud/info/SpringCloudInfoService.java +++ b/spring-cloud-info/src/main/java/org/springframework/cloud/info/SpringCloudInfoService.java @@ -29,18 +29,15 @@ import org.springframework.cloud.info.exceptions.SpringCloudVersionNotFoundExcep */ public interface SpringCloudInfoService { - SpringCloudVersion getSpringCloudVersion(String bootVersion) - throws SpringCloudVersionNotFoundException; + SpringCloudVersion getSpringCloudVersion(String bootVersion) throws SpringCloudVersionNotFoundException; Collection getSpringCloudVersions() throws IOException; - Map getReleaseVersions(String bomVersion) - throws SpringCloudVersionNotFoundException, IOException; + Map getReleaseVersions(String bomVersion) throws SpringCloudVersionNotFoundException, IOException; Collection getMilestones() throws IOException; - Milestone getMilestoneDueDate(String name) - throws SpringCloudMilestoneNotFoundException, IOException; + Milestone getMilestoneDueDate(String name) throws SpringCloudMilestoneNotFoundException, IOException; class Milestone { diff --git a/spring-cloud-info/src/main/java/org/springframework/cloud/info/SpringCloudRelease.java b/spring-cloud-info/src/main/java/org/springframework/cloud/info/SpringCloudRelease.java index 18b3056f..471613e2 100644 --- a/spring-cloud-info/src/main/java/org/springframework/cloud/info/SpringCloudRelease.java +++ b/spring-cloud-info/src/main/java/org/springframework/cloud/info/SpringCloudRelease.java @@ -56,8 +56,7 @@ public abstract class SpringCloudRelease implements SpringCloudInfoService { /** * Github tags path. */ - public static final String SPRING_CLOUD_RELEASE_TAGS_PATH = "repos/" - + SPRING_CLOUD_RELEASE_COORDINATES + "/tags"; + public static final String SPRING_CLOUD_RELEASE_TAGS_PATH = "repos/" + SPRING_CLOUD_RELEASE_COORDINATES + "/tags"; private static final String SPRING_CLOUD_RELEASE_RAW = "https://raw.githubusercontent.com/" + SPRING_CLOUD_RELEASE_COORDINATES; @@ -87,8 +86,8 @@ public abstract class SpringCloudRelease implements SpringCloudInfoService { @Cacheable("springCloudVersions") public Collection getSpringCloudVersions() throws IOException { List releaseVersions = new ArrayList<>(); - JsonReader reader = github.entry().uri().path(SPRING_CLOUD_RELEASE_TAGS_PATH) - .back().fetch().as(JsonResponse.class).json(); + JsonReader reader = github.entry().uri().path(SPRING_CLOUD_RELEASE_TAGS_PATH).back().fetch() + .as(JsonResponse.class).json(); JsonArray tags = reader.readArray(); reader.close(); List tagsList = tags.getValuesAs(JsonObject.class); @@ -108,12 +107,10 @@ public abstract class SpringCloudRelease implements SpringCloudInfoService { } try { Map versions = new HashMap<>(); - Model model = reader.readPomFromUrl( - String.format(SPRING_CLOUD_RELEASE_DEPENDENCIES_RAW, bomVersion)); + Model model = reader.readPomFromUrl(String.format(SPRING_CLOUD_RELEASE_DEPENDENCIES_RAW, bomVersion)); for (String name : model.getProperties().stringPropertyNames()) { if (name.startsWith("spring-cloud-")) { - versions.put(name.replace(".version", ""), - model.getProperties().getProperty(name)); + versions.put(name.replace(".version", ""), model.getProperties().getProperty(name)); } } versions.put("spring-boot", getSpringCloudBootVersion(bomVersion)); @@ -138,8 +135,7 @@ public abstract class SpringCloudRelease implements SpringCloudInfoService { @Override @Cacheable("milestoneDueDate") - public Milestone getMilestoneDueDate(String name) - throws SpringCloudMilestoneNotFoundException, IOException { + public Milestone getMilestoneDueDate(String name) throws SpringCloudMilestoneNotFoundException, IOException { Iterable milestones = getMilestonesFromGithub(); for (com.jcabi.github.Milestone milestone : milestones) { JsonObject json = milestone.json(); @@ -149,8 +145,7 @@ public abstract class SpringCloudRelease implements SpringCloudInfoService { } else { Instant instant = Instant.parse(json.getString("due_on")); - return new Milestone(LocalDateTime - .ofInstant(instant, ZoneId.of(ZoneOffset.UTC.getId())) + return new Milestone(LocalDateTime.ofInstant(instant, ZoneId.of(ZoneOffset.UTC.getId())) .toLocalDate().toString()); } } @@ -161,15 +156,12 @@ public abstract class SpringCloudRelease implements SpringCloudInfoService { private Iterable getMilestonesFromGithub() { Map params = new HashMap<>(); params.put("state", "open"); - return github.repos() - .get(new Coordinates.Simple(SPRING_CLOUD_RELEASE_COORDINATES)) - .milestones().iterate(params); + return github.repos().get(new Coordinates.Simple(SPRING_CLOUD_RELEASE_COORDINATES)).milestones() + .iterate(params); } - private String getSpringCloudBootVersion(String bomVersion) - throws IOException, XmlPullParserException { - Model model = reader.readPomFromUrl( - String.format(SPRING_CLOUD_STARTER_PARENT_RAW, bomVersion)); + private String getSpringCloudBootVersion(String bomVersion) throws IOException, XmlPullParserException { + Model model = reader.readPomFromUrl(String.format(SPRING_CLOUD_STARTER_PARENT_RAW, bomVersion)); return model.getParent().getVersion(); } diff --git a/spring-cloud-info/src/main/java/org/springframework/cloud/info/exceptions/SpringCloudMilestoneNotFoundException.java b/spring-cloud-info/src/main/java/org/springframework/cloud/info/exceptions/SpringCloudMilestoneNotFoundException.java index ccb26f2c..2330114f 100644 --- a/spring-cloud-info/src/main/java/org/springframework/cloud/info/exceptions/SpringCloudMilestoneNotFoundException.java +++ b/spring-cloud-info/src/main/java/org/springframework/cloud/info/exceptions/SpringCloudMilestoneNotFoundException.java @@ -22,8 +22,7 @@ package org.springframework.cloud.info.exceptions; public class SpringCloudMilestoneNotFoundException extends Exception { public SpringCloudMilestoneNotFoundException(String name) { - super("Spring Cloud milestone " + name - + " was not found in Spring Cloud Release"); + super("Spring Cloud milestone " + name + " was not found in Spring Cloud Release"); } } diff --git a/spring-cloud-info/src/main/java/org/springframework/cloud/info/exceptions/SpringCloudVersionNotFoundException.java b/spring-cloud-info/src/main/java/org/springframework/cloud/info/exceptions/SpringCloudVersionNotFoundException.java index 85a0a442..b1fdd31f 100644 --- a/spring-cloud-info/src/main/java/org/springframework/cloud/info/exceptions/SpringCloudVersionNotFoundException.java +++ b/spring-cloud-info/src/main/java/org/springframework/cloud/info/exceptions/SpringCloudVersionNotFoundException.java @@ -22,8 +22,7 @@ package org.springframework.cloud.info.exceptions; public class SpringCloudVersionNotFoundException extends Exception { public SpringCloudVersionNotFoundException(String springBootVersion) { - super("Spring Cloud version not found for Spring Boot Version " - + springBootVersion); + super("Spring Cloud version not found for Spring Boot Version " + springBootVersion); } public SpringCloudVersionNotFoundException(Exception e) { diff --git a/spring-cloud-info/src/main/resources/static/docs/reference/html/spring-cloud-info.html b/spring-cloud-info/src/main/resources/static/docs/reference/html/spring-cloud-info.html index ee292c6c..b085ac0a 100644 --- a/spring-cloud-info/src/main/resources/static/docs/reference/html/spring-cloud-info.html +++ b/spring-cloud-info/src/main/resources/static/docs/reference/html/spring-cloud-info.html @@ -153,67 +153,33 @@ $(addBlockSwitches);

cURL Request

-
-
-
$ curl 'http://spring-cloud-info.cfapps.io/springcloudversions' -i -X GET \
-    -H 'Accept: application/json'
-
+
+

Unresolved directive in spring-cloud-info.adoc - include::../../target/generated-snippets/springcloudversions/curl-request.adoc[]

HTTPie Request

-
-
-
$ http GET 'http://spring-cloud-info.cfapps.io/springcloudversions' \
-    'Accept:application/json'
-
+
+

Unresolved directive in spring-cloud-info.adoc - include::../../target/generated-snippets/springcloudversions/httpie-request.adoc[]

HTTP Request

-
-
-
GET /springcloudversions HTTP/1.1
-Accept: application/json
-Host: spring-cloud-info.cfapps.io
-
+
+

Unresolved directive in spring-cloud-info.adoc - include::../../target/generated-snippets/springcloudversions/http-request.adoc[]

Response

-
-
-
HTTP/1.1 200 OK
-Content-Type: application/json
-Content-Length: 449
-
-["Greenwich.SR1","Greenwich.RELEASE","Greenwich.RC2","Greenwich.RC1","Greenwich.M3","Greenwich.M2","Greenwich.M1","Finchley.SR3","Finchley.SR2","Finchley.SR1","Finchley.RELEASE","Finchley.RC2","Finchley.RC1","Finchley.M9","Finchley.M8","Finchley.M7","Finchley.M6","Finchley.M5","Finchley.M3","Finchley.M2","Finchley.M1","Edgware.SR5","Edgware.SR4","Edgware.SR3","Edgware.SR2","Edgware.SR1","Edgware.RELEASE","Edgware.M1","Dalston.SR5","Dalston.SR4"]
-
+
+

Unresolved directive in spring-cloud-info.adoc - include::../../target/generated-snippets/springcloudversions/http-response.adoc[]

----- - - - - - - - - - - - - - - -
PathTypeDescription

[]

Array

An array versions

+
+

Unresolved directive in spring-cloud-info.adoc - include::../../target/generated-snippets/springcloudversions/response-fields.adoc[]

+
@@ -225,90 +191,39 @@ Content-Length: 449

Path Parameters

- - ---- - - - - - - - - - - - - -
Table 1. /springcloudversion/springboot/{bootVersion}
ParameterDescription

bootVersion

The Spring Boot version

+
+

Unresolved directive in spring-cloud-info.adoc - include::../../target/generated-snippets/springcloudversion/path-parameters.adoc[]

+

cURL Request

-
-
-
$ curl 'http://spring-cloud-info.cfapps.io/springcloudversion/springboot/2.1.1.RELEASE' -i -X GET \
-    -H 'Accept: application/json'
-
+
+

Unresolved directive in spring-cloud-info.adoc - include::../../target/generated-snippets/springcloudversion/curl-request.adoc[]

HTTPie Request

-
-
-
$ http GET 'http://spring-cloud-info.cfapps.io/springcloudversion/springboot/2.1.1.RELEASE' \
-    'Accept:application/json'
-
+
+

Unresolved directive in spring-cloud-info.adoc - include::../../target/generated-snippets/springcloudversion/httpie-request.adoc[]

HTTP Request

-
-
-
GET /springcloudversion/springboot/2.1.1.RELEASE HTTP/1.1
-Accept: application/json
-Host: spring-cloud-info.cfapps.io
-
+
+

Unresolved directive in spring-cloud-info.adoc - include::../../target/generated-snippets/springcloudversion/http-request.adoc[]

HTTP Response

-
-
-
HTTP/1.1 200 OK
-Content-Disposition: inline;filename=f.txt
-Content-Type: application/json
-Content-Length: 31
-
-{"version":"Greenwich.RELEASE"}
-
+
+

Unresolved directive in spring-cloud-info.adoc - include::../../target/generated-snippets/springcloudversion/http-response.adoc[]

Response Fields

- ----- - - - - - - - - - - - - - - -
PathTypeDescription

version

String

Spring Cloud version

+
+

Unresolved directive in spring-cloud-info.adoc - include::../../target/generated-snippets/springcloudversion/response-fields.adoc[]

+
@@ -320,43 +235,26 @@ Content-Length: 31

cURL Request

-
-
-
$ curl 'http://spring-cloud-info.cfapps.io/bomversions/Finchley.SR1' -i -X GET \
-    -H 'Accept: application/json'
-
+
+

Unresolved directive in spring-cloud-info.adoc - include::../../target/generated-snippets/bomversions/curl-request.adoc[]

HTTPie Request

-
-
-
$ http GET 'http://spring-cloud-info.cfapps.io/bomversions/Finchley.SR1' \
-    'Accept:application/json'
-
+
+

Unresolved directive in spring-cloud-info.adoc - include::../../target/generated-snippets/bomversions/httpie-request.adoc[]

HTTP Request

-
-
-
GET /bomversions/Finchley.SR1 HTTP/1.1
-Accept: application/json
-Host: spring-cloud-info.cfapps.io
-
+
+

Unresolved directive in spring-cloud-info.adoc - include::../../target/generated-snippets/bomversions/http-request.adoc[]

HTTP Response

-
-
-
HTTP/1.1 200 OK
-Content-Disposition: inline;filename=f.txt
-Content-Type: application/json
-Content-Length: 904
-
-{"spring-cloud-cloudfoundry":"2.2.0.BUILD-SNAPSHOT","spring-cloud-openfeign":"2.2.0.BUILD-SNAPSHOT","spring-cloud-task":"2.0.0.RELEASE","spring-cloud-security":"2.2.0.BUILD-SNAPSHOT","spring-cloud-zookeeper":"2.2.0.BUILD-SNAPSHOT","spring-cloud-config":"2.2.0.BUILD-SNAPSHOT","spring-cloud-function":"2.1.0.BUILD-SNAPSHOT","spring-cloud-netflix":"2.2.0.BUILD-SNAPSHOT","spring-cloud-vault":"2.2.0.BUILD-SNAPSHOT","spring-cloud-stream":"Germantown.BUILD-SNAPSHOT","spring-cloud-gcp":"1.1.0.BUILD-SNAPSHOT","spring-cloud-sleuth":"2.2.0.BUILD-SNAPSHOT","spring-cloud-kubernetes":"1.1.0.BUILD-SNAPSHOT","spring-cloud-commons":"2.2.0.BUILD-SNAPSHOT","spring-cloud-aws":"2.2.0.BUILD-SNAPSHOT","spring-cloud-contract":"2.2.0.BUILD-SNAPSHOT","spring-cloud-bus":"2.2.0.BUILD-SNAPSHOT","spring-cloud-gateway":"2.2.0.BUILD-SNAPSHOT","spring-boot":"2.2.0.BUILD-SNAPSHOT","spring-cloud-consul":"2.2.0.BUILD-SNAPSHOT"}
-
+
+

Unresolved directive in spring-cloud-info.adoc - include::../../target/generated-snippets/bomversions/http-response.adoc[]

@@ -369,42 +267,26 @@ Content-Length: 904

cURL Request

-
-
-
$ curl 'http://spring-cloud-info.cfapps.io/milestones' -i -X GET \
-    -H 'Accept: application/json'
-
+
+

Unresolved directive in spring-cloud-info.adoc - include::../../target/generated-snippets/milestones/curl-request.adoc[]

HTTPie Request

-
-
-
$ http GET 'http://spring-cloud-info.cfapps.io/milestones' \
-    'Accept:application/json'
-
+
+

Unresolved directive in spring-cloud-info.adoc - include::../../target/generated-snippets/milestones/httpie-request.adoc[]

HTTP Request

-
-
-
GET /milestones HTTP/1.1
-Accept: application/json
-Host: spring-cloud-info.cfapps.io
-
+
+

Unresolved directive in spring-cloud-info.adoc - include::../../target/generated-snippets/milestones/http-request.adoc[]

HTTP Response

-
-
-
HTTP/1.1 200 OK
-Content-Type: application/json
-Content-Length: 57
-
-["Hoxton.RELEASE","Finchley.SR4","Hoxton.M1","Hoxton.M2"]
-
+
+

Unresolved directive in spring-cloud-info.adoc - include::../../target/generated-snippets/milestones/http-response.adoc[]

@@ -417,89 +299,39 @@ Content-Length: 57

Path Parameters

- - ---- - - - - - - - - - - - - -
Table 2. /milestones/{release}/duedate
ParameterDescription

release

The Spring Cloud release train name

+
+

Unresolved directive in spring-cloud-info.adoc - include::../../target/generated-snippets/milestoneduedate/path-parameters.adoc[]

+

cURL Request

-
-
-
$ curl 'http://spring-cloud-info.cfapps.io/milestones/Hoxton.RELEASE/duedate' -i -X GET \
-    -H 'Accept: application/json'
-
+
+

Unresolved directive in spring-cloud-info.adoc - include::../../target/generated-snippets/milestoneduedate/curl-request.adoc[]

HTTPie Request

-
-
-
$ http GET 'http://spring-cloud-info.cfapps.io/milestones/Hoxton.RELEASE/duedate' \
-    'Accept:application/json'
-
+
+

Unresolved directive in spring-cloud-info.adoc - include::../../target/generated-snippets/milestoneduedate/httpie-request.adoc[]

HTTP Request

-
-
-
GET /milestones/Hoxton.RELEASE/duedate HTTP/1.1
-Accept: application/json
-Host: spring-cloud-info.cfapps.io
-
+
+

Unresolved directive in spring-cloud-info.adoc - include::../../target/generated-snippets/milestoneduedate/http-request.adoc[]

HTTP Response

-
-
-
HTTP/1.1 200 OK
-Content-Type: application/json
-Content-Length: 24
-
-{"dueDate":"2019-07-31"}
-
+
+

Unresolved directive in spring-cloud-info.adoc - include::../../target/generated-snippets/milestoneduedate/http-response.adoc[]

Response Fields

- ----- - - - - - - - - - - - - - - -
PathTypeDescription

dueDate

String

Spring Cloud milestone due date

+
+

Unresolved directive in spring-cloud-info.adoc - include::../../target/generated-snippets/milestoneduedate/response-fields.adoc[]

+
diff --git a/spring-cloud-info/src/test/java/org/springframework/cloud/info/InitializrSpringCloudInfoServiceTests.java b/spring-cloud-info/src/test/java/org/springframework/cloud/info/InitializrSpringCloudInfoServiceTests.java index ab02fd81..6306a4b4 100644 --- a/spring-cloud-info/src/test/java/org/springframework/cloud/info/InitializrSpringCloudInfoServiceTests.java +++ b/spring-cloud-info/src/test/java/org/springframework/cloud/info/InitializrSpringCloudInfoServiceTests.java @@ -75,8 +75,7 @@ public class InitializrSpringCloudInfoServiceTests { Github github = mock(Github.class); GithubPomReader githubPomReader = mock(GithubPomReader.class); when(rest.getForObject(anyString(), eq(Map.class))).thenReturn(new HashMap()); - InitializrSpringCloudInfoService service = new InitializrSpringCloudInfoService( - rest, github, githubPomReader); + InitializrSpringCloudInfoService service = new InitializrSpringCloudInfoService(rest, github, githubPomReader); try { service.getSpringCloudVersion("2.1.0"); fail("Exception should have been thrown"); @@ -94,8 +93,7 @@ public class InitializrSpringCloudInfoServiceTests { Map> info = new HashMap<>(); info.put("bom-ranges", new HashMap<>()); when(rest.getForObject(anyString(), eq(Map.class))).thenReturn(info); - InitializrSpringCloudInfoService service = new InitializrSpringCloudInfoService( - rest, github, githubPomReader); + InitializrSpringCloudInfoService service = new InitializrSpringCloudInfoService(rest, github, githubPomReader); try { service.getSpringCloudVersion("2.1.0"); fail("Exception should have been thrown"); @@ -111,25 +109,19 @@ public class InitializrSpringCloudInfoServiceTests { RestTemplate rest = mock(RestTemplate.class); Github github = mock(Github.class); GithubPomReader githubPomReader = mock(GithubPomReader.class); - when(githubPomReader.readPomFromUrl(eq(String - .format(SpringCloudRelease.SPRING_CLOUD_STARTER_PARENT_RAW, bomVersion)))) - .thenReturn(new MavenXpp3Reader() - .read(new FileReader(new ClassPathResource( - "spring-cloud-starter-parent-pom.xml") - .getFile()))); - when(githubPomReader.readPomFromUrl(eq(String.format( - SpringCloudRelease.SPRING_CLOUD_RELEASE_DEPENDENCIES_RAW, bomVersion)))) + when(githubPomReader + .readPomFromUrl(eq(String.format(SpringCloudRelease.SPRING_CLOUD_STARTER_PARENT_RAW, bomVersion)))) .thenReturn(new MavenXpp3Reader().read(new FileReader( - new ClassPathResource("spring-cloud-dependencies-pom.xml") - .getFile()))); + new ClassPathResource("spring-cloud-starter-parent-pom.xml").getFile()))); + when(githubPomReader.readPomFromUrl( + eq(String.format(SpringCloudRelease.SPRING_CLOUD_RELEASE_DEPENDENCIES_RAW, bomVersion)))) + .thenReturn(new MavenXpp3Reader().read( + new FileReader(new ClassPathResource("spring-cloud-dependencies-pom.xml").getFile()))); InitializrSpringCloudInfoService service = spy( new InitializrSpringCloudInfoService(rest, github, githubPomReader)); - doReturn(Arrays.asList(new String[] { bomVersion })).when(service) - .getSpringCloudVersions(); - Map releaseVersionsResult = service - .getReleaseVersions(bomVersion); - assertThat(releaseVersionsResult, - Matchers.equalTo(SpringCloudInfoTestData.releaseVersions)); + doReturn(Arrays.asList(new String[] { bomVersion })).when(service).getSpringCloudVersions(); + Map releaseVersionsResult = service.getReleaseVersions(bomVersion); + assertThat(releaseVersionsResult, Matchers.equalTo(SpringCloudInfoTestData.releaseVersions)); } @Test(expected = SpringCloudVersionNotFoundException.class) @@ -138,17 +130,14 @@ public class InitializrSpringCloudInfoServiceTests { RestTemplate rest = mock(RestTemplate.class); Github github = mock(Github.class); GithubPomReader githubPomReader = mock(GithubPomReader.class); - when(githubPomReader.readPomFromUrl(eq(String - .format(SpringCloudRelease.SPRING_CLOUD_STARTER_PARENT_RAW, bomVersion)))) - .thenReturn(new MavenXpp3Reader() - .read(new FileReader(new ClassPathResource( - "spring-cloud-starter-parent-pom.xml") - .getFile()))); - when(githubPomReader.readPomFromUrl(eq(String.format( - SpringCloudRelease.SPRING_CLOUD_RELEASE_DEPENDENCIES_RAW, bomVersion)))) + when(githubPomReader + .readPomFromUrl(eq(String.format(SpringCloudRelease.SPRING_CLOUD_STARTER_PARENT_RAW, bomVersion)))) .thenReturn(new MavenXpp3Reader().read(new FileReader( - new ClassPathResource("spring-cloud-dependencies-pom.xml") - .getFile()))); + new ClassPathResource("spring-cloud-starter-parent-pom.xml").getFile()))); + when(githubPomReader.readPomFromUrl( + eq(String.format(SpringCloudRelease.SPRING_CLOUD_RELEASE_DEPENDENCIES_RAW, bomVersion)))) + .thenReturn(new MavenXpp3Reader().read( + new FileReader(new ClassPathResource("spring-cloud-dependencies-pom.xml").getFile()))); InitializrSpringCloudInfoService service = spy( new InitializrSpringCloudInfoService(rest, github, githubPomReader)); doReturn(new ArrayList()).when(service).getSpringCloudVersions(); @@ -163,10 +152,8 @@ public class InitializrSpringCloudInfoServiceTests { Response response = mock(Response.class); Request request = mock(Request.class); RequestURI requestURI = mock(RequestURI.class); - JsonResponse jsonResponse = new JsonResponse(new DefaultResponse(request, 200, "", - new Array<>(), - IOUtils.toByteArray(new ClassPathResource("spring-cloud-versions.json") - .getInputStream()))); + JsonResponse jsonResponse = new JsonResponse(new DefaultResponse(request, 200, "", new Array<>(), + IOUtils.toByteArray(new ClassPathResource("spring-cloud-versions.json").getInputStream()))); doReturn(request).when(requestURI).back(); doReturn(requestURI).when(requestURI).path(eq(SPRING_CLOUD_RELEASE_TAGS_PATH)); doReturn(requestURI).when(request).uri(); @@ -175,9 +162,8 @@ public class InitializrSpringCloudInfoServiceTests { doReturn(request).when(github).entry(); InitializrSpringCloudInfoService service = spy( new InitializrSpringCloudInfoService(rest, github, githubPomReader)); - assertThat(service.getSpringCloudVersions(), - Matchers.equalTo(SpringCloudInfoTestData.springCloudVersions.stream() - .map(v -> v.replaceFirst("v", "")).collect(Collectors.toList()))); + assertThat(service.getSpringCloudVersions(), Matchers.equalTo(SpringCloudInfoTestData.springCloudVersions + .stream().map(v -> v.replaceFirst("v", "")).collect(Collectors.toList()))); } @Test @@ -226,8 +212,7 @@ public class InitializrSpringCloudInfoServiceTests { for (String m : milestoneStrings.keySet()) { Milestone milestone = mock(Milestone.class); String dueDate = milestoneStrings.get(m); - JsonObjectBuilder builder = builderFactory.createObjectBuilder().add("title", - m); + JsonObjectBuilder builder = builderFactory.createObjectBuilder().add("title", m); if (dueDate == null) { builder.add("due_on", JsonValue.NULL); } @@ -256,8 +241,7 @@ public class InitializrSpringCloudInfoServiceTests { Map>> info = new HashMap<>(); info.put("bom-ranges", springCloud); when(rest.getForObject(anyString(), eq(Map.class))).thenReturn(info); - InitializrSpringCloudInfoService service = new InitializrSpringCloudInfoService( - rest, github, githubPomReader); + InitializrSpringCloudInfoService service = new InitializrSpringCloudInfoService(rest, github, githubPomReader); String version = service.getSpringCloudVersion("2.1.0.RELEASE").getVersion(); assertThat(version, Matchers.equalTo("Greenwich.SR1")); version = service.getSpringCloudVersion("2.1.4.RELEASE").getVersion(); @@ -273,20 +257,16 @@ public class InitializrSpringCloudInfoServiceTests { private Map generateSpringCloudData() { Map data = new HashMap<>(); data.put("Edgware.SR5", "Spring Boot >=1.5.0.RELEASE and <=1.5.20.RELEASE"); - data.put("Edgware.BUILD-SNAPSHOT", - "Spring Boot >=1.5.21.BUILD-SNAPSHOT and <2.0.0.M1"); + data.put("Edgware.BUILD-SNAPSHOT", "Spring Boot >=1.5.21.BUILD-SNAPSHOT and <2.0.0.M1"); data.put("Finchley.M2", "Spring Boot >=2.0.0.M3 and <2.0.0.M5"); data.put("Finchley.M3", "Spring Boot >=2.0.0.M5 and <=2.0.0.M5"); data.put("Finchley.M4", "Spring Boot >=2.0.0.M6 and <=2.0.0.M6"); data.put("Finchley.RC1", "Spring Boot >=2.0.1.RELEASE and <2.0.2.RELEASE"); data.put("Finchley.RC2", "Spring Boot >=2.0.2.RELEASE and <2.0.3.RELEASE"); - data.put("Finchley.SR3", - "Spring Boot >=2.0.3.RELEASE and <2.0.999.BUILD-SNAPSHOT"); - data.put("Finchley.BUILD-SNAPSHO", - "Spring Boot >=2.0.999.BUILD-SNAPSHOT and <2.1.0.M3"); + data.put("Finchley.SR3", "Spring Boot >=2.0.3.RELEASE and <2.0.999.BUILD-SNAPSHOT"); + data.put("Finchley.BUILD-SNAPSHO", "Spring Boot >=2.0.999.BUILD-SNAPSHOT and <2.1.0.M3"); data.put("Greenwich.M1", "Spring Boot >=2.1.0.M3 and <2.1.0.RELEASE"); - data.put("Greenwich.SR1", - "Spring Boot >=2.1.0.RELEASE and <2.1.5.BUILD-SNAPSHOT"); + data.put("Greenwich.SR1", "Spring Boot >=2.1.0.RELEASE and <2.1.5.BUILD-SNAPSHOT"); data.put("Greenwich.BUILD-SNAPSHOT", "Spring Boot >=2.1.5.BUILD-SNAPSHOT"); return data; diff --git a/spring-cloud-info/src/test/java/org/springframework/cloud/info/SpringCloudInfoRestControllerTests.java b/spring-cloud-info/src/test/java/org/springframework/cloud/info/SpringCloudInfoRestControllerTests.java index 647d8409..84e85104 100644 --- a/spring-cloud-info/src/test/java/org/springframework/cloud/info/SpringCloudInfoRestControllerTests.java +++ b/spring-cloud-info/src/test/java/org/springframework/cloud/info/SpringCloudInfoRestControllerTests.java @@ -68,8 +68,8 @@ public class SpringCloudInfoRestControllerTests { @BeforeEach public void setUp() { this.mockMvc = MockMvcBuilders.webAppContextSetup(this.context) - .apply(documentationConfiguration(this.restDocumentation).uris() - .withHost("spring-cloud-info.cfapps.io").withPort(80)) + .apply(documentationConfiguration(this.restDocumentation).uris().withHost("spring-cloud-info.cfapps.io") + .withPort(80)) .build(); } @@ -78,59 +78,47 @@ public class SpringCloudInfoRestControllerTests { doReturn(new SpringCloudVersion("Greenwich.RELEASE")).when(springCloudInfoService) .getSpringCloudVersion(eq("2.1.1.RELEASE")); this.mockMvc - .perform(get("/springcloudversion/springboot/{bootVersion}", - "2.1.1.RELEASE").accept(MediaType.APPLICATION_JSON)) + .perform(get("/springcloudversion/springboot/{bootVersion}", "2.1.1.RELEASE") + .accept(MediaType.APPLICATION_JSON)) .andExpect(status().isOk()) .andDo(document("springcloudversion", - pathParameters(parameterWithName("bootVersion") - .description("The Spring Boot version")), - responseFields(fieldWithPath("version") - .description("Spring Cloud version")))); + pathParameters(parameterWithName("bootVersion").description("The Spring Boot version")), + responseFields(fieldWithPath("version").description("Spring Cloud version")))); } @Test public void versions() throws Exception { - doReturn(springCloudVersions.stream().map(v -> v.replaceFirst("v", "")) - .collect(Collectors.toList())).when(springCloudInfoService) - .getSpringCloudVersions(); - this.mockMvc - .perform(get("/springcloudversions").accept(MediaType.APPLICATION_JSON)) - .andExpect(status().isOk()) - .andDo(document("springcloudversions", responseFields( - fieldWithPath("[]").description("An array versions")))); + doReturn(springCloudVersions.stream().map(v -> v.replaceFirst("v", "")).collect(Collectors.toList())) + .when(springCloudInfoService).getSpringCloudVersions(); + this.mockMvc.perform(get("/springcloudversions").accept(MediaType.APPLICATION_JSON)).andExpect(status().isOk()) + .andDo(document("springcloudversions", + responseFields(fieldWithPath("[]").description("An array versions")))); } @Test public void bomVersions() throws Exception { doReturn(SpringCloudInfoTestData.releaseVersions).when(springCloudInfoService) .getReleaseVersions(eq("Finchley.SR1")); - this.mockMvc - .perform(get("/bomversions/Finchley.SR1") - .accept(MediaType.APPLICATION_JSON)) + this.mockMvc.perform(get("/bomversions/Finchley.SR1").accept(MediaType.APPLICATION_JSON)) .andExpect(status().isOk()).andDo(document("bomversions")); } @Test public void milestones() throws Exception { - doReturn(SpringCloudInfoTestData.milestoneStrings.keySet()) - .when(springCloudInfoService).getMilestones(); - this.mockMvc.perform(get("/milestones").accept(MediaType.APPLICATION_JSON)) - .andExpect(status().isOk()).andDo(document("milestones")); + doReturn(SpringCloudInfoTestData.milestoneStrings.keySet()).when(springCloudInfoService).getMilestones(); + this.mockMvc.perform(get("/milestones").accept(MediaType.APPLICATION_JSON)).andExpect(status().isOk()) + .andDo(document("milestones")); } @Test public void milestoneDueDate() throws Exception { - doReturn(new SpringCloudInfoService.Milestone("2019-07-31")) - .when(springCloudInfoService).getMilestoneDueDate(eq("Hoxton.RELEASE")); - this.mockMvc - .perform(get("/milestones/{release}/duedate", "Hoxton.RELEASE") - .accept(MediaType.APPLICATION_JSON)) + doReturn(new SpringCloudInfoService.Milestone("2019-07-31")).when(springCloudInfoService) + .getMilestoneDueDate(eq("Hoxton.RELEASE")); + this.mockMvc.perform(get("/milestones/{release}/duedate", "Hoxton.RELEASE").accept(MediaType.APPLICATION_JSON)) .andExpect(status().isOk()) .andDo(document("milestoneduedate", - pathParameters(parameterWithName("release") - .description("The Spring Cloud release train name")), - responseFields(fieldWithPath("dueDate") - .description("Spring Cloud milestone due date")))); + pathParameters(parameterWithName("release").description("The Spring Cloud release train name")), + responseFields(fieldWithPath("dueDate").description("Spring Cloud milestone due date")))); } } diff --git a/spring-cloud-info/src/test/java/org/springframework/cloud/info/SpringCloudInfoTestData.java b/spring-cloud-info/src/test/java/org/springframework/cloud/info/SpringCloudInfoTestData.java index 6381a575..4e688500 100644 --- a/spring-cloud-info/src/test/java/org/springframework/cloud/info/SpringCloudInfoTestData.java +++ b/spring-cloud-info/src/test/java/org/springframework/cloud/info/SpringCloudInfoTestData.java @@ -33,29 +33,33 @@ public final class SpringCloudInfoTestData { public static Map milestoneStrings = new HashMap<>(); static { - releaseVersions.put("spring-boot", "2.2.0.BUILD-SNAPSHOT"); - releaseVersions.put("spring-cloud-aws", "2.2.0.BUILD-SNAPSHOT"); - releaseVersions.put("spring-cloud-bus", "2.2.0.BUILD-SNAPSHOT"); - releaseVersions.put("spring-cloud-cloudfoundry", "2.2.0.BUILD-SNAPSHOT"); - releaseVersions.put("spring-cloud-commons", "2.2.0.BUILD-SNAPSHOT"); - releaseVersions.put("spring-cloud-config", "2.2.0.BUILD-SNAPSHOT"); - releaseVersions.put("spring-cloud-consul", "2.2.0.BUILD-SNAPSHOT"); - releaseVersions.put("spring-cloud-contract", "2.2.0.BUILD-SNAPSHOT"); - releaseVersions.put("spring-cloud-function", "2.1.0.BUILD-SNAPSHOT"); - releaseVersions.put("spring-cloud-gateway", "2.2.0.BUILD-SNAPSHOT"); - releaseVersions.put("spring-cloud-gcp", "1.1.0.BUILD-SNAPSHOT"); - releaseVersions.put("spring-cloud-kubernetes", "1.1.0.BUILD-SNAPSHOT"); - releaseVersions.put("spring-cloud-netflix", "2.2.0.BUILD-SNAPSHOT"); - releaseVersions.put("spring-cloud-openfeign", "2.2.0.BUILD-SNAPSHOT"); - releaseVersions.put("spring-cloud-security", "2.2.0.BUILD-SNAPSHOT"); - releaseVersions.put("spring-cloud-sleuth", "2.2.0.BUILD-SNAPSHOT"); - releaseVersions.put("spring-cloud-stream", "Germantown.BUILD-SNAPSHOT"); + releaseVersions.put("spring-boot", "2.2.0-SNAPSHOT"); + releaseVersions.put("spring-cloud-aws", "2.2.0-SNAPSHOT"); + releaseVersions.put("spring-cloud-bus", "2.2.0-SNAPSHOT"); + releaseVersions.put("spring-cloud-cloudfoundry", "2.2.0-SNAPSHOT"); + releaseVersions.put("spring-cloud-commons", "2.2.0-SNAPSHOT"); + releaseVersions.put("spring-cloud-config", "2.2.0-SNAPSHOT"); + releaseVersions.put("spring-cloud-consul", "2.2.0-SNAPSHOT"); + releaseVersions.put("spring-cloud-contract", "2.2.0-SNAPSHOT"); + releaseVersions.put("spring-cloud-function", "2.1.0-SNAPSHOT"); + releaseVersions.put("spring-cloud-gateway", "2.2.0-SNAPSHOT"); + releaseVersions.put("spring-cloud-gcp", "1.1.0-SNAPSHOT"); + releaseVersions.put("spring-cloud-kubernetes", "1.1.0-SNAPSHOT"); + releaseVersions.put("spring-cloud-netflix", "2.2.0-SNAPSHOT"); + releaseVersions.put("spring-cloud-openfeign", "2.2.0-SNAPSHOT"); + releaseVersions.put("spring-cloud-security", "2.2.0-SNAPSHOT"); + releaseVersions.put("spring-cloud-sleuth", "2.2.0-SNAPSHOT"); + releaseVersions.put("spring-cloud-stream", "Germantown-SNAPSHOT"); releaseVersions.put("spring-cloud-task", "2.0.0.RELEASE"); - releaseVersions.put("spring-cloud-vault", "2.2.0.BUILD-SNAPSHOT"); - releaseVersions.put("spring-cloud-zookeeper", "2.2.0.BUILD-SNAPSHOT"); + releaseVersions.put("spring-cloud-vault", "2.2.0-SNAPSHOT"); + releaseVersions.put("spring-cloud-zookeeper", "2.2.0-SNAPSHOT"); } static { + springCloudVersions.add("v2020.0.1"); + springCloudVersions.add("v2020.0.0"); + springCloudVersions.add("v2020.0.0-RC1"); + springCloudVersions.add("v2020.0.0-M1"); springCloudVersions.add("vGreenwich.SR1"); springCloudVersions.add("vGreenwich.RELEASE"); springCloudVersions.add("vGreenwich.RC2");