jenkinds安裝及教程使用
安裝Jenkins服務(wù)器
????????????? jenkins的IP地址是:192.168.4.30。它必須能與其他主機(jī)通信
????????????? 關(guān)閉selinux/防火墻
????????????? 安裝jenkins
# 安裝依賴(lài)包
# jenkins需要通過(guò)git下載代碼,所以裝git。
# jenkins是java程序,所以裝java
# postfix和mailx是郵件程序,jenkins可以通過(guò)它們給管理員發(fā)郵件
[root@jenkins ~]# yum install -y git postfix mailx java-11-openjdk
# 把jenkins軟件包拷貝到192.168.4.30
[root@zzgrhel8 ~]# ls /linux-soft/2/jenkins*
/linux-soft/2/jenkins-2.263.1-1.1.noarch.rpm
/linux-soft/2/jenkins_plugins.tar.gz
[root@zzgrhel8 ~]# scp /linux-soft/2/jenkins* 192.168.4.30:/root/
# 在192.168.4.30上安裝jenkins
[root@jenkins ~]# yum install -y jenkins-2.263.1-1.1.noarch.rpm
# 啟動(dòng)服務(wù),并設(shè)置為開(kāi)機(jī)自啟
[root@jenkins ~]# systemctl enable jenkins
jenkins.service is not a native service, redirecting to systemd-sysv-install.?? # 注意:這里不是錯(cuò)誤,忽略即可
Executing: /usr/lib/systemd/systemd-sysv-install enable jenkins
[root@jenkins ~]# systemctl start jenkins
????????????? 訪問(wèn)http://192.168.4.30:8080,進(jìn)行初始化
# 查看初始化密碼
[root@jenkins ~]# cat /var/lib/jenkins/secrets/initialAdminPassword
2c58512973be4a44aec3ef5c1463d00a
把查看到的密碼粘貼到文本框中,如下:


不用創(chuàng)建管理員,使用自帶的admin







?vim /etc/rc.d/rc.local?? # 在文件尾部追加一行內(nèi)容如下:
... ...
podman start gitlab
[root@git ~]# chmod +x /etc/rc.d/rc.local
配置jenkins
????????????? 訪問(wèn)http://192.168.4.30:8080,用戶(hù)名是admin
????????????? 安裝插件:jenkins的很多功能都是能過(guò)插件實(shí)現(xiàn)的,比如發(fā)郵件、比如中文支持。
[root@jenkins ~]# yum install -y tar
[root@jenkins ~]# tar xf jenkins_plugins.tar.gz
# 拷貝文件的時(shí)候,注意選項(xiàng),-r可以拷貝目錄,-p保留權(quán)限
[root@jenkins ~]# cp -rp jenkins_plugins/* /var/lib/jenkins/plugins/
[root@jenkins ~]# systemctl restart jenkins
# 刷新web頁(yè)面,如果出現(xiàn)中文,則插件安裝成功
軟件版本管理????????????
????????????? 可以在git中使用tag標(biāo)記將某一次commit提交標(biāo)識(shí)為某一版本
[root@develop ~]# cd myproject/??? # 進(jìn)入項(xiàng)目目錄
[root@develop myproject]# git tag? # 查看標(biāo)記,默認(rèn)沒(méi)有標(biāo)記
[root@develop myproject]# git tag 1.0? # 將當(dāng)前提交,標(biāo)識(shí)為1.0
[root@develop myproject]# git tag
1.0
[root@develop myproject]# echo 'hello world' > index.html
[root@develop myproject]# git add .
[root@develop myproject]# git commit -m "add index.html"
[root@develop myproject]# git tag 1.1
# 將本地文件和tag推送到gitlab服務(wù)器
[root@develop myproject]# git push??? # 只推送文件,不推送標(biāo)記
[root@develop myproject]# git push --tags
在gitlab上查看標(biāo)記:


配置jenkins訪問(wèn)gitlab代碼倉(cāng)庫(kù)


數(shù)化構(gòu)建過(guò)程中,“名稱(chēng)”是自己定義的變量名,用于標(biāo)識(shí)tag或分支


git倉(cāng)庫(kù)地址,在gitlab上找到myproject倉(cāng)庫(kù)的http地址,注意將gitlab名稱(chēng)改為IP地址

指定分支構(gòu)建的時(shí)候,使用上面步驟創(chuàng)建的變量$web

