在 Jenkins 上部署 Spring Boot 应用程序
Posted
技术标签:
【中文标题】在 Jenkins 上部署 Spring Boot 应用程序【英文标题】:Deploying Spring Boot Application on Jenkins 【发布时间】:2021-05-14 10:08:24 【问题描述】:我在 Jenkins 端口 8081 上部署 Spring Boot 应用程序。我在端口 5050 上运行 tomcat。当我部署应用程序时,它显示一条成功消息,但是当我导航到 localhost:5050/given context name 时,它显示给我一个404 未找到消息。我也尝试过使用嵌入式方式,如果有任何使用嵌入式 tomcat 部署的方式会更好
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.5.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>auth-course</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>war</packaging>
<name>auth-course</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
<maven-jar-plugin.version>3.1.1</maven-jar-plugin.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
<groupId>com.auth0</groupId>
<artifactId>java-jwt</artifactId>
<version>3.12.1</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
Jenkins 日志
> git.exe rev-parse "refs/remotes/origin/master^commit" # timeout=10
Checking out Revision 23c1d2fafe6f0c1d19c479b1ae2e5b9b6492a36a (refs/remotes/origin/master)
> git.exe config core.sparsecheckout # timeout=10
> git.exe checkout -f 23c1d2fafe6f0c1d19c479b1ae2e5b9b6492a36a # timeout=10
Commit message: "added new dep"
> git.exe rev-list --no-walk 70373963607fb3dd6f1919eb0e6313cfd135e6dd # timeout=10
[jenkins-deployment-1] $ cmd.exe /C "mvn clean compile package && exit %%ERRORLEVEL%%"
[INFO] Scanning for projects...
[INFO]
[INFO] ----------------------< com.example:auth-course >-----------------------
[INFO] Building auth-course 0.0.1-SNAPSHOT
[INFO] --------------------------------[ war ]---------------------------------
[INFO]
[INFO] --- maven-clean-plugin:3.1.0:clean (default-clean) @ auth-course ---
[INFO]
[INFO] --- maven-resources-plugin:3.1.0:resources (default-resources) @ auth-course ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] Copying 1 resource
[INFO] Copying 1 resource
[INFO]
[INFO] --- maven-compiler-plugin:3.8.1:compile (default-compile) @ auth-course ---
[INFO] Changes detected - recompiling the module!
[INFO] Compiling 24 source files to C:\Users\Developer\.jenkins\workspace\jenkins-deployment-1\target\classes
[INFO]
[INFO] --- maven-resources-plugin:3.1.0:resources (default-resources) @ auth-course ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] Copying 1 resource
[INFO] Copying 1 resource
[INFO]
[INFO] --- maven-compiler-plugin:3.8.1:compile (default-compile) @ auth-course ---
[INFO] Changes detected - recompiling the module!
[INFO] Compiling 24 source files to C:\Users\Developer\.jenkins\workspace\jenkins-deployment-1\target\classes
[INFO]
[INFO] --- maven-resources-plugin:3.1.0:testResources (default-testResources) @ auth-course ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] skip non existing resourceDirectory C:\Users\Developer\.jenkins\workspace\jenkins-deployment-1\src\test\resources
[INFO]
[INFO] --- maven-compiler-plugin:3.8.1:testCompile (default-testCompile) @ auth-course ---
[INFO] Changes detected - recompiling the module!
[INFO] Compiling 1 source file to C:\Users\Developer\.jenkins\workspace\jenkins-deployment-1\target\test-classes
[INFO]
[INFO] --- maven-surefire-plugin:2.22.2:test (default-test) @ auth-course ---
[INFO]
[INFO] -------------------------------------------------------
[INFO] T E S T S
[INFO] -------------------------------------------------------
[INFO] Running com.example.demo.SareetaApplicationTests
21:58:30.863 [main] DEBUG org.springframework.test.context.junit4.SpringJUnit4ClassRunner - SpringJUnit4ClassRunner constructor called with [class com.example.demo.SareetaApplicationTests]
21:58:30.928 [main] DEBUG org.springframework.test.context.BootstrapUtils - Instantiating CacheAwareContextLoaderDelegate from class [org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate]
21:58:30.991 [main] DEBUG org.springframework.test.context.BootstrapUtils - Instantiating BootstrapContext using constructor [public org.springframework.test.context.support.DefaultBootstrapContext(java.lang.Class,org.springframework.test.context.CacheAwareContextLoaderDelegate)]
21:58:31.109 [main] DEBUG org.springframework.test.context.BootstrapUtils - Instantiating TestContextBootstrapper for test class [com.example.demo.SareetaApplicationTests] from class [org.springframework.boot.test.context.SpringBootTestContextBootstrapper]
21:58:31.398 [main] INFO org.springframework.boot.test.context.SpringBootTestContextBootstrapper - Neither @ContextConfiguration nor @ContextHierarchy found for test class [com.example.demo.SareetaApplicationTests], using SpringBootContextLoader
21:58:31.456 [main] DEBUG org.springframework.test.context.support.AbstractContextLoader - Did not detect default resource location for test class [com.example.demo.SareetaApplicationTests]: class path resource [com/example/demo/SareetaApplicationTests-context.xml] does not exist
21:58:31.464 [main] DEBUG org.springframework.test.context.support.AbstractContextLoader - Did not detect default resource location for test class [com.example.demo.SareetaApplicationTests]: class path resource [com/example/demo/SareetaApplicationTestsContext.groovy] does not exist
21:58:31.466 [main] INFO org.springframework.test.context.support.AbstractContextLoader - Could not detect default resource locations for test class [com.example.demo.SareetaApplicationTests]: no resource found for suffixes -context.xml, Context.groovy.
21:58:31.469 [main] INFO org.springframework.test.context.support.AnnotationConfigContextLoaderUtils - Could not detect default configuration classes for test class [com.example.demo.SareetaApplicationTests]: SareetaApplicationTests does not declare any static, non-private, non-final, nested classes annotated with @Configuration.
21:58:31.933 [main] DEBUG org.springframework.test.context.support.ActiveProfilesUtils - Could not find an 'annotation declaring class' for annotation type [org.springframework.test.context.ActiveProfiles] and class [com.example.demo.SareetaApplicationTests]
21:58:32.922 [main] DEBUG org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider - Identified candidate component class: file [C:\Users\Developer\.jenkins\workspace\jenkins-deployment-1\target\classes\com\example\demo\SareetaApplication.class]
21:58:32.937 [main] INFO org.springframework.boot.test.context.SpringBootTestContextBootstrapper - Found @SpringBootConfiguration com.example.demo.SareetaApplication for test class com.example.demo.SareetaApplicationTests
21:58:33.933 [main] DEBUG org.springframework.boot.test.context.SpringBootTestContextBootstrapper - @TestExecutionListeners is not present for class [com.example.demo.SareetaApplicationTests]: using defaults.
21:58:33.948 [main] INFO org.springframework.boot.test.context.SpringBootTestContextBootstrapper - Loaded default TestExecutionListener class names from location [META-INF/spring.factories]: [org.springframework.boot.test.mock.mockito.MockitoTestExecutionListener, org.springframework.boot.test.mock.mockito.ResetMocksTestExecutionListener, org.springframework.boot.test.autoconfigure.restdocs.RestDocsTestExecutionListener, org.springframework.boot.test.autoconfigure.web.client.MockRestServiceServerResetTestExecutionListener, org.springframework.boot.test.autoconfigure.web.servlet.MockMvcPrintOnlyOnFailureTestExecutionListener, org.springframework.boot.test.autoconfigure.web.servlet.WebDriverTestExecutionListener, org.springframework.test.context.web.ServletTestExecutionListener, org.springframework.test.context.support.DirtiesContextBeforeModesTestExecutionListener, org.springframework.test.context.support.DependencyInjectionTestExecutionListener, org.springframework.test.context.support.DirtiesContextTestExecutionListener, org.springframework.test.context.transaction.TransactionalTestExecutionListener, org.springframework.test.context.jdbc.SqlScriptsTestExecutionListener]
21:58:34.144 [main] INFO org.springframework.boot.test.context.SpringBootTestContextBootstrapper - Using TestExecutionListeners: [org.springframework.test.context.web.ServletTestExecutionListener@38425407, org.springframework.test.context.support.DirtiesContextBeforeModesTestExecutionListener@43bc63a3, org.springframework.boot.test.mock.mockito.MockitoTestExecutionListener@702657cc, org.springframework.boot.test.autoconfigure.SpringBootDependencyInjectionTestExecutionListener@6a6cb05c, org.springframework.test.context.support.DirtiesContextTestExecutionListener@40a4337a, org.springframework.test.context.transaction.TransactionalTestExecutionListener@6025e1b6, org.springframework.test.context.jdbc.SqlScriptsTestExecutionListener@22ff4249, org.springframework.boot.test.mock.mockito.ResetMocksTestExecutionListener@2d1ef81a, org.springframework.boot.test.autoconfigure.restdocs.RestDocsTestExecutionListener@4c402120, org.springframework.boot.test.autoconfigure.web.client.MockRestServiceServerResetTestExecutionListener@327514f, org.springframework.boot.test.autoconfigure.web.servlet.MockMvcPrintOnlyOnFailureTestExecutionListener@5b12b668, org.springframework.boot.test.autoconfigure.web.servlet.WebDriverTestExecutionListener@1165b38]
21:58:34.161 [main] DEBUG org.springframework.test.annotation.ProfileValueUtils - Retrieved @ProfileValueSourceConfiguration [null] for test class [com.example.demo.SareetaApplicationTests]
21:58:34.166 [main] DEBUG org.springframework.test.annotation.ProfileValueUtils - Retrieved ProfileValueSource type [class org.springframework.test.annotation.SystemProfileValueSource] for class [com.example.demo.SareetaApplicationTests]
21:58:34.181 [main] DEBUG org.springframework.test.annotation.ProfileValueUtils - Retrieved @ProfileValueSourceConfiguration [null] for test class [com.example.demo.SareetaApplicationTests]
21:58:34.188 [main] DEBUG org.springframework.test.annotation.ProfileValueUtils - Retrieved ProfileValueSource type [class org.springframework.test.annotation.SystemProfileValueSource] for class [com.example.demo.SareetaApplicationTests]
21:58:34.197 [main] DEBUG org.springframework.test.annotation.ProfileValueUtils - Retrieved @ProfileValueSourceConfiguration [null] for test class [com.example.demo.SareetaApplicationTests]
21:58:34.200 [main] DEBUG org.springframework.test.annotation.ProfileValueUtils - Retrieved ProfileValueSource type [class org.springframework.test.annotation.SystemProfileValueSource] for class [com.example.demo.SareetaApplicationTests]
21:58:34.247 [main] DEBUG org.springframework.test.context.support.AbstractDirtiesContextTestExecutionListener - Before test class: context [DefaultTestContext@179ece50 testClass = SareetaApplicationTests, testInstance = [null], testMethod = [null], testException = [null], mergedContextConfiguration = [WebMergedContextConfiguration@3b0090a4 testClass = SareetaApplicationTests, locations = '', classes = 'class com.example.demo.SareetaApplication', contextInitializerClasses = '[]', activeProfiles = '', propertySourceLocations = '', propertySourceProperties = 'org.springframework.boot.test.context.SpringBootTestContextBootstrapper=true', contextCustomizers = set[org.springframework.boot.test.context.filter.ExcludeFilterContextCustomizer@42607a4f, org.springframework.boot.test.json.DuplicateJsonObjectContextCustomizerFactory$DuplicateJsonObjectContextCustomizer@64485a47, org.springframework.boot.test.mock.mockito.MockitoContextCustomizer@0, org.springframework.boot.test.web.client.TestRestTemplateContextCustomizer@4c762604, org.springframework.boot.test.autoconfigure.properties.PropertyMappingContextCustomizer@0, org.springframework.boot.test.autoconfigure.web.servlet.WebDriverContextCustomizerFactory$Customizer@52525845], resourceBasePath = 'src/main/webapp', contextLoader = 'org.springframework.boot.test.context.SpringBootContextLoader', parent = [null]], attributes = map['org.springframework.test.context.web.ServletTestExecutionListener.activateListener' -> true]], class annotated with @DirtiesContext [false] with mode [null].
21:58:34.264 [main] DEBUG org.springframework.test.annotation.ProfileValueUtils - Retrieved @ProfileValueSourceConfiguration [null] for test class [com.example.demo.SareetaApplicationTests]
21:58:34.265 [main] DEBUG org.springframework.test.annotation.ProfileValueUtils - Retrieved ProfileValueSource type [class org.springframework.test.annotation.SystemProfileValueSource] for class [com.example.demo.SareetaApplicationTests]
21:58:34.816 [main] DEBUG org.springframework.test.context.support.TestPropertySourceUtils - Adding inlined properties to environment: spring.jmx.enabled=false, org.springframework.boot.test.context.SpringBootTestContextBootstrapper=true, server.port=-1
. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v2.1.5.RELEASE)
2021-02-10 21:58:39.164 INFO 5452 --- [ main] c.example.demo.SareetaApplicationTests : Starting SareetaApplicationTests on DESKTOP-PM4AIA1 with PID 5452 (started by Developer in C:\Users\Developer\.jenkins\workspace\jenkins-deployment-1)
2021-02-10 21:58:39.175 INFO 5452 --- [ main] c.example.demo.SareetaApplicationTests : No active profile set, falling back to default profiles: default
2021-02-10 21:58:47.344 INFO 5452 --- [ main] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data repositories in DEFAULT mode.
2021-02-10 21:58:48.015 INFO 5452 --- [ main] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 622ms. Found 4 repository interfaces.
2021-02-10 21:58:54.388 INFO 5452 --- [ main] trationDelegate$BeanPostProcessorChecker : Bean 'org.springframework.transaction.annotation.ProxyTransactionManagementConfiguration' of type [org.springframework.transaction.annotation.ProxyTransactionManagementConfiguration$$EnhancerBySpringCGLIB$$db2b2bf7] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2021-02-10 21:58:56.598 INFO 5452 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting...
2021-02-10 21:58:58.389 INFO 5452 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed.
2021-02-10 21:58:59.098 INFO 5452 --- [ main] o.hibernate.jpa.internal.util.LogHelper : HHH000204: Processing PersistenceUnitInfo [
name: default
...]
2021-02-10 21:58:59.636 INFO 5452 --- [ main] org.hibernate.Version : HHH000412: Hibernate Core 5.3.10.Final
2021-02-10 21:58:59.645 INFO 5452 --- [ main] org.hibernate.cfg.Environment : HHH000206: hibernate.properties not found
2021-02-10 21:59:01.012 INFO 5452 --- [ main] o.hibernate.annotations.common.Version : HCANN000001: Hibernate Commons Annotations 5.0.4.Final
2021-02-10 21:59:04.109 INFO 5452 --- [ main] org.hibernate.dialect.Dialect : HHH000400: Using dialect: org.hibernate.dialect.H2Dialect
2021-02-10 21:59:09.888 INFO 5452 --- [ main] j.LocalContainerEntityManagerFactoryBean : Initialized JPA EntityManagerFactory for persistence unit 'default'
2021-02-10 21:59:23.250 INFO 5452 --- [ main] o.s.s.web.DefaultSecurityFilterChain : Creating filter chain: any request, [org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter@32b46831, org.springframework.security.web.context.SecurityContextPersistenceFilter@13cc31ae, org.springframework.security.web.header.HeaderWriterFilter@34ab26a, org.springframework.security.web.authentication.logout.LogoutFilter@671d97bc, com.example.demo.security.jwt.JwtAuthenticationFilter@5353dd09, com.example.demo.security.jwt.JwtAuthorizationFilter@320ff86f, org.springframework.security.web.savedrequest.RequestCacheAwareFilter@4bfa5eb9, org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter@ee2ae9a, org.springframework.security.web.authentication.AnonymousAuthenticationFilter@192b472d, org.springframework.security.web.session.SessionManagementFilter@12209826, org.springframework.security.web.access.ExceptionTranslationFilter@176333ee, org.springframework.security.web.access.intercept.FilterSecurityInterceptor@6eabe718]
2021-02-10 21:59:40.560 INFO 5452 --- [ main] o.s.s.concurrent.ThreadPoolTaskExecutor : Initializing ExecutorService 'applicationTaskExecutor'
2021-02-10 21:59:41.490 WARN 5452 --- [ main] aWebConfiguration$JpaWebMvcConfiguration : spring.jpa.open-in-view is enabled by default. Therefore, database queries may be performed during view rendering. Explicitly configure spring.jpa.open-in-view to disable this warning
2021-02-10 21:59:51.868 INFO 5452 --- [ main] c.example.demo.SareetaApplicationTests : Started SareetaApplicationTests in 76.819 seconds (JVM running for 83.918)
[INFO] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 84.83 s - in com.example.demo.SareetaApplicationTests
2021-02-10 21:59:54.810 INFO 5452 --- [ Thread-3] o.s.s.concurrent.ThreadPoolTaskExecutor : Shutting down ExecutorService 'applicationTaskExecutor'
2021-02-10 21:59:54.828 INFO 5452 --- [ Thread-3] j.LocalContainerEntityManagerFactoryBean : Closing JPA EntityManagerFactory for persistence unit 'default'
2021-02-10 21:59:54.839 INFO 5452 --- [ Thread-3] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown initiated...
2021-02-10 21:59:54.950 INFO 5452 --- [ Thread-3] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown completed.
[INFO]
[INFO] Results:
[INFO]
[INFO] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0
[INFO]
[INFO]
[INFO] --- maven-war-plugin:3.2.2:war (default-war) @ auth-course ---
[INFO] Packaging webapp
[INFO] Assembling webapp [auth-course] in [C:\Users\Developer\.jenkins\workspace\jenkins-deployment-1\target\auth-course-0.0.1-SNAPSHOT]
[INFO] Processing war project
[INFO] Webapp assembled in [3006 msecs]
[INFO] Building war: C:\Users\Developer\.jenkins\workspace\jenkins-deployment-1\target\auth-course-0.0.1-SNAPSHOT.war
[INFO]
[INFO] --- spring-boot-maven-plugin:2.1.5.RELEASE:repackage (repackage) @ auth-course ---
[INFO] Replacing main artifact with repackaged archive
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 03:02 min
[INFO] Finished at: 2021-02-10T22:00:41+05:00
[INFO] ------------------------------------------------------------------------
[DeployPublisher][INFO] Attempting to deploy 1 war file(s)
[DeployPublisher][INFO] Deploying C:\Users\Developer\.jenkins\workspace\jenkins-deployment-1\target\auth-course-0.0.1-SNAPSHOT.war to container Tomcat 8.x Remote with context jenkins-project-1
Redeploying [C:\Users\Developer\.jenkins\workspace\jenkins-deployment-1\target\auth-course-0.0.1-SNAPSHOT.war]
Undeploying [C:\Users\Developer\.jenkins\workspace\jenkins-deployment-1\target\auth-course-0.0.1-SNAPSHOT.war]
Deploying [C:\Users\Developer\.jenkins\workspace\jenkins-deployment-1\target\auth-course-0.0.1-SNAPSHOT.war]
Finished: SUCCESS
【问题讨论】:
Spring Boot 2.1.5 是古老的。您应该升级到 2.4.2。您不应该在 Jenkins 服务器上部署应用程序。 【参考方案1】:Jenkins 是一个 CI/CD 软件,用于构建您的应用程序(而不是将其部署在 Jenkins 服务器上)。在哪里运行它是一个不同的主题。 Jenkins 在构建您的 java 可执行文件 (.war) 时所做的一切都是正确的。你现在应该做的是在服务器上运行这个构建的可执行文件。
考虑使用 Docker 在 Jenkins 中构建您的应用程序,并在不同的服务器上启动生成的 docker 容器。
【讨论】:
以上是关于在 Jenkins 上部署 Spring Boot 应用程序的主要内容,如果未能解决你的问题,请参考以下文章
Spring Boot(十六):使用Jenkins部署Spring Boot
spring boot(十六)使用Jenkins部署spring boot
springboot(十六):使用Jenkins部署Spring Boot