前言:
1治笨、Jenkins實(shí)現(xiàn)打包部署項(xiàng)目是自動(dòng)化運(yùn)維部署的基本知識(shí),本章只為學(xué)習(xí)之用,對(duì)熟悉Jenkins流程有一定的幫助肉康。
2、生產(chǎn)上強(qiáng)烈不建議部署Jenkins到Docker容器灼舍,切記吼和!
總體流程
1、Jenkins - 2骑素、拉取githup中倉(cāng)庫(kù)代碼 - 3炫乓、打包Maven項(xiàng)目為Docker鏡像文件 - 4、上傳到目標(biāo)服務(wù)器 - 5、執(zhí)行目標(biāo)服務(wù)器內(nèi)的shell腳本末捣,啟動(dòng)Docke容器
安裝jdk1.8.0_261到宿主機(jī)
此處我們把jdk1.8.0_261安裝到/home/calebit/Desktop/soft/jdk18/
目錄下侠姑。
mkdir -p /home/calebit/Desktop/soft/jdk18/
cd /home/calebit/Desktop/soft/jdk18/
下載jdk過(guò)程略...
解壓步驟略...
例:
unzip xxx.tar.gz
tar -zcxf xxx.tar.gz
安裝 maven3.6.3到宿主機(jī)
1、此處我們把maven3.6.3安裝到/home/calebit/Desktop/soft/
mkdir -p /home/calebit/Desktop/soft/
cd /home/calebit/Desktop/soft/
2箩做、解壓步驟略...
3莽红、配置maven中央倉(cāng)庫(kù)地址,進(jìn)入本地maven解壓目錄的 配置文件conf
目錄:
cd /home/calebit/Desktop/soft/apache-maven-3.6.3/conf
4卒茬、由于maven默認(rèn)中央倉(cāng)庫(kù)下載比較慢船老,我們可以更改maven倉(cāng)庫(kù)為阿里云中央倉(cāng)庫(kù)地址,我們可以 編輯 apache-maven-3.6.3/conf/settings.xml
文件圃酵, 更改本地倉(cāng)庫(kù)地址和增加阿里云中央倉(cāng)庫(kù)地址:
cp settings.xml settings.xml_bak
vim settings.xml
打開(kāi)localRepository
節(jié)點(diǎn),并且配置倉(cāng)庫(kù)目錄/mydata/mavenRepository
柳畔,localRepository 的配置,可以理解成是Maven下載遠(yuǎn)程倉(cāng)庫(kù)的jar包存放到本地倉(cāng)庫(kù)的路徑郭赐,此處配置成/mydata/mavenRepository
,后面我們可以通過(guò)增加掛載文件夾的方式薪韩,來(lái)和我們宿主機(jī)共享這個(gè)倉(cāng)庫(kù)。
<localRepository>/mydata/mavenRepository</localRepository>
在mirrors節(jié)點(diǎn)下增加以下內(nèi)容
<mirrors>
<mirror>
<id>alimaven</id>
<mirrorOf>central</mirrorOf>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/repositories/central/</url>
</mirror>
</mirrors>
此處為了jenkins打包時(shí)候不再去中央倉(cāng)庫(kù)拉取jar包捌锭,如果我們?cè)谖覀冏约旱腎dea中打包過(guò)我們要發(fā)布的SpringBoot項(xiàng)目的話俘陷,我們就可以把本地的maven倉(cāng)庫(kù)文件(全部文件)上傳到宿主機(jī)
/mydata/mavenRepository
目錄下。這樣Jenkins打包的時(shí)候观谦,就不需要再次去中央倉(cāng)庫(kù)拉取需要的jar包了拉盾,加快了打包時(shí)間,拷貝過(guò)程略...
開(kāi)啟Docker Remote API
1豁状、編輯 /lib/systemd/system/docker.service
,在ExecStart后開(kāi)啟捉偏。
vim /lib/systemd/system/docker.service
找到 ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
后面添加-H tcp://0.0.0.0:2375
。泻红。夭禽。。谊路。
[Service]
Type=notify
# the default is not to use systemd for cgroups because the delegate issues still
# exists and systemd currently does not support the cgroup feature set required
# for containers run by docker
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock -H tcp://0.0.0.0:2375
ExecReload=/bin/kill -s HUP $MAINPID
TimeoutSec=0
RestartSec=2
Restart=always
讹躯。。缠劝。潮梯。。
2惨恭、重新加載配置文件
systemctl daemon-reload
systemctl restart docker
3酷麦、關(guān)閉防火墻 或者 開(kāi)啟防火墻的端口
centos 開(kāi)啟防火墻端口:
#關(guān)閉防火墻
systemctl stop firewalld.service
# 禁止firewall開(kāi)機(jī)啟動(dòng)
systemctl disable firewalld.service
# 或者允許固定端口
firewall-cmd --zone=public --add-port=2375/tcp --permanent
firewall-cmd --reload
ubantu 關(guān)閉防火墻
#關(guān)閉防火墻
sudo ufw disable
# 或者允許固定端口
sudo ufw allow 2375
#查看防火墻狀態(tài)
sudo ufw status
以下正文開(kāi)始...
Docker環(huán)境下安裝Jenkins
本文自動(dòng)拉取到的jenkins為Jenkins 2.249.1版本(2020年9月30日)。其他版本過(guò)低的話喉恋,可能初始化Jenkins插件的時(shí)候沃饶,會(huì)報(bào)一些版本過(guò)低的錯(cuò)誤母廷。會(huì)提示你升級(jí)Jenkins版本。
1糊肤、拉取最新的Jenkins的docker鏡像
docker pull jenkins/jenkins:lts
2琴昆、 啟動(dòng)Jenkins容器
docker run -p 8080:8080 -p 50000:5000 --name jenkins \
-u root \
-v /mydata/jenkins_home:/var/jenkins_home \
-v /home/calebit/Desktop/soft/apache-maven-3.6.3:/maven/apache-maven-3.6.3 \
-v /home/calebit/Desktop/soft/jdk18/jdk1.8.0_261/:/jdk/jdk1.8.0_261 \
-v /mydata/mavenRepository:/mydata/mavenRepository \
-d jenkins/jenkins:lts
其中:
a、掛載目錄/mydata/mavenRepository
為后面需要用到的 maven 倉(cāng)庫(kù)地址
b馆揉、掛載目錄/mydata/jenkins_home
為 jenkins 安裝配置文件地址
c业舍、掛載目錄/home/calebit/Desktop/soft/apache-maven-3.6.3
需提前下載好本地maven解壓到宿主機(jī)/home/calebit/Desktop/soft/apache-maven-3.6.3
目錄
d、掛載目錄/home/calebit/Desktop/soft/jdk18/jdk1.8.0_261/
為 宿主機(jī)本地jdk目錄升酣。需提前下載解壓到該目錄
3舷暮、查看 jenkins初始密碼(第一次訪問(wèn)jenkins需要用到這個(gè)管理員密碼)
docker logs jenkins
## 本次測(cè)試,日志中的初始密碼為:85d429ac39ee468e9d9d92776ee7c47f
配置jenkins
參考:
https://mp.weixin.qq.com/s?__biz=MzU1Nzg4NjgyMw==&mid=2247484270&idx=1&sn=92bc35f7568e061059e58af919e75bde&scene=21#wechat_redirect
1噩茄、訪問(wèn) htttp://192.168.23.135:8080
Please wait while Jenkins is getting ready to work ...
Your browser will reload automatically when Jenkins is ready.
等待啟動(dòng)完成下面,會(huì)提示輸入管理員密碼。此密碼通過(guò)以下命令查看绩聘。
docker logs jenkins
2沥割、輸入日志里面獲取的管理員密碼:85d429ac39ee468e9d9d92776ee7c47f
3、首次進(jìn)入jenkins需要下載推薦插件凿菩,點(diǎn)擊左邊第一項(xiàng)【安裝推薦的插件】等待過(guò)程有點(diǎn)長(zhǎng)机杜,請(qǐng)耐心等待...
等待插件下載完成后,進(jìn)入下一步衅谷。
4椒拗、創(chuàng)建一個(gè)管理員賬號(hào) admin
/ admin
..
5、輸入實(shí)例配置url:htttp://192.168.23.135:8080
6获黔、配置【全局工具配置】
【首頁(yè)】-【系統(tǒng)管理】-【全局工具配置】-【JDK】-【jdk安裝】-【新增JDK】
JDK別名:jdk1.8
JAVA_HOME:/jdk/jdk1.8.0_261
(注意陡叠,此處若出現(xiàn) xxxx is not a directory on the Jenkins master (but perhaps it exists on some agents) 請(qǐng)確保掛載目錄是否出錯(cuò),如果出錯(cuò)肢执,請(qǐng)參考附錄內(nèi)第3條新增掛載目錄
),如果正確,此處可以不用勾選[自動(dòng)安裝]
同理译红。下拉該頁(yè)面,配置 maven
【Maven】-【Maven安裝】-【新增Maven】
Maven Name:Maven3.6.3
MAVEN_HOME:/maven/apache-maven-3.6.3
配置完畢预茄,點(diǎn)擊【保存】按鈕保存。
7侦厚、安裝ssh 插件
【首頁(yè)】-【系統(tǒng)管理】-【插件管理】-【可選插件】里面搜索 和安裝 Publish Over SSH
及 SSH plugin
插件,安裝完畢耻陕,勾選重啟jenkins ,重啟即可刨沦。
8诗宣、配置【系統(tǒng)配置】
【首頁(yè)】-【系統(tǒng)管理】-【系統(tǒng)配置】-【SSH remote hosts】-[SSH sites]新增加配置ssh登陸憑證
此步驟的主要作用是jenkins 打包鏡像后,能夠遠(yuǎn)程去登陸和執(zhí)行腳本文件
Hostname:192.168.23.135
(需要登陸的服務(wù)器)
Port:22
(ssh登陸端口)
Credentials:登陸賬號(hào)和密碼(此處點(diǎn)擊[添加]
按鈕增加一個(gè))
9想诅、配置【Publish over SSH】
【首頁(yè)】-【系統(tǒng)管理】-【系統(tǒng)配置】-【Publish over SSH】-[SSH Servers]
SSH Server Name:192.168.23.135
(隨便起)
Hostname:192.168.23.135
Username:root
Remote Directory: /root
此處用密碼登陸召庞,需點(diǎn)擊【高級(jí)】按鈕岛心,勾選【Use password authentication, or use a different key】
Passphrase / Password :root
編輯完成,點(diǎn)擊【Test configuration】顯示[success]即可篮灼,否則請(qǐng)驗(yàn)證密碼
準(zhǔn)備項(xiàng)目
主備一個(gè)SpringBoot項(xiàng)目忘古,項(xiàng)目主要結(jié)構(gòu)如下:
項(xiàng)目源碼地址:https://github.com/liuxianzhong/jenkins-docker-demo
pom.xm
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
....
<!-- docker-maven-plugin -->
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>1.0.0</version>
<executions>
<execution>
<id>build-image</id>
<phase>package</phase>
<goals>
<goal>build</goal>
</goals>
</execution>
</executions>
<configuration>
<imageName>docker-demo/${project.artifactId}:${project.version}</imageName>
<dockerHost>http://192.168.23.135:2375</dockerHost>
<baseImage>java:8</baseImage>
<entryPoint>["java", "-jar","/${project.build.finalName}.jar"]
</entryPoint>
<resources>
<resource>
<targetPath>/</targetPath>
<directory>${project.build.directory}</directory>
<include>${project.build.finalName}.jar</include>
</resource>
</resources>
</configuration>
</plugin>
根據(jù)自己的IP更改 <dockerHost>http://192.168.23.135:2375
</dockerHost> 這個(gè)IP
DockerController.java
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class DockerController {
static Log log = LogFactory.getLog(DockerController.class);
@RequestMapping("/")
public String index() {
log.info("Hello Jenkins Docker!");
return "Hello Jenkins Docker!";
}
}
配置啟動(dòng)腳本:
新增 jenkins啟動(dòng)容器的腳本文件 jenkins-docker-demo.sh
,到 /mydata/sh/
目錄下
mkdir -p /mydata/sh/
cd /mydata/sh/
vim jenkins-docker-demo.sh
加入以下內(nèi)容诅诱,并且保存
#!/usr/bin/env bash
app_name='jenkins-docker-demo'
docker stop ${app_name}
echo ----stop container success ----
docker rm ${app_name}
echo ----rm container success ----
echo ----clear old images... -----
clearImagesList=$(docker images -f "dangling=true" -q)
if [ ! -n "$clearImagesList" ]; then
echo "no images need clean up."
else
docker rmi $(docker images -f "dangling=true" -q)
echo "clear old images success"
fi
docker run -p 8990:8990 --name ${app_name} \
-v /etc/localtime:/etc/localtime \
-v /home/developer/app/logs/:/home/developer/app/logs/ \
-d docker-demo/${app_name}:1.0.0
echo ----start container success----
該腳本的主要功能是髓堪,自動(dòng)啟動(dòng) 我們的鏡像。
需要賦予jenkins-docker-demo.sh
腳本 可執(zhí)行權(quán)限(很重要娘荡!干旁,否則SpringBoot能打包上傳成鏡像,但可能啟動(dòng)不了容器):
chmod +x ./jenkins-docker-demo.sh
為了順利啟動(dòng)Jenkins炮沐,(可能啟動(dòng)Jenkin時(shí)報(bào)錯(cuò)如下)(很重要争群!,否則可能啟動(dòng)不了容器):
touch: cannot touch ‘/var/jenkins_home/copy_reference_file.log’: Permission denied
Can not write to /var/jenkins_home/copy_reference_file.log. Wrong volume permissions?
這里是沒(méi)有權(quán)限問(wèn)題央拖,需要執(zhí)行:sudo chown -R 1000:1000 /mydata/jenkins_home
Jenkins新建項(xiàng)目
【首頁(yè)】-【新建任務(wù)】-[輸入一個(gè)任務(wù)名稱] 下面輸入:jenkins-docker-demo
, 選擇【構(gòu)建一個(gè)自由風(fēng)格的軟件項(xiàng)目】后點(diǎn)擊【確定】
[源碼管理]-[git]:
Repositories:
Repository URL: https://github.com/liuxianzhong/jenkins-docker-demo.git
(筆者可以自己搭建gitlab或者克隆該項(xiàng)目到自己的git倉(cāng)庫(kù))
Credentials: (點(diǎn)擊[添加
]按鈕添加自己的git登陸賬號(hào)和密碼)
【構(gòu)建】-【增加構(gòu)建步驟】-【調(diào)用頂層Maven目標(biāo)】
Maven 版本:Maven3.6.3(此處下拉選擇之前配置的Maven3.6.3)
目標(biāo):package clean
【構(gòu)建】-【增加構(gòu)建步驟】-【Execute shell script on remote host using ssh】
SSH site: 下拉選擇之前配置的 root@192.168.23.135
Command:/mydata/sh/jenkins-docker-demo.sh
(執(zhí)行腳本路徑)
構(gòu)建
【首頁(yè)】-【我的視圖】-【jenkins-docker-demo】-【立即構(gòu)建】
查看- [控制臺(tái)輸出] 內(nèi)日志祭阀,提示
Successfully built 53900b85314d
Successfully tagged docker-demo/jenkins-docker-demo:1.0.0
[INFO] Built docker-demo/jenkins-docker-demo:1.0.0
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 30.265 s
[INFO] Finished at: 2020-09-30T02:28:07Z
[INFO] ------------------------------------------------------------------------
[SSH] script:
/mydata/sh/jenkins-docker-demo.sh
[SSH] executing...
Error response from daemon: No such container: jenkins-docker-demo
Error: No such container: jenkins-docker-demo
----stop container success ----
----rm container success ----
----clear old images... -----
no images need clean up.
50d4402203ef2041a80ad943183113cd9b357f558c1118bdf9044203e8721549
----start container success----
[SSH] completed
[SSH] exit-status: 0
Finished: SUCCESS
訪問(wèn)
訪問(wèn) http://192.168.23.135:8990/
如果返回:
Hello Jenkins Docker!
則整個(gè)部署成功!鲜戒!
后記:
一专控、本文章僅供學(xué)習(xí)之用,生產(chǎn)環(huán)境強(qiáng)烈不建議把jenkins部署成docker容器遏餐。
二伦腐、githup地址:https://github.com/liuxianzhong/jenkins-docker-demo
三、 動(dòng)態(tài)添加掛載目錄 到固定的容器id
此處演示把本地的/mydata/mavenRepository
目錄失都,掛載到j(luò)enkins容器的/mydata/mavenRepository
1柏蘑、查詢到 容器ID
docker ps -a
#記錄 containerID
2、停止docker
systemctl stop docker
3粹庞、編輯容器文件hostconfig.json
cd /var/lib/docker/containers/容器id
cp hostconfig.json hostconfig.json_bak
vim hostconfig.json
添加以下內(nèi)容到節(jié)點(diǎn)Binds:[]
,"/mydata/mavenRepository:/mydata/mavenRepository"
:
前為宿主機(jī)目錄咳焚,:
后為容器目錄。
4庞溜、編輯容器文件config.v2.json
cp config.v2.json config.v2.json_bak
vim config.v2.json
添加以下內(nèi)容到節(jié)點(diǎn)MountPoints:[]
內(nèi)(最好是格式化成一行革半,此處是為了好編輯)
,"/mydata/mavenRepository":{
"Source": "/mydata/mavenRepository",
"Destination": "/mydata/mavenRepository",
"RW": true,
"Name": "",
"Driver": "",
"Type": "bind",
"Propagation": "rprivate",
"Spec": {
"Type": "bind",
"Source": "/mydata/mavenRepository",
"Target": "/mydata/mavenRepository"
},
"SkipMountpointCreation": false
}
5、重啟docker
systemctl start docker
四、原文參考地址:
五允坚、對(duì)于自動(dòng)化運(yùn)維的東西還很多,目前主流的有K8s + Rancher + Jenkins/Jib的Idea插件+ Harbor + Git/GitLab(webhook:參考https://blog.csdn.net/qq_21768483/article/details/80177920
)等等六敬,學(xué)無(wú)止境。希望本文對(duì)正在學(xué)習(xí)的你有一點(diǎn)點(diǎn)幫助驾荣。
六外构、重復(fù)造輪子的工作毫無(wú)意義普泡,站在巨人的肩膀上能讓人看得更遠(yuǎn),我們能做的就是學(xué)習(xí)典勇、學(xué)習(xí)劫哼、再學(xué)習(xí)!來(lái)割笙,干了這碗雞湯Hㄉ铡!