国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【Jenkins】持續(xù)集成部署學(xué)習(xí)

這篇具有很好參考價(jià)值的文章主要介紹了【Jenkins】持續(xù)集成部署學(xué)習(xí)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

【一】Jenkins介紹

【Jenkins】持續(xù)集成部署學(xué)習(xí),jenkins,ci/cd,學(xué)習(xí)

【二】Docker安裝Gitlab

【1】首先準(zhǔn)備一臺(tái)空的虛擬機(jī)服務(wù)器

Gitlab用的端口是80,可能會(huì)跟其它應(yīng)用沖突,并且Gitlab所需內(nèi)存也很大,所以還是單獨(dú)放在一個(gè)服務(wù)器上比較好。
用原來(lái)空的虛擬機(jī)服務(wù)器克隆一個(gè),注意內(nèi)存要選大一點(diǎn),6G左右

【2】安裝服務(wù)器所需的依賴

(1)ip a / ip addr / ifconfig 不顯示ip問(wèn)題

yum install iproute ftp bind-utils net-tools wget -y

【3】Docker的安裝

(1)查看系統(tǒng)的內(nèi)核版本

uname -r 4.18.0-80.11.2.el8_0.x86_64

執(zhí)行命令:uname -r
注意:x86 64位系統(tǒng),如果是32位是不能安裝 docker 的

(2)yum更新到最新版本

sudo yum -y update

執(zhí)行命令:sudo yum update
注意:看到顯示 Complete 就代表完成了,整個(gè)過(guò)程需要 5-10 分鐘左右

更新gcc(C語(yǔ)言的編譯環(huán)境)

yum -y install gcc
yum -y install gcc-c++

(3)安裝Docker所需的依賴包

sudo yum install -y yum-utils device-mapper-persistent-data lvm2

執(zhí)行命令:sudo yum install -y yum-utils device-mapper-persistent-data lvm2
注意:看到顯示 Complete 就代表完成了,整個(gè)過(guò)程需要 1-3 分鐘左右

(4)設(shè)置Docker的yum的源

yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

(5)更新yum軟件包索引

yum makecache fast

(6)查看倉(cāng)庫(kù)所有Docker版本

yum list docker-ce --showduplicates | sort -r

(7)安裝Docker
安裝默認(rèn)最新版本的Docker

yum -y install docker-ce docker-ce-cli containerd.io

(8)啟動(dòng)Docker并添加開(kāi)機(jī)自啟動(dòng)
啟動(dòng)Docker

sudo systemctl start docker

設(shè)置開(kāi)機(jī)啟動(dòng)Docker

systemctl enable docker

重啟docker

systemctl restart docker

停止docker

systemctl stop docker

(9)查看Docker版本

docker --version

(10)測(cè)試

ps -ef|grep docker
docker version

(11)卸載Docker

systemctl stop docker
yum remove docker-ce docker-ce-cli containerd.io
rm -rf /var/lib/docker
rm -rf /var/lib/containerd

(12)Docker常用命令

[root@CodeGuide ~]# docker --help				#Docker幫助
[root@CodeGuide ~]# docker --version			#查看Docker版本
[root@CodeGuide ~]# docker search <image>		#搜索鏡像文件,如:docker search mysql
[root@CodeGuide ~]# docker pull <image>		#拉取鏡像文件, 如:docker pull mysql
[root@CodeGuide ~]# docker images				#查看已經(jīng)拉取下來(lái)的所以鏡像文件
[root@CodeGuide ~]# docker rmi <image>		#刪除指定鏡像文件
[root@CodeGuide ~]# docker run --name <name> -p 80:8080 -d <image>		#發(fā)布指定鏡像文件
[root@CodeGuide ~]# docker ps					#查看正在運(yùn)行的所有鏡像
[root@CodeGuide ~]# docker ps -a				#查看所有發(fā)布的鏡像
[root@CodeGuide ~]# docker rm <image>			#刪除執(zhí)行已發(fā)布的鏡像

(13)如何創(chuàng)建自啟動(dòng)的容器
(1)還沒(méi)run創(chuàng)建容器的
使用 docker run 命令運(yùn)行時(shí),增加 --restart=always 參數(shù)即可

(2)已運(yùn)行的容器修改其自啟動(dòng)策略
執(zhí)行命令:
docker update --restart=always 容器名或容器ID
docker container update --restart=【容器策略】 容器名稱

# no 容器退出時(shí)不重啟容器
# on-failure 只有在非零狀態(tài)退出時(shí)才重新啟動(dòng)容器
--restart=on-failure:【重啟次數(shù)】
# always 無(wú)論退出狀態(tài)如何都

【4】阿里云鏡像加速

(1)獲取阿里云加速器地址
登陸阿里云,點(diǎn)擊控制臺(tái),然后點(diǎn)擊菜單,找到“容器鏡像服務(wù)”
【Jenkins】持續(xù)集成部署學(xué)習(xí),jenkins,ci/cd,學(xué)習(xí)

創(chuàng)建個(gè)人容器鏡像托管服務(wù)

然后點(diǎn)擊鏡像工具,進(jìn)入鏡像加速器,即可看到阿里云加速器地址,把這個(gè)加速器地址配置到docker容器里
【Jenkins】持續(xù)集成部署學(xué)習(xí),jenkins,ci/cd,學(xué)習(xí)

(2)創(chuàng)建文件夾并執(zhí)行腳本
先創(chuàng)建文件夾

mkdir -p /etc/docker

執(zhí)行腳本

tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://xqybwad5.mirror.aliyuncs.com"]
}
EOF

(3)重新加載配置文件

systemctl daemon-reload

(4)重新啟動(dòng)docker

systemctl restart docker

(5)查看 daemon.json 是否已經(jīng)生效了

tail /etc/docker/daemon.json

【Jenkins】持續(xù)集成部署學(xué)習(xí),jenkins,ci/cd,學(xué)習(xí)

【5】安裝Gitlab

關(guān)閉所有防火墻
service firewalld status
service firewalld stop
重啟docker:systemctl restart docker

(1)拉取鏡像,創(chuàng)建容器
直接使用創(chuàng)建命令,系統(tǒng)會(huì)自動(dòng)進(jìn)行拉取

# 添加容器
docker run --detach \
 --hostname 192.168.19.8  \
 --publish 443:443 --publish 80:80 \
 --name gitlab \
 --restart always \
 --volume $GITLAB_HOME/config:/etc/gitlab \
 --volume $GITLAB_HOME/logs:/var/log/gitlab \
 --volume $GITLAB_HOME/data:/var/opt/gitlab \
 --shm-size 256m \
 registry.gitlab.cn/omnibus/gitlab-jh:latest


 gitlab/gitlab-ce:latest

(2)啟動(dòng)容器

docker start gitlab

查看已經(jīng)存在的容器

docker ps -a

(3)進(jìn)入容器

docker exec -it gitlab /bin/bash

(4)外網(wǎng)訪問(wèn)測(cè)試
首先保證前面關(guān)閉防火墻
訪問(wèn)下面連接(注意http不加s):http://192.168.19.8/
要稍微等一會(huì)

查看內(nèi)存使用情況

free -m

等內(nèi)存加載的差不多了,就可以打開(kāi)網(wǎng)頁(yè)了
【Jenkins】持續(xù)集成部署學(xué)習(xí),jenkins,ci/cd,學(xué)習(xí)
【Jenkins】持續(xù)集成部署學(xué)習(xí),jenkins,ci/cd,學(xué)習(xí)
(5)管理員賬號(hào)密碼登錄
密碼是進(jìn)入容器后查找的

cat /etc/gitlab/initial_root_password

登錄名是root,密碼直接復(fù)制過(guò)來(lái)使用
【Jenkins】持續(xù)集成部署學(xué)習(xí),jenkins,ci/cd,學(xué)習(xí)
(6)修改默認(rèn)密碼
啟動(dòng) gitlab-rails console要等一會(huì)

進(jìn)入容器:
~/files/code/gitlab$ docker exec -it gitlab bash
啟動(dòng) gitlab-rails console:

root@gitlab:/# gitlab-rails console
--------------------------------------------------------------------------------
 Ruby:         ruby 2.7.5p203 (2021-11-24 revision f69aeb8314) [x86_64-linux]
 GitLab:       14.7.2 (89599212ee6) FOSS
 GitLab Shell: 13.22.2
 PostgreSQL:   12.7
--------------------------------------------------------------------------------
Loading production environment (Rails 6.1.4.4)
irb(main):001:0> user =User.find(1)
=> #<User id:1 @root>
irb(main):002:0> user.password = '111111admin'
=> "111111admin"
irb(main):003:0> user.password_confirmation = '111111admin'
=> "111111admin"
irb(main):004:0> user.send_only_admin_changed_your_password_notification!
=> true
irb(main):005:0> user.save!
=> true
irb(main):006:0> exit
root@gitlab:/# exit

【三】Gitlab的使用

(1)Gitlab創(chuàng)建項(xiàng)目

首先創(chuàng)建一個(gè)空白的項(xiàng)目
【Jenkins】持續(xù)集成部署學(xué)習(xí),jenkins,ci/cd,學(xué)習(xí)

(2)Idea工具創(chuàng)建本地倉(cāng)庫(kù)

在IDEA中創(chuàng)建好項(xiàng)目,點(diǎn)擊VCS,按照下圖指示先給項(xiàng)目創(chuàng)建本地Git倉(cāng)庫(kù)
【Jenkins】持續(xù)集成部署學(xué)習(xí),jenkins,ci/cd,學(xué)習(xí)

(3)選擇此項(xiàng)目根目錄作為發(fā)布的倉(cāng)庫(kù)

(4)把項(xiàng)目ADD添加到git緩沖區(qū)

選擇最右側(cè)的 “add”
【Jenkins】持續(xù)集成部署學(xué)習(xí),jenkins,ci/cd,學(xué)習(xí)

(5)再將項(xiàng)目COMMIT提交到本地倉(cāng)庫(kù)

選擇最右側(cè)第一個(gè) “Commit Directory…”
【Jenkins】持續(xù)集成部署學(xué)習(xí),jenkins,ci/cd,學(xué)習(xí)點(diǎn)擊之后,在彈窗里填寫備注信息
【Jenkins】持續(xù)集成部署學(xué)習(xí),jenkins,ci/cd,學(xué)習(xí)

(6)把項(xiàng)目PUSH推送到遠(yuǎn)程倉(cāng)庫(kù)

【Jenkins】持續(xù)集成部署學(xué)習(xí),jenkins,ci/cd,學(xué)習(xí)【Jenkins】持續(xù)集成部署學(xué)習(xí),jenkins,ci/cd,學(xué)習(xí)
【Jenkins】持續(xù)集成部署學(xué)習(xí),jenkins,ci/cd,學(xué)習(xí)
【Jenkins】持續(xù)集成部署學(xué)習(xí),jenkins,ci/cd,學(xué)習(xí)
URL復(fù)制下面這個(gè)
【Jenkins】持續(xù)集成部署學(xué)習(xí),jenkins,ci/cd,學(xué)習(xí)連接的時(shí)候輸入root和對(duì)應(yīng)的密碼就行了

這樣就可以提交上去了
【Jenkins】持續(xù)集成部署學(xué)習(xí),jenkins,ci/cd,學(xué)習(xí)

更新項(xiàng)目的話,commit的時(shí)候選擇你修改的文件,push的時(shí)候,對(duì)應(yīng)的url就是你要更新項(xiàng)目倉(cāng)庫(kù)的url。這樣,gitlab上面?zhèn)}庫(kù)里面的項(xiàng)目就是你選擇的文件進(jìn)行修改了。也就是只是局部進(jìn)行修改。

(7)查看commit的幾次,就是看版本

【Jenkins】持續(xù)集成部署學(xué)習(xí),jenkins,ci/cd,學(xué)習(xí)

看到以上commit了3次;

我們想要回到某一次,我們可以右擊想要回到的版本
【Jenkins】持續(xù)集成部署學(xué)習(xí),jenkins,ci/cd,學(xué)習(xí)
只要點(diǎn)擊了以上的這個(gè),就回去了

【Checkout Revision】和【Reset Current Branch to Here】的區(qū)別?

