1.背景
? ? ? ? 在實際開發(fā)中,我們經(jīng)常要一邊開發(fā)一邊測試,當(dāng)然這里說的測試并不是程序員對自己代碼的單元測試,而是同組程序員將代碼提交后,由測試人員測試;
或者前后端分離后,經(jīng)常會修改接口,然后重新部署;
這些情況都會涉及到頻繁的打包部署;
手動打包常規(guī)步驟:
1.提交代碼
2.問一下同組小伙伴有沒有要提交的代碼
3.拉取代碼并打包(war包,或者jar包)
4.上傳到Linux服務(wù)器
5.查看當(dāng)前程序是否在運行
6.關(guān)閉當(dāng)前程序
7.啟動新的jar包
8.觀察日志看是否啟動成功
9.如果有同事說,自己還有代碼沒有提交......再次重復(fù)1到8的步驟?。。。。。ㄒ簧衔鐩]了)
那么,有一種工具能夠?qū)崿F(xiàn),將代碼提交到git后就自動打包部署勒,答案是肯定的:Jenkins
當(dāng)然除了Jenkins以外,也還有其他的工具可以實現(xiàn)自動化部署,如Hudson等
只是Jenkins相對來說,使用得更廣泛
?
1.?jenkins
1.1 什么是jenkins
jenkins就是持續(xù)開發(fā)部署得軟件
1.2.Jenkins自動化部署實現(xiàn)原理
yum install -y curl policycoreutils-python openssh-server perl postfix
systemctl enable --now sshd postfixrpm -ivh gitlab-ce-12.3.0-ce.0.el7.x86_64.rpm
?
vim /etc/gitlab/gitlab.rb
external_url 'http://192.168.50.25:82'
nginx['listen_port'] = 82gitlab-ctl reconfigure
gitlab-ctl restart
?
瀏覽器訪問:http://192.168.50.25:82 ,如果顯示 502,稍等片刻再刷新
1、設(shè)置管理員 root 用戶的新密碼,注意有格式要求,這里設(shè)置成 root@123
2、使用管理員 root 用戶登錄(root/root@123)
3、登錄后點擊頁面右上方的用戶選項下拉選擇【Settings】,點擊左邊菜單【Preferences】,在【Localization】的【Language】中選擇【簡體中文】,點擊【Save changes】按鈕,再刷新頁面使用中文顯示。
?
?//Gitlab添加組、創(chuàng)建用戶、創(chuàng)建項目
#創(chuàng)建群組
點擊頁面左上方的【GitLab】圖標(biāo),點擊 【新建群組】
【群組名稱】、【群組URL】、【群組描述】都設(shè)置成 devops_group
【可見性級別】設(shè)置成 私有
其他都保持默認(rèn)值,點擊 【創(chuàng)建群組】
#創(chuàng)建項目
點擊 【新建項目】
【項目URL】群組選項下拉選擇 devops_group
【項目名稱】設(shè)置成 web_demo
【項目描述】設(shè)置成 web_demo
【可見等級】設(shè)置成 私有
點擊 【創(chuàng)建項目】
?
?
#創(chuàng)建用戶
點擊頁面上方的【扳手】圖標(biāo)進(jìn)入“管理區(qū)域”
點擊 【新建用戶】
【姓名】設(shè)置成 zhangsan
【用戶名】設(shè)置成 zhangsan
【電子郵箱】設(shè)置成 zhangsan@kgc.com
這里密碼暫不設(shè)置,其他都保持默認(rèn)值,先點擊 【創(chuàng)建用戶】
注:Access level:Regular(表示的是普通用戶,只能訪問屬于他的組和項目);Admin(表示的是管理員,可以訪問所有組和項目)創(chuàng)建好用戶后再點擊右上角的【Edit】,可在這里設(shè)置密碼,如 zhangsan@123
#將用戶添加到組中
點擊頁面上方的【群組】下拉選擇 devops_group
點擊左邊菜單【成員】
【添加成員到 devops_group】選擇 zhangsan,角色權(quán)限選擇 Owner
點擊 【添加到群組】
?
#使用自己創(chuàng)建的賬戶進(jìn)行管理
退出當(dāng)前賬戶,使用自己創(chuàng)建的賬戶 zhangsan 登錄(zhangsan/zhangsan@123)
第一次登錄會被強制要求修改密碼(zhangsan/zhangsan@123),可與舊密碼相同,再重新登錄
?
//Jenkins安裝
#安裝JDK
tar zxvf jdk-11.0.5_linux-x64_bin.tar.gz -C /usr/local/vim /etc/profile
export JAVA_HOME=/usr/local/jdk-11.0.5
export CLASSPATH=.:${JAVA_HOME}/lib
export PATH=${JAVA_HOME}/bin:$PATHsource /etc/profile
java -version
#安裝jenkins
wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo --no-check-certificate
rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io.keyyum install epel-release -y
yum install jenkins -y
或者直接用下載好的安裝包
yum localinstall -y jenkins-2.401.2-1.1.noarch.rpm
#修改 jenkins 的運行用戶和監(jiān)聽端口
vim /etc/sysconfig/jenkins
JENKINS_USER="root"
JENKINS_PORT="8888"
##新版本的 jenkins 還要在 /usr/lib/systemd/system/jenkins.service 文件中修改用戶名和端口
vim /usr/lib/systemd/system/jenkins.service
User=root
Group=root
Environment="JAVA_HOME=/usr/local/jdk-11.0.5"? ? ?注釋去掉
Environment="JENKINS_PORT=8888"
#修改 jenkins 的啟動腳本添加java路徑
vim /etc/init.d/jenkins
candidates="
......
/usr/local/jdk-11.0.5/bin/java
/usr/bin/java
systemctl daemon-reload
systemctl start jenkins
systemctl enable jenkins
vim /var/lib/jenkins/hudson.model.UpdateCenter.xml
<url>https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json</url>?sed -i 's#https://www.google.com#https://www.baidu.com#' /var/lib/jenkins/updates/default.json
http://192.168.50.25:8888?
?systemctl restart jenkins
瀏覽器訪問:http://192.168.50.25:8888 ,獲取并輸入 admin 賬戶密碼
要安裝git插件,從gitlab倉庫拉取代碼?
點擊用戶名下拉選擇憑據(jù) -> Jenkins 全局 -> 添加憑據(jù)
類型選擇 "Username with password" ,輸入 Gitlab 的用戶名和密碼(zhangsan/zhangsan@123),描述輸入 gitlab-auth-password?
點擊 "確定"。
創(chuàng)建一個FreeStyle項目:新建Item -> 任務(wù)名稱(test01) FreeStyle Project -> 確定
源碼管理:選擇 Git,Repository URL:http://192.168.80.10:82/devops_group/web_demo.git(可從 Gitlab 使用 HTTP 克?。?,
Credentials 下拉選擇 gitlab-auth-password,點擊 保存。
點擊 Bulid Now 開始構(gòu)建,查看控制臺輸出可以看到構(gòu)建成功,構(gòu)建后的包會生成在服務(wù)器的 /var/lib/jenkins/workspace/test01 目錄中。
?
?
//Jenkins 構(gòu)建 Maven 項目
Maven 是一個主要用于 Java 項目的自動化構(gòu)建工具。Maven 還可以用來構(gòu)建和管理用 C#、Ruby、Scala 和其他語言開發(fā)的項目。
#在 Jenkins 服務(wù)器上安裝 Maven 來編譯和打包項目
cd /opt
tar -zxvf apache-maven-3.6.2-bin.tar.gz
mv apache-maven-3.6.2 /usr/local/mavenvim /etc/profile
......
export MAVEN_HOME=/usr/local/maven
export PATH=$MAVEN_HOME/bin:${JAVA_HOME}/bin:$PATHsource /etc/profile
mvn -v
#Jenkins 關(guān)聯(lián) JDK 和 Maven
tar xf jdk-8u171-linux-x64.tar.gz -C /usr/local/
Manage Jenkins -> Global Tool Configuration?
-> JDK
點擊 新增JDK,別名輸入 jdk11,取消勾選 Install automatically,JAVA_HOME輸入 /usr/local/jdk-11.0.5
點擊 新增JDK,別名輸入 jdk1.8,取消勾選 Install automatically,JAVA_HOME輸入 /usr/local/jdk1.8.0_171
-> Maven
點擊 新增Maven,Name輸入 maven3,取消勾選 Install automatically,MAVEN_HOME駛?cè)?/usr/local/maven
點擊 "應(yīng)用"和"保存"。
#添加 Jenkins 全局變量,讓 Jenkins 能夠識別 JDK 和 Maven 環(huán)境的命令
Manage Jenkins -> Configure System -> 全局屬性,勾選 Environment variables
鍵值對列表添加:鍵 JAVA_HOME ,值 /usr/local/jdk-11.0.5
?? ??? ??? ??? ?鍵 M2_HOME ,值 /usr/local/maven
?? ??? ??? ??? ?鍵 PATH+EXTRA ,值 $M2_HOME/bin
#修改 Maven 的 settings.xml
mkdir /root/repo?? ??? ?#創(chuàng)建本地倉庫目錄
vim /usr/local/maven/conf/settings.xml
54 -->?? ??? ?#本地倉庫改為 /root/repo/
? ?<localRepository>/root/repo</localRepository>
153 -->?? ??? ?#添加阿里云私服地址
? ? <mirror>
? ? ? <id>alimaven</id>
? ? ? <mirrorOf>central</mirrorOf>
? ? ? <name>aliyun maven</name>
? ? ? <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
? ? </mirror>
? </mirrors>
//Tomcat 安裝和配置
#安裝 Tomcat8.5
tar zxvf jdk-8u171-linux-x64.tar.gz -C /usr/local/
vim /etc/profile
export JAVA_HOME=/usr/local/jdk1.8.0_171
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=${JAVA_HOME}/bin:${JRE_HOME}/bin:$PATH
source /etc/profile
tar zxvf apache-tomcat-9.0.16.tar.gz
mv /opt/apache-tomcat-9.0.16/ /usr/local/tomcat
/usr/local/tomcat/bin/startup.sh
//配置 Tomcat 用戶角色權(quán)限
默認(rèn)情況下 Tomcat 是沒有配置用戶角色權(quán)限的
驗證方法:可瀏覽器訪問 http://192.168.80.12:8080 ,點擊 Managing Tomcat 下的 manager webapp ,發(fā)現(xiàn)返回 403 頁面。
但是后續(xù) Jenkins 部署項目到 Tomcat 服務(wù)器,需要用到 Tomcat 的用戶進(jìn)行遠(yuǎn)程部署,所以修改 tomcat 以下配置,添加用戶及權(quán)限
vim /usr/local/tomcat/conf/tomcat-users.xml
43 --> ? ?#添加 tomcat 用戶角色權(quán)限,指定用戶和密碼都是 tomcat ,并授予權(quán)限
? ?<role rolename="tomcat"/>
? ?<role rolename="role1"/>
? ?<role rolename="manager-script"/>
? ?<role rolename="manager-gui"/>
? ?<role rolename="manager-status"/>
? ?<role rolename="admin-gui"/>
? ?<role rolename="admin-script"/>
? ?<user username="tomcat" password="tomcat" roles="manager-gui,manager-script,tomcat,admin-gui,admin-script"/>
</tomcat-users>
vim /usr/local/tomcat/webapps/manager/META-INF/context.xml
<!-- ? ? #注釋掉 Valve 配置
? <Valve className="org.apache.catalina.valves.RemoteAddrValve"
? ? ? ? ?allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1" />
-->/usr/local/tomcat/bin/shutdown.sh
/usr/local/tomcat/bin/startup.sh再次訪問:http://192.168.80.12:8080/manager/html ,輸入賬號/密碼 tomcat/tomcat,即可成功登錄
?再次登錄
//Jenkins 構(gòu)建 Maven 項目
//自由風(fēng)格項目構(gòu)建
項目的集成過程:拉取代碼 -> 編譯 -> 打包 -> 部署
#拉取代碼
新建item -> 任務(wù)名稱(web_demo_freestyle) FreeStyle Project -> 確定
源碼管理:選擇 Git,Repository URL:git@192.168.80.10:devops_group/web_demo.git
Credentials 下拉選擇 gitlab-auth-ssh,點擊 保存
點擊 Build Now,嘗試構(gòu)建項目
#編譯打包
配置 —> 構(gòu)建 -> 添加構(gòu)建步驟 -> Execute Shell,輸入以下命令
echo "開始編譯和打包"
mvn clean package
echo "編譯和打包結(jié)束"
點擊 Build Now,嘗試構(gòu)建項目
#把項目部署到遠(yuǎn)程的 Tomcat 里面
1)安裝 Deploy to container 插件
Jenkins 本身無法實現(xiàn)遠(yuǎn)程部署到 Tomcat 的功能,需要安裝 Deploy to container 插件實現(xiàn):
Manage Jenkins -> 管理插件-可選插件 -> 搜索 Deploy to container 插件選中直接安裝即可
2)添加構(gòu)建后操作
配置 —> 構(gòu)建后操作 -> 增加構(gòu)建后操作步驟 -> Deploy war/ear to a container
WAR/EAR files 輸入 target/*.war
Containers —> Add Container —> Tomcat 9.x Remote -> Credentials,點擊添加 -> Jenkins
用戶名 輸入 tomcat,密碼 輸入 tomcat,描述 輸入 tomcat-auth,點擊添加
Credentials 下拉選擇 tomcat-auth
Tomcat URL 輸入 http://192.168.80.12:8080
點擊保存
點擊 Build Now,嘗試構(gòu)建項目
3)部署成功后,刷新 http://192.168.80.12:8080/manager/html 頁面,可以發(fā)現(xiàn)應(yīng)用程序中多出一個項目,點擊新項目進(jìn)去訪問?
//Pipeline 流水線項目構(gòu)建
Pipeline 腳本是由 Groovy 語言實現(xiàn)的,但是我們沒必要單獨去學(xué)習(xí) Groovy
Pipeline 支持兩種語法:Declarative(聲明式)和 Scripted Pipeline(腳本式)語法
#安裝 Pipeline 插件(推薦的插件已默認(rèn)安裝)
Manage Jenkins -> Manage Plugins -> 可選插件 –> 安裝 Pipeline 和 Pipeline Stage View
#Pipeline 語法快速入門
1)Scripted 腳本式 Pipeline?
新建item -> 任務(wù)名稱(web_demo_pipeline) Pipeline -> 確定
流水線 -> 定義 選擇 Pipeline script -> 選擇 Scripted Pipeline?
生成內(nèi)容如下:
node {
? ? def mvnHome
? ? stage('Preparation') { // for display purposes
? ? ? ? // Get some code from a GitHub repository
? ? ? ? git 'https://github.com/jglick/simple-maven-project-with-tests.git'
? ? ? ? // Get the Maven tool.
? ? ? ? // ** NOTE: This 'M3' Maven tool must be configured
? ? ? ? // ** ? ? ? in the global configuration.
? ? ? ? mvnHome = tool 'M3'
? ? }
? ? stage('Build') {
? ? ? ? // Run the maven build
? ? ? ? withEnv(["MVN_HOME=$mvnHome"]) {
? ? ? ? ? ? if (isUnix()) {
? ? ? ? ? ? ? ? sh '"$MVN_HOME/bin/mvn" -Dmaven.test.failure.ignore clean package'
? ? ? ? ? ? } else {
? ? ? ? ? ? ? ? bat(/"%MVN_HOME%\bin\mvn" -Dmaven.test.failure.ignore clean package/)
? ? ? ? ? ? }
? ? ? ? }
? ? }
? ? stage('Results') {
? ? ? ? junit '**/target/surefire-reports/TEST-*.xml'
? ? ? ? archiveArtifacts 'target/*.jar'
? ? }
}
●Node:節(jié)點,一個 Node 代表一個 Jenkins 節(jié)點,Master 或者 Agent 節(jié)點,是執(zhí)行 Step 的具體運行環(huán)境,后續(xù)講到 Jenkins 的 Master-Slave 架構(gòu)的時候用到。
●Stage:階段,一個 Pipeline 可以劃分為若干個 Stage,每個 Stage 代表一組操作,比如:Build、Test、Deploy,Stage 是一個邏輯分組的概念。
●Step:步驟,Step 是最基本的操作單元,可以是打印一句話,也可以是構(gòu)建一個 Docker 鏡像,由各類 Jenkins 插件提供, 比如命令:sh 'make',就相當(dāng)于我們平時 shell 終端中執(zhí)行 make 命令一樣。
編寫一個簡單的腳本式 Pipeline:
node {
? ? def mvnHome
? ? stage('拉取代碼') {
? ? ? ? echo '拉取代碼'
? ? }?
?? ?stage('編譯構(gòu)建') {
? ? ? ? echo '編譯構(gòu)建'
? ? }?
?? ?stage('項目部署') {
? ? ?? ?echo '項目部署'
?? ?}
}
2)Declarative 聲明式 Pipeline
流水線 -> 選擇 HelloWorld 模板
生成內(nèi)容如下:
pipeline {
? ? agent any
? ? stages { ? ? ? ? ? ? ?#stages:代表整個流水線的所有執(zhí)行階段。通常stages只有1個,里面包含多個stage
? ? ? ? stage('Hello') { ?#stage:代表流水線中的某個階段,可能出現(xiàn)n個。一般分為拉取代碼,編譯構(gòu)建,部署等階段
? ? ? ? ? ? steps { ? ? ? #steps:代表一個階段內(nèi)需要執(zhí)行的邏輯。steps里面是shell腳本,git拉取代碼,ssh遠(yuǎn)程發(fā)布等任意內(nèi)容
? ? ? ? ? ? ? ? echo 'Hello World'
? ? ? ? ? ? }
? ? ? ? }
?? ?}
}
編寫一個簡單聲明式Pipeline:
pipeline {
? ?agent any
? ?stages {
? ? ? ?stage('拉取代碼') {
? ? ? ? ? ?steps {
? ? ? ? ? ? ? ?echo '拉取代碼'
? ? ? ? ? ?}
? ? ? ?}?
? ? ? ?stage('編譯構(gòu)建') {
? ? ? ? ? ?steps {
? ? ? ? ? ? ? ?echo '編譯構(gòu)建'
? ? ? ? ? ?}
? ? ? ?}?
? ? ? ?stage('項目部署') {
? ? ? ? ? ?steps {
? ? ? ? ? ? ? ?echo '項目部署'
? ? ? ? ? ?}
? ? ? ?}
? ?}
}
點擊保存
點擊 Build Now,查看 Console Output 可以看到整個構(gòu)建過程
#使用代碼生成器生成流水線腳本:
流水線 -> 流水線語法 -> 片段生成器
#生成一個 pull stage
選擇 checkout: Check out from version control
SCM 選擇 Git,Repository URL:git@192.168.80.10:devops_group/web_demo.git
Credentials 下拉選擇 gitlab-auth-ssh
指定分支 */master
點擊 生成流水線腳本
把生成的腳本復(fù)制到流水線中后,點擊保存,嘗試構(gòu)建;
#生成一個構(gòu)建 stage
選擇 sh:Shell Script
Shell Script 輸入 mvn clean package
點擊 生成流水線腳本
把生成的腳本復(fù)制到流水線中后,點擊保存,嘗試構(gòu)建;文章來源:http://www.zghlxwxcb.cn/news/detail-625101.html
#生成一個部署 stage
選擇 deploy: Deploy war/ear to a container
WAR files 輸入 targer/*.war
Containers —> Add Container —> Tomcat 8.x Remote -> Credentials 下拉選擇 tomcat-auth
Tomcat URL 輸入 http://192.168.80.12:8080
點擊 生成流水線腳本
把生成的腳本復(fù)制到流水線中后,點擊保存,嘗試構(gòu)建部署。文章來源地址http://www.zghlxwxcb.cn/news/detail-625101.html
到了這里,關(guān)于CI/CD持續(xù)集成持續(xù)發(fā)布(jenkins)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!