在當今互聯網行業乃至一些大廠,大部分公司都采用敏捷項目管理模式來管理項目,在敏捷十二條宣言中有一條是這樣說:“我們的最高目標是,通過盡早和持續地交付有價值的軟件來滿足客戶”,通過這一條我們可以看出,項目的持續集成和持續部署發布對客戶來說是非常重要的。
通過網絡搜索和查閱相關資料,能夠完成CI/CD持續集成持續部署的工具有很多種,最常用的一般是赫赫有名的Jenkins。Jenkins是采用JAVA語言編寫支持許多插件,除過基本的功能外其他的擴展功能都可以通過插件的形式來完成,包括集成現在比較火的Docker,Kubernetes,AWS等。
在實際的項目開發過程中,Jenkins的典型工作流如下圖:
通過這張圖我們可以簡單的理解在整個CI/CD的工作流中,數據的流轉是:
- DBA,Developer,Operations,Tester將代碼提交到版本管理工具中,例如:GIT,SVN等;
- CI服務器會手動觸發或者定時觸發去版本管理工具中拉取代碼進行編譯,打包操作,在這個過程中還可以完成對代碼的質量檢查,單元測試等;
- CI服務器將打包后的二進制文件部署到目標服務器(環境)中,根據CI服務器的配置,如果配置了多個環境,可以將打包后的文件部署到SIT,UAT或者PROD等;
下面我們就通過一個簡單的案例來看看Jenkins是如何實現CI/CD持續集成持續部署功能的,具體的環境如下:
- linux centos 7
- Jenkins latest
- Sonar latest
步驟一:通過官網下載Jenkins最新安裝包
我們找到Jenkins的官網:https://jenkins.io/zh/
通過上圖我們可以看到Jenkins支持許多操作系統和環境部署,而且我們還可以通過官網下載到Jenkins的源代碼,在這里我們下載最新的二進制文件war包,它可以部署到Tomcat也可以通過命令行的方式啟動,我們采用第二種方式命令行的方式部署Jenkins。
步驟二:編寫Jenkins啟動腳本start_jenkins.sh
#!/bin/bash ? # Author:xiaobaoqiang ? JENKINS_LOG=/tmp/jenkins.log JENKINS_JAR=/root/jenkins.war PID_FILE=/run/jenkins.pid ? # start function function start(){ # pring message echo "Checking jenkins ..." # check Jenkins is running or not PID=`ps auwx | grep ${JENKINS_JAR} | grep -v grep | awk '{print $2}'` if [ $PID ]; then echo "Jenkins is Running at PID:$PID, Don't start again." exit 0 else echo "Jenkins is not running, will be started." fi ? # pring message echo "Jenkins starting ..." ? # start jenkins nohup java -jar ${JENKINS_JAR} > ${JENKINS_LOG} 2>&1 & ? # start jenkins status status=$? ? if [[ $status != 0 ]]; then echo "Failed to start jenkins, return code: $status. Please check ${JENKINS_LOG} for more information." exit $status; fi ? # sleep sleep 2s ? # PID PID=`ps auwx | grep ${JENKINS_JAR} | grep -v grep | awk '{print $2}'` ? if [ ! $PID ]; then echo "Start jenkins Failed. Please check ${JENKINS_LOG} for more information." else echo $PID > ${PID_FILE} echo "Jenkins is started at PID:$PID" fi } ? # stop function function stop(){ # pring message echo "Jenkins stopping ..." # PID PID=`ps auwx | grep ${JENKINS_JAR} | grep -v grep | awk '{print $2}'` ? if [ ! $PID ]; then echo "Jenkins is not running. Please check jenkins is running or not." else kill -9 $PID rm -f ${PID_FILE} echo "Jenkins is stopped." fi } ? # restart function function restart(){ stop start } ? # status function function status(){ # pring message echo "Checking jenkins ..." # PID PID=`ps auwx | grep ${JENKINS_JAR} | grep -v grep | awk '{print $2}'` ? if [ ! $PID ]; then echo "Jenkins is not running. Please check jenkins is running or not." else echo "Jenkins is started at PID:$PID" fi } ? case "$1" in start ) echo "************************************************" start echo "************************************************" ;; stop ) echo "************************************************" stop echo "************************************************" ;; restart ) echo "************************************************" restart echo "************************************************" ;; status ) echo "************************************************" status echo "************************************************" ;; * ) echo "************************************************" echo "Usage: start_jenkins.sh ( commands ... )" echo "commands:" echo " start start jenkins" echo " stop stop jenkins" echo " restart restart jenkins" echo " status status jenkins" echo "************************************************" ;; esac exit 0
上面的Jenkins啟動腳本包括了Jenkins的啟動,停止和重啟功能。
我們也可以通過下面一條簡單的命令來啟動Jenkins:
java -jar jenkins.war
通過這種簡單的方式當我們按Ctrl+C或者關閉命令行的時候,Jenkins就會被停止掉。
步驟三:啟動Jenins服務
通過上一步驟我們編寫的啟動腳本啟動Jenkins
[root@dev01 ~]# ./start_jenkins.sh start ************************************************ Checking jenkins ... Jenkins is not running, will be started. Jenkins starting ... Jenkins is started at PID:20755 ************************************************
查看下Jenkins的啟動日志:
十月 27, 2019 11:08:03 上午 org.springframework.context.support.AbstractApplicationContext prepareRefresh 信息: Refreshing org.springframework.web.context.support.StaticWebApplicationContext@43a00e48: display name [Root WebApplicationContext]; startup date [Sun Oct 27 11:08:03 CST 2019]; root of context hierarchy 十月 27, 2019 11:08:03 上午 org.springframework.context.support.AbstractApplicationContext obtainFreshBeanFactory 信息: Bean factory for application context [org.springframework.web.context.support.StaticWebApplicationContext@43a00e48]: org.springframework.beans.factory.support.DefaultListableBeanFactory@6de44024 十月 27, 2019 11:08:03 上午 org.springframework.beans.factory.support.DefaultListableBeanFactory preInstantiateSingletons 信息: Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@6de44024: defining beans [filter,legacy]; root of factory hierarchy 十月 27, 2019 11:08:03 上午 jenkins.InitReactorRunner$1 onAttained 信息: Completed initialization 十月 27, 2019 11:08:03 上午 hudson.WebAppMain$3 run 信息: Jenkins is fully up and running
通過日志信息可以看到Jenkins已經完全啟動了。
步驟四:登陸Jenkins
我們以管理員root的身份登陸Jenkins,打開
http://localhost:8080/pluginManager/ 可以查看和安裝我們需要的插件,對Java語言來說最常用的應該是Maven插件了
可以看到,通過上面簡單的步驟一個Jenkins服務我們已經部署成功了,然后我們就可以利用我們的Jenkins服務來部署和發布我們的項目了,達到持續部署持續集成的目的。
參考:
https://jenkins.io/zh/doc/book/installing/
文章如有不妥之處,歡迎指正!謝謝!