1、Jenkins是什麼?
Jenkins是一個開源的支持自動化構建、部署等任務的平臺。基本上可以說是持續集成(CI)、持續發佈(CD)不可或缺的工具。 jenkins官網
持續集成是一個監視你版本控制系統改變的軟件。每當代碼改變的時候,這個工具自動的編譯和測試你的應用。如果出現了錯誤,這個工具立即通知開發者,因此開發者能夠立即修復問題。而且它還能自動地監測代碼質量和測試覆蓋率。可視化的代碼質量度量方案能夠鼓勵開發者不斷地改進他們的代碼
2、安裝
版本說明:系統: centos 7.6, jdk: 8u181, jenkins: 2.210
2.1、安裝jdk
~]# tar xf jdk-8u181-linux-x64.tar.gz -C /usr/java/
~]# cd /usr/java/
java]# ln -sv jdk1.8.0_181/ default
java]# ln -sv default/ jdk
]# cat /etc/profile.d/java.sh
export JAVA_HOME=/usr/java/jdk
export PATH=$JAVA_HOME/bin:$PATH
2.2、yum源
導入
sudo wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat/jenkins.repo
sudo rpm --import https://pkg.jenkins.io/redhat/jenkins.io.key
安裝 yum -y install jenkins
2.3、rpm&docker
rpm安裝: 下載地址 docker: hub, 配置說明
配置文件
~]# rpm -ql jenkins-2.210-1.1
/etc/init.d/jenkins
/etc/logrotate.d/jenkins
/etc/sysconfig/jenkins
/usr/lib/jenkins
/usr/lib/jenkins/jenkins.war
/usr/sbin/rcjenkins
/var/cache/jenkins
/var/lib/jenkins
/var/log/jenkins
2.3.1、配置jenkins
]# grep -v "^#" /etc/sysconfig/jenkins | grep -v "^$"
# 工作目錄
JENKINS_HOME="/usr/local/website/jenkins"
# java地址
JENKINS_JAVA_CMD="/usr/java/jdk/bin/java"
JENKINS_USER="jenkins"
JENKINS_JAVA_OPTIONS="-Djava.awt.headless=true"
# 指定端口
JENKINS_PORT="18888"
JENKINS_LISTEN_ADDRESS="0.0.0.0"
JENKINS_HTTPS_PORT=""
JENKINS_HTTPS_KEYSTORE=""
JENKINS_HTTPS_KEYSTORE_PASSWORD=""
JENKINS_HTTPS_LISTEN_ADDRESS=""
JENKINS_HTTP2_PORT=""
JENKINS_HTTP2_LISTEN_ADDRESS=""
JENKINS_DEBUG_LEVEL="5"
JENKINS_ENABLE_ACCESS_LOG="no"
JENKINS_HANDLER_MAX="100"
JENKINS_HANDLER_IDLE="20"
JENKINS_EXTRA_LIB_FOLDER=""
JENKINS_ARGS=""
2.3.2、啓動配置服務
]# ll -d /usr/local/website/jenkins/ # 工作目錄
drwxr-xr-x 2 jenkins jenkins 6 1月 2 11:39 /usr/local/website/jenkins/
# 啓動服務查看狀態
]# systemctl restart jenkins
]# systemctl status jenkins
#由於Jenkins不是Native Service,所以需要用chkconfig命令而不是systemctl命令
]# chkconfig jenkins on
]# chkconfig --list jenkins
jenkins 0:關 1:關 2:開 3:開 4:開 5:開 6:關
3、jenkins初始化
解鎖jenkins
JENKINS_HOME="/usr/local/website/jenkins" # 定義的目錄
]# cat /usr/local/website/jenkins/secrets/initialAdminPassword
選擇推薦的插件
下載等待
實例配置、這裏是url的訪問路徑 ,nginx反代也將使用這個地址
jenkins就緒準備
jenkins主界面
訪問界面
4、配置maven
4.1、安裝及配置
-
下載: 下載地址
-
配置&添加環境變量
local]# tar xf apache-maven-3.6.3-bin.tar.gz local]# ln -sv apache-maven-3.6.3 maven local]# echo "export PATH=$PATH:/usr/local/maven/bin" > /etc/profile.d/maven.sh && source /etc/profile.d/maven.sh ]# mvn -version Apache Maven 3.6.3 (cecedd343002696d0abb150b32b541b8a6ba2883f) Maven home: /usr/local/maven Java version: 1.8.0_181, vendor: Oracle Corporation, runtime: /usr/java/jdk1.8.0_181/jre修改默認下載倉庫
4.2、下載源配置
4.2.1、maven
]# vim /usr/local/maven/conf/settings.xml # 位置在157行
<mirrors>
<mirror>
<id>maven私服</id>
<name>私服name</name>
<url>maven私服,可以使用阿里或自定義/</url>
<mirrorOf>central</mirrorOf>
</mirror>
</mirrors>
4.2.2、jenkins
點高級(advanced) 站點地址
4.3、全局配置
4.3.1、配置maven
manage jenkins --> global tool configuration(全局配置) --> settings.xml 配置過下載源的文件
4.3.2、配置jdk
就在maven配置下面
4.3.3、配置maven
4.4、publish over ssh
4.4.1、安裝
4.4.2、私鑰
]# ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Created directory '/root/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
# 設置本地免密登陸
]# ssh-keygen -t rsa
]# cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys
]# chmod 600 !$
]# ssh localhost
# 如果還是不行查看 tailf /var/log/secure
4.4.3、配置ssh
manage jenkins --> configure system --> publish over SSH
5、構建
5.1、構建第一個工程
subversion構建
提供svn用戶密碼
清除之後重新編譯java類 clean compile install -Dmaven.test.skip=true
構建步驟, exec command爲最後的步驟,可以定義腳本
svn中pom.xml文件頭部,開發提供
<modelVersion>4.0.0</modelVersion>
<groupId>com.geokon</groupId>
<artifactId>name</artifactId>
<packaging>war</packaging>
<version>0.0.1-SNAPSHOT</version>
<name>gmonitor Maven Webapp</name>
<url>http://maven.apache.org</url>
# 拼起來就是 name-0.0.1-SNAPSHOT.war
5.2、構建查看
點擊項目--> build now --> 點擊構建項目進度條 --> 控制檯輸出日誌
# 等待
[JENKINS] Archiving /usr/local/website/jenkins/workspace/first_maven/pom.xml to com.geokon/gmonitor/0.0.1-SNAPSHOT/gmonitor-0.0.1-SNAPSHOT.pom
[JENKINS] Archiving /usr/local/website/jenkins/workspace/first_maven/target/gmonitor.war to com.geokon/gmonitor/0.0.1-SNAPSHOT/gmonitor-0.0.1-SNAPSHOT.war
channel stopped
SSH: Connecting from host [docker_v6]
SSH: Connecting with configuration [docker_v6] ...
SSH: Disconnecting configuration [docker_v6] ...
SSH: Transferred 1 file(s)
# 登陸 9.62服務器就能看到對應的war包了
~ ]# ls /mnt/gmonitor
gmonitor.war
6、docker
操作與構建一樣, docker:社區 19.03.5, jenkins: 2.210, 腳本 bash, svn
6.1、構建
清除之後重新編譯java類 clean compile install -Dmaven.test.skip=true
exec timout(ms) 時間需要加長: 默認 120000 加個0
構建之後控制檯輸出
6.2、腳本
6.2.1、Dockerfile
]# cat Dockerfile
FROM centos:7.6.1810
ADD jdk-8u181-linux-x64.tar.gz /data/
COPY apache-tomcat-8.5.38 /data/tomcat/
WORKDIR /data
ENV JAVA_HOME=/data/jdk1.8.0_181
ENV CATALINAME_HOME=/data/tomcat
ENV CATALINAME_VERSION=8.5.38
ENV PATH=$JAVA_HOME/bin:$CATALINAME_HOME/bin:$PATH
ENV LC_ALL=en_US.UTF-8
EXPOSE 8081
#CMD ["catalina.sh", "run"]
CMD ["run.sh"]
6.2.2、run.sh
]# cat apache-tomcat-8.5.38/bin/run.sh
#!/bin/bash
#
# Name: docker 容器運行
# Version Number:1.01
# Type: docker
# Language:bash shell
# Date:2019-12-31
# Author:xiong
# 啓動tomcat
bash /data/tomcat/bin/startup.sh
# 長期輸出catalina.out日誌, 如果不這麼定義需要在前處理catalina.out日誌
tail -f /data/tomcat/logs/catalina.out
6.2.3、jenkins腳本
]# cat /mnt/jenkins_docker.sh
#!/bin/bash
#
# Name:jenkins scripts
# Version Number:1.01
# Type:服務啓動腳本
# Language:bash shell
# Date:2020.01.03
# Author:xiong
#
# jenkins 傳遞參數說明*****: bash script 項目名稱 端口號
# svn中的pom.xml文件名稱必須與jenkins項目名稱對應,以及與docker名稱必須對應
# ps: 一個容器對應一個端口,強制性必須唯一
P_NAME=$1 # 接受參數 項目名稱
P_PORT=$2 # 項目端口
WEBSITE=/usr/local/website
R_PRO_NAME=${WEBSITE}/${P_NAME} # 相對程序路徑
R_PRO_NAME_WORK=${R_PRO_NAME}/work # work路徑
R_PRO_NAME_LOG=${R_PRO_NAME}/log # 日誌
R_PRO_NAME_LINK=${R_PRO_NAME_WORK}/${P_NAME} # 軟鏈接,灰度發佈
A_PRO_DATE_NAME=${P_NAME}`date +%Y%m%d%H%M` # 真實名稱,項目名稱
A_PRO_NAME=${R_PRO_NAME_WORK}/${A_PRO_DATE_NAME} # 真實訪問路徑
JENKINS_SAVE_DIR=/mnt/${P_NAME} # jenkins 提交的目錄 /mnt/gmonitor
delete_container() {
# 如果容器不存在, 解壓完之後就不在刪除配置文件,直接灰度
/usr/bin/docker container ls | /usr/bin/grep ${P_NAME} &>/dev/null
if [ $? -eq 0 ]; then
# 如果存在,先刪除容器,然後在配置上線
/usr/bin/docker container stop ${P_NAME} &>/dev/null
/usr/bin/docker container rm ${P_NAME} &>/dev/null
fi
project_config
}
project_config() {
[ ! -d "${R_PRO_NAME}" ] && /bin/mkdir ${R_PRO_NAME}/{log,work} -p
[ ! -d "${A_PRO_NAME}" ] && /bin/mkdir ${A_PRO_NAME} -p
/usr/bin/unzip ${JENKINS_SAVE_DIR}/*.war -d ${A_PRO_NAME}/ &>/dev/null # 解壓文件
# 如果存在軟鏈接說明曾經上過線
if [ -L "${R_PRO_NAME_LINK}" ]; then
if [ -d "${R_PRO_NAME_LINK}/upload" ]; then
/bin/rm -irf ${A_PRO_NAME}/upload
/bin/cp -i ${R_PRO_NAME_LINK}/upload ${A_PRO_NAME}/ -r
fi
/bin/rm -irf ${A_PRO_NAME}/WEB-INF/classes/*.properties # 清除配置文件
/bin/cp -i ${R_PRO_NAME_LINK}/WEB-INF/classes/*.properties ${A_PRO_NAME}/WEB-INF/classes/ -r
/bin/rm -irf ${R_PRO_NAME_LINK} &>/dev/null # 刪除軟鏈接
fi
/bin/ln -sv ${A_PRO_NAME} ${R_PRO_NAME_LINK} &>/dev/null
}
# 創建新容器
create_container() {
/usr/bin/docker run -it --name ${P_NAME} --network bridge -p ${P_PORT}:8081 -v ${R_PRO_NAME_LINK}:/usr/local/website/ -v ${R_PRO_NAME_LOG}:/data/tomcat/logs --memory 2048m --memory-reservation 2000m --oom-kill-disable --privileged --restart=on-failure:10 --env TZ='Asia/Shanghai' --volume /etc/localtime:/etc/localtime:ro -d v6-test/tomcat:v8.5.38-jdk8u181-1
}
delete_container
create_container