網頁

2020/12/1

Docker Jenkins Maven building Spring Boot from Github

使用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 IDEAEclipse)。

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過程中需要下載需要的套件所以時間會有點久。

  1. 從git repository checkout專案
  2. 安裝pipeline tools
  3. 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來實現。


沒有留言:

張貼留言