1. 程式人生 > >Docker+Jenkins+Git釋出SpringBoot應用

Docker+Jenkins+Git釋出SpringBoot應用

 

Doccker

Docker 是一個開源的應用容器引擎,讓開發者可以打包他們的應用以及依賴包到一個可移植的容器中,然後釋出到任何流行的Linux機器上,也可以實現虛擬化,容器是完全使用沙箱機制,相互之間不會有任何介面。 一個完整的Docker有以下幾個部分組成:
  1. DockerClient客戶端
  2. Docker Daemon守護程序
  3. Docker Image映象
  4. DockerContainer容器

docker安裝

ubuntu下的安裝。使用snap應該是最簡單的方法。

#安裝docker
sudo snap install docker
#移除docker sudo snap remove docker

 

檢視snap的安裝列表

可以看到本次安裝的docker版本是18.06.1-ce

lgj@lgj-Lenovo-G470:~$ snap list docker 
Name    Version     Rev  Tracking  Publisher   Notes
docker  18.06.1-ce  384  stable    canonical*  -

 

測試docker是否安裝成功

lgj@lgj-Lenovo-G470:~$ docker version
Client:
 Version:           18.06.1-ce
 API version:       1.38
 Go version:        go1.10.4
 Git commit:        e68fc7a
 Built:             Tue May  7 17:57:34 2019
 OS/Arch:           linux/amd64
 Experimental:      false

Server:
 Engine:
  Version:          18.06.1-ce
  API version:      1.38 (minimum version 1.12)
  Go version:       go1.10.4
  Git commit:       e68fc7a
  Built:            Tue May  7 17:57:34 2019
  OS/Arch:          linux/amd64
  Experimental:     false

 

docker常用命令

#檢視docker支援的所有命令 
docker

#檢視docker命令的使用方式
docker images --help
docker ps --help

#檢視安裝的映象
docker images [OPTIONS] [REPOSITORY[:TAG]]

#檢視執行的容器
docker ps

#檢視所有的容器
docker ps -a

#刪除映象
docker rmi -f [REPOSITORY[:TAG]]

#刪除容器
docker rm [OPTIONS] CONTAINER [CONTAINER...]

 

更多命令參考官方命令文件

dockerfile使用

 

docker的更多使用方法參考

<Docker開發實踐><Docker開發指南><沒什麼難的Docker入門與開發實戰><第一本DOCKER書>

 

 

Jenkins

Jenkins是一個獨立的開源軟體專案,是基於Java開發的一種持續整合工具,用於監控持續重複的工作,旨在提供一個開放易用的軟體平臺,使軟體的持續整合變成可能。前身是Hudson是一個可擴充套件的持續整合引擎。可用於自動化各種任務,如構建,測試和部署軟體。Jenkins可以通過本機系統包Docker安裝,甚至可以通過安裝Java Runtime Environment的任何機器獨立執行。

 

安裝

下載地址

選擇下載war包

下載之後直接執行即可,指定埠為8097,訪問地址為http://localhost:8097

java -jar jenkins.war --httpPort=8097

 

執行後會在使用者目錄下生成.jenkins工作目錄。

 

首次登入需要使用者名稱和密碼

使用者名稱為:admin

密碼檢視 .jenkins/secrets/initialAdminPassword 檔案中。

lgj@lgj-Lenovo-G470:~$ cat .jenkins/secrets/initialAdminPassword 
7d3bc703deb449debce0a25dfd3a00ad

 

配置

 

安裝git外掛

系統管理-外掛管理

配置jdk和maven

系統管理-全域性工具配置

可以選擇本地或者自動安裝

 

 

 

 

 

jemkins更多使用方式參考官方文件 <jenkins權威指南>

 

建立一個SpringBoot應用

只有一個controller類

@RestController
@RequestMapping("/web")
public class WebController {

    @RequestMapping("/demo")
    public String demo(){
        return new Random().nextInt(100)+"";
    }
}

 

訪問埠為:8452

server:
  port: 8452

 

上傳到git,倉庫地址為https://github.com/lgjlife/web-demo

 

構建jenkins專案

首頁-新建任務-構建一個maven專案(專案名稱為:web-demo-docker)

