使用Jenkins docker container的pipeline建置Github上的Spring Boot專案。
範例環境:
- macOS Catalina
- Docker 19.03.12
- Java 8
- Spring Boot 2.3.2
建立Spring Boot專案
首先建立一個簡單的Spring Boot專案(參考IntelliJ IDEA,Eclipse)。
Spring Boot的配置設定application.properties
如下。context path設為/demo
;port設為8081
避免和下面的jenkins container的port衝突。
#context path
server.servlet.context-path=/demo
#port
server.port=8081
新增一個DemoController
負責處理請求。
DemoController
package com.abc.demo.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class DemoController {
@GetMapping("/hello")
public String hello() {
return "Hello World Spring Boot build by Jenkins Maven plugin";
}
}
在Spring Boot專案根目錄下新增Jenkinsfile
(不用副檔名)內容如下,此為Jenkin Pipeline script。待會Jenkins build時將以此來建構專案。
Jenkinsfile
pipeline {
agent any
tools {
maven 'Maven 3.6.3'
jdk 'JDK 1.8'
}
stages {
stage('Build') {
steps {
sh 'mvn -B -DskipTests clean package'
}
}
}
}
Spring Boot專案建立好後push到Github上,例如本範例的github repository為https://github.com/matthung0807/spring-boot-demo.git
,分支jenkins-maven-build
。
建立Jenkins
接著建立Jenkins,本範例使用docker jenkins container,參考「Docker 安裝Jenkins」設定。
啟動jenkins container後登入。Jenkins建置Spring Boot專案需要Maven即JDK,所以要先在[Global Tool Configuration]設定。
點選Jenkins首頁左側的[Manage Jenkins]然後選擇[Global Tool Configuration]。
[JDK]項目設定如下:
- [Name]欄位輸入
JDK 1.8
- 勾選[Install automatically]
- [Version]選擇Java 8的版本,需要輸入Oracle的帳號密碼
[Maven]項目設定如下:
- [Name]欄位輸入
Maven 3.6.3
- 勾選[Install automatically]
- [Versoin]選擇
3.6.3
設定完以上按Save儲存。
新增Pipeline
回到Jenkins首頁,點選左側的[New Item]新增一個build項目。項目名稱任意命名,這邊是輸入spring-boot-demo
,選擇[Pipeline]然後點選下面的OK進入設定頁面。
在最下方的Pipeline區塊設定如下:
- [SCM]欄位選擇[Git]
- [Repository URL]欄位輸入Spring Boot專案的github reposiotry位址。範例為
https://github.com/matthung0807/spring-boot-demo
- [Credentials]點選Add新增github的帳號密碼後選擇。
- [Script Path]輸入
Jenkinsfile
,此即為Spring Boot專案根目錄的Jenkinsfile
。
新增的[Credentials]設定,在[Username]及[Password]欄位輸入github的帳號密碼。
完成Pipeline設定後按頁面最下方的Save儲存。
在剛新增好的Pipeline spring-boot-demo項目中點選[Build Now]開始建置。建置過程大概分為以下步驟。build過程中需要下載需要的套件所以時間會有點久。
- 從git repository checkout專案
- 安裝pipeline tools
- Maven build
執行Spring Boot jar
jenkins container會將spring-boot-demo
建置項目build好的Spring Boot jar放在/var/jenkins_home/workspace/spring-boot-demo/target/spring-boot-demo-0.0.1-SNAPSHOT.jar
。
在之前啟動jenkins container時有使用-v ~/jenkins_home:/var/jenkins_home
將container的/var/jenkins_home
目錄掛到本機的$HOME/jenkins_home
目錄,所以可以直接在本機的$HOME/jenkins_home/workspace/spring-boot-demo/target/spring-boot-demo-0.0.1-SNAPSHOT.jar
取得build好的Spring Boot jar。
在本機輸入$ java -jar ~/jenkins_home/workspace/spring-boot-demo/target/spring-boot-demo-0.0.1-SNAPSHOT.jar
即可執行build好的Spring Boot jar。
$ java -jar ~/jenkins_home/workspace/spring-boot-demo/target/spring-boot-demo-0.0.1-SNAPSHOT.jar
. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v2.3.2.RELEASE)
2020-12-01 22:57:40.159 INFO 30313 --- [ main] c.a.d.DemoApplication : Starting DemoApplication v0.0.1-SNAPSHOT on MacBook-Pro with PID 30313 (/Users/user/jenkins_home/workspace/spring-boot-demo/target/spring-boot-demo-0.0.1-SNAPSHOT.jar started by user in /Users/user/jenkins_home/workspace/spring-boot-demo/target)
2020-12-01 22:57:40.169 INFO 30313 --- [ main] c.a.d.DemoApplication : No active profile set, falling back to default profiles: default
2020-12-01 22:57:41.338 INFO 30313 --- [ main] o.s.b.w.e.t.TomcatWebServer : Tomcat initialized with port(s): 8081 (http)
2020-12-01 22:57:41.367 INFO 30313 --- [ main] o.a.c.c.StandardService : Starting service [Tomcat]
2020-12-01 22:57:41.368 INFO 30313 --- [ main] o.a.c.c.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.37]
2020-12-01 22:57:41.441 INFO 30313 --- [ main] o.a.c.c.C.[.[.[/demo] : Initializing Spring embedded WebApplicationContext
2020-12-01 22:57:41.441 INFO 30313 --- [ main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 1213 ms
2020-12-01 22:57:41.647 INFO 30313 --- [ main] o.s.s.c.ThreadPoolTaskExecutor : Initializing ExecutorService 'applicationTaskExecutor'
2020-12-01 22:57:41.846 INFO 30313 --- [ main] o.s.b.w.e.t.TomcatWebServer : Tomcat started on port(s): 8081 (http) with context path '/demo'
2020-12-01 22:57:41.856 INFO 30313 --- [ main] c.a.d.DemoApplication : Started DemoApplication in 2.254 seconds (JVM running for 3.376)
在瀏覽器輸入http://localhost:8081/demo/hello
測試回應如下。
從持續整合與佈署來看,這邊少了自動佈署(deploy)的流程,後續的佈署應搭配build Spring Boot docker image來實現。
沒有留言:
張貼留言