上回继续,本文以我托管在bitbucket上的一个开源项目spring-boot-rest-framework做为演示,讲解如何创建自动化部署。

一、创建item

点击ok继续,item的详情页面很长,我们分成一段段来讲解,最上面这部分,除了名字要填写外,其它全留空即可

然后是源代码管理部分,这是一个git项目,先在Repository URL这里填写上项目的git地址(即:红字1的位置),bitbucket是需要用户名密码才能访问的,所以Credentials这里要选择相应的用户名、密码(即:红字2的部分),红字3的部分为git获取的源代码分支名称,一般为master主分支,也可以改成自己希望的分支。

可能有同学会问,红字1处的git地址怎么得到? 这个很简单,bitbucket网站项目右上角里就有,见下图:

另外,红字2处对应的下拉框,首次进来时,应该是空的,可点击右侧的Add,添加用户名,密码,见下图:

然后在Build的部分,点击Add Build Step下拉框

本文中的这个项目是maven项目,所以我们选择Invoke Maven3

然后输入maven构建必要的参数,参考下图:

然后保存,创建完成。

二、开始构建

保存后,系统会返回首页,每个项目旁边有一个小三角箭头,选择Build Now

稍等片刻,左侧就会出现一个进度条,表示正在Building...

点击这个进度条上的链接,会看到构建详情

继续点击进度条前的#x的序号,会看到左侧有一个Console Output