(8)創(chuàng)建分支

我們想要在當(dāng)前的項(xiàng)目的基礎(chǔ)上面,創(chuàng)建一個(gè)分支,相當(dāng)于對(duì)于當(dāng)前的項(xiàng)目復(fù)制一份,變?yōu)橐粋€(gè)分支
【Jenkins】持續(xù)集成部署學(xué)習(xí),jenkins,ci/cd,學(xué)習(xí)
【Jenkins】持續(xù)集成部署學(xué)習(xí),jenkins,ci/cd,學(xué)習(xí)
【Jenkins】持續(xù)集成部署學(xué)習(xí),jenkins,ci/cd,學(xué)習(xí)

如何查看是不是切換過(guò)去了

idea右下角,就可以看到當(dāng)前的項(xiàng)目在哪個(gè)分支

【Jenkins】持續(xù)集成部署學(xué)習(xí),jenkins,ci/cd,學(xué)習(xí)
【Jenkins】持續(xù)集成部署學(xué)習(xí),jenkins,ci/cd,學(xué)習(xí)

也可以直接在右下角進(jìn)行點(diǎn)擊創(chuàng)建
【Jenkins】持續(xù)集成部署學(xué)習(xí),jenkins,ci/cd,學(xué)習(xí)

【四】Docker安裝Jenkins

【1】安裝JDK、Maven、Git(可跳過(guò))

(1)安裝JDK

參考文章:Linux安裝JDK
(1)yum下載JDK

yum search java | grep java-1.8
# 安裝JRE
yum install java-1.8.0-openjdk
# 安裝JDK
yum install -y java-devel

安裝完成后,默認(rèn)的安裝路徑為:

cd /usr/lib/jvm/

(2)配置JDK環(huán)境變量
1-編輯系統(tǒng)配置文件

vim /etc/profile

2-在profile的最后面添加,下面的JAVA_HOME是JDK文件夾

JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk
PATH=$JAVA_HOME/bin:$PATH
CLASSPATH=$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/jre/lib/ext
 
export PATH JAVA_HOME CLASSPATH

3-讓配置生效

source /etc/profile

4-查看jdk是否生效
【Jenkins】持續(xù)集成部署學(xué)習(xí),jenkins,ci/cd,學(xué)習(xí)

(2)安裝Maven

(1)下載maven
下載地址:https://dlcdn.apache.org/maven/maven-3/3.8.8/binaries/apache-maven-3.8.8-bin.tar.gz

(2)把下載包上傳到服務(wù)器的/usr/lib/jvm目錄下

cd /usr/lib/jvm
#解壓maven
tar -zxvf apache-maven-3.8.8-bin.tar.gz

(3)設(shè)置環(huán)境變量

vim /etc/profile
JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk
PATH=$JAVA_HOME/bin:$PATH
CLASSPATH=$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/jre/lib/ext
 
export PATH JAVA_HOME CLASSPATH
export MAVEN_HOME=/usr/lib/jvm/apache-maven-3.8.8
export PATH=${MAVEN_HOME}/bin:${PATH}

讓配置生效

source /etc/profile

查看mvn的版本,測(cè)試是否安裝成功

mvn -v

【Jenkins】持續(xù)集成部署學(xué)習(xí),jenkins,ci/cd,學(xué)習(xí)

(4)配置Maven加速鏡像

cd /usr/lib/jvm/apache-maven-3.8.8/conf/

vim settings.xml

編輯添加下面內(nèi)容

<mirrors>
	<mirror>
	    <id>alimaven</id>
	    <name>aliyun maven</name>
	    <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
	    <mirrorOf>central</mirrorOf>
	</mirror>
</mirrors>

【Jenkins】持續(xù)集成部署學(xué)習(xí),jenkins,ci/cd,學(xué)習(xí)

(3)安裝Git

docker安裝的git自帶git

【2】安裝Jenkins

(1)拉取鏡像

拉取鏡像,這里指定是2.415版本,默認(rèn)最新的是2.3版本,在初始化插件的時(shí)候會(huì)因?yàn)榘姹镜投螺d失敗

docker pull jenkins/jenkins:2.415

(2)修改目錄權(quán)限

會(huì)把容器中的Jenkins主目錄給持久化到主機(jī)本地目錄里,因此需要先在主機(jī)上新建一個(gè)本地目錄,并設(shè)置權(quán)限

需要修改下目錄權(quán)限,因?yàn)楫?dāng)映射本地?cái)?shù)據(jù)卷時(shí),/data/jenkins_home/目錄的擁有者為root用戶,

而容器中jenkins用戶的 uid 為 1000。

我們創(chuàng)建一個(gè)jenkins目錄
# mkdir /var/jenkins_home
# chown -R 1000:1000 /var/jenkins_home/

(3)運(yùn)行容器

(1)–name jenkins:命名
(2)-d:表示后臺(tái)運(yùn)行
(3)-p 10240:8080:把宿主機(jī)的10240端口映射到8080端口
(4)-v /var/jenkins_home:/var/jenkins_home
(5)-v /etc/localtime:/etc/localtime
(6)-v /var/run/docker.sock:/var/run/docker.sock:讓Jenkins能夠與主機(jī)的Docker進(jìn)行通訊

如果上面沒(méi)有安裝JDK、Maven、Git這些,就不需要進(jìn)行掛載了,后面直接使用docker安裝自帶的jdk和git,還可以自動(dòng)安裝maven

docker run -d -p 10240:8080 -p 10241:50000 -v /var/jenkins_home:/var/jenkins_home -v /etc/localtime:/etc/localtime --name myjenkins -v /var/run/docker.sock:/var/run/docker.sock jenkins/jenkins:2.415

如果已經(jīng)安裝了JDK、Maven、Git這些,可以在啟動(dòng)的時(shí)候掛載

docker run -di --name=myjenkins -p 10240:8080 -p 10241:50000 -v /var/jenkins_home:/var/jenkins_home \
-v /etc/localtime:/etc/localtime \
-v /usr/local/java/jdk:/usr/local/jdk1.8 \
-v /usr/local/java/apache-maven-3.8.5:/usr/local/apache-maven-3.8.5 \
-v /var/run/docker.sock:/var/run/docker.sock jenkins/jenkins:2.415

-v /home/jenkins_home:/var/jenkins_home:是對(duì)容器內(nèi)存儲(chǔ)Jenkins的一些配置信息的文件夾
-v /usr/local/java/jdk:/usr/local/jdk1.8:是把linux下的jdk和容器內(nèi)的關(guān)聯(lián)(配置Jenkins時(shí)使用)
-v /usr/local/java/apache-maven-3.8.5:/usr/local/apache-maven-3.8.5:是把linux下的maven和容器內(nèi)的關(guān)聯(lián)(配置Jenkins時(shí)使用)

(4)瀏覽器訪問(wèn)Jenkins頁(yè)面

輸入http://192.168.XX.XX:10240
IP是服務(wù)器IP地址
端口號(hào)是我們剛剛設(shè)置的端口號(hào)
【Jenkins】持續(xù)集成部署學(xué)習(xí),jenkins,ci/cd,學(xué)習(xí)

(5)獲取管理員密碼

vim /var/jenkins_home/secrets/initialAdminPassword

復(fù)制密碼然后登錄

(6)安裝插件

這里先跳過(guò)安裝

(7)創(chuàng)建管理員

root
admin

(8)實(shí)例配置

url不用動(dòng)
【Jenkins】持續(xù)集成部署學(xué)習(xí),jenkins,ci/cd,學(xué)習(xí)
配置完成
【Jenkins】持續(xù)集成部署學(xué)習(xí),jenkins,ci/cd,學(xué)習(xí)http://192.168.19.7:10240/

(9)通過(guò)docker安裝的jenkins自帶git和JDK,就不需要再安裝了

Jenkins本機(jī)默認(rèn)使用“yum -y install git” 安裝的 git

docker exec -it myjenkins /bin/bash

git --version

java --version

echo $JAVA_HOME

【Jenkins】持續(xù)集成部署學(xué)習(xí),jenkins,ci/cd,學(xué)習(xí)

(10)查看Jenkins版本

【Jenkins】持續(xù)集成部署學(xué)習(xí),jenkins,ci/cd,學(xué)習(xí)
滑到最底下,可以看到當(dāng)前安裝的版本是2.328
【Jenkins】持續(xù)集成部署學(xué)習(xí),jenkins,ci/cd,學(xué)習(xí)

【五】Jenkins使用

【1】配置插件鏡像

【Jenkins】持續(xù)集成部署學(xué)習(xí),jenkins,ci/cd,學(xué)習(xí)
滑到下面,找到升級(jí)站點(diǎn)
【Jenkins】持續(xù)集成部署學(xué)習(xí),jenkins,ci/cd,學(xué)習(xí)
輸入:https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json

點(diǎn)擊提交,然后重啟jenkins:http://localhost:8080/restart

【2】定制安裝所需的插件

因?yàn)榄h(huán)境網(wǎng)絡(luò)問(wèn)題前面跳過(guò)了插件的安裝,在這一步選擇一個(gè)簡(jiǎn)單的jenkins系統(tǒng)所需要的插件。

配置路徑:Manage Jenkins>> Manage Plugins
【Jenkins】持續(xù)集成部署學(xué)習(xí),jenkins,ci/cd,學(xué)習(xí)【Jenkins】持續(xù)集成部署學(xué)習(xí),jenkins,ci/cd,學(xué)習(xí)
選擇所需要插件,點(diǎn)擊安裝(Install without restart)
【Jenkins】持續(xù)集成部署學(xué)習(xí),jenkins,ci/cd,學(xué)習(xí)

有兩個(gè)重要的插件需要安裝:publish over ssh和Maven Integration plugin

(1)安裝publish over ssh

我們想把Jenkins打包好的jar包通過(guò)SSH發(fā)送到遠(yuǎn)程測(cè)試服務(wù)器上,在遠(yuǎn)程測(cè)試服務(wù)上進(jìn)行啟動(dòng)使用,所以需要這個(gè)插件,安裝完插件以后,會(huì)在system系統(tǒng)配置里進(jìn)行配置,也就是添加遠(yuǎn)程服務(wù)器的連接信息,這個(gè)后面會(huì)講到
【Jenkins】持續(xù)集成部署學(xué)習(xí),jenkins,ci/cd,學(xué)習(xí)
注意:這里直接安裝可能會(huì)失敗,查看失敗的詳情信息,提示說(shuō)需要更高版本的Jenkins才可以:Jenkins (2.332.1) or higher required,所以剛開(kāi)始直接安裝的2.4版本Jenkins

那么我們可以換個(gè)更低版本的插件來(lái)安裝試試,插件網(wǎng)址:http://updates.jenkins-ci.org/download/plugins/

【Jenkins】持續(xù)集成部署學(xué)習(xí),jenkins,ci/cd,學(xué)習(xí)

查看它前面的版本是否符合要求,下載一個(gè)hpi文件,離線方式安裝插件:
【Jenkins】持續(xù)集成部署學(xué)習(xí),jenkins,ci/cd,學(xué)習(xí)
【Jenkins】持續(xù)集成部署學(xué)習(xí),jenkins,ci/cd,學(xué)習(xí)
重啟jenkins

(2)安裝Maven Integration

然后還有Maven插件
【Jenkins】持續(xù)集成部署學(xué)習(xí),jenkins,ci/cd,學(xué)習(xí)

安裝完成后重新啟動(dòng)一下

(3)安裝中文翻譯插件

安裝Local和Chinese兩個(gè)插件
【Jenkins】持續(xù)集成部署學(xué)習(xí),jenkins,ci/cd,學(xué)習(xí)點(diǎn)擊【Configure System】選項(xiàng)。
【Jenkins】持續(xù)集成部署學(xué)習(xí),jenkins,ci/cd,學(xué)習(xí)找到【Locale】選項(xiàng),輸入【zh_CN】,勾選下面的選項(xiàng),最后點(diǎn)擊【應(yīng)用】即可。

【Jenkins】持續(xù)集成部署學(xué)習(xí),jenkins,ci/cd,學(xué)習(xí)

(4)安裝Git插件

直接搜Git,安裝流程如上