點(diǎn)擊保存。
在項(xiàng)目頁(yè)面, 可以進(jìn)行構(gòu)建測(cè)試。


測(cè)試下載



構(gòu)建過(guò)程中,邊欄左下角會(huì)有一個(gè)閃爍的灰球,構(gòu)建成功是藍(lán)球,失敗是紅球。點(diǎn)擊它,可以看詳情。



在jenkins上查看下載的內(nèi)容:
[root@jenkins ~]# ls /var/lib/jenkins/workspace/myproject/
README.md? hosts? passwd
下載到子目錄
????????????? jenkins下載不同的版本到自己的子目錄,不共享相同目錄


新增時(shí),如果沒(méi)有中文,英文是“checkout to a sub directory”


點(diǎn)擊保存。
測(cè)試:
# 刪除之前下載的內(nèi)容
[root@jenkins ~]# rm -rf /var/lib/jenkins/workspace/myproject/
執(zhí)行多次構(gòu)建,構(gòu)建不同版本:

查看下載目錄:
[root@jenkins ~]# ls /var/lib/jenkins/workspace/myproject/
myproject-1.0? myproject-1.1
準(zhǔn)備兩臺(tái)web服務(wù)器
????????????? web1:192.168.4.100,配置YUM,關(guān)閉SELINUX/防火墻
????????????? web2:192.168.4.200,配置YUM,關(guān)閉SELINUX/防火墻
部署代碼到web服務(wù)器
自動(dòng)化部署流程
1.????????? 程序員編寫(xiě)代碼,推送到gitlab服務(wù)器
2.????????? Jenkins服務(wù)器從gitlab上下載代碼
3.????????? Jenkins處理下載的代碼
–??????????? 刪除下載目錄的版本庫(kù)
–??????????? 將下載的代碼打包
–??????????? 計(jì)算程序壓縮包的md5值
–??????????? 在Jenkins上安裝ftp服務(wù),共享程序壓縮包
4.????????? web服務(wù)器下載軟件包,并應(yīng)用(通過(guò)腳本實(shí)現(xiàn))
5.????????? 訪問(wèn)測(cè)試
在Jenkins上配置FTP服務(wù)器
# 安裝vsftpd
[root@jenkins ~]# yum install -y vsftpd
# 啟用ftp的匿名訪問(wèn)
[root@jenkins ~]# vim +12 /etc/vsftpd/vsftpd.conf
anonymous_enable=YES
# 起服務(wù)
[root@jenkins ~]# systemctl enable vsftpd --now
# ftp的數(shù)據(jù)目錄默認(rèn)是/var/ftp。
# 在ftp上創(chuàng)建保存壓縮包的路徑
[root@jenkins ~]# mkdir -p /var/ftp/deploy/packages
# 因?yàn)閖enkins服務(wù)需要向該目錄保存文件,所以設(shè)置jenkins對(duì)它有權(quán)限
[root@jenkins ~]# chown -R :jenkins /var/ftp/deploy
[root@jenkins ~]# chmod -R 775 /var/ftp/deploy/
配置jenkins把gitlab下載的代碼打包
在jenkins上修改myproject項(xiàng)目


# 定義存儲(chǔ)軟件包路徑的變量
pkg_dir=/var/ftp/deploy/packages
# 將下載的代碼目錄拷貝到下載目錄
cp -r myproject-$web $pkg_dir
# 刪除下載目錄的版本庫(kù),不是必須的,只是為了嚴(yán)謹(jǐn)
rm -rf $pkg_dir/myproject-$web/.git
cd $pkg_dir?? # 切換到下載目錄
# 將下載的目錄打包
tar czf myproject-$web.tar.gz myproject-$web
# 下載目錄已打包,目錄就不需要了,刪除它
rm -rf myproject-$web
# 計(jì)算壓縮包的md5值,保存到文件
md5sum myproject-$web.tar.gz | awk '{print $1}' > myproject-$web.tar.gz.md5
cd ..
echo -n $web > ver.txt?? # 將版本號(hào)寫(xiě)入文件
以上步驟改好后,保存。
測(cè)試修改的任務(wù)。


