From bb8561272340b1ffad5f4d219a747fcec1bde955 Mon Sep 17 00:00:00 2001 From: Madhura Bhave Date: Mon, 24 Jun 2019 15:25:05 -0700 Subject: [PATCH] Add concourse pipeline for Windows Closes gh-15553 --- ci/pipeline.yml | 44 ++++++++++++++++++- ci/scripts/build-project-windows.bat | 6 +++ ci/tasks/build-project-windows.yml | 6 +++ .../jsp/SampleWebJspApplicationTests.java | 22 +++++++++- .../spring-boot-server-tests/pom.xml | 11 +++++ .../example/JettyServerCustomizerConfig.java | 42 ++++++++++++++++++ .../context/embedded/ApplicationBuilder.java | 6 +++ 7 files changed, 135 insertions(+), 2 deletions(-) create mode 100755 ci/scripts/build-project-windows.bat create mode 100644 ci/tasks/build-project-windows.yml create mode 100644 spring-boot-tests/spring-boot-integration-tests/spring-boot-server-tests/src/test/java/com/example/JettyServerCustomizerConfig.java diff --git a/ci/pipeline.yml b/ci/pipeline.yml index fb99ae5da6a..497619ab7b1 100644 --- a/ci/pipeline.yml +++ b/ci/pipeline.yml @@ -27,6 +27,17 @@ resources: username: ((github-username)) password: ((github-password)) branch: ((branch)) +- name: git-repo-windows + type: git + source: + uri: ((github-repo)) + username: ((github-username)) + password: ((github-password)) + branch: ((branch)) + git_config: + - name: core.autocrlf + value: true + icon: github-circle - name: git-pull-request type: pull-request icon: source-pull @@ -125,6 +136,9 @@ resources: start: 8:00 PM stop: 9:00 PM days: [Wednesday] +- name: daily + type: time + source: { interval: "24h" } jobs: - name: build-spring-boot-ci-images plan: @@ -378,6 +392,34 @@ jobs: silent: true icon_emoji: ":concourse:" username: concourse-ci +- name: windows-build + serial: true + plan: + - get: git-repo + resource: git-repo-windows + - get: daily + trigger: true + - do: + - task: build-project + privileged: true + file: git-repo/ci/tasks/build-project-windows.yml + tags: + - WIN64 + timeout: 1h30m + on_failure: + do: + - put: slack-alert + params: + text: ":concourse-failed: " + silent: true + icon_emoji: ":concourse:" + username: concourse-ci + - put: slack-alert + params: + text: ":concourse-succeeded: " + silent: true + icon_emoji: ":concourse:" + username: concourse-ci - name: stage-milestone serial: true plan: @@ -552,7 +594,7 @@ jobs: body: generated-release-notes/release-notes.md groups: - name: "Build" - jobs: ["build", "jdk11-build", "jdk12-build"] + jobs: ["build", "jdk11-build", "jdk12-build", "windows-build"] - name: "Release" jobs: ["stage-milestone", "stage-rc", "stage-release", "promote-milestone", "promote-rc", "promote-release", "sync-to-maven-central"] - name: "CI Images" diff --git a/ci/scripts/build-project-windows.bat b/ci/scripts/build-project-windows.bat new file mode 100755 index 00000000000..ba3ac4f8023 --- /dev/null +++ b/ci/scripts/build-project-windows.bat @@ -0,0 +1,6 @@ +SET "JAVA_HOME=C:\opt\jdk-8" +SET PATH=%PATH%;C:\Program Files\Git\usr\bin +cd git-repo + +echo ".\mvnw clean install" > build.log +.\mvnw clean install >> build.log 2>&1 || (sleep 1 && tail -n 3000 build.log && exit 1) \ No newline at end of file diff --git a/ci/tasks/build-project-windows.yml b/ci/tasks/build-project-windows.yml new file mode 100644 index 00000000000..744b1ada09b --- /dev/null +++ b/ci/tasks/build-project-windows.yml @@ -0,0 +1,6 @@ +--- +platform: windows +inputs: +- name: git-repo +run: + path: git-repo/ci/scripts/build-project-windows.bat diff --git a/spring-boot-samples/spring-boot-sample-jetty-jsp/src/test/java/sample/jetty/jsp/SampleWebJspApplicationTests.java b/spring-boot-samples/spring-boot-sample-jetty-jsp/src/test/java/sample/jetty/jsp/SampleWebJspApplicationTests.java index 59150494689..0a93eb9510f 100644 --- a/spring-boot-samples/spring-boot-sample-jetty-jsp/src/test/java/sample/jetty/jsp/SampleWebJspApplicationTests.java +++ b/spring-boot-samples/spring-boot-sample-jetty-jsp/src/test/java/sample/jetty/jsp/SampleWebJspApplicationTests.java @@ -16,6 +16,7 @@ package sample.jetty.jsp; +import org.eclipse.jetty.server.handler.ContextHandler; import org.junit.Test; import org.junit.runner.RunWith; @@ -23,6 +24,9 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; import org.springframework.boot.test.web.client.TestRestTemplate; +import org.springframework.boot.web.embedded.jetty.JettyServerCustomizer; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.test.context.junit4.SpringRunner; @@ -35,7 +39,8 @@ import static org.assertj.core.api.Assertions.assertThat; * @author Phillip Webb */ @RunWith(SpringRunner.class) -@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT) +@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT, + classes = { SampleWebJspApplicationTests.JettyCustomizerConfig.class, SampleJettyJspApplication.class }) public class SampleWebJspApplicationTests { @Autowired @@ -48,4 +53,19 @@ public class SampleWebJspApplicationTests { assertThat(entity.getBody()).contains("/resources/text.txt"); } + @Configuration + static class JettyCustomizerConfig { + + // To allow aliased resources on Concourse Windows CI (See gh-15553) to be served + // as static resources. + @Bean + public JettyServerCustomizer jettyServerCustomizer() { + return (server) -> { + ContextHandler handler = (ContextHandler) server.getHandler(); + handler.addAliasCheck(new ContextHandler.ApproveAliases()); + }; + } + + } + } diff --git a/spring-boot-tests/spring-boot-integration-tests/spring-boot-server-tests/pom.xml b/spring-boot-tests/spring-boot-integration-tests/spring-boot-server-tests/pom.xml index 355439526a6..404f8a6042e 100644 --- a/spring-boot-tests/spring-boot-integration-tests/spring-boot-server-tests/pom.xml +++ b/spring-boot-tests/spring-boot-integration-tests/spring-boot-server-tests/pom.xml @@ -40,6 +40,17 @@ 3.0.0 test + + org.eclipse.jetty + jetty-webapp + test + + + javax.servlet + javax.servlet-api + + + org.springframework spring-web diff --git a/spring-boot-tests/spring-boot-integration-tests/spring-boot-server-tests/src/test/java/com/example/JettyServerCustomizerConfig.java b/spring-boot-tests/spring-boot-integration-tests/spring-boot-server-tests/src/test/java/com/example/JettyServerCustomizerConfig.java new file mode 100644 index 00000000000..7ae4c7f0570 --- /dev/null +++ b/spring-boot-tests/spring-boot-integration-tests/spring-boot-server-tests/src/test/java/com/example/JettyServerCustomizerConfig.java @@ -0,0 +1,42 @@ +/* + * Copyright 2012-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 com.example; + +import org.eclipse.jetty.server.handler.ContextHandler; + +import org.springframework.boot.web.embedded.jetty.JettyServerCustomizer; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * {@link JettyServerCustomizer} that approves all aliases (Used for Windows CI on + * Concourse). + * + * @author Madhura Bhave + */ +@Configuration +public class JettyServerCustomizerConfig { + + @Bean + public JettyServerCustomizer jettyServerCustomizer() { + return (server) -> { + ContextHandler handler = (ContextHandler) server.getHandler(); + handler.addAliasCheck(new ContextHandler.ApproveAliases()); + }; + } + +} diff --git a/spring-boot-tests/spring-boot-integration-tests/spring-boot-server-tests/src/test/java/org/springframework/boot/context/embedded/ApplicationBuilder.java b/spring-boot-tests/spring-boot-integration-tests/spring-boot-server-tests/src/test/java/org/springframework/boot/context/embedded/ApplicationBuilder.java index 38a3b4ff0a1..32792d04bcd 100644 --- a/spring-boot-tests/spring-boot-integration-tests/spring-boot-server-tests/src/test/java/org/springframework/boot/context/embedded/ApplicationBuilder.java +++ b/spring-boot-tests/spring-boot-integration-tests/spring-boot-server-tests/src/test/java/org/springframework/boot/context/embedded/ApplicationBuilder.java @@ -126,6 +126,12 @@ class ApplicationBuilder { examplePackage.mkdirs(); FileCopyUtils.copy(new File("src/test/java/com/example/ResourceHandlingApplication.java"), new File(examplePackage, "ResourceHandlingApplication.java")); + // To allow aliased resources on Concourse Windows CI (See gh-15553) to be served + // as static resources. + if (this.container.equals("jetty")) { + FileCopyUtils.copy(new File("src/test/java/com/example/JettyServerCustomizerConfig.java"), + new File(examplePackage, "JettyServerCustomizerConfig.java")); + } if ("war".equals(this.packaging)) { File srcMainWebapp = new File(appFolder, "src/main/webapp"); srcMainWebapp.mkdirs();