【3】開(kāi)始配置

(1)配置ssh(可跳過(guò),在后面用到的時(shí)候配)

Dashboard——》ManageJenkins——》System

配置全局憑據(jù),這個(gè)全局憑據(jù)看起來(lái)高大上,其實(shí)挺好理解,就是一個(gè)配置項(xiàng),然后你配置好以后,你就可以通過(guò)jenkins登錄到你想進(jìn)入的那臺(tái)服務(wù)器里面,你還可以在那臺(tái)服務(wù)器上執(zhí)行你設(shè)計(jì)的指令。而咱們前面安裝的publish over ssh插件,就是用來(lái)干這事的!

(1)生成ssh私鑰和公鑰
假設(shè)我有兩臺(tái)機(jī)器A,B然后我想在A機(jī)器上遠(yuǎn)程登錄到B機(jī)器上,那么我就應(yīng)該在A機(jī)器中通過(guò)ssh生成公鑰和私鑰,然后把公鑰放到B機(jī)器中,私鑰自己留著。

(2)配置jdk和maven和git

Dashboard——》ManageJenkins——》Tools

(1)配置JDK

點(diǎn)擊系統(tǒng)管理,找到全局工具配置

如果是在宿主機(jī)里安裝的JDK
【Jenkins】持續(xù)集成部署學(xué)習(xí),jenkins,ci/cd,學(xué)習(xí)
但是如果使用Docker安裝的Jenkins,那么是自帶JDK的,我們可以進(jìn)入到j(luò)enkins容器中 echo $JAVA_HOME 獲取java環(huán)境安裝地址

docker exec -it myjenkins /bin/bash

git --version

java --version

echo $JAVA_HOME

獲取Jenkins里的jdk路徑是【/opt/java/openjdk】
【Jenkins】持續(xù)集成部署學(xué)習(xí),jenkins,ci/cd,學(xué)習(xí)

【Jenkins】持續(xù)集成部署學(xué)習(xí),jenkins,ci/cd,學(xué)習(xí)

(2)配置maven(選用默認(rèn)的即可)

進(jìn)入【首頁(yè)】–【系統(tǒng)管理】–【全局配置】,拉到最下面maven–maven安裝

下載jar包會(huì)比較慢,所以還要配置國(guó)內(nèi)的鏡像,所以這里也可以用自己安裝的maven會(huì)更方便使用
【Jenkins】持續(xù)集成部署學(xué)習(xí),jenkins,ci/cd,學(xué)習(xí)

(3)配置git

使用默認(rèn)的,不需要配

點(diǎn)擊保存

【4】helloworld項(xiàng)目部署:進(jìn)階一:ssh傳送jar包然后手動(dòng)命令啟動(dòng)jar

(1)準(zhǔn)備一個(gè)springboot的helloworld項(xiàng)目

(1)下載地址
https://how2j.cn/k/springboot/springboot-idea/1641.html

【Jenkins】持續(xù)集成部署學(xué)習(xí),jenkins,ci/cd,學(xué)習(xí)
(2)idea打開(kāi)項(xiàng)目
下載項(xiàng)目文件后,解壓,然后使用idea打開(kāi)
【Jenkins】持續(xù)集成部署學(xué)習(xí),jenkins,ci/cd,學(xué)習(xí)
(3)啟動(dòng)項(xiàng)目,測(cè)試訪問(wèn)
因?yàn)楸镜?080端口沖突,所以在配置文件里把服務(wù)端口改成了8082,啟動(dòng)成功以后訪問(wèn):http://localhost:8082/hello
【Jenkins】持續(xù)集成部署學(xué)習(xí),jenkins,ci/cd,學(xué)習(xí)
如圖測(cè)試成功,接下來(lái)就是把測(cè)試成功的項(xiàng)目提交到自己搭建的Gitlab上去了

(4)Gitlab創(chuàng)建項(xiàng)目
首先創(chuàng)建一個(gè)空白的項(xiàng)目
【Jenkins】持續(xù)集成部署學(xué)習(xí),jenkins,ci/cd,學(xué)習(xí)
【Jenkins】持續(xù)集成部署學(xué)習(xí),jenkins,ci/cd,學(xué)習(xí)
【Jenkins】持續(xù)集成部署學(xué)習(xí),jenkins,ci/cd,學(xué)習(xí)

(5)Idea工具創(chuàng)建本地倉(cāng)庫(kù)
在IDEA中創(chuàng)建好項(xiàng)目,點(diǎn)擊VCS,按照下圖指示先給項(xiàng)目創(chuàng)建本地Git倉(cāng)庫(kù)
【Jenkins】持續(xù)集成部署學(xué)習(xí),jenkins,ci/cd,學(xué)習(xí)
然后選擇當(dāng)前項(xiàng)目的文件作為發(fā)布的倉(cāng)庫(kù),成功之后看到所有項(xiàng)目文件變成了紅色
【Jenkins】持續(xù)集成部署學(xué)習(xí),jenkins,ci/cd,學(xué)習(xí)

(6)把項(xiàng)目ADD添加到git緩沖區(qū)
點(diǎn)擊項(xiàng)目,然后右鍵,選擇最右側(cè)的 “add”,添加之后可以看到所有項(xiàng)目文件變成了綠色
【Jenkins】持續(xù)集成部署學(xué)習(xí),jenkins,ci/cd,學(xué)習(xí)
(7)再將項(xiàng)目COMMIT提交到本地倉(cāng)庫(kù)
選擇最右側(cè)第一個(gè) “Commit Directory…”
【Jenkins】持續(xù)集成部署學(xué)習(xí),jenkins,ci/cd,學(xué)習(xí)
點(diǎn)擊之后,在彈窗里填寫備注信息
【Jenkins】持續(xù)集成部署學(xué)習(xí),jenkins,ci/cd,學(xué)習(xí)
提交完成后,可以看到項(xiàng)目的所有文件都變成了白色

(8)把項(xiàng)目PUSH推送到遠(yuǎn)程倉(cāng)庫(kù)
先復(fù)制項(xiàng)目在Gitlab的git地址:http://192.168.19.8/root/hello-world.git
【Jenkins】持續(xù)集成部署學(xué)習(xí),jenkins,ci/cd,學(xué)習(xí)

然后push項(xiàng)目

【Jenkins】持續(xù)集成部署學(xué)習(xí),jenkins,ci/cd,學(xué)習(xí)

然后自定義遠(yuǎn)程地址

【Jenkins】持續(xù)集成部署學(xué)習(xí),jenkins,ci/cd,學(xué)習(xí)

然后點(diǎn)擊Push,連接的時(shí)候輸入root和對(duì)應(yīng)的密碼就行了,這樣就可以提交上去了
【Jenkins】持續(xù)集成部署學(xué)習(xí),jenkins,ci/cd,學(xué)習(xí)

更新項(xiàng)目的話,commit的時(shí)候選擇你修改的文件,push的時(shí)候,對(duì)應(yīng)的url就是你要更新項(xiàng)目倉(cāng)庫(kù)的url。這樣,gitlab上面?zhèn)}庫(kù)里面的項(xiàng)目就是你選擇的文件進(jìn)行修改了。也就是只是局部進(jìn)行修改。

可以看到項(xiàng)目的代碼都已經(jīng)提交上來(lái)了
【Jenkins】持續(xù)集成部署學(xué)習(xí),jenkins,ci/cd,學(xué)習(xí)

(2)Jenkins新建任務(wù)

【Jenkins】持續(xù)集成部署學(xué)習(xí),jenkins,ci/cd,學(xué)習(xí)

【Jenkins】持續(xù)集成部署學(xué)習(xí),jenkins,ci/cd,學(xué)習(xí)

(3)到Gitlab的項(xiàng)目里復(fù)制克隆路徑

【Jenkins】持續(xù)集成部署學(xué)習(xí),jenkins,ci/cd,學(xué)習(xí)
hello world項(xiàng)目:http://192.168.19.8/root/hello-world.git

(4)Jenkins的項(xiàng)目配置

(1)源碼管理
用的是自己搭建服務(wù)器上gitlab的代碼,創(chuàng)建的時(shí)候已經(jīng)設(shè)置為public了,這里直接用:http://192.168.19.8/root/docker-springboot.git
【Jenkins】持續(xù)集成部署學(xué)習(xí),jenkins,ci/cd,學(xué)習(xí)

(2)構(gòu)建觸發(fā)器(不改動(dòng))
【Jenkins】持續(xù)集成部署學(xué)習(xí),jenkins,ci/cd,學(xué)習(xí)

(3)構(gòu)建環(huán)境(不改動(dòng))
【Jenkins】持續(xù)集成部署學(xué)習(xí),jenkins,ci/cd,學(xué)習(xí)
(4)Pre Steps(不改動(dòng))
可以執(zhí)行一些構(gòu)建之前的操作

(5)Build(構(gòu)建)
在Gitlab里面可以看一下pom.xml是不是放在根目錄下的,如果還有子目錄,下面就要填成***/pom.xml
【Jenkins】持續(xù)集成部署學(xué)習(xí),jenkins,ci/cd,學(xué)習(xí)
【Jenkins】持續(xù)集成部署學(xué)習(xí),jenkins,ci/cd,學(xué)習(xí)

(6)立即構(gòu)建

立即構(gòu)建
【Jenkins】持續(xù)集成部署學(xué)習(xí),jenkins,ci/cd,學(xué)習(xí)

因?yàn)槭堑谝淮螛?gòu)建,maven的倉(cāng)庫(kù)里沒(méi)有jar包,所以全部都要下載,有可能會(huì)在下載的過(guò)程中就失敗,所以構(gòu)建的過(guò)程中要觀察一下控制臺(tái)輸出
【Jenkins】持續(xù)集成部署學(xué)習(xí),jenkins,ci/cd,學(xué)習(xí)
【Jenkins】持續(xù)集成部署學(xué)習(xí),jenkins,ci/cd,學(xué)習(xí)

(7)啟動(dòng)jar包
首先找到構(gòu)建好的jar包所在位置

cd /var/jenkins_home/workspace/helloworld/target

【Jenkins】持續(xù)集成部署學(xué)習(xí),jenkins,ci/cd,學(xué)習(xí)

然后使用命令啟動(dòng)項(xiàng)目

java -jar springboot-0.0.1-SNAPSHOT.jar --server.port=8088

啟動(dòng)成功
【Jenkins】持續(xù)集成部署學(xué)習(xí),jenkins,ci/cd,學(xué)習(xí)
查看端口

netstat -tuln | grep 8088

(8)訪問(wèn)測(cè)試
訪問(wèn)地址:192.168.19.9:8088/hello

如果訪問(wèn)不通,可能是防火墻的問(wèn)題,關(guān)閉所有防火墻
service firewalld status
service firewalld stop

【Jenkins】持續(xù)集成部署學(xué)習(xí),jenkins,ci/cd,學(xué)習(xí)
成功

【5】helloworld項(xiàng)目部署:進(jìn)階二:ssh傳送jar包然后自動(dòng)執(zhí)行java -jar啟動(dòng)jar

(1)介紹

上面已經(jīng)安裝了SSH插件,就是通過(guò)SSH把JAR包發(fā)送到測(cè)試服務(wù)器。這里我們要再克隆一個(gè)虛擬機(jī)服務(wù)器,上面只需要安裝JDK就行了。

這里想要實(shí)現(xiàn)的邏輯就是
(1)本地idea完成代碼修改后,把代碼提交到192.168.19.8服務(wù)器的Gitlab上
(2)然后192.168.19.9服務(wù)器上的Jenkins在構(gòu)建項(xiàng)目的時(shí)候,會(huì)自動(dòng)到Gitlab的服務(wù)器上拉取代碼,然后使用Maven對(duì)代碼進(jìn)行打包,生成Jar包
(3)最后192.168.19.9服務(wù)器上的Jenkins在打包完成后,把Jar包通過(guò)SSH發(fā)送到遠(yuǎn)程測(cè)試服務(wù)器192.168.19.11上,并且會(huì)執(zhí)行自定義的命令,比如java -jar,完成項(xiàng)目啟動(dòng)