点击output,可以实时看到构建过程中的所有输出,内容大致如下:

  1. SuccessConsole Output
  2.  
  3. Started by user 杨俊明
  4. Building in workspace /Users/yjmyzz/.jenkins/workspace/spring-boot-rest-framework
  5. > git rev-parse --is-inside-work-tree # timeout=10
  6. Fetching changes from the remote Git repository
  7. > git config remote.origin.url https://yangjunming@bitbucket.org/yangjunming/spring-boot-rest-framework.git # timeout=10
  8. Fetching upstream changes from https://yangjunming@bitbucket.org/yangjunming/spring-boot-rest-framework.git
  9. > git --version # timeout=10
  10. using .gitcredentials to set credentials
  11. > git config --local credential.username yangjunming@huijiame.com # timeout=10
  12. > git config --local credential.helper store --file=/var/folders/sk/2f7knc1518g57382y5s4zxsr0000gn/T/git8289517448278554241.credentials # timeout=10
  13. > git -c core.askpass=true fetch --tags --progress https://yangjunming@bitbucket.org/yangjunming/spring-boot-rest-framework.git +refs/heads/*:refs/remotes/origin/*
  14. > git config --local --remove-section credential # timeout=10
  15. > git rev-parse refs/remotes/origin/master^{commit} # timeout=10
  16. > git rev-parse refs/remotes/origin/origin/master^{commit} # timeout=10
  17. Checking out Revision b9f197e3214a6af98a5b039912cf062997593116 (refs/remotes/origin/master)
  18. > git config core.sparsecheckout # timeout=10
  19. > git checkout -f b9f197e3214a6af98a5b039912cf062997593116
  20. > git rev-list b9f197e3214a6af98a5b039912cf062997593116 # timeout=10
  21. Jenkins Artifactory Plugin version: 2.4.7
  22. Artifactory integration is disabled
  23. [spring-boot-rest-framework] $ /Library/Java/JavaVirtualMachines/jdk1.8.0_51.jdK/Contents/Home/bin/java -classpath /Users/yjmyzz/app/apache-maven-3.3.3/boot/plexus-classworlds-2.5.2.jar -Dmaven.home=/Users/yjmyzz/app/apache-maven-3.3.3 -Dclassworlds.conf=/Users/yjmyzz/app/apache-maven-3.3.3/bin/m2.conf -Dmaven.multiModuleProjectDirectory=/Users/yjmyzz/.jenkins/workspace/spring-boot-rest-framework/pom.xml org.codehaus.plexus.classworlds.launcher.Launcher -f pom.xml clean package -Dmaven.test.skip=true
  24. [INFO] Scanning for projects...
  25. [INFO]
  26. [INFO] ------------------------------------------------------------------------
  27. [INFO] Building spring-boot-rest-framework 1.0.0
  28. [INFO] ------------------------------------------------------------------------
  29. [INFO]
  30. [INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ spring-boot-rest-framework ---
  31. [INFO] Deleting /Users/yjmyzz/.jenkins/workspace/spring-boot-rest-framework/target
  32. [INFO]
  33. [INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ spring-boot-rest-framework ---
  34. [INFO] Using 'UTF-8' encoding to copy filtered resources.
  35. [INFO] Copying 1 resource
  36. [INFO] Copying 2 resources
  37. [INFO]
  38. [INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ spring-boot-rest-framework ---
  39. [INFO] Changes detected - recompiling the module!
  40. [INFO] Compiling 20 source files to /Users/yjmyzz/.jenkins/workspace/spring-boot-rest-framework/target/classes
  41. [WARNING] /Users/yjmyzz/.jenkins/workspace/spring-boot-rest-framework/src/main/java/spring/boot/rest/common/aop/ServiceMonitor.java: /Users/yjmyzz/.jenkins/workspace/spring-boot-rest-framework/src/main/java/spring/boot/rest/common/aop/ServiceMonitor.java uses unchecked or unsafe operations.
  42. [WARNING] /Users/yjmyzz/.jenkins/workspace/spring-boot-rest-framework/src/main/java/spring/boot/rest/common/aop/ServiceMonitor.java: Recompile with -Xlint:unchecked for details.
  43. [INFO]
  44. [INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) @ spring-boot-rest-framework ---
  45. [INFO] Not copying test resources
  46. [INFO]
  47. [INFO] --- maven-compiler-plugin:3.1:testCompile (default-testCompile) @ spring-boot-rest-framework ---
  48. [INFO] Not compiling test sources
  49. [INFO]
  50. [INFO] --- maven-surefire-plugin:2.18.1:test (default-test) @ spring-boot-rest-framework ---
  51. [INFO] Tests are skipped.
  52. [INFO]
  53. [INFO] --- maven-jar-plugin:2.5:jar (default-jar) @ spring-boot-rest-framework ---
  54. [INFO] Building jar: /Users/yjmyzz/.jenkins/workspace/spring-boot-rest-framework/target/spring-boot-rest-framework-1.0.0.jar
  55. [INFO]
  56. [INFO] --- spring-boot-maven-plugin:1.3.0.RELEASE:repackage (default) @ spring-boot-rest-framework ---
  57. [INFO] ------------------------------------------------------------------------
  58. [INFO] BUILD SUCCESS
  59. [INFO] ------------------------------------------------------------------------
  60. [INFO] Total time: 4.234 s
  61. [INFO] Finished at: 2016-01-18T23:41:28+08:00
  62. [INFO] Final Memory: 30M/273M
  63. [INFO] ------------------------------------------------------------------------
  64. Build step 'Invoke Maven 3' changed build result to SUCCES
  65. Finished: SUCCESS

从输出内容可以看出构建的整个过程:先从git上拉取源码,然后调用maven命令进行构建。只不过这一切是在UI界面完成的,以后项目的Build工作就可以交由运维甚至测试人员直接来做了,程序员只管提交代码即可。

三、远程分发

编译成功只是第一步,接下来要将编译后的文件打包上传到远程服务器,通常在上传前会压缩一下,即节省带宽,也方便传输。

参考刚才添加maven参数的做法,再次点击Add build step,只不过这次选择Execute shell,即执行脚本,脚本内容如下:

即:进入工作目录下的target目录,然后将编译后的jar包压缩成.tar.gz包,大家可以参考图中的命令自行调整。

接下来要上传到远程服务器,理论上讲,应该继续在上面的脚本里追加一行scp deploy.tar.gz user@remote_server:/remote_path之类的命令,大家可以尝试一下,最后执行时多半会报没有权限,原因是jenkins当前运行的账号通常不是root账号,权限不够。更好的做法是利用scp插件,以证书方式连接到远程服务器(具体配置请参考上节SSH相关的部分),参考下图:

在post-build actions下拉框里,选择Publish articifacts to SCP Repository

然后参考下图填写相应参数

然后保存,再次build,观察Console Output

  1. ...
  2. Build step 'Invoke Maven 3' changed build result to SUCCESS
  3. [spring-boot-rest-framework] $ /bin/bash -xe /var/folders/sk/2f7knc1518g57382y5s4zxsr0000gn/T/hudson5867298139164607521.sh
  4. + cd /Users/yjmyzz/.jenkins/workspace/spring-boot-rest-framework
  5. + cd target
  6. + tar zcf deploy.tar.gz spring-boot-rest-framework-1.0.0.jar
  7. [SCP] Connecting to deploy
  8. [SCP] uploading file: '/opt/deploy/deploy.tar.gz'
  9. Finished: SUCCESS

从输出看,上传文件已经ok

四、远程应用重启

最后就是远程将上传文件解压,并启动应用,我们可以事先写一个shell脚本,放在服务器上(或者参考上一步的做法,用scp插件上传到服务器),脚本内容参考下面这样:

  1. #!/bin/bash
  2. export JAVA_HOME=/opt/app/jdk1.8.0_65
  3. echo ${JAVA_HOME}
  4. dir_base=/opt/deploy
  5. cd ${dir_base}
  6. echo 'deploying...'
  7. if [ -r 'deploy.tar.gz' ];then
  8. tar -zxvf deploy.tar.gz
  9. fi
  10. rm -rf *.gz
  11. rm -rf ${dir_base}/logs
  12. jar_name='spring-boot-rest-framework-1.0.0.jar'
  13. if [ $(pgrep -f ${jar_name} | wc -l) -gt 0 ]; then
  14. pkill -9 -f ${jar_name}
  15. fi
  16. echo ${dir_base}/${jar_name}
  17. nohup ${JAVA_HOME}/bin/java -jar ${dir_base}/${jar_name} >/dev/null 2>&1 &
  18. sleep 2
  19. echo 'ok!'

这段脚本的大概意思是,先检测指定目录下有无deploy.tar.gz文件,有的话就解压,本文中的项目是一个spring-boot的项目,解压开后就是一个可独立运行的jar包,然后先检测当前进程中是否已经在运行,如果有,则先kill掉进程,最后用nohup以后台方式运行jar包。假设该脚本文件名为deploy.sh,具备执行权限,我们可以在jenkins中通过插件远程调用它,参考下图的配置:
  

最后build下,还是观察console output的变化:

  1. Build step 'Invoke Maven 3' changed build result to SUCCESS
  2. [spring-boot-rest-framework] $ /bin/bash -xe /var/folders/sk/2f7knc1518g57382y5s4zxsr0000gn/T/hudson3712003549124736229.sh
  3. + cd /Users/yjmyzz/.jenkins/workspace/spring-boot-rest-framework
  4. + cd target
  5. + tar zcf deploy.tar.gz spring-boot-rest-framework-1.0.0.jar
  6. [SCP] Connecting to deploy
  7. [SCP] uploading file: '/opt/deploy/deploy.tar.gz'
  8. SSH: Connecting from host [yangjunmingdeMacBook-Pro.local]
  9. SSH: Connecting with configuration [deploy] ...
  10. SSH: EXEC: STDOUT/STDERR from command [/opt/deploy/deploy.sh] ...
  11. /opt/app/jdk1.8.0_65
  12. deploying...
  13. spring-boot-rest-framework-1.0.0.jar
  14. tar: spring-boot-rest-framework-1.0.0.jar: time stamp 2016-01-20 22:52:15 is 143461.67416312 s in the future
  15. /opt/deploy/spring-boot-rest-framework-1.0.0.jar
  16. ok!
  17. SSH: EXEC: completed after 2,230 ms
  18. SSH: Disconnecting configuration [deploy] ...
  19. SSH: Transferred 0 file(s)
  20. Finished: SUCCESS

从第16行输出的ok来看,远程部署已经成功。  

最后上一张图,大致描述了整个流程:

jenkins 入门教程(中)的更多相关文章

  1. Jenkins入门教程

    Jenkins入门教程 @ 目录 Jenkins入门教程 1. 什么是Jenkins 1.1 我们为啥需要jenkins 1.2. Jenkin实现原理 2. Jenkins搭建 2.1. Jenki ...

  2. Jenkins入门教程(一):Windos下Jenkins的安装教程

    Jenkins的安装教程 Jenkins安装前的准备 1.安装jenkins前首先确保你的电脑已经安装了JDK,由于jenkins是基于java开发的 JDK下载地址 2.下载jenkins的安装包 ...

  3. jenkins 入门教程(下)

    接上回继续学习jenkins,这次主要来看一些疑难杂症: 一.yum install安装方式 除了直接java -jar jenkins.war方式,还可以用yum安装,这种方式下提供了更多的可配置选 ...

  4. jenkins 入门教程(上)

    jenkins是一个广泛用于持续构建的可视化web工具,持续构建说得更直白点,就是各种项目的"自动化"编译.打包.分发部署.jenkins可以很好的支持各种语言(比如:java, ...

  5. jenkins 入门教程(上)【转】

    转自:https://www.cnblogs.com/yjmyzz/p/jenkins-tutorial-part-1.html jenkins是一个广泛用于持续构建的可视化web工具,持续构建说得更 ...

  6. jenkins 入门教程

    jenkins是一个广泛用于持续构建的可视化web工具,持续构建说得更直白点,就是各种项目的"自动化"编译.打包.分发部署.jenkins可以很好的支持各种语言(比如:java, ...

  7. [转]Scrapy入门教程

    关键字:scrapy 入门教程 爬虫 Spider 作者:http://www.cnblogs.com/txw1958/ 出处:http://www.cnblogs.com/txw1958/archi ...

  8. Scrapy入门教程

    关键字:scrapy 入门教程 爬虫 Spider作者:http://www.cnblogs.com/txw1958/出处:http://www.cnblogs.com/txw1958/archive ...

  9. Realm for Android快速入门教程

    介绍 如果你关注安卓开发的最新趋势,你可能已经听说过Realm.Realm是一个可以替代SQLite以及ORMlibraries的轻量级数据库. 相比SQLite,Realm更快并且具有很多现代数据库 ...

随机推荐

  1. ASP.NET MVC导出excel(数据量大,非常耗时的,异步导出)

    要在ASP.NET MVC站点上做excel导出功能,但是要导出的excel文件比较大,有几十M,所以导出比较费时,为了不影响对界面的其它操作,我就采用异步的方式,后台开辟一个线程将excel导出到指 ...

  2. 变通实现微服务的per request以提高IO效率(三)

    *:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: 0 !important; } /* ...

  3. 微信js-sdk注意事项

    1.录音结束后播放需要localId,用 var voice = { localId: '', serverId: '' }; 来存储,然后用voice.localId引用 2.token和ticke ...

  4. 适应手机端的jQuery图片滑块动画DEMO演示

    在线预览 下载地址 实例代码 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "htt ...

  5. eclipse启动时报错 Could not create the java virtual machine

    eclipse启动的时候 报错 这是系统为eclipse分配的内存不足,需要去修改  eclipse.ini文件 eclipse.ini是eclipse 内存分配之类的配置文件   对java虚拟机的 ...

  6. WeakReference在Handler中的应用

    public class AutoActivity extends Activity { Handler handler = new Handler(){ public void handleMess ...

  7. 【代码笔记】iOS-通过颜色来生成一个纯色图片

    一,效果图. 二,代码. RootViewController.m - (void)viewDidLoad { [super viewDidLoad]; // Do any additional se ...

  8. python之局部变量引用赋值前的结果

    通过正则表达式,实现加减 昨晚在做计算器的时候,被一个BUG搞懵比了.现在再看看,发现我好小白啊~~ #++- num = input("please input:") sa = ...

  9. Android 最全Activity生命周期

    新进入Activity:onCreate > onStart > onResume 退出Activity:onPause > onStop > onDestroy 目前处于该A ...

  10. ORACLE查看补丁出现“OPatch failed with error code 1”

    案例场景:               在Oracle Linux Server release 5.7上安装完ORACLE 10g后,顺便将PSR(Patch Set Release)p681018 ...