在互聯網時代,對于每一家公司,軟件開發和發布的重要性不言而喻,目前已經形成一套標準的流程,最重要的組成部分就是持續集成(CI)及持續部署、交付(CD)。本文基于Jenkins+Docker+Git實現一套CI自動化發布流程。
1、發布流程設計
工作流程:
1.開發人員提交代碼到Git版本倉庫;
2.Jenkins人工/定時觸發項目構建;
3.Jenkins拉取代碼、代碼編碼、打包鏡像、推送到鏡像倉庫;
4.Jenkins在Docker主機創建容器并發布。
環境規劃如下:
角色IP
Jenkins/Docker 192.168.0.13
Docker 192.168.0.14
Git/Registry 192.168.0.15
操作系統:centos7.5
systemctl stop firewalld
setenforce 0
yum install -y ntpdate
ntpdate time.windows.com
2、部暑git倉庫
1、創建Git用戶并設置密碼
# yum install -y git
2、創建Git用戶并設置密碼
# useradd git
# passwd git
3、創建倉庫
# su - git
# mkdir solo.git
# cd solo.git
# git --bare init
4、訪問這個倉庫
# git clone git@192.168.0.15:/home/git/solo.git
3、準備jenkins環境
Jenkins是一個開源軟件項目,是基于JAVA開發的一種持續集成工具,用于代碼編譯、部署、測試等工作。 Jenkins也是一個跨平臺的,大多數主流的平臺都支持,而且安裝很簡單,我們這里以部署war包方式安裝它。
官網下載地址:
https://jenkins.io/download/
如圖點擊下載最后一個Generic Java package(war):
在安裝前需要具備Java環境,安裝方式如下:
# tar -xzf jdk-8u45-linux-x64.tar.gz
# mv jdk1.8.0_45/ /usr/local/jdk1.8
# vi /etc/profile
JAVA_HOME=/usr/local/jdk1.8
PATH=$PATH:$JAVA_HOME/bin
CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export JAVA_HOME PATH CLASSPATH
# source /etc/profile
# java -version
在192.168.0.13主機安裝Jenkins,下載Tomcat二進制包將war包到webApps下即可:
# wget http://mirrors.jenkins.io/war-stable/latest/jenkins.war
# tar -xzf Apache-tomcat-8.5.31.tar.gz
# mv apache-tomcat-8.5.31 /usr/local/tomcat-jenkins
# rm /usr/local/tomcat-jenkins/webapps/* -rf
# unzip jenkins.war -d /usr/local/tomcat-jenkins/webapps/ROOT
# cd /usr/local/tomcat-jenkins/bin/
# ./startup.sh
# tail ../logs/catalina.out -f
...
Jenkins initial setup is required. An admin user has been created and a password generated.
Please use the following password to proceed to installation:
063de6a478ac44fb8d807a8a46313e38
This may also be found at: /root/.jenkins/secrets/initialAdminPassword
部署成功,訪問Jenkins:http://192.168.0.13:8080
第一步:輸入上面日志輸出的密碼:
063de6a478ac44fb8d807a8a46313e38
,或者從本機
/root/.jenkins/secrets/initialAdminPassword文件獲取,點擊繼續
第二步:點擊“選擇插件來安裝”
第三步:保持默認,點擊繼續
第四步:創建管理員用戶,保存并完成
第五步:設置Jenkins訪問地址,保持默認,點擊保存完成
安裝完成,開始使用Jenkins:
4、安裝docker
在
192.168.0.13/192.168.0.14/192.168.0.15主機安裝Docker,如下:
1、安裝依賴包
# yum install -y yum-utils device-mapper-persistent-data lvm2
2、添加Docker軟件包源:
# yum-config-manager
--add-repo
https://download.docker.com/linux/centos/docker-ce.repo
3、安裝Docker CE
# yum install docker-ce -y
4、配置加速器
# curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://bc437cce.m.daocloud.io
5、啟動并開機啟動
# systemctl start docker
# systemctl enable docker
5、部署私有鏡像倉庫
Docker Hub作為Docker默認官方公共鏡像;如果想自己搭建私有鏡像倉庫,官方也提供registry鏡像,使得搭建私有倉庫非常簡單。
在192.168.0.15部署:
# docker run -d -v /opt/registry:/var/lib/registry -p 5000:5000 --restart=always --name registry registry
接下來測試registry可用性。
由于Docker CLI默認以HTTPS訪問,而部署的registry并未提供HTTPS,因此,需要在pull鏡像的Docker主機(192.168.0.13,192.168.0.14)添加HTTP可信任:
# vi /etc/docker/daemon.json
{
"registry-mirrors": ["http://bc437cce.m.daocloud.io"],
"insecure-registries": ["192.168.0.15:5000"]
}
# systemctl restart docker
6、構建Tomcat基礎鏡像
JAVA程序必須有JDK環境才可以運行,為了減少鏡像大小及提高性能,這里直接把JDK放到宿主機上,容器以掛載形式使用。
在192.168.0.13/192.168.0.14安裝JDK:
# tar -xzf jdk-8u45-linux-x64.tar.gz
# mv jdk1.8.0_45/ /usr/local/jdk1.8
# vi /etc/profile
JAVA_HOME=/usr/local/jdk1.8
PATH=$PATH:$JAVA_HOME/bin
CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export JAVA_HOME PATH CLASSPATH
# source /etc/profile
# java -version
Tomcat基礎鏡像Dockerfile:
# cat Dockerfile
FROM centos:7
MAINTAINER andy
ENV VERSION=8.5.31
ENV JAVA_HOME /usr/local/jdk1.8
COPY apache-tomcat-8.5.31.tar.gz /opt
#RUN yum install wget -y
#RUN wget http://mirrors.shu.edu.cn/apache/tomcat/tomcat-8/v${VERSION}/bin/apache-tomcat-${VERSION}.tar.gz &&
RUN cd /opt &&
tar zxf apache-tomcat-${VERSION}.tar.gz &&
mv apache-tomcat-${VERSION} /usr/local/tomcat &&
rm -rf apache-tomcat-${VERSION}.tar.gz /usr/local/tomcat/webapps/* &&
mkdir /usr/local/tomcat/webapps/ROOT
EXPOSE 8080
CMD ["catalina.sh", "run"]
# docker build -t 192.168.0.15:5000/tomcat-85 -f Dockerfile .
# docker push 192.168.0.15:5000/tomcat-85
7、Jenkins配置全局工具配置
主頁面 -> 系統管理 -> 全局工具配置
指定JDK、Maven路徑,Git保持默認:
安裝git:
# yum install git -y
安裝maven:
下載地址:
http://maven.apache.org/download.cgi
# tar -xzf apache-maven-3.5.4-bin.tar.gz -C /usr/local/
# cd /usr/local/
# mv apache-maven-3.5.4/ maven
配置環境變量:
# cat /etc/profile
export MAVEN_HOME=/usr/local/maven
export PATH=$MAVEN_HOME/bin:$PATH
# source /etc/profile
# mvn -v
8、Jenkins安裝必要插件
1. Jenkins安裝必要插件
主頁面 -> 系統管理 ->管理插件:
安裝SSH與Git Parameter插件。
插件說明:
•SSH:用于SSH遠程Docker主機執行Shell命令
•Git Parameter:動態獲取Git倉庫Branch、Tag
2. 配置SSH插件
第一步:先創建一個用于連接Docker主機的憑據。
主頁面 -> 憑據 -> 系統 -> 右擊全局憑據 -> 添加憑據:
輸入連接Docker主機的用戶名和密碼:
第二步:添加SSH遠程主機
主頁面 -> 系統管理 -> 系統設置 -> SSH remote hosts:
9、上傳JAVA項目代碼到Git倉庫
從GitHub拉取開源Java博客系統solo:
# git clone -b v2.9.0 https://github.com/b3log/solo.git
# cd solo
修改Git地址:
# vim .git/config
[core]
repositoryformatversion = 0
filemode = true
bare = false
logallrefupdates = true
[remote "origin"]
url = git@192.168.0.15:/home/git/solo.git
fetch = +refs/heads/*:refs/remotes/origin/*
提交代碼到Git倉庫
# git add .
# git commit -m 'solo'
創建標簽
# git tag 1.0.0
推送到Git服務器
# git push origin 1.0.0
10、Jenkins創建項目并發布測試
主頁面 -> 新建任務 -> 輸入任務名稱,構建一個Maven項目:
注意:如果沒有顯示“構建一個Maven項目”選項,需要在管理插件里安裝“Maven Integration plugin”插件。
配置Git參數化構建:
動態獲取Git倉庫tag,與用戶交互選擇Tag發布:
指定項目Git倉庫地址:
jenkins服務器配置:
# ssh-keygen
# ssh-copy-id git@192.168.0.15
修改*/master為$Tag,Tag是上面動態獲取的變量名,表示根據用戶選擇打代碼版本。
設置maven構建命令選項:
clean package -Dmaven.test.skip=true
利用pom.xml文件構建項目。
在Jenkins本機鏡像構建與推送到鏡像倉庫,并SSH遠程連接到Docker主機使用推送的鏡像創建容器:
上圖中,在Jenkins主機執行的Shell命令如下:
REPOSITORY=192.168.0.15:5000/solo:${Tag}
# 構建鏡像
cat > Dockerfile << EOF
FROM 192.168.0.15:5000/tomcat-85:latest
RUN rm -rf /usr/local/tomcat/webapps/ROOT
COPY target/*.war /usr/local/tomcat/webapps/ROOT.war
ENV PATH /usr/local/tomcat/bin:$PATH
CMD ["catalina.sh", "run"]
EOF
docker build -t $REPOSITORY .
# 上傳鏡像
docker push $REPOSITORY
上圖中,SSH遠程Docker主機執行的Shell命令如下:
REPOSITORY=192.168.0.15:5000/solo:${Tag}
# 部署
docker rm -f blog-solo |true
docker image rm $REPOSITORY |true
docker container run -d --name blog-solo -v /usr/local/jdk1.8:/usr/local/jdk1.8 -p 88:8080 $REPOSITORY
注:容器名稱blog-solo,暴露宿主機端口88,即使用宿主機IP:88訪問blog-solo項目。
blog-solo項目已配置完成,開始構建:
選擇tag,開始構建:
點擊左下角構建歷史里,右擊第一個查看控制臺輸出:
瀏覽器訪問solo項目:http://192.168.0.14:88