綜上,開(kāi)發(fā)人員只需要在idea把代碼提交到Gitlab,然后進(jìn)入Jenkins點(diǎn)一下構(gòu)建項(xiàng)目,然后就可以在測(cè)試服務(wù)器上使用部署好的代碼了

(2)修改全局配置

【Jenkins】持續(xù)集成部署學(xué)習(xí),jenkins,ci/cd,學(xué)習(xí)
目前是一臺(tái)服務(wù)器都沒(méi)有的,點(diǎn)擊新增
1-Name:自己給服務(wù)器起個(gè)名字
2-HostName:服務(wù)器的ip地址
3-Username:登錄用戶名
4-點(diǎn)擊高級(jí),Passwor的:登錄密碼
5-port:端口默認(rèn)22
【Jenkins】持續(xù)集成部署學(xué)習(xí),jenkins,ci/cd,學(xué)習(xí)最后點(diǎn)擊Test Configuration測(cè)試連接,顯示Success為連接成功

(3)打開(kāi)項(xiàng)目配置

【Jenkins】持續(xù)集成部署學(xué)習(xí),jenkins,ci/cd,學(xué)習(xí)
上面知道Jenkins打成的Jar包是放在workspace文件夾下的target包里的【springboot-0.0.1-SNAPSHOT.jar】,每次打包的時(shí)候后綴【-0.0.1】可能會(huì)變

cd /var/jenkins_home/workspace/helloworld/target

配置如下,點(diǎn)擊保存
【Jenkins】持續(xù)集成部署學(xué)習(xí),jenkins,ci/cd,學(xué)習(xí)

(4)遠(yuǎn)程服務(wù)器開(kāi)啟SSH

(1)首先查看ssh服務(wù)沒(méi)有開(kāi)啟

查看狀態(tài):#lssrc -s sshd

如果狀態(tài)為inoperative說(shuō)明沒(méi)有開(kāi)啟:

開(kāi)啟sshd:#startsrc -s sshd

(2)修改配置文件

root用戶默認(rèn)情況下是無(wú)法使用ssh連接的。

編輯:#vi /etc/ssh/sshd_config去掉前面的#,并將PermitRootLogin改為yes
#Port 22
#PermitRootLogin yes

(3)啟動(dòng)sshd服務(wù)

啟動(dòng)ssh:#startsrc -s sshd

(5)再次構(gòu)建,查看構(gòu)建日志

顯示傳送了一個(gè)文件
【Jenkins】持續(xù)集成部署學(xué)習(xí),jenkins,ci/cd,學(xué)習(xí)

(6)到遠(yuǎn)程服務(wù)器上看看

看看文件是不是真的傳送了
【Jenkins】持續(xù)集成部署學(xué)習(xí),jenkins,ci/cd,學(xué)習(xí)

(7)看看jar是否已經(jīng)自動(dòng)啟動(dòng)

訪問(wèn)地址:192.168.19.11:8082/hello(因?yàn)檫@次啟動(dòng)沒(méi)有指定啟動(dòng)端口,而項(xiàng)目yml里配置的端口是8082)

如果訪問(wèn)不通,可能是防火墻的問(wèn)題,關(guān)閉所有防火墻
service firewalld status
service firewalld stop

查看端口

netstat -tuln | grep 8082

【Jenkins】持續(xù)集成部署學(xué)習(xí),jenkins,ci/cd,學(xué)習(xí)

【6】helloworld項(xiàng)目部署:進(jìn)階三:優(yōu)化啟動(dòng)命令實(shí)現(xiàn)可以反復(fù)拉取&構(gòu)建&啟動(dòng)

(1)這種方式存在的問(wèn)題

1-問(wèn)題描述

上面我們?cè)谕瓿蒵ar包的發(fā)送后,直接使用【nohup java -jar /root/helloworld/springboot*.jar &】命令來(lái)啟動(dòng)jar包,但是這種方式是一次性的,下次構(gòu)建的時(shí)候再啟動(dòng)jar包就會(huì)有端口沖突的問(wèn)題,導(dǎo)致新的jar包啟動(dòng)失敗,所以就會(huì)發(fā)現(xiàn)每次雖然提交了新的代碼,jar包也打包成功了,但是構(gòu)建完成后發(fā)現(xiàn)新的代碼沒(méi)有真正的生效。具體的報(bào)錯(cuò)我們可以在測(cè)試服務(wù)器里查看啟動(dòng)日志。

還有就是使用【jps】命令查看虛擬機(jī)正在運(yùn)行的進(jìn)程信息。
【Jenkins】持續(xù)集成部署學(xué)習(xí),jenkins,ci/cd,學(xué)習(xí)

我們正確的操作應(yīng)該是,在每次啟動(dòng)jar包之前都要檢查端口是否被占用,如果占用就查出來(lái)是具體哪個(gè)線程占用的,然后殺掉線程,之后才進(jìn)行重新啟動(dòng)jar包。

2-第一步:解決nohup提示導(dǎo)致卡住問(wèn)題

針對(duì)這種情況我們對(duì)上面的命令進(jìn)行優(yōu)化,換成

nohup java -jar /root/helloworld/springboot*.jar >my.log 2>&1 &

命令分析
(1)nohup:全稱是no hang up(不掛起),也就是說(shuō),當(dāng)前交互命令行退出的時(shí)候,程序還在運(yùn)行。
(2)&:表示后臺(tái)運(yùn)行,不霸占交互命令行
(3)>my.log 2>&1:數(shù)據(jù)流重定向,把要輸出的信息流指定到my.log文件,并且把標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯(cuò)誤輸出都寫到這個(gè)文件里
數(shù)據(jù)流重定向就是把某個(gè)命令執(zhí)行后應(yīng)該要出現(xiàn)在屏幕上的數(shù)據(jù)傳輸?shù)狡渌胤?br> 1-標(biāo)準(zhǔn)輸入(stdin):代碼為0,使用<或<<
2-標(biāo)準(zhǔn)輸出(stdout):代碼為1,使用>或>>
3-標(biāo)準(zhǔn)錯(cuò)誤輸出(stderr):diamante為2,使用2>或2>>,其中>為覆蓋寫,>>為追加寫

總結(jié):改成這個(gè)命令以后,原本現(xiàn)在屏幕的【nohup:忽略輸入并把輸出追加到“nohup.out”】的提示語(yǔ)就會(huì)被寫到指定的文件里,而不會(huì)現(xiàn)在屏幕上導(dǎo)致卡住。
【Jenkins】持續(xù)集成部署學(xué)習(xí),jenkins,ci/cd,學(xué)習(xí)

3-驗(yàn)證一下

我們最后再來(lái)測(cè)試一下修改項(xiàng)目代碼,然后提交git,最后jenkins構(gòu)建打包,看看新的代碼是不是真的生效了

jenkins構(gòu)建完成后,我們進(jìn)入服務(wù)器的jar目錄看一下
1-看jar包的創(chuàng)建時(shí)間,新的jar發(fā)送成功了
2-有了新的日志文件my.log,jar包的啟動(dòng)日志就會(huì)寫入到這個(gè)文件里

我們進(jìn)入my.log文件里看看,提示語(yǔ)寫到這里了,不會(huì)出現(xiàn)在屏幕上導(dǎo)致卡住了
【Jenkins】持續(xù)集成部署學(xué)習(xí),jenkins,ci/cd,學(xué)習(xí)
但是還是有報(bào)錯(cuò)內(nèi)容,提示端口被占用,啟動(dòng)失敗,那么我們接下來(lái)就要解決端口被占用的問(wèn)題
【Jenkins】持續(xù)集成部署學(xué)習(xí),jenkins,ci/cd,學(xué)習(xí)

(2)手動(dòng)完成解決“地址已在使用”的問(wèn)題

(1)啟動(dòng)jar包
當(dāng)前jar包是第一次啟動(dòng),我們使用命令

nohup java -jar /root/helloworld/springboot*.jar >my.log 2>&1 &

啟動(dòng)完成后
1-查看jar包同級(jí)目錄下my.log日志
2-檢查端口占用情況
3-檢查jar包進(jìn)程

(2)學(xué)習(xí)ps -ef命令
我們啟動(dòng)的jar包名字為springboot-0.0.1-SNAPSHOT.jar,ps -ef 命令會(huì)顯示以下幾個(gè)字段:

  • UID:進(jìn)程的擁有者
  • PID:進(jìn)程的 ID
  • PPID:進(jìn)程的父進(jìn)程 ID
  • C:進(jìn)程占用 CPU 的百分比
  • STIME:進(jìn)程啟動(dòng)的時(shí)間
  • TTY:進(jìn)程所在的終端設(shè)備
  • TIME:進(jìn)程運(yùn)行的時(shí)間
  • CMD:進(jìn)程執(zhí)行的命令
ps -ef | grep springboot

【Jenkins】持續(xù)集成部署學(xué)習(xí),jenkins,ci/cd,學(xué)習(xí)
(3)進(jìn)一步完善命令

ps -ef | grep java | grep springboot | grep -v grep | awk '{print $2}'

grep java:留下有java關(guān)鍵字的
grep springboot:留下有springboot關(guān)鍵字的
grep -v grep:去除有g(shù)rep關(guān)鍵字的
awk ‘{print $2}’:打印結(jié)果的第二個(gè)值,也就是PID,進(jìn)程的ID
【Jenkins】持續(xù)集成部署學(xué)習(xí),jenkins,ci/cd,學(xué)習(xí)
結(jié)果也確實(shí)是3200

(4)學(xué)習(xí)netstat -nltp命令
根據(jù)端口號(hào)查找進(jìn)程ID

netstat -nltp | grep 8082

【Jenkins】持續(xù)集成部署學(xué)習(xí),jenkins,ci/cd,學(xué)習(xí)

(3)最終完善命令

ps -ef | grep springboot-0.0.1-SNAPSHOT.jar | grep -v grep | awk '{printf $2}' | xargs kill -9
nohup java -jar /root/helloworld/springboot*.jar >my.log 2>&1 &

也就是把前面學(xué)習(xí)的兩個(gè)命令整合一起執(zhí)行了,第一行先檢查有沒(méi)有占用端口的進(jìn)程,如果就殺掉進(jìn)程,第二行是后臺(tái)啟動(dòng)jar包,并且把輸出的日志內(nèi)容存進(jìn)目標(biāo)日志文件里,不會(huì)導(dǎo)致啟動(dòng)命令被卡住

【Jenkins】持續(xù)集成部署學(xué)習(xí),jenkins,ci/cd,學(xué)習(xí)
保存以后進(jìn)程測(cè)試,我們只需要在idea的項(xiàng)目里修改代碼,然后commit并push,接著直接在jenkins里點(diǎn)擊項(xiàng)目構(gòu)建,結(jié)束后訪問(wèn)項(xiàng)目,可以看到代碼已經(jīng)生效了。這種方式可以實(shí)現(xiàn)反復(fù)的提交構(gòu)建了。

【7】helloworld項(xiàng)目部署:進(jìn)階四:使用start.sh腳本進(jìn)行啟動(dòng)

上面我們?cè)赑ost Steps這一步進(jìn)行執(zhí)行shell命令,我們也可以把shell命令寫到項(xiàng)目的一個(gè)啟動(dòng)腳本start.sh里,在打包的時(shí)候把啟動(dòng)腳本start.sh一起打包,然后使用ssh把啟動(dòng)腳本start.sh和jar包都發(fā)送到目標(biāo)服務(wù)器,最后執(zhí)行啟動(dòng)這個(gè)腳本就可以了

(1)腳本的位置

【Jenkins】持續(xù)集成部署學(xué)習(xí),jenkins,ci/cd,學(xué)習(xí)
然后commit和push代碼,jenkins執(zhí)行構(gòu)建,完成之后,我們看看jar包和start.sh分別放在了哪里
【Jenkins】持續(xù)集成部署學(xué)習(xí),jenkins,ci/cd,學(xué)習(xí)

(2)腳本的內(nèi)容

#!/bin/sh

