【Linux】使用Jenkins和Docker集成部署SpringBoot應用

一、Jenkins介紹

來自官網 的介紹:

作爲一個可擴展的自動化服務器,Jenkins 可以用作簡單的 CI 服務器,或者變成任何項目的持續交付中心。

我的理解:

可以將代碼從SVN或GIT倉庫拉取過來進行自動編譯與發佈,所以可以成爲一個交付中心,也可以作爲一個集成測試環境。

配置過程可能有些許繁瑣,總共分下面幾塊,一塊一塊配置慢慢來就可以了。

1.環境準備,包括jdk,maven和docker。然後一些文件
2.安裝,下載和在線安裝都比較簡單
3.配置,下載插件和全局配置
4.任務管理,即新建一個任務進行相關的配置,這裏會步驟會比較多
5.構建,構建也有輸出臺可以看到錯誤,所以問題不大

二、前置準備

2.1服務器(Linux)所需環境

OS:CentOS7 (買的百度雲學生服務器
Jenkins
Docker
Jdk
Maven
SVN
Git(從github拉取代碼所需)

Jdk&Maven安裝點這
Docker 安裝點這
SVN 安裝使用點這(待補充)

2.2配置Docker工作空間

#創建文件夾用來放docker工作空間
mkdir /home/work/demo
cd /home/work/demo
#創建備份文件夾
mkdir backup

然後添加Docker構造文件

vim Dockerfile

在文件中添加如下內容

#基於openjdk:8
FROM openjdk:8
#這裏其他的項目,可以把demo改成其他的項目名稱
ADD demo-1.0-SNAPSHOT.jar demo.jar
RUN bash -c 'touch /demo.jar'

ENTRYPOINT ["java","-jar","/demo.jar"]

添加shell腳本文件

vim run.sh

添加如下內容

#定義好這些變量,後面其他的項目,只需要改前面這些變量即可
PROJECT_NAME=JenkinsDemo #Maven項目名稱
IMAGE_NAME=demo  #生成的鏡像名稱
BASE_PATH=/home/work/demo #Docker工作空間
PORT=9120 #端口
TASK_NAME=Jenkins # 任務名稱
SOURCE_PATH=/var/lib/jenkins/workspace/$TASK_NAME/target/ # Jenkins生成jar包位置
#查看當前docker是否運行了該項目
CID=$(docker ps | grep "$IMAGE_NAME" | awk '{print $1}')
 
DATE=`date +%Y%m%d%H%M`
 
# 將jar包移動到工作空間
function transfer(){
    echo "newest $SOURCE_PATH/$PROJECT_NAME-1.0-SNAPSHOT.jar moveto $BASE_PATH ...."
        sudo cp $SOURCE_PATH/$PROJECT_NAME-1.0-SNAPSHOT.jar $BASE_PATH/$IMAGE_NAME-1.0-SNAPSHOT.jar
    echo "move complete"
}
 
# 備份
function backup(){
        if [ -f "$BASE_PATH/$PROJECT_NAME-1.0-SNAPSHOT.jar" ]; then
        echo "$PROJECT_NAME-1.0-SNAPSHOT.jar 開始備份"
                sudo cp $BASE_PATH/$PROJECT_NAME-1.0-SNAPSHOT.jar $BASE_PATH/backup/$PROJECT_NAME-$DATE.jar
                        sleep 3
                        sudo rm -rf $BASE_PATH/$PROJECT_NAME-1.0-SNAPSHOT.jar
        echo "備份完成"
    else
        echo "$BASE_PATH/$PROJECT_NAME-1.0-SNAPSHOT.jar not exists , pass "
    fi
}
 
#構建鏡像
function build(){
        echo "開始構建"
        cd $BASE_PATH
        sudo docker build -t $IMAGE_NAME .
}
 
#運行
function run(){
        backup
        transfer
        build
        if [ -n "$CID" ]; then
                echo "存在,刪除再運行"
                        sudo docker stop $CID
                        sudo docker rm $CID
                        sudo docker run -d -p $PORT:$PORT $IMAGE_NAME
                echo "complete"
        else
                echo "不存在,直接運行"
                        sudo docker run -d -p $PORT:$PORT $IMAGE_NAME 
                echo "create ok"
        fi
}
 
#執行run方法
run 

三、 安裝Jenkins

3.1 官網安裝步驟如下:

#添加jenkins 源
sudo wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo

#導入key
sudo rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io.key

#安裝
yum install jenkins

在這裏插入圖片描述
不過通過yum安裝的效果會比較慢,極端前端下僅幾k的速度,因此可以把rpm包先下過來,然後通過rpm的方式安裝

3.2 rpm方式安裝如下:

  • 首先下載rpm包,可從清華鏡像下載,也可以從某雲提取碼w6tl下載
  • 將rpm包上傳至centos 中
  • 執行rpm -ivh jenkins-2.204.2-1.1.noarch.rpm 這個文件

3.3 啓動jenkins

service jenkins start 

如果是自己安裝的jdk,Jenkins第一次啓動可能會報錯,可以使用命令systemctl status jenkins.server來查看錯誤明細,可以看到錯誤信息提示java: no such file or directory
在這裏插入圖片描述
執行如下命令:vim /etc/init.d/jenkins

candidates裏面加上自己安裝的jdk的java命令的位置,如下
在這裏插入圖片描述
然後重新加載配置文件systemctl daemon-reload後重啓Jenkins

service jenkins start 

成功執行有如下提示

[root@instance-7k1d5qb8 ~]# service jenkins start 
Starting jenkins (via systemctl):  [  OK  ]

四、 訪問Jenkins

在瀏覽器打開地址http://服務器ip:8080 ,不出意外就能進入到如下界面,然後根據提示輸入密碼:
在這裏插入圖片描述
輸入密碼之後會進入到如下界面,選擇推薦的插件即可,就會進入到插件安裝頁面。
在這裏插入圖片描述
如若網絡不好的情況下,可能會出現如下情況,安裝插件失敗
在這裏插入圖片描述

  • 解決方法(1)如下

打開 http://ip:8080/pluginManager/advanced

最後站點設置

https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json

然後保存

在這裏插入圖片描述

  • 解決方法(2)如下

     vim /var/lib/jenkins/hudson.model.UpdateCenter.xml
    

將 https://updates.jenkins.io/update-center.json" 修改爲

“http://mirror.xmission.com/jenkins/updates/update-center.json”

然後systemctl daemon-reload 使配置生效,並重啓Jenkins systemctl restart jenkins

訪問Jenkins出現的問題:

在這裏插入圖片描述
可能是由於自己按照的jdk,少了一些基礎程序,如下安裝,重啓即可:

sudo yum install libgcc.i686 --setopt=protected_multilib=false

五、配置Jenkins

插件安裝成功之後會進入到如下界面,創建一個用戶即可
在這裏插入圖片描述
使用賬號密碼登陸之後需要進行一些基礎配置:
在這裏插入圖片描述
選擇全局工具配置
在這裏插入圖片描述
此處主要配置maven、jdk、docker 三者配置相似,把自動安裝的勾取消,便可以輸入在系統中的位置。查看環境變量中位置如下:
在這裏插入圖片描述
而yum所安裝的docker 位置如下:

/var/lib/docker

六、創建SpringBoot項目

新建一個maven項目,項目名爲JenkinsDemo 項目名在後續會用到

pom依賴和插件如下

  <parent>
        <artifactId>spring-boot-parent</artifactId>
        <groupId>org.springframework.boot</groupId>
        <version>2.1.7.RELEASE</version>
  </parent>
    
  <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>


    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>2.1.7.RELEASE</version>
                <executions>
                    <execution>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
                <configuration>
                    <fork>true</fork>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.1</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
            </plugin>
        </plugins>
    </build>

application.yml 修改端口,默認8080會和Jenkins衝突,除非修改了Jenkins的端口

server:
  port: 9120

Controller類

@RestController
public class HelloController {

    @RequestMapping("/test")
    public String hello(){
        return "自動構建測試" + LocalDateTime.now();
    }

}

啓動類

@SpringBootApplication
public class Main {
    public static void main(String[] args) {
        SpringApplication.run(Main.class,args);
    }
}

項目基礎結構搭建完成之後。

6.1 添加SVN控制

在這裏插入圖片描述
在這裏插入圖片描述添加完版本控制之後,底端會有一個Version Control ,右鍵選擇commit
在這裏插入圖片描述
勾選需要提交的文件夾或文件
在這裏插入圖片描述
提交完成之後,可以在svn管理軟件中看到,此處使用小烏龜
在這裏插入圖片描述

七、新建任務

在這裏插入圖片描述

輸入名稱Jenkins,選擇構建一個自由風格的軟件項目 確定,便進入到如下配置
在這裏插入圖片描述

勾選這個,以免產生過多的文件,導致服務器資源耗竭
在這裏插入圖片描述

添加svn,Jenkins會從這獲取源碼
在這裏插入圖片描述
svn當然需要添加賬號密碼
在這裏插入圖片描述
觸發器,大概就是何時會進行構建,如若是變化不頻繁的,可以不選,手動構建
在這裏插入圖片描述
這裏仍然是刪除之前的工作空間,避免代碼衝突
在這裏插入圖片描述
因爲我們的是Maven項目,所以選擇Maven構建
在這裏插入圖片描述
Maven構建配置如上。配置文件也可以指定位置,最好指定修改了國內鏡像的settings.xml 文件
在這裏插入圖片描述
後面選擇執行shell腳本

#!/bin/bash
cd /home/work/demo

sudo ./run.sh

最後確定

7.1 構建查看輸出

項目構建成功首頁如下所示,點擊名稱Jenkins查看該任務詳情

在這裏插入圖片描述

裏面的工作空間存放了從svn拉取的代碼,下面的Build History 就是每次構建的記錄
在這裏插入圖片描述

這裏是看工作空間的代碼
在這裏插入圖片描述
點擊Build History裏面的某一項記錄,可以進入到這裏,然後點擊控制檯輸出可以查看代碼運行情況。

第一次運行輸出往往會需要從maven下載各種依賴,如果比較慢的話,是否需要切換爲國內鏡像。

下圖的紅圈中,

第一部分表示Maven install 已經ok了 ;

第二部分是開始執行shell命令 ;

第三部分是執行Dockerfile 命令。

如果在那個部分出了問題導致訪問失敗,可以對應排除。

在這裏插入圖片描述

如果一路順利,⑧出意外的話,執行

docker ps 

便可以看到如下輸出,表示該demo已經運行完成。
在這裏插入圖片描述

然後我們只需要在瀏覽器輸入

http://ip:9120/test

便可以看到如下輸出。然事與願違,這個過程構建了好幾次才搞定。後面有參考
在這裏插入圖片描述

7.2 構建遇見的問題

  1. sudo: ./run.sh: command not found ,因爲剛剛創建的run.sh文件沒有賦予可執行權限

    ​ 在/home/work/demo 目錄下執行如下命令

    chmod a+x run.sh
    

在這裏插入圖片描述

  1. 各種no such directory , 根據控制檯輸出提示的部分,然後查看是哪個文件配置出錯,然後處理

  2. sudo: no tty present and no askpass program specified 因爲在shell文件中有sudo命令,但是權限又不夠。

    #在Jenkins宿主服務器上運行如下命令
    $ sudo visudo
    #在文件的末尾加上一行
    jenkins ALL=(ALL) NOPASSWD: ALL
    #保存文件(注意保存的時候修改文件名,文件名後綴不要加上默認的.tmp,即可覆蓋原文件)
    Ctrl+O
    #退出編輯
    Ctrl+X
    #重啓Jenkins服務
    /etc/init.d/jenkins restart
    
  3. Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?

    ​ 重啓docker 即可 systemctl restart docker

八、更新迭代

在Controller中添加如下代碼:

@GetMapping("/new")
  public String newMethod(){
       return "version 2";
}

然後提交到svn

在這裏插入圖片描述

稍等一會待Jenkins自動構建

然後在瀏覽器地址中輸入http://ip:9120/new,不出意外便能出現一下結果。如果無:

  1. 查看是否產生了構建,若無,點擊立即構建手動
  2. 查看構建記錄中的控制檯輸出,根據不同的提示,解決不同的問題。
    在這裏插入圖片描述

九、總結

這僅是Jenkins的簡單使用,還有更過的高級用法暫未用到,學習記錄倒是夠了。

1.這裏用Jenkins做了什麼?

​ 本地敲代碼 -》 提交到SVN -》 Jenkins自動編譯部署 -》訪問網頁

2.Jenkins幾個配置

​ 全局配置: Jdk、Maven、Docker

​ 任務配置: 代碼源,如何構建

發佈了11 篇原創文章 · 獲贊 14 · 訪問量 4997
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章