web服務(wù)自動(dòng)部署
安裝httpd服務(wù)
[root@web1 ~]# yum install -y httpd tar wget
[root@web1 ~]# systemctl enable httpd --now
[root@web1 ~]# ss -tlnp | grep :80
LISTEN??? 0???????? 128????????????????????? *:80???????????????????? *:*??????? users:(("httpd",pid=9721,fd=4),("httpd",pid=9720,fd=4),("httpd",pid=9719,fd=4),("httpd",pid=9717,fd=4))
編寫(xiě)自動(dòng)上線腳本
????????????? 下載軟件包
????????????? 檢查軟件包是否損壞
????????????? 解壓、部署到web服務(wù)器
[root@web1 ~]# vim /usr/local/bin/web.sh
#!/bin/bash
# 定義軟件包服務(wù)器和本地路徑
ftp_url=ftp://192.168.4.30/deploy
deploy_dir=/var/www/deploy
dest=/var/www/html/tedu-cloud
# 創(chuàng)建用于部署的函數(shù)
down_file(){
??????? # 獲取要下載的軟件版本
??????? version=$(curl -s $ftp_url/ver.txt)
??? ????# 下載版本文件到本地
??????? wget -q $ftp_url/ver.txt -O $deploy_dir/ver.txt
??????? # 下載軟件壓縮包
??????? wget -q $ftp_url/packages/myproject-$version.tar.gz -O $deploy_dir/myproject-$version.tar.gz
??????? # 計(jì)算本地壓縮包Md5值
??????? hash=$(md5sum $deploy_dir/myproject-$version.tar.gz | awk '{print $1}')
??????? # 獲取網(wǎng)上md5文件中的md5值
??????? ftp_hash=$(curl -s $ftp_url/packages/myproject-$version.tar.gz.md5)
??????? # 如果文件未損壞則解壓
??????? if [ "$hash" == "$ftp_hash" ]; then
??????????? tar xf $deploy_dir/myproject-$version.tar.gz -C $deploy_dir
??????? else
??????????? rm -f $deploy_dir/myproject-$version.tar.gz
??????? fi
??????? # 如果存在目標(biāo)軟鏈接,先刪除它
??????? if [ -e "$dest" ]; then
??????? ??? rm -f $dest
??????? fi
??????? # 創(chuàng)建軟鏈接
??????? ln -s $deploy_dir/myproject-$version $dest
}
# 如果$deploy_dir不存在,先創(chuàng)建它
if [ ! -e "$deploy_dir" ]; then
??? mkdir $deploy_dir
fi
# 如果本地不存在版本文件,則意味著是新服務(wù)器,要部署軟件
if [ ! -f $deploy_dir/ver.txt ]; then
??? down_file
fi
# 如果本地存在版本文件,但是和服務(wù)器上的版本文件不一樣,則要部署新版本
if [ -f $deploy_dir/ver.txt ]; then
??????? ftp_ver=$(curl -s $ftp_url/ver.txt)
??????? local_ver=$(cat $deploy_dir/ver.txt)
??????? if [ "$ftp_ver" != "$local_ver" ]; then
??????????? down_file
??????? fi
fi
[root@web1 ~]# chmod +x /usr/local/bin/web.sh
[root@web1 ~]# yum install -y wget
[root@web1 ~]# web.sh
# 訪問(wèn)http://192.168.4.100/tedu-cloud/可以看到部署的文件
[root@web1 html]# ls /var/www/html/
tedu-cloud
????????????? 完整測(cè)試流程:
–??????????? 程序員編寫(xiě)新版本并推送到服務(wù)器
–??????????? Jenkins上構(gòu)建新版本
–??????????? web服務(wù)器上執(zhí)行web.sh部署新版本
# 程序員編寫(xiě)新版本
[root@develop myproject]# vim index.html
<marquee>Welcome to tedu</marquee>
[root@develop myproject]# git add .
[root@develop myproject]# git commit -m "modify index.html"
[root@develop myproject]# git tag 2.0
# 程序員推送到服務(wù)器
[root@develop myproject]# git push
[root@develop myproject]# git push --tags

web服務(wù)器上執(zhí)行`web.sh`部署新版本
[root@web1 html]# web.sh
[root@web1 html]# ls /var/www/deploy/
myproject-1.1???????? myproject-2.0???????? ver.txt
myproject-1.1.tar.gz? myproject-2.0.tar.gz
# 訪問(wèn)http://192.168.4.100/tedu-cloud