jar_name=springboot-0.0.1-SNAPSHOT.jar
jar_path=/root/helloworld
log_path=/root/helloworld/logs
log_name=`date +%y-%m-%d`_out.log
jar_port=8082
#指向自定義jdk
#export JAVA_HOME=/xxx/xxx/jdk1.8.0_131
#export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
#export PATH=$JAVA_HOME/bin:$PATH
#sh start.sh restart
stop() {
  echo "開(kāi)始關(guān)閉項(xiàng)目"
  pid=`ps -ef | grep java | grep ${jar_name} | grep -v grep |grep -v gateway| awk '{print$2}'`
  sleep 2
  if [ -z $pid ]; then # -z 是判斷是否為空
    echo "${jar_name}未運(yùn)行!"
  else
    echo "準(zhǔn)備關(guān)閉進(jìn)程$pid"
    kill -9 $pid
    sleep 0.5
    echo "${jar_name}已關(guān)閉!"
  fi
  echo "關(guān)閉操作完成"
}

start() {
  echo "開(kāi)始啟動(dòng)項(xiàng)目"
  pid=$(ps -ef | grep $jar_name | grep -v grep | awk '{print $2}')
  if [ -z $pid ]; then
    cd $jar_path  # 這里轉(zhuǎn)到j(luò)ar包目錄執(zhí)行命令,是為了使用jar_path下的config文件,貌似java程序只能識(shí)別當(dāng)前執(zhí)行命令目錄下的配置,否則就是使用已打入Jar包的配置文件。
    # 判斷日志文件夾是否存在,不存在則創(chuàng)建
#    if [ ! -d $log_path ];then
#        mkdir $log_path
#    else
#        echo "文件夾已經(jīng)存在"
#    fi
    nohup java -jar $jar_name >$log_name 2>&1 &
    pid=$(ps -ef | grep $jar_name | grep -v grep | awk '{print $2}')
    sleep 2
    echo "應(yīng)用 ${jar_name}啟動(dòng)成功,pid=${pid}"
    # tail -f $log_path
 
  else
    echo "應(yīng)用 ${jar_name} 正在運(yùn)行,pid = ${pid}"
  fi
  echo "啟動(dòng)項(xiàng)目完成"
}

status() {
  echo "開(kāi)始檢查項(xiàng)目狀態(tài)"
  pid=$(ps -ef | grep $jar_name | grep -v grep | awk '{print $2}')
  if [ -z $pid ]; then
    echo "應(yīng)用 ${jar_name} 未運(yùn)行"
  else
    echo "應(yīng)用 ${jar_name} 正在運(yùn)行,pid = ${pid}"
  fi
  echo "檢查狀態(tài)完成"

}
restart() {
  echo "開(kāi)始重啟項(xiàng)目"
  stop
  sleep 2
  echo "停止完成,準(zhǔn)備啟動(dòng)jar包"
  start
  echo "重啟完成"
}
action() {
  echo "請(qǐng)輸入數(shù)字選擇要執(zhí)行的操作:1=啟動(dòng),2=重啟,3=停止,4=查看運(yùn)行狀態(tài),5=退出"
  echo '你輸入的數(shù)字為:'
  read a
  case $a in
  "1")
    start
    ;;
  "2")
    restart
    ;;
  "3")
    stop
    ;;
  "4")
    status
    ;;
  "5")
    exit 1
    ;;
  *)
    echo "輸入錯(cuò)誤,請(qǐng)重新輸入"
    action
    ;;
  esac
}
#action
restart

(3)jenkins的項(xiàng)目配置

主要的操作包括三步
(1)pre steps:在構(gòu)建前把舊的jar包刪除
【Jenkins】持續(xù)集成部署學(xué)習(xí),jenkins,ci/cd,學(xué)習(xí)

(2)post steps-1:把jar包通過(guò)ssh傳送到服務(wù)器
【Jenkins】持續(xù)集成部署學(xué)習(xí),jenkins,ci/cd,學(xué)習(xí)

(3)post steps-2:把啟動(dòng)腳本start.sh傳送到服務(wù)器,并且到對(duì)應(yīng)的目錄下執(zhí)行啟動(dòng)命令
注意:想執(zhí)行遠(yuǎn)程服務(wù)器的腳本,需要先cd /root/helloworld切換到腳本所在的目錄,否則構(gòu)建的時(shí)候會(huì)報(bào)錯(cuò)【ERROR: Exception when publishing, exception message [Exec exit status not zero. Status [127]] 】,127代表的是找不到目標(biāo)腳本文件。如果沒(méi)有權(quán)限的話,可以到目標(biāo)服務(wù)器使用【chmod 777 start.sh】給啟動(dòng)腳本賦權(quán)
【Jenkins】持續(xù)集成部署學(xué)習(xí),jenkins,ci/cd,學(xué)習(xí)

【六】jenkins的其他配置

【1】配置參數(shù)化構(gòu)建和自動(dòng)構(gòu)建

(1)helloworld項(xiàng)目創(chuàng)建一個(gè)新的docker分支

創(chuàng)建新的分支,用來(lái)提交作為docker部署的代碼,在jenkins構(gòu)建的時(shí)候也要指明構(gòu)建這個(gè)分支的代碼,而git的地址就不用變了
1-Newbranch新建一個(gè)分支,并且checkout
2-修改文件
3-add-》commit-》push

查看gitlab,看到新的分支代碼已經(jīng)提交
【Jenkins】持續(xù)集成部署學(xué)習(xí),jenkins,ci/cd,學(xué)習(xí)

(2)jenkins配置構(gòu)建的參數(shù)

(1)安裝Git Parameter插件

【Jenkins】持續(xù)集成部署學(xué)習(xí),jenkins,ci/cd,學(xué)習(xí)
(2)修改項(xiàng)目配置
【Jenkins】持續(xù)集成部署學(xué)習(xí),jenkins,ci/cd,學(xué)習(xí)填寫 Git Parameter 參數(shù)配置
1-Name 自定義參數(shù)名稱
2-Description 描述
3-Paramert Type 參數(shù)類型,可選 Tag 、Branch 、Branch or Tag、Revision、Pull Request
4-Default Value 默認(rèn)值
【Jenkins】持續(xù)集成部署學(xué)習(xí),jenkins,ci/cd,學(xué)習(xí)

指定分支引用上面的變量:${branch}
【Jenkins】持續(xù)集成部署學(xué)習(xí),jenkins,ci/cd,學(xué)習(xí)

保存成功后,在job列表頁(yè),構(gòu)建的時(shí)候,可以選擇- Build with Parameters,接著會(huì)自動(dòng)加載出項(xiàng)目的所有分支,可供選擇
【Jenkins】持續(xù)集成部署學(xué)習(xí),jenkins,ci/cd,學(xué)習(xí)

【2】鉤子函數(shù)

(1)進(jìn)入項(xiàng)目配置

1-選擇構(gòu)建觸發(fā)器
2-勾選觸發(fā)遠(yuǎn)程構(gòu)建
3-自定義填寫一個(gè)身份驗(yàn)證令牌
4-注意我們可以使用的鉤子鏈接格式有兩種,【JENKINS_URL/job/helloworld/build?token=TOKEN_NAME 或者 /buildWithParameters?token=TOKEN_NAME】

然后保存
【Jenkins】持續(xù)集成部署學(xué)習(xí),jenkins,ci/cd,學(xué)習(xí)

(2)測(cè)試

在瀏覽器窗口輸入鏈接:http://192.168.19.9:10240/job/helloworld/build?token=123123

回到j(luò)enkins可以看到項(xiàng)目自動(dòng)構(gòu)建了
【Jenkins】持續(xù)集成部署學(xué)習(xí),jenkins,ci/cd,學(xué)習(xí)

(3)把上面的鏈接配置到gitlab里面去

如果是直接把這個(gè)鏈接配置到gitlab里,因?yàn)間itlab里沒(méi)有jenkins登錄的會(huì)話,所以訪問(wèn)也是無(wú)效的,我們可以安裝插件來(lái)解決這個(gè)問(wèn)題。這個(gè)插件可以實(shí)現(xiàn)匿名的訪問(wèn)jenkins系統(tǒng)
【Jenkins】持續(xù)集成部署學(xué)習(xí),jenkins,ci/cd,學(xué)習(xí)
【Jenkins】持續(xù)集成部署學(xué)習(xí),jenkins,ci/cd,學(xué)習(xí)

然后進(jìn)入gitlab配置
Settings-》Webhooks-》Add new webhooks-》填寫新的url:http://192.168.19.9:10240/buildByToken/build?job=helloworld&token=123123(這個(gè)鏈接就有了高級(jí)權(quán)限)【Jenkins】持續(xù)集成部署學(xué)習(xí),jenkins,ci/cd,學(xué)習(xí)
【Jenkins】持續(xù)集成部署學(xué)習(xí),jenkins,ci/cd,學(xué)習(xí)【Jenkins】持續(xù)集成部署學(xué)習(xí),jenkins,ci/cd,學(xué)習(xí)
【Jenkins】持續(xù)集成部署學(xué)習(xí),jenkins,ci/cd,學(xué)習(xí)
勾選完成后點(diǎn)擊Add webhook,會(huì)提示本地網(wǎng)絡(luò)不能訪問(wèn)
【Jenkins】持續(xù)集成部署學(xué)習(xí),jenkins,ci/cd,學(xué)習(xí)
我們需要設(shè)置一下支持本地請(qǐng)求

(4)設(shè)置支持本地請(qǐng)求

在Gitlab 10.6以后的版本為了安全起見(jiàn),默認(rèn)不允許向本地網(wǎng)絡(luò)發(fā)送webhook請(qǐng)求,但是可以使用管理員身份修改默認(rèn)設(shè)置!

以管理員身份登錄Gitlab后,進(jìn)入adminarea,點(diǎn)擊菜單(首頁(yè)頂層一行有個(gè)小扳手圖標(biāo))點(diǎn)擊進(jìn)入,接著左側(cè)菜單欄---->settings(設(shè)置)下一級(jí)---->network(網(wǎng)絡(luò))---->outbound requests expend(外發(fā)請(qǐng)求)前面打勾(□ Allow requests to the local network from web hooks and services-允許Webhook和服務(wù)對(duì)本地網(wǎng)絡(luò)的請(qǐng)求)即可!

【Jenkins】持續(xù)集成部署學(xué)習(xí),jenkins,ci/cd,學(xué)習(xí)
【Jenkins】持續(xù)集成部署學(xué)習(xí),jenkins,ci/cd,學(xué)習(xí)
保存以后,繼續(xù)完成上一步的webhook配置操作

【Jenkins】持續(xù)集成部署學(xué)習(xí),jenkins,ci/cd,學(xué)習(xí)

(5)測(cè)試

(1)可以在gitlab的webhook配置頁(yè)面直接測(cè)試push操作
【Jenkins】持續(xù)集成部署學(xué)習(xí),jenkins,ci/cd,學(xué)習(xí)
(2)也可以在IDEA里進(jìn)行push提交測(cè)試

【Jenkins】持續(xù)集成部署學(xué)習(xí),jenkins,ci/cd,學(xué)習(xí)

【Jenkins】持續(xù)集成部署學(xué)習(xí),jenkins,ci/cd,學(xué)習(xí)
【Jenkins】持續(xù)集成部署學(xué)習(xí),jenkins,ci/cd,學(xué)習(xí)
IDEA里提交代碼后,可以看到j(luò)enkins里開(kāi)始自動(dòng)創(chuàng)建了,然后訪問(wèn)頁(yè)面,看到代碼生效了,成功

【七】jenkins部署Docker項(xiàng)目

【1】把helloworld項(xiàng)目結(jié)合Dockerfile部署到遠(yuǎn)程測(cè)試服務(wù)器

(1)遠(yuǎn)程測(cè)試服務(wù)器搭建運(yùn)行環(huán)境,創(chuàng)建鏡像運(yùn)行起來(lái)

(1)安裝docker
參考如上
(2)安裝JDK
參考下一個(gè)案例
(3)創(chuàng)建Dockerfile文件,并上傳jar包
創(chuàng)建專門用來(lái)放dockerfile和jar的文件夾

mkdir -p /root/docker/docker_helloworld

進(jìn)入創(chuàng)建的專門放置docker文件的文件夾/docker,然后創(chuàng)建一個(gè)專屬該項(xiàng)目的文件夾/docker_springboot,進(jìn)入,然后vi Dockerfile創(chuàng)建Dockerfile文件,編輯輸入以下內(nèi)容

