快速组建Java项目持续集成环境

2014年时在这里就写过一篇关于持续集成的文章Jenkins 使用教程当时的Jenkins还是1.x版本,没想到5年过去了都9102年了,今天和朋友聊天还有团队在使用开发人员机器构建项目,人工ftp传到服务器上人工部署,累吗?也不安全啊。

最近在做一个小的项目使用Spring Boot框架,搭建开发真的简单,但人工部署了三次服务器就觉得麻烦了,就在家里的树莓派上装了个Jenkins帮我来做自动部署,现在的Jenkins已经内置了一个Java servlet 容器/应用程序服务器,直接执行jar包即可,不用再像之前一样还需要装个Tomcat当servlet容器。不过我现在用的还是派3 CPU弱了点,一开始构建项目派的两个核心的CPU就跑满,磁盘IO性能也不行。等大家多点赞我以后也能换个派4耍耍😄😄。

现在的整体框架环境是IDEA负责开发提交代码,github只是一个仓库负责存储代码,在有PUSH提交时触发Jenkins开始做构建动作。构建完成后按分支名字【develop分支上测试服,master分支上正式服】上不同的服务。并重启spring jar包。完成整个部署过程。

flow

创建Spring Boot项目,并生成Jenkinsfile文件

Java项目的IDE目前得推荐下IntelliJ IDEA,IJ分为两个版本按官方的解释Ultimate主要适合做WEB和企业应用比如支持Spring,而Community比较适合JVM和Android开发。但因为Spring Boot,现在社区版本对spring boot web的支持也不错,也可以断点调试。只是对于模板引擎支持真的比较惨。Java语言是主力开发的就花钱买Ultimate吧支持下人家团队,玩一玩的用Community就够了。

想让社区版使用向导创建Spring项目就需要先安装“Spring Assistant”这个插件,之后就可以使用向导来创建了,过程是:File->Project->Spring Assistant->Next->给项目起个名字,选择下项目类型和项目要使用的语言->Next->勾选下你要依赖的组件比如Spring Boot->Next->确定下项目的目录->Finish。一个最简单的SB项目创建好了。

为了配合Jenkins做构建,我们还要在项目中加点料。目前Jenkins主推是使用Pipelines来定义构建中的每一步,Pipelines又分为声明式和脚本化。相比脚本化的流水线语法,声明式提供更丰富的语法特性。声明式需要在项目的根目录创建一个 Jenkinsfile文件,来存放构建的脚本。具体的语法可以参考官方文档 流水线语法 我们直接用一个成品脚本来讲解。

pipeline {
  agent any
  environment {
    //目标服务器IP以及登陆名
    TAG_SERVER = 'guohai@guohai.org'
    //目标服务器程序部署路径
    TAG_PATH = '/data/vaccine.guohai.org'
    //目标服务器启动停止springboot脚本路径
    TAG_SCRIPT = '/data/spring-boot.sh'
  }

  stages {
    //构建块
    stage ('build') {
      steps {
         script{
            //获得maven程序路径
            def mvnHome = tool 'maven 3.6.0'
            //打包
            sh "${mvnHome}/bin/mvn clean package"
            echo "build over"
         }

      }
    }
    //部署块
    stage ('deploy') {
        steps {
            //计算本地文件MD5
            sh "md5sum ${WORKSPACE}/target/*.jar"
            //因为我们要使用私钥来操作远程服务器内容,下面的代码块需要使用withCredentials括起来,其中credentialsId为在Jenkins里配置的证书。keyFileVariable为代码块中可以使用的变量名
            withCredentials([sshUserPrivateKey(credentialsId: 'guohai.org', keyFileVariable: 'guohai_org_key', passphraseVariable: '', usernameVariable: '')]) {
                //拷贝本地JAR文件到服务器上
                sh "scp -i ${guohai_org_key} ${WORKSPACE}/target/*.jar ${TAG_SERVER}:${TAG_PATH}/${JOB_BASE_NAME}.jar"
                //计算拷贝到服务器上的文件 MD5,确保与本地一致。避免因传输产生的错误。
                sh "ssh -i ${guohai_org_key} ${TAG_SERVER} md5sum ${TAG_PATH}/${JOB_BASE_NAME}.jar"
                //使用脚本重启spring boot
                sh "ssh -i ${guohai_org_key} ${TAG_SERVER} ${TAG_SCRIPT} restart ${TAG_PATH}/${JOB_BASE_NAME}.jar"
            }

        }
    }
  }
}

设置下github仓库

仓库这块设置就比较简单了,去github创建一个空仓库。将本地代码push上来,然后去配置下webhooks。Payload URL里配置上你的Jenkins的通知地址。图片中遮挡部位是jenkins的IP或域名。默认是push事件会触发这个规则。你可以修改为自定义其它事件。


webhook

Jenkins的配置

如果你不需要在一台机器上跑多份Jenkins,建议还是尽量用系统包的方式来安装。比用war包形式省事很多,因我的派上装的是debian系统,这里我就用Debian/Ubuntu来举例。

wget -q -O - https://pkg.jenkins.io/debian/jenkins.io.key | sudo apt-key add -
sudo sh -c 'echo deb http://pkg.jenkins.io/debian-stable binary/ > /etc/apt/sources.list.d/jenkins.list'
sudo apt-get update
sudo apt-get install jenkins

安装完后会默认监听8080口,[这里有坑]但上一步的github回调在8080口上一直没有成功。派上的80口已经被nginx占用了,这里就不能修改jenkins的端口了,直接在nginx上配置一下反向代理即可。安装过程一路下一步就行,插件看你的情况适量安装。

  1. 配置Jenkins的Maven:maven可以手工安装,然后给jenkins配置环境变量就行,这里想偷懒直接让jenkins帮我下载安装。选择 系统管理->全局工具配置,在Maven分类下点击Maven安装勾选自动安装选择一个比较新的版本号。在Name标签中填写一个名字。这个名字要和Jenkinsfile里的一致。


    j-maven
  2. 配置连接远程服务器私钥:SSH服务器的连接建议尽量全用私钥的形式,不要使用用户名+密码不安全。在Jenkins里点击凭据->添加凭据。类型选择[SSH Username with private key],ID起一个唯一好记的名字就行,比如服务器IP或域名。用户名为远程主机用户名。在PrivateKey里选择Enter directly点击Add后选择你的私钥文件即可


    j-credentials
  3. 都配置完了我们来创建构建任务:名字,按你的项目起就行,类型选择流水线/Pipelines。在构建触发器要勾选下 [GitHub hook trigger for GITScm polling]这样上一步的提交钩子就能触发本地构建了。
  4. 将流水线内的定义切成 [Pipeline script from SCM] 配置好你的仓库地址和分支名字,脚本路径如果上次无变化保持默认即可。


    j-pipeline

Jenkins的部分到此结束。

线上服务器的配置

线上只要配置好权限,放一个脚本上去即可,脚本的功能是帮你重启jar包的。路径要和第一步里的Jenkinsfile里配置的一致。

结束语

至此整个过程1个小时左右,就全部搞定了。奉劝各位团队们不要在手工部署了太不安全了。也真的累啊

=====
更多历史原创文章,请扫码

wechat.jpg
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,590评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,808评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,151评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,779评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,773评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,656评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,022评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,678评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,038评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,756评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,411评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,005评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,973评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,053评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,495评论 2 343

推荐阅读更多精彩内容