【一】Jenkins介紹
【二】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ù)”
創(chuàng)建個(gè)人容器鏡像托管服務(wù)
然后點(diǎn)擊鏡像工具,進(jìn)入鏡像加速器,即可看到阿里云加速器地址,把這個(gè)加速器地址配置到docker容器里
(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
【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è)了
(5)管理員賬號(hào)密碼登錄
密碼是進(jìn)入容器后查找的
cat /etc/gitlab/initial_root_password
登錄名是root,密碼直接復(fù)制過(guò)來(lái)使用
(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)目
(2)Idea工具創(chuàng)建本地倉(cāng)庫(kù)
在IDEA中創(chuàng)建好項(xiàng)目,點(diǎn)擊VCS,按照下圖指示先給項(xiàng)目創(chuàng)建本地Git倉(cāng)庫(kù)
(3)選擇此項(xiàng)目根目錄作為發(fā)布的倉(cāng)庫(kù)
(4)把項(xiàng)目ADD添加到git緩沖區(qū)
選擇最右側(cè)的 “add”
(5)再將項(xiàng)目COMMIT提交到本地倉(cāng)庫(kù)
選擇最右側(cè)第一個(gè) “Commit Directory…”點(diǎn)擊之后,在彈窗里填寫備注信息
(6)把項(xiàng)目PUSH推送到遠(yuǎn)程倉(cāng)庫(kù)
URL復(fù)制下面這個(gè)連接的時(shí)候輸入root和對(duì)應(yīng)的密碼就行了
這樣就可以提交上去了
更新項(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的幾次,就是看版本
看到以上commit了3次;
我們想要回到某一次,我們可以右擊想要回到的版本
只要點(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è)分支
如何查看是不是切換過(guò)去了
idea右下角,就可以看到當(dāng)前的項(xiàng)目在哪個(gè)分支
也可以直接在右下角進(jìn)行點(diǎn)擊創(chuàng)建
【四】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是否生效
(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
(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>
(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)
(5)獲取管理員密碼
vim /var/jenkins_home/secrets/initialAdminPassword
復(fù)制密碼然后登錄
(6)安裝插件
這里先跳過(guò)安裝
(7)創(chuàng)建管理員
root
admin
(8)實(shí)例配置
url不用動(dòng)
配置完成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
(10)查看Jenkins版本
滑到最底下,可以看到當(dāng)前安裝的版本是2.328
【五】Jenkins使用
【1】配置插件鏡像
滑到下面,找到升級(jí)站點(diǎn)
輸入: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
選擇所需要插件,點(diǎn)擊安裝(Install without restart)
有兩個(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ì)講到
注意:這里直接安裝可能會(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/
查看它前面的版本是否符合要求,下載一個(gè)hpi文件,離線方式安裝插件:
重啟jenkins
(2)安裝Maven Integration
然后還有Maven插件
安裝完成后重新啟動(dòng)一下
(3)安裝中文翻譯插件
安裝Local和Chinese兩個(gè)插件點(diǎn)擊【Configure System】選項(xiàng)。
找到【Locale】選項(xiàng),輸入【zh_CN】,勾選下面的選項(xiàng),最后點(diǎn)擊【應(yīng)用】即可。
(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
但是如果使用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】
(2)配置maven(選用默認(rèn)的即可)
進(jìn)入【首頁(yè)】–【系統(tǒng)管理】–【全局配置】,拉到最下面maven–maven安裝
下載jar包會(huì)比較慢,所以還要配置國(guó)內(nèi)的鏡像,所以這里也可以用自己安裝的maven會(huì)更方便使用
(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
(2)idea打開(kāi)項(xiàng)目
下載項(xiàng)目文件后,解壓,然后使用idea打開(kāi)
(3)啟動(dòng)項(xiàng)目,測(cè)試訪問(wèn)
因?yàn)楸镜?080端口沖突,所以在配置文件里把服務(wù)端口改成了8082,啟動(dòng)成功以后訪問(wèn):http://localhost:8082/hello
如圖測(cè)試成功,接下來(lái)就是把測(cè)試成功的項(xiàng)目提交到自己搭建的Gitlab上去了
(4)Gitlab創(chuàng)建項(xiàng)目
首先創(chuàng)建一個(gè)空白的項(xiàng)目
(5)Idea工具創(chuàng)建本地倉(cāng)庫(kù)
在IDEA中創(chuàng)建好項(xiàng)目,點(diǎn)擊VCS,按照下圖指示先給項(xiàng)目創(chuàng)建本地Git倉(cāng)庫(kù)
然后選擇當(dāng)前項(xiàng)目的文件作為發(fā)布的倉(cāng)庫(kù),成功之后看到所有項(xiàng)目文件變成了紅色
(6)把項(xiàng)目ADD添加到git緩沖區(qū)
點(diǎn)擊項(xiàng)目,然后右鍵,選擇最右側(cè)的 “add”,添加之后可以看到所有項(xiàng)目文件變成了綠色
(7)再將項(xiàng)目COMMIT提交到本地倉(cāng)庫(kù)
選擇最右側(cè)第一個(gè) “Commit Directory…”
點(diǎn)擊之后,在彈窗里填寫備注信息
提交完成后,可以看到項(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
然后push項(xiàng)目
然后自定義遠(yuǎn)程地址
然后點(diǎn)擊Push,連接的時(shí)候輸入root和對(duì)應(yīng)的密碼就行了,這樣就可以提交上去了
更新項(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)了
(2)Jenkins新建任務(wù)
(3)到Gitlab的項(xiàng)目里復(fù)制克隆路徑
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
(2)構(gòu)建觸發(fā)器(不改動(dòng))
(3)構(gòu)建環(huán)境(不改動(dòng))
(4)Pre Steps(不改動(dòng))
可以執(zhí)行一些構(gòu)建之前的操作
(5)Build(構(gòu)建)
在Gitlab里面可以看一下pom.xml是不是放在根目錄下的,如果還有子目錄,下面就要填成***/pom.xml
(6)立即構(gòu)建
立即構(gòu)建
因?yàn)槭堑谝淮螛?gòu)建,maven的倉(cāng)庫(kù)里沒(méi)有jar包,所以全部都要下載,有可能會(huì)在下載的過(guò)程中就失敗,所以構(gòu)建的過(guò)程中要觀察一下控制臺(tái)輸出
(7)啟動(dòng)jar包
首先找到構(gòu)建好的jar包所在位置
cd /var/jenkins_home/workspace/helloworld/target
然后使用命令啟動(dòng)項(xiàng)目
java -jar springboot-0.0.1-SNAPSHOT.jar --server.port=8088
啟動(dòng)成功
查看端口
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
成功
【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)修改全局配置
目前是一臺(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最后點(diǎn)擊Test Configuration測(cè)試連接,顯示Success為連接成功
(3)打開(kāi)項(xiàng)目配置
上面知道Jenkins打成的Jar包是放在workspace文件夾下的target包里的【springboot-0.0.1-SNAPSHOT.jar】,每次打包的時(shí)候后綴【-0.0.1】可能會(huì)變
cd /var/jenkins_home/workspace/helloworld/target
配置如下,點(diǎn)擊保存
(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è)文件
(6)到遠(yuǎn)程服務(wù)器上看看
看看文件是不是真的傳送了
(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
【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)程信息。
我們正確的操作應(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)致卡住。
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)致卡住了
但是還是有報(bào)錯(cuò)內(nèi)容,提示端口被占用,啟動(dòng)失敗,那么我們接下來(lái)就要解決端口被占用的問(wèn)題
(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
(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
結(jié)果也確實(shí)是3200
(4)學(xué)習(xí)netstat -nltp命令
根據(jù)端口號(hào)查找進(jìn)程ID
netstat -nltp | grep 8082
(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)命令被卡住
保存以后進(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)腳本的位置
然后commit和push代碼,jenkins執(zhí)行構(gòu)建,完成之后,我們看看jar包和start.sh分別放在了哪里
(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包刪除
(2)post steps-1:把jar包通過(guò)ssh傳送到服務(wù)器
(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的其他配置
【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)提交
(2)jenkins配置構(gòu)建的參數(shù)
(1)安裝Git Parameter插件
(2)修改項(xiàng)目配置填寫 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)值
指定分支引用上面的變量:${branch}
保存成功后,在job列表頁(yè),構(gòu)建的時(shí)候,可以選擇- Build with Parameters,接著會(huì)自動(dòng)加載出項(xiàng)目的所有分支,可供選擇
【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】
然后保存
(2)測(cè)試
在瀏覽器窗口輸入鏈接:http://192.168.19.9:10240/job/helloworld/build?token=123123
回到j(luò)enkins可以看到項(xiàng)目自動(dòng)構(gòu)建了
(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)
然后進(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)限)
勾選完成后點(diǎn)擊Add webhook,會(huì)提示本地網(wǎng)絡(luò)不能訪問(wèn)
我們需要設(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)求)即可!
保存以后,繼續(xù)完成上一步的webhook配置操作
(5)測(cè)試
(1)可以在gitlab的webhook配置頁(yè)面直接測(cè)試push操作
(2)也可以在IDEA里進(jìn)行push提交測(cè)試
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è)文件夾里
(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分支
(2)Pre Steps
(3)Post Steps
(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包名字改了
然后再項(xiàng)目里添加Dockerfile文件
完整的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
(3)Post Steps
分兩個(gè)步驟。第一步發(fā)送jar包,jar包在target目錄,第二步發(fā)送Dockerfile,Dockerfile在target同級(jí)的docker目錄
(4)給docker.sock權(quán)限
chmod a+rw /var/run/docker.sock
(5)構(gòu)建以后
helloworld文件夾下確實(shí)有了新的文件,并且容器重新運(yùn)行了
如果第一遍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)信息。
2-創(chuàng)建登錄賬號(hào)和密碼
(3)Docker安裝Mysql
(1)拉取鏡像:docker pull mysql:5.7
(2)查看本地鏡像:docker images
(3)創(chuàng)建一個(gè)mysql容器,首先在根目錄下創(chuàng)建好一個(gè)文件夾allenuse
(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(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
[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
(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)本地連接
(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
(2)拉取JDK1.8鏡像
從上面列表里選取一個(gè)拉取
docker pull java
(3)查看下載的鏡像
docker images
(4)啟動(dòng)JDK鏡像
docker run -di --name=jdk8 java
(5)查看鏡像運(yùn)行情況
docker ps
(6)進(jìn)入鏡像
docker exec -it jdk8 /bin/bash
查看jdk版本
退出鏡像
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ò)程類似
(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)生成增刪改查的代碼
(6)查看代碼的生成結(jié)果
修改啟動(dòng)類,加上掃描路徑
(7)啟動(dòng)項(xiàng)目,測(cè)試接口
訪問(wèn)地址:http://localhost:8989/docker_springboot/category/64
(3)docker創(chuàng)建網(wǎng)絡(luò)
docker network create apps
然后查看容器
docker ps
然后把mysql加到網(wǎng)絡(luò)中去
docker network connect apps e3
最后查看一下網(wǎng)絡(luò)
docker inspect apps
(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
然后開(kāi)始打包
(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è)文件夾里
(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)建完畢查看鏡像,可以看到下面已經(jīng)有鏡像了
docker images
(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
通過(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)成功了
(8)本地測(cè)試
關(guān)閉所有防火墻
service firewalld status
service firewalld stop
然后訪問(wèn)地址:http://192.168.19.7:8989/docker_springboot/category/64
【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í)
(2)上傳到git
看上面【三】Gitlab的使用
(3)修改全局配置(在上面helloworld項(xiàng)目已經(jīng)配置過(guò)了)
目前是一臺(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最后點(diǎn)擊Test Configuration測(cè)試連接,顯示Success為連接成功
(4)Jenkins創(chuàng)建新項(xiàng)目
(5)修改項(xiàng)目的Pre Steps配置
然后修改Pre Steps,在Build構(gòu)建之前把容器停掉,再把舊的容器和鏡像都刪除
(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)方式一
clean install -Dmaven.test.skip=true
(2)方式二
(7)修改項(xiàng)目的Post Steps配置
(8)立即構(gòu)建
因?yàn)槭堑谝淮螛?gòu)建,maven的倉(cāng)庫(kù)里沒(méi)有jar包,所以全部都要下載,有可能會(huì)在下載的過(guò)程中就失敗,所以構(gòu)建的過(guò)程中要觀察一下控制臺(tái)輸出
(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í)行
有了之前手動(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)擊保存我們看到打包成功了,就是在使用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文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-674572.html
(11)查看Docker鏡像是否啟動(dòng)
docker images
docker ps
文章來(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)!