cd /root/docker/docker_helloworld
vi Dockerfile
FROM java:8
ENV APP_PATH=/docker/docker_helloworld
WORKDIR $APP_PATH
ADD ./springboot-0.0.1-SNAPSHOT.jar $APP_PATH/helloworld.jar
EXPOSE 8090
ENTRYPOINT ["java","-jar"]
CMD ["helloworld.jar","-Dfile.encoding=GBK", "--server.port=8090"]

最后再手動(dòng)把jar包傳到這個(gè)文件夾里
【Jenkins】持續(xù)集成部署學(xué)習(xí),jenkins,ci/cd,學(xué)習(xí)
(4)構(gòu)建鏡像和啟動(dòng)容器

進(jìn)入存放Dockerfile的目錄下面

cd /root/docker/docker_helloworld

#docker build –f (dockerfile文件路徑) –t 鏡像名稱:版本  .
docker build -t helloworld:1.0 .

構(gòu)建完畢,然后啟動(dòng)容器
暴露的端口號(hào)是8090

#這里可以使用【鏡像id】,也可以使用名稱+版本號(hào)【helloworld:1.0】
docker run -d -p 8090:8090 --name helloworld helloworld:1.0

(5)訪問(wèn)測(cè)試
http://192.168.19.11:8090/hello

至此,手動(dòng)完成了helloworld項(xiàng)目的docker部署,接下來(lái)就是用jenkins實(shí)現(xiàn)自動(dòng)拉取代碼和部署

(2)Jenkins新建項(xiàng)目

名稱為helloworld_docker

(3)修改全局配置

上面已經(jīng)配置好遠(yuǎn)程服務(wù)器的信息了,這里不改,直接用

(4)ssh方式一:不刪除鏡像,只重新構(gòu)建容器

(1)源碼管理
git地址不變,但是分支指定為新的docker分支
【Jenkins】持續(xù)集成部署學(xué)習(xí),jenkins,ci/cd,學(xué)習(xí)
(2)Pre Steps
【Jenkins】持續(xù)集成部署學(xué)習(xí),jenkins,ci/cd,學(xué)習(xí)
(3)Post Steps
【Jenkins】持續(xù)集成部署學(xué)習(xí),jenkins,ci/cd,學(xué)習(xí)
(4)總結(jié)
首先,我們已經(jīng)手動(dòng)創(chuàng)建了helloworld的鏡像,并且創(chuàng)建了容器,已經(jīng)可以正常訪問(wèn)接口了?,F(xiàn)在我們希望更新jar包,那么就在pre操作的時(shí)候,刪除舊的jar包,并且停止容器,然后ssh發(fā)送新的jar包到服務(wù)器,最后執(zhí)行docker start命令啟動(dòng)容器。

注意,整個(gè)過(guò)程中,鏡像是本來(lái)就存在的,并且沒(méi)有改動(dòng)過(guò)!

(5)ssh方式二:刪除鏡像,重新創(chuàng)建鏡像和啟動(dòng)容器

(1)在根目錄下創(chuàng)建docker文件夾,添加Dockerfile文件
為了不跟之前的helloworld項(xiàng)目的jar包重名,先把jar包名字改了
【Jenkins】持續(xù)集成部署學(xué)習(xí),jenkins,ci/cd,學(xué)習(xí)
然后再項(xiàng)目里添加Dockerfile文件
【Jenkins】持續(xù)集成部署學(xué)習(xí),jenkins,ci/cd,學(xué)習(xí)
完整的Dockerfile內(nèi)容如下

FROM java:8
ENV APP_PATH=/docker/helloworld_docker
WORKDIR $APP_PATH
ADD ./helloworld-docker-0.0.1-SNAPSHOT.jar $APP_PATH/helloworld.jar
EXPOSE 8090
ENTRYPOINT ["java","-jar"]
CMD ["helloworld.jar","-Dfile.encoding=GBK", "--server.port=8090"]

(2)Pre Steps
【Jenkins】持續(xù)集成部署學(xué)習(xí),jenkins,ci/cd,學(xué)習(xí)

(3)Post Steps
分兩個(gè)步驟。第一步發(fā)送jar包,jar包在target目錄,第二步發(fā)送Dockerfile,Dockerfile在target同級(jí)的docker目錄
【Jenkins】持續(xù)集成部署學(xué)習(xí),jenkins,ci/cd,學(xué)習(xí)
【Jenkins】持續(xù)集成部署學(xué)習(xí),jenkins,ci/cd,學(xué)習(xí)

(4)給docker.sock權(quán)限

chmod a+rw /var/run/docker.sock

(5)構(gòu)建以后
helloworld文件夾下確實(shí)有了新的文件,并且容器重新運(yùn)行了
【Jenkins】持續(xù)集成部署學(xué)習(xí),jenkins,ci/cd,學(xué)習(xí)

如果第一遍Dockerfile已經(jīng)傳送成功了,但是啟動(dòng)沒(méi)有成功,可能是權(quán)限不夠,使用【chmod 777 Dockerfile】命令給文件授權(quán),然后再構(gòu)建一次,后續(xù)就可以實(shí)現(xiàn)反復(fù)構(gòu)建了

【2】準(zhǔn)備一個(gè)Docker啟動(dòng)的CRUD項(xiàng)目

(1)遠(yuǎn)程測(cè)試服務(wù)器搭建運(yùn)行環(huán)境

(1)安裝Docker

看上面

(2)Docker安裝Portainer

(1)拉取最新的Portainer鏡像

docker pull portainer/portainer

(2)運(yùn)行鏡像(9000)

docker run -d -p 9000:9000 -v /root/portainer:/data -v /var/run/docker.sock:/var/run/docker.sock --name dev-portainer portainer/portainer

或者

docker run -d --restart=always --name portainer -p 9000:9000 -v /var/run/docker.sock:/var/run/docker.sock portainer/portainer

參數(shù)說(shuō)明:

-d #容器在后臺(tái)運(yùn)行
-p 9000:9000 # 宿主機(jī)9000端口映射容器中的9000端口
-v /var/run/docker.sock:/var/run/docker.sock # 把宿主機(jī)的Docker守護(hù)進(jìn)程(docker daemon)默認(rèn)監(jiān)聽(tīng)的Unix域套接字掛載到容器中
-v /root/portainer:/data # 把宿主機(jī)目錄 /root/portainer 掛載到容器 /data 目錄;
–name dev-portainer # 指定運(yùn)行容器的名稱

注意:在啟動(dòng)容器時(shí)必須掛載本地 /var/run/docker.socker與容器內(nèi)的/var/run/docker.socker連接。

(3)訪問(wèn)Portainer可視化界面
1-瀏覽器中輸入:服務(wù)器的ip地址:9000,訪問(wèn)portainer可視化界面
第一次會(huì)彈出安裝界面,配置賬號(hào)密碼、選擇是本地Docker還是遠(yuǎn)程Docker,一般我們選擇本地Docker,也就是local,可以查看宿主機(jī)配置信息、查看容器、鏡像、網(wǎng)絡(luò)、卷等相關(guān)信息。

【Jenkins】持續(xù)集成部署學(xué)習(xí),jenkins,ci/cd,學(xué)習(xí)
2-創(chuàng)建登錄賬號(hào)和密碼
【Jenkins】持續(xù)集成部署學(xué)習(xí),jenkins,ci/cd,學(xué)習(xí)
【Jenkins】持續(xù)集成部署學(xué)習(xí),jenkins,ci/cd,學(xué)習(xí)
【Jenkins】持續(xù)集成部署學(xué)習(xí),jenkins,ci/cd,學(xué)習(xí)

(3)Docker安裝Mysql

(1)拉取鏡像:docker pull mysql:5.7
(2)查看本地鏡像:docker images
(3)創(chuàng)建一個(gè)mysql容器,首先在根目錄下創(chuàng)建好一個(gè)文件夾allenuse
【Jenkins】持續(xù)集成部署學(xué)習(xí),jenkins,ci/cd,學(xué)習(xí)

(4)運(yùn)行容器:docker run -d -p 3306:3306 --privileged=true -v /allenuse/mysql/log:/var/log/mysql -v /allenuse/mysql/data:/var/lib/mysql -v /allenuse/mysql/conf:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=123456 --name mysql5 mysql:5.7

如果報(bào)錯(cuò)的話,可能是端口3306被占用了,就用下面的命令解決
1-先查看當(dāng)前占用端口:netstat -tanlp
2-殺死對(duì)應(yīng)的進(jìn)程:kill 1330
【Jenkins】持續(xù)集成部署學(xué)習(xí),jenkins,ci/cd,學(xué)習(xí)(5)查看是否創(chuàng)建成功
1-查看容器:docker ps 或者 docker ps -a
2-查看啟動(dòng)日志:docker logs mysql5

(6)新建my.cnf,通過(guò)容器卷同步給mysql容器實(shí)例(解決中文亂碼問(wèn)題)

cd /allenuse/mysql/conf/

vi my.cnf

【Jenkins】持續(xù)集成部署學(xué)習(xí),jenkins,ci/cd,學(xué)習(xí)

[client]
default_character_set=utf8
[mysqld]
collation_server = utf8_general_ci
character_set_server = utf8

(7)重啟mysql容器實(shí)例,再重新進(jìn)入并查看字符編碼
1-重啟:docker restart mysql5
2-查看字符編碼:docker exec -it mysql5 /bin/bash

【Jenkins】持續(xù)集成部署學(xué)習(xí),jenkins,ci/cd,學(xué)習(xí)(8)新建庫(kù)新建表再插入中文測(cè)試

(9)如果不小心把mysql的容器刪除了如何恢復(fù)
之前已經(jīng)配置了容器卷,mysql的數(shù)據(jù)已經(jīng)在本地存儲(chǔ)了,只需要重新執(zhí)行創(chuàng)建容器的命令就行了

docker run -d -p 3306:3306 --privileged=true -v /allenuse/mysql/log:/var/log/mysql -v /allenuse/mysql/data:/var/lib/mysql -v /allenuse/mysql/conf:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=123456 --name mysql5 mysql:5.7

(10)防火墻設(shè)置
1-設(shè)置mysql 3306 端口:firewall-cmd --zone=public --add-port=3306/tcp --permanent
2-重新加載:firewall-cmd --reload

(11)本地連接
【Jenkins】持續(xù)集成部署學(xué)習(xí),jenkins,ci/cd,學(xué)習(xí)
【Jenkins】持續(xù)集成部署學(xué)習(xí),jenkins,ci/cd,學(xué)習(xí)
(12)如果3306端口被占用了怎么處理
1-先查看當(dāng)前占用端口:netstat -tanlp
2-殺死對(duì)應(yīng)的進(jìn)程:kill 1330

(13)初始化數(shù)據(jù)庫(kù)腳本

create database tmall_springboot;
use tmall_springboot;
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for category
-- ----------------------------
DROP TABLE IF EXISTS `category`;
CREATE TABLE `category` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=84 DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of category
-- ----------------------------
BEGIN;
INSERT INTO `category` VALUES (60, '安全座椅');
INSERT INTO `category` VALUES (64, '太陽(yáng)鏡');
INSERT INTO `category` VALUES (68, '品牌女裝');
INSERT INTO `category` VALUES (69, '時(shí)尚男鞋');
INSERT INTO `category` VALUES (71, '男士西服');
INSERT INTO `category` VALUES (72, '男士手拿包 ');
INSERT INTO `category` VALUES (73, '男表');
INSERT INTO `category` VALUES (74, '女表');
INSERT INTO `category` VALUES (75, '空調(diào)');
INSERT INTO `category` VALUES (76, '冰箱');
INSERT INTO `category` VALUES (77, '原汁機(jī)');
INSERT INTO `category` VALUES (78, '掃地機(jī)器人 ');
INSERT INTO `category` VALUES (79, '平衡車');
INSERT INTO `category` VALUES (80, '電熱水器');
INSERT INTO `category` VALUES (81, '沙發(fā)');
INSERT INTO `category` VALUES (82, '馬桶');
INSERT INTO `category` VALUES (83, '平板電視');
COMMIT;

