文章目錄
一、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方式安裝如下:
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 構建遇見的問題
-
sudo: ./run.sh: command not found
,因爲剛剛創建的run.sh文件沒有賦予可執行權限 在/home/work/demo 目錄下執行如下命令
chmod a+x run.sh
-
各種no such directory , 根據控制檯輸出提示的部分,然後查看是哪個文件配置出錯,然後處理
-
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
-
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
,不出意外便能出現一下結果。如果無:
- 查看是否產生了構建,若無,點擊
立即構建
手動 - 查看構建記錄中的控制檯輸出,根據不同的提示,解決不同的問題。
九、總結
這僅是Jenkins的簡單使用,還有更過的高級用法暫未用到,學習記錄倒是夠了。
1.這裏用Jenkins做了什麼?
本地敲代碼 -》 提交到SVN -》 Jenkins自動編譯部署 -》訪問網頁
2.Jenkins幾個配置
全局配置: Jdk、Maven、Docker
任務配置: 代碼源,如何構建