在当今互联网行业乃至一些大厂,大部分公司都采用敏捷项目管理模式来管理项目,在敏捷十二条宣言中有一条是这样说:“我们的最高目标是,通过尽早和持续地交付有价值的软件来满足客户”,通过这一条我们可以看出,项目的持续集成和持续部署发布对客户来说是非常重要的。
通过网络搜索和查阅相关资料,能够完成CI/CD持续集成持续部署的工具有很多种,最常用的一般是赫赫有名的Jenkins。Jenkins是采用JAVA语言编写支持许多插件,除过基本的功能外其他的扩展功能都可以通过插件的形式来完成,包括集成现在比较火的Docker,Kubernetes,AWS等。
在实际的项目开发过程中,Jenkins的典型工作流如下图:
通过这张图我们可以简单的理解在整个CI/CD的工作流中,数据的流转是:
下面我们就通过一个简单的案例来看看Jenkins是如何实现CI/CD持续集成持续部署功能的,具体的环境如下:
步骤一:通过官网下载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/
文章如有不妥之处,欢迎指正!谢谢!