(4)Docker安裝JDK

(1)查找JDK

docker search jdk

【Jenkins】持續(xù)集成部署學(xué)習(xí),jenkins,ci/cd,學(xué)習(xí)
(2)拉取JDK1.8鏡像
從上面列表里選取一個(gè)拉取

docker pull java

(3)查看下載的鏡像

docker images

【Jenkins】持續(xù)集成部署學(xué)習(xí),jenkins,ci/cd,學(xué)習(xí)
(4)啟動(dòng)JDK鏡像

docker run -di --name=jdk8 java

(5)查看鏡像運(yùn)行情況

docker ps

【Jenkins】持續(xù)集成部署學(xué)習(xí),jenkins,ci/cd,學(xué)習(xí)
(6)進(jìn)入鏡像

docker exec -it jdk8 /bin/bash

查看jdk版本
【Jenkins】持續(xù)集成部署學(xué)習(xí),jenkins,ci/cd,學(xué)習(xí)
退出鏡像

exit

(7)鏡像的運(yùn)維
停止鏡像:docker stop jdk8
啟動(dòng)鏡像:docker start jdk8
重啟鏡像:docker restart jdk8
刪除容器:

# 1.查看歷史所有容器
docker ps -a
# 2.刪除容器
docker rm 容器id

(2)創(chuàng)建一個(gè)springboot項(xiàng)目

項(xiàng)目創(chuàng)建后,完成以下準(zhǔn)備工作
(1)idea連接數(shù)據(jù)庫(kù)
首先啟動(dòng)mysql容器

docker start mysql5

然后idea連接mysql,跟上面Navicat連接的過(guò)程類似
【Jenkins】持續(xù)集成部署學(xué)習(xí),jenkins,ci/cd,學(xué)習(xí)
(2)添加相關(guān)的依賴
確認(rèn)一下springboot版本為2.5.2

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.49</version>
</dependency>
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid</artifactId>
    <version>1.1.19</version>
</dependency>
<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>2.1.3</version>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <version>RELEASE</version>
    <scope>compile</scope>
</dependency>
<!--domain.page-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>

(3)編寫yml配置文件

server:
  port: 8989
  servlet:
    context-path: /docker_springboot
spring:
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql://localhost:3306/tmall_springboot?characterEncoding=UTF-8&useSSL=false
    username: root
    password: 123456