建立成功後首頁可以看到專案列表

專案配置

點選專案名稱---配置---進入配置頁面

1.配置git倉庫

jenkins構建時會自動從git倉庫拉取專案檔案。

[email protected]:lgjlife/web-demo.git

注意url的寫法,寫錯會自動報錯。由於是從公共倉庫拉取,所以沒有進行認證配置。

本次獲取的是master分支。

 

2.配置觸發器

觸發器就是定義何種條件下jenkins開始構建專案

這裡選擇輪詢,*/1 * * * * 說明每隔一分鐘就進行一次構建,這裡只有在git倉庫更新之後才起作用。也就是每分鐘會去檢測git倉庫原始碼是否更新,不更新則不進行構建。

更多表達式的說明點選後面的?圖示檢視。

3.構建操作

這裡選擇執行兩個shell指令碼,指令碼後面進行說明

jenkins專案配置完成。

 

編寫Dockerfile檔案

注意dockerfile位於主工程目錄下。

POM檔案配置

 <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <!-- 指定該Main Class為全域性的唯一入口 -->
                    <mainClass>com.demo.web.WebApplication</mainClass>
                    <layout>ZIP</layout>
                </configuration>
                <executions>
                    <execution>
                        <goals>
                            <goal>repackage</goal><!--可以把依賴的包都打包到生成的Jar包中-->
                        </goals>
                    </execution>
                </executions>
            </plugin>

       <!-- docker 外掛配置--> <plugin> <groupId>com.spotify</groupId> <artifactId>dockerfile-maven-plugin</artifactId> <version>1.4.10</version> <configuration> <repository>lgj/webdemo</repository> <tag>1.0</tag> <buildArgs> <JAR_FILE>/target/web-1.0.jar</JAR_FILE> </buildArgs> </configuration> </plugin> </plugins> </build>

 

說明:

 dockerfile-maven-plugin ,maven 的docker外掛

<repository>lgj/webdemo</repository>:映象名稱
<tag>1.0</tag>:映象標籤

一個映象的完整標識是:映象倉庫/映象名稱:映象標籤
<JAR_FILE>/target/web-1.0.jar</JAR_FILE>:構建時的傳入dockerfile的引數  

dockerfile

#基於jdk8映象進行構建,建立的映象已經配置好java環境
FROM openjdk:8
#上述的pom中配置的JAR_FILE將會傳入到該引數
#也可以在這裡直接配置 ARG JAR_FILE=/target/web-1.0.jar
#用於配置spingboot應用maven打包生成的jar檔案 ARG JAR_FILE
#在映象中建立一個工作目錄 run mkdir /worker
#將jar檔案複製到工作目錄中 add ${JAR_FILE} /worker
#暴露映象的埠8452,其他埠不開放 expose 8452
#映象啟動時執行的命令,配置多條僅執行最後一條
#這裡配置啟動jar檔案: java -jar /worker/web-1.0.jar entrypoint ["java","-jar","/worker/web-1.0.jar"]




 

構建指令碼build.sh

用於根據dockerfile建立docker指令碼

mvn clean

mvn package -DskipTests

docker rmi -f lgj/webdemo:1.0

mvn dockerfile:build

docker images

 

先使用mvn進行打包

再刪除舊的映象,由於不能覆蓋建立,因此需要刪除再建立。

由於已經pom中已經配置docker外掛,可以直接呼叫:mvn dockerfile:build 進行構建。

執行指令碼run.sh

用於建立並執行docker容器

docker ps -a

docker stop webdemo-8452
docker rm -f webdemo-8452
docker run -d --name webdemo-8452  -p 8452:8452 lgj/webdemo:1.0

docker ps -a

 

和建立映象類似,執行之前必須先刪除容器。

docker run 說明:

-d:以後臺程序的方式執行。

--name :指定容器的名稱為 webdemo-8452 

-p : 指定主機和容器的埠對映。docker是基於主機執行的,資料--》主機埠--》容器埠。因此需要配置埠對映。一般配置成一樣的。這裡只需要訪問springboot應用的8452,所以配置成8452.

lgj/webdemo:1.0: 映象名稱

 