mybatis:
  mapper-locations: classpath:mapper/*.xml
  type-aliases-package: com.allen.docker_springboot.entity

(4)下載自動(dòng)生成代碼的插件easycode
(5)使用插件自動(dòng)生成增刪改查的代碼【Jenkins】持續(xù)集成部署學(xué)習(xí),jenkins,ci/cd,學(xué)習(xí)【Jenkins】持續(xù)集成部署學(xué)習(xí),jenkins,ci/cd,學(xué)習(xí)

(6)查看代碼的生成結(jié)果

【Jenkins】持續(xù)集成部署學(xué)習(xí),jenkins,ci/cd,學(xué)習(xí)
修改啟動(dòng)類,加上掃描路徑
【Jenkins】持續(xù)集成部署學(xué)習(xí),jenkins,ci/cd,學(xué)習(xí)

(7)啟動(dòng)項(xiàng)目,測(cè)試接口
訪問(wèn)地址:http://localhost:8989/docker_springboot/category/64
【Jenkins】持續(xù)集成部署學(xué)習(xí),jenkins,ci/cd,學(xué)習(xí)

(3)docker創(chuàng)建網(wǎng)絡(luò)

docker network create apps

然后查看容器

docker ps

【Jenkins】持續(xù)集成部署學(xué)習(xí),jenkins,ci/cd,學(xué)習(xí)
然后把mysql加到網(wǎng)絡(luò)中去

docker network connect apps e3

最后查看一下網(wǎng)絡(luò)

docker inspect apps

【Jenkins】持續(xù)集成部署學(xué)習(xí),jenkins,ci/cd,學(xué)習(xí)

(4)把項(xiàng)目打成jar包

打成jar包之前,要把yml配置文件里的mysql的ip地址,端口號(hào),密碼等信息都換成服務(wù)器的,不能直接用localhost。

我們可以直接把ip改成對(duì)應(yīng)服務(wù)器的ip來(lái)替換localhost,還有另外一種方式,因?yàn)樯厦嬉呀?jīng)設(shè)置了網(wǎng)絡(luò),名稱為mysql5,所以我們可以直接用mysql5
【Jenkins】持續(xù)集成部署學(xué)習(xí),jenkins,ci/cd,學(xué)習(xí)

然后開(kāi)始打包

【Jenkins】持續(xù)集成部署學(xué)習(xí),jenkins,ci/cd,學(xué)習(xí)

(5)創(chuàng)建Dockerfile文件,并上傳jar包

創(chuàng)建專門用來(lái)放dockerfile和jar的文件夾

mkdir -p /root/docker/docker_springboot

進(jìn)入創(chuàng)建的專門放置docker文件的文件夾/docker,然后創(chuàng)建一個(gè)專屬該項(xiàng)目的文件夾/docker_springboot,進(jìn)入,然后vi Dockerfile創(chuàng)建Dockerfile文件,編輯輸入以下內(nèi)容

cd /root/docker/docker_springboot
vi Dockerfile
FROM java:8
ENV APP_PATH=/docker/docker_springboot
WORKDIR $APP_PATH
ADD ./docker_springboot-0.0.1-SNAPSHOT.jar $APP_PATH/app.jar
EXPOSE 8989
ENTRYPOINT ["java","-jar"]
CMD ["app.jar","-Dfile.encoding=GBK", "--server.port=8989"]

最后再把jar包傳到這個(gè)文件夾里
【Jenkins】持續(xù)集成部署學(xué)習(xí),jenkins,ci/cd,學(xué)習(xí)

(6)用dockerfile構(gòu)建鏡像

進(jìn)入存放Dockerfile的目錄下面

cd /root/docker/docker_springboot

#docker build –f (dockerfile文件路徑) –t 鏡像名稱:版本  .
docker build -t apps:1.0 .

構(gòu)建完畢
【Jenkins】持續(xù)集成部署學(xué)習(xí),jenkins,ci/cd,學(xué)習(xí)查看鏡像,可以看到下面已經(jīng)有鏡像了

docker images

【Jenkins】持續(xù)集成部署學(xué)習(xí),jenkins,ci/cd,學(xué)習(xí)

(7)使用鏡像創(chuàng)建容器

暴露的端口號(hào)是8989

#這里可以使用【鏡像id】,也可以使用名稱+版本號(hào)【apps:1.0】
docker run -d -p 8989:8989 --name apps apps:1.0

這一步我們可以使用–network直接加入網(wǎng)絡(luò),也可以在后面再加入,先使用上面的創(chuàng)建命令
docker run -d -p 8989:8989 --name apps --network apps apps:1.0

下面開(kāi)始加入網(wǎng)絡(luò)

docker network connect apps 容器id

查看網(wǎng)絡(luò)

docker inspect apps

查看運(yùn)行的容器

docker ps

【Jenkins】持續(xù)集成部署學(xué)習(xí),jenkins,ci/cd,學(xué)習(xí)
通過(guò)【docker logs 容器ID】來(lái)查看springboot的日志,看看是不是真的啟動(dòng)成功了

如果有報(bào)錯(cuò),要?jiǎng)h除容器和鏡像,然后需要重新打包執(zhí)行

docker ps
停止運(yùn)行的容器:docker stop 容器id
刪除容器:docker rm 容器id
docker images
刪除鏡像:docker rmi -f 鏡像id

或者可以使用下面這個(gè)命令啟動(dòng),不用后臺(tái)啟動(dòng)了,可以直接查看啟動(dòng)日志

#docker run -p 8989:8989 鏡像ID
docker run -p 8989:8989 鏡像ID

看到下面的日志說(shuō)明啟動(dòng)成功了
【Jenkins】持續(xù)集成部署學(xué)習(xí),jenkins,ci/cd,學(xué)習(xí)

(8)本地測(cè)試

關(guān)閉所有防火墻
service firewalld status
service firewalld stop

然后訪問(wèn)地址:http://192.168.19.7:8989/docker_springboot/category/64
【Jenkins】持續(xù)集成部署學(xué)習(xí),jenkins,ci/cd,學(xué)習(xí)

【3】使用Jenkins部署上面的Docker項(xiàng)目

上面的案例,我們想把項(xiàng)目打包發(fā)送到服務(wù)器部署,需要在本地idea里手動(dòng)的package,然后把jar包發(fā)送到服務(wù)器里,然后手動(dòng)構(gòu)建Dockerfile文件進(jìn)行啟動(dòng)。而現(xiàn)在我們要實(shí)現(xiàn)的是,改完代碼以后,只需要點(diǎn)一下commit and push把代碼提交到git,然后進(jìn)入jenkins點(diǎn)一下構(gòu)建,就可以了。Jenkins會(huì)自動(dòng)去Gitlab拉取最新的代碼,然后打成Jar包,然后把Jar包發(fā)送到服務(wù)器上,最后執(zhí)行啟動(dòng)。太省事了。

(1)把項(xiàng)目發(fā)送到git

(2)Jenkins創(chuàng)建項(xiàng)目,Jenkins配置git,自動(dòng)拉取代碼
(3)Jenkins會(huì)把jar包發(fā)送到測(cè)試服務(wù)器

(1)在項(xiàng)目文件里加上Dockerfile

要包含Dockerfile文件,在springboot項(xiàng)目根目錄新建一個(gè)名為Dockerfile的文件,注意沒(méi)有后綴名,其內(nèi)容如下:(大致就是使用jdk8,把jar包添加到docker然后運(yùn)行prd配置文件)

FROM java:8
ENV APP_PATH=/docker/docker_springboot
WORKDIR $APP_PATH
ADD ./docker_springboot-0.0.1-SNAPSHOT.jar $APP_PATH/app.jar
EXPOSE 8989
ENTRYPOINT ["java","-jar"]
CMD ["app.jar","-Dfile.encoding=GBK", "--server.port=8989"]

Dockerfile文件和pom同級(jí)
【Jenkins】持續(xù)集成部署學(xué)習(xí),jenkins,ci/cd,學(xué)習(xí)

(2)上傳到git

看上面【三】Gitlab的使用

(3)修改全局配置(在上面helloworld項(xiàng)目已經(jīng)配置過(guò)了)

【Jenkins】持續(xù)集成部署學(xué)習(xí),jenkins,ci/cd,學(xué)習(xí)
目前是一臺(tái)服務(wù)器都沒(méi)有的,點(diǎn)擊新增
1-Name:自己給服務(wù)器起個(gè)名字
2-HostName:服務(wù)器的ip地址
3-Username:登錄用戶名
4-點(diǎn)擊高級(jí),Passwor的:登錄密碼
5-port:端口默認(rèn)22
【Jenkins】持續(xù)集成部署學(xué)習(xí),jenkins,ci/cd,學(xué)習(xí)最后點(diǎn)擊Test Configuration測(cè)試連接,顯示Success為連接成功

(4)Jenkins創(chuàng)建新項(xiàng)目

【Jenkins】持續(xù)集成部署學(xué)習(xí),jenkins,ci/cd,學(xué)習(xí)

(5)修改項(xiàng)目的Pre Steps配置

【Jenkins】持續(xù)集成部署學(xué)習(xí),jenkins,ci/cd,學(xué)習(xí)

然后修改Pre Steps,在Build構(gòu)建之前把容器停掉,再把舊的容器和鏡像都刪除
【Jenkins】持續(xù)集成部署學(xué)習(xí),jenkins,ci/cd,學(xué)習(xí)

(6)修改項(xiàng)目的Build配置

再往下就是配置Build,這里要注意,在打包的時(shí)候要跳過(guò)test單元測(cè)試,否則在打包的時(shí)候會(huì)啟動(dòng)測(cè)試,就會(huì)測(cè)試連接數(shù)據(jù)庫(kù),而我們?cè)趈enkins服務(wù)器上用項(xiàng)目里的數(shù)據(jù)源信息是連接不上數(shù)據(jù)庫(kù)的,關(guān)閉啟動(dòng)測(cè)試的方式有兩種,一種是在jenkins里配置,還有一種是在pom里加配置

如果不加的話,會(huì)有報(bào)錯(cuò)

(1)方式一
【Jenkins】持續(xù)集成部署學(xué)習(xí),jenkins,ci/cd,學(xué)習(xí)

clean install -Dmaven.test.skip=true

(2)方式二
【Jenkins】持續(xù)集成部署學(xué)習(xí),jenkins,ci/cd,學(xué)習(xí)

(7)修改項(xiàng)目的Post Steps配置

【Jenkins】持續(xù)集成部署學(xué)習(xí),jenkins,ci/cd,學(xué)習(xí)
【Jenkins】持續(xù)集成部署學(xué)習(xí),jenkins,ci/cd,學(xué)習(xí)

(8)立即構(gòu)建

【Jenkins】持續(xù)集成部署學(xué)習(xí),jenkins,ci/cd,學(xué)習(xí)

因?yàn)槭堑谝淮螛?gòu)建,maven的倉(cāng)庫(kù)里沒(méi)有jar包,所以全部都要下載,有可能會(huì)在下載的過(guò)程中就失敗,所以構(gòu)建的過(guò)程中要觀察一下控制臺(tái)輸出
【Jenkins】持續(xù)集成部署學(xué)習(xí),jenkins,ci/cd,學(xué)習(xí)

(9)完全使用shell命令的方式

或者使用下面這種shell命令

再往下就是配置就是構(gòu)建后的操作,這里使用shell命令,以前非docker部署的項(xiàng)目,直接把jar包生成并SSH發(fā)送,再執(zhí)行一個(gè)java -jar命令就行了?,F(xiàn)在是docker部署的項(xiàng)目了,需要把jar和Dockerfile都復(fù)制過(guò)去,并且停止刪除以前的舊容器,使用新的dockerfile構(gòu)建新的容器,命令很多,所以使用shell命令來(lái)執(zhí)行
【Jenkins】持續(xù)集成部署學(xué)習(xí),jenkins,ci/cd,學(xué)習(xí)
有了之前手動(dòng)部署docker項(xiàng)目的案例,下面的參數(shù)就可以按照上面的案例來(lái)了,完整的shell命令如下

#!/bin/bash
# 服務(wù)名稱
SERVER_NAME=jenkins

# 源jar名稱,mvn打包之后,target目錄下的jar包名稱
JAR_NAME=docker_springboot-0.0.1-SNAPSHOT

# jar包的目錄
JENKINS_HOME=/var/jenkins_home/workspace/docker_springboot

# 等待三秒
echo sleep 3s
sleep 1
echo sleep 2s
sleep 1
echo sleep 1s
sleep 1
      
echo "結(jié)束進(jìn)程完成"

cd $JENKINS_HOME/target

cp $JENKINS_HOME/Dockerfile $JENKINS_HOME/target

# 修改文件權(quán)限
chmod 755 $JAR_NAME.jar

echo "看看docker能不能用"
docker -v

echo "停止容器"
# 停止容器
docker stop apps

echo "刪除容器"
# 刪除容器
docker rm apps
echo "刪除鏡像"
# 刪除鏡像
docker rmi apps
echo "打包鏡像"
# 打包鏡像
docker build -t apps:1.0 .
echo "運(yùn)行鏡像"
# 運(yùn)行鏡像,直接加入網(wǎng)絡(luò)
docker run -d -p 8989:8989 --name apps --network apps apps:1.0

點(diǎn)擊保存
【Jenkins】持續(xù)集成部署學(xué)習(xí),jenkins,ci/cd,學(xué)習(xí)我們看到打包成功了,就是在使用docker命令的時(shí)候出現(xiàn)權(quán)限問(wèn)題,這是我們要給docker.sock權(quán)限就可以解決了??!

報(bào)錯(cuò)信息:

Got permission denied while trying to connect to the Docker daemon socket at
 unix:///var/run/docker.sock: Post 
 "http://%2Fvar%2Frun%2Fdocker.sock/v1.24/containers/springboot/stop": dial unix 
 /var/run/docker.sock: connect: permission denied

解決方案:

chmod a+rw /var/run/docker.sock

(10)再次構(gòu)建

我們發(fā)現(xiàn)沒(méi)有報(bào)錯(cuò),也看到了容器的id
【Jenkins】持續(xù)集成部署學(xué)習(xí),jenkins,ci/cd,學(xué)習(xí)

(11)查看Docker鏡像是否啟動(dòng)

docker images
docker ps

【Jenkins】持續(xù)集成部署學(xué)習(xí),jenkins,ci/cd,學(xué)習(xí)文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-674572.html

(12)本地接口訪問(wèn)測(cè)試

到了這里,關(guān)于【Jenkins】持續(xù)集成部署學(xué)習(xí)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • CI/CD到底是啥?持續(xù)集成/持續(xù)部署概念解釋

    大家好,我是chowley,日常工作中,我每天都在接觸CI/CD,今天就給出我心中的答案。 在現(xiàn)代軟件開(kāi)發(fā)中,持續(xù)集成(Continuous Integration,CI)和持續(xù)部署(Continuous Deployment,CD)是兩個(gè)非常重要的實(shí)踐,它們通過(guò)自動(dòng)化的流程來(lái)加速軟件的開(kāi)發(fā)、測(cè)試和部署,提高團(tuán)隊(duì)的效率和

    2024年02月19日
    瀏覽(25)
  • 【持續(xù)集成CI/持續(xù)部署CD】六、Docker Compose構(gòu)建CI全流程

    【持續(xù)集成CI/持續(xù)部署CD】六、Docker Compose構(gòu)建CI全流程

    1. 創(chuàng)建宿主機(jī)掛載目錄并賦權(quán) 2. 新建 Jenkins+Sonar 安裝腳本 jenkins-compose.yml 腳本,這里的 Jenkins 使用的是 Docker 官方推薦的鏡像 jenkinsci/blueocean,在實(shí)際使用中發(fā)現(xiàn),即使不修改插件下載地址,也可以下載插件,所以比較推薦這個(gè)鏡像。 3. 在 jenkins-compose.yml 文件所在目錄下執(zhí)行

    2024年02月10日
    瀏覽(27)
  • DevOps:自動(dòng)化部署和持續(xù)集成/持續(xù)交付(CI/CD)

    在現(xiàn)代軟件開(kāi)發(fā)領(lǐng)域,DevOps(Development和Operations的組合)已經(jīng)成為一個(gè)不可或缺的概念。它代表了一種將軟件開(kāi)發(fā)和運(yùn)維(Operations)緊密結(jié)合的方法,旨在提高軟件交付速度、質(zhì)量和可靠性。本文將深入探討DevOps中的關(guān)鍵概念,特別是自動(dòng)化部署和持續(xù)集成/持續(xù)交付(CI/C

    2024年02月07日
    瀏覽(33)
  • DevOps-Jenkins-CI持續(xù)集成操作

    DevOps-Jenkins-CI持續(xù)集成操作

    創(chuàng)建個(gè)web項(xiàng)目 我這里直接用Spring Web自動(dòng)生成的demos 啟動(dòng)項(xiàng)目,訪問(wèn)展示如下默認(rèn)頁(yè)面信息 在項(xiàng)目下新建docker目錄,新增Dockerfile、docker-compose.yml文件 Dockerfile文件,將mytest.jar 復(fù)制到容器的/usr/local/目錄下,在/usr/local執(zhí)行命令java -jar mytest.jar docker-compose.yml文件,當(dāng)前目錄以D

    2024年03月13日
    瀏覽(31)
  • 【git】CI/CD持續(xù)集成與部署C++示例

    【git】CI/CD持續(xù)集成與部署C++示例

    ?? ★,° :.☆( ̄▽ ̄)/$: .°★ ?? 這篇文章主要介紹CI/CD持續(xù)集成與部署C++示例。 學(xué)其所用,用其所學(xué)?!?jiǎn)⒊?歡迎來(lái)到我的博客,一起學(xué)習(xí),共同進(jìn)步。 喜歡的朋友可以關(guān)注一下,下次更新不迷路?? CI/CD (持續(xù)集成/持續(xù)交付)是一種軟件開(kāi)發(fā)實(shí)踐和方法論,旨在通過(guò)

    2024年01月19日
    瀏覽(43)
  • Gitlab CI/CD筆記-第一天-GitOps和以前的和jenkins的集成的區(qū)別

    Gitlab CI/CD筆記-第一天-GitOps和以前的和jenkins的集成的區(qū)別

    一、GitOps-CI/CD的流程圖與Jenkins的流程圖 從上圖可以看到: GitOps與基于Jennkins技術(shù)棧的CI/CD流程,無(wú)法從Jenkins集成其他第三方開(kāi)源的項(xiàng)目來(lái)實(shí)現(xiàn)換成了Gitlab來(lái)進(jìn)行集成。 好處在于:CI 一個(gè)工具Gitlab就行了,但CD部分依舊是傳統(tǒng)的云主機(jī)(虛擬機(jī)),物理及,docker單機(jī)容器或者

    2024年02月14日
    瀏覽(27)
  • nodejs前端項(xiàng)目的CI/CD實(shí)現(xiàn)(二)jenkins的容器化部署

    nodejs前端項(xiàng)目的CI/CD實(shí)現(xiàn)(二)jenkins的容器化部署

    docker安裝jenkins,可能你會(huì)反問(wèn),這太簡(jiǎn)單了,有什么好講的。 我最近就接手了一個(gè)打包項(xiàng)目,它是一個(gè)nodejs的前端項(xiàng)目,jenkins已在容器里部署且運(yùn)行OK。 但是,前端組很追求新技術(shù),不斷地升級(jí)Nodejs的版本,之前是14,現(xiàn)在需要升級(jí)到16。 也就是說(shuō),原本運(yùn)行順暢的打包不

    2024年01月20日
    瀏覽(24)
  • 【軟件測(cè)試】- 將 Selenium 和 JMeter 測(cè)試腳本集成到 Jenkins 中實(shí)現(xiàn)自動(dòng)化測(cè)試和持續(xù)集成(CI)及Jenkinsfile 實(shí)現(xiàn) Jenkins Pipeline 原理介紹

    將 Selenium 和 JMeter 測(cè)試腳本集成到 Jenkins 中是實(shí)現(xiàn)自動(dòng)化測(cè)試和持續(xù)集成(CI)的關(guān)鍵步驟。以下是詳細(xì)的集成過(guò)程: 1、準(zhǔn)備工作 安裝 Jenkins : 確保您已經(jīng)在服務(wù)器上安裝了 Jenkins。 可以從 Jenkins 官網(wǎng) 下載并安裝。 安裝必要的插件 : 在 Jenkins 中安裝所需的插件,如 Git 插

    2024年02月04日
    瀏覽(35)
  • Jenkins CI/CD

    Jenkins CI/CD

    1、 Jenkins CI/CD 流程圖 說(shuō)明:這張圖稍微更形象一點(diǎn),上線之前先把代碼git到版本倉(cāng)庫(kù),然后通過(guò)Jenkins 如Java項(xiàng)目通過(guò)maven去構(gòu)建,這是在非容器之前,典型的自動(dòng)化的一個(gè)版本上線流程。那它有哪些問(wèn)題呢? 如:它的測(cè)試環(huán)境,預(yù)生產(chǎn)環(huán)境,測(cè)試環(huán)境。會(huì)存在一定的兼容性

    2024年02月05日
    瀏覽(32)
  • CI/CD 持續(xù)集成 持續(xù)交付

    CI/CD 持續(xù)集成 持續(xù)交付

    參考:https://www.jianshu.com/p/2132949ff84a? 持續(xù)集成是指 多名開(kāi)發(fā)者在開(kāi)發(fā)不同功能代碼的過(guò)程當(dāng)中,可以頻繁的將代碼行合并到一起并切相互不影響工作 。 持續(xù)集成的目的,是 讓產(chǎn)品可以快速迭代,同時(shí)還能保持高質(zhì)量 。它的核心措施是,代碼集成到主干之前,必須通過(guò)自動(dòng)

    2024年02月10日
    瀏覽(72)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包