所有檔案編寫完成後,重新pull到git倉庫。

 

jenkins構建

點選專案頁面的立即構建

可以看到下方的構建歷史。

點選進去檢視每次構建的具體情況。

 點選控制檯輸出,可以檢視構建過程的輸出

 

構建過程:

1.拉取遠端的git倉庫檔案到jenkins的工作目錄/home/lgj/.jenkins/workspace/web-demo-docker

 2. 執行配置的相關命令和操作。

輸出 Finished: SUCCESS 則表示構建成功。

??? admin ??
??? ????? /home/lgj/.jenkins/workspace/web-demo-docker ?
No credentials specified
 > git rev-parse --is-inside-work-tree # timeout=10
Fetching changes from the remote Git repository
 > git config remote.origin.url [email protected]:lgjlife/web-demo.git # timeout=10
Fetching upstream changes from [email protected]:lgjlife/web-demo.git
 > git --version # timeout=10
 > git fetch --tags --force --progress [email protected]:lgjlife/web-demo.git +refs/heads/*:refs/remotes/origin/*
 > git rev-parse refs/remotes/origin/master^{commit} # timeout=10
 > git rev-parse refs/remotes/origin/origin/master^{commit} # timeout=10
Checking out Revision 074769c6e558772ddcaf133e92641995cbf3c7ef (refs/remotes/origin/master)
 > git config core.sparsecheckout # timeout=10
 > git checkout -f 074769c6e558772ddcaf133e92641995cbf3c7ef
Commit message: "docker images"
 > git rev-list --no-walk 074769c6e558772ddcaf133e92641995cbf3c7ef # timeout=10
[web-demo-docker] $ /bin/sh -xe /tmp/jenkins5091262134747837972.sh
+ echo =======================================================================================
=======================================================================================
+ pwd
/home/lgj/.jenkins/workspace/web-demo-docker
+ ./build.sh
[INFO] Scanning for projects...
[INFO] 
[INFO] ------------------------------------------------------------------------
[INFO] Building web 1.0
[INFO] ------------------------------------------------------------------------
[INFO] 
[INFO] --- maven-clean-plugin:3.1.0:clean (default-clean) @ web ---
[INFO] Deleting /home/lgj/.jenkins/workspace/web-demo-docker/target
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 2.595 s
[INFO] Finished at: 2019-06-02T13:07:18+08:00
[INFO] Final Memory: 12M/188M
[INFO] ------------------------------------------------------------------------
[INFO] Scanning for projects...
[INFO] 
[INFO] ------------------------------------------------------------------------
[INFO] Building web 1.0
[INFO] ------------------------------------------------------------------------
[INFO] 
[INFO] --- maven-resources-plugin:3.1.0:resources (default-resources) @ web ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] Copying 1 resource
[INFO] Copying 1 resource
[INFO] 
[INFO] --- maven-compiler-plugin:3.8.0:compile (default-compile) @ web ---
[INFO] Changes detected - recompiling the module!
[INFO] Compiling 2 source files to /home/lgj/.jenkins/workspace/web-demo-docker/target/classes
[INFO] 
[INFO] --- maven-resources-plugin:3.1.0:testResources (default-testResources) @ web ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] skip non existing resourceDirectory /home/lgj/.jenkins/workspace/web-demo-docker/src/test/resources
[INFO] 
[INFO] --- maven-compiler-plugin:3.8.0:testCompile (default-testCompile) @ web ---
[INFO] No sources to compile
[INFO] 
[INFO] --- maven-surefire-plugin:2.22.1:test (default-test) @ web ---
[INFO] Tests are skipped.
[INFO] 
[INFO] --- maven-jar-plugin:3.1.0:jar (default-jar) @ web ---
[INFO] Building jar: /home/lgj/.jenkins/workspace/web-demo-docker/target/web-1.0.jar
[INFO] 
[INFO] --- spring-boot-maven-plugin:2.1.0.RELEASE:repackage (repackage) @ web ---
[INFO] Layout: ZIP
[INFO] Replacing main artifact /home/lgj/.jenkins/workspace/web-demo-docker/target/web-1.0.jar
[INFO] 
[INFO] --- spring-boot-maven-plugin:2.1.0.RELEASE:repackage (default) @ web ---
[INFO] Layout: ZIP
[INFO] Replacing main artifact /home/lgj/.jenkins/workspace/web-demo-docker/target/web-1.0.jar
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 9.671 s
[INFO] Finished at: 2019-06-02T13:07:30+08:00
[INFO] Final Memory: 32M/330M
[INFO] ------------------------------------------------------------------------
Untagged: lgj/webdemo:1.0
[INFO] Scanning for projects...
[INFO] 
[INFO] ------------------------------------------------------------------------
[INFO] Building web 1.0
[INFO] ------------------------------------------------------------------------
[INFO] 
[INFO] --- dockerfile-maven-plugin:1.4.10:build (default-cli) @ web ---
[INFO] dockerfile: null
[INFO] contextDirectory: /home/lgj/.jenkins/workspace/web-demo-docker
[INFO] Building Docker context /home/lgj/.jenkins/workspace/web-demo-docker
[INFO] Path(dockerfile): null
[INFO] Path(contextDirectory): /home/lgj/.jenkins/workspace/web-demo-docker
[INFO] 
[INFO] Image will be built as lgj/webdemo:1.0
[INFO] 
[INFO] Step 1/6 : FROM openjdk:8
[INFO] 
[INFO] Pulling from library/openjdk
[INFO] Digest: sha256:0e25c8428a56e32861fe996b528a107933155c98fb2a9998a4a4e9423aad734d
[INFO] Status: Image is up to date for openjdk:8
[INFO]  ---> 4a0a42e87cf3
[INFO] Step 2/6 : ARG JAR_FILE
[INFO] 
[INFO]  ---> Using cache
[INFO]  ---> dc2f959e4d9c
[INFO] Step 3/6 : run mkdir /worker
[INFO] 
[INFO]  ---> Using cache
[INFO]  ---> 87e001b16580
[INFO] Step 4/6 : add ${JAR_FILE} /worker
[INFO] 
[INFO]  ---> 7d6b791017fd
[INFO] Step 5/6 : expose 8452
[INFO] 
[INFO]  ---> Running in f7989737ef59
[INFO] Removing intermediate container f7989737ef59
[INFO]  ---> aa553eea45de
[INFO] Step 6/6 : entrypoint ["java","-jar","/worker/web-1.0.jar"]
[INFO] 
[INFO]  ---> Running in 7133f5214111
[INFO] Removing intermediate container 7133f5214111
[INFO]  ---> 10e0d3d344d6
[INFO] Successfully built 10e0d3d344d6
[INFO] Successfully tagged lgj/webdemo:1.0
[INFO] 
[INFO] Detected build of image with id 10e0d3d344d6
[INFO] Building jar: /home/lgj/.jenkins/workspace/web-demo-docker/target/web-1.0-docker-info.jar
[INFO] Successfully built lgj/webdemo:1.0
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 57.257 s
[INFO] Finished at: 2019-06-02T13:08:31+08:00
[INFO] Final Memory: 25M/362M
[INFO] ------------------------------------------------------------------------
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
lgj/webdemo         1.0                 10e0d3d344d6        2 seconds ago       504MB
<none>              <none>              67b2eee0f0b6        2 hours ago         504MB
<none>              <none>              88b1d5b63784        2 hours ago         504MB
<none>              <none>              e60203504301        2 hours ago         504MB
<none>              <none>              11f593fd9537        2 hours ago         504MB
openjdk             8                   4a0a42e87cf3        3 days ago          488MB
+ ./run.sh
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
d1a4fdf8f230        67b2eee0f0b6        "java -jar /worker/w���"   2 hours ago         Up 2 hours          0.0.0.0:8452->8452/tcp   webdemo-8452
webdemo-8452
7fe8d8d9cdff88f8281e8b0f6c8ff5e010844dd40b82829f5952d589c6d183b2
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                  PORTS                    NAMES
7fe8d8d9cdff        lgj/webdemo:1.0     "java -jar /worker/w���"   2 seconds ago       Up Less than a second   0.0.0.0:8452->8452/tcp   webdemo-8452
Finished: SUCCESS

 

完成!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!