第一集 hudson+gradle+git+maven(非必选)持续集成编译,打包,发布到仓库集成

前言

什么是持续集成

随着软件开发复杂度的不断提高,团队开发成员间如何更好地协同工作以确保软件开发的质量已经慢慢成为开发过程中不可回避的问题。尤其是近些年来,敏捷(Agile) 在软件工程领域越来越红火,如何能再不断变化的需求中快速适应和保证软件的质量也显得尤其的重要。

持续集成正是针对这一类问题的一种软件开发实践。它倡导团队开发成员必须经常集成他们的工作,甚至每天都可能发生多次集成。而每次的集成都是通过自动化的构建来验证,包括自动编译、发布和测试,从而尽快地发现集成错误,让团队能够更快的开发内聚的软件。
持续集成的核心价值在于:

1 持续集成中的任何一个环节都是自动完成的,无需太多的人工干预,有利于减少重复过程以节省时间、费用和工作量;
2 持续集成保障了每个时间点上团队成员提交的代码是能成功集成的。换言之,任何时间点都能第一时间发现软件的集成问题,使任意时间发布可部署的软件成为了可能;
3 持续集成还能利于软件本身的发展趋势,这点在需求不明确或是频繁性变更的情景中尤其重要,持续集成的质量能帮助团队进行有效决策,同时建立团队对开发产品的信心。

持续集成的原则

业界普遍认同的持续集成的原则包括:

1)需要版本控制软件保障团队成员提交的代码不会导致集成失败。常用的版本控制软件有Subversion Git 等;

2)开发人员必须及时向版本控制库中提交代码,也必须经常性地从版本控制库中更新代码到本地;

3)需要有专门的集成服务器来执行集成构建。根据项目的具体实际,集成构建可以被软件的修改来直接触发,也可以定时启动,如每半个小时构建一次;

4)必须保证构建的成功。如果构建失败,修复构建过程中的错误是优先级最高的工作。一旦修复,需要手动启动一次构建。

持续集成系统的组成

由此可见,一个完整的构建系统必须包括:

  • 一个自动构建过程,包括自动编译、分发、部署和测试等。

  • 一个代码存储库,即需要版本控制软件来保障代码的可维护性,同时作为构建过程的素材库。

  • 一个持续集成服务器。本文中介绍的 Jenkins /Hudson 就是一个配置简单和使用方便的持续集成服务器。

实战

准备工作(centos 7 为例)

下载安装

Hudson(戳一下进入官网)是一款轻量级、易扩展、易配置的持续集成平台,该集成平台maven2有良好的支持,并且扩展插件丰富,包括findbug,PMD静态分析插件、emma单元测试覆盖率插件、junit测试报告插件等等。
下面我们以Hudson持续集成平台为例,主要讲解怎么安装hudson和hudson扩展插件的使用,并以maven2工程为例,建立新作业。

  • 启动方式一

    nohup java -jar hudson-1.398.war >  hudson.log 2>&1 & // 启动hudson
  • 启动方式二

下载Hudson的war包,http://hudson-ci.org/ 在tomcat环境里,在confCatalinalocalhost 中新建配置文件hudson.xml,配置如下

<?xml version="1.0" encoding="UTF-8"?>
   <Context docBase="HudsonPath/hudson.war" path="hudson" reloadable="false">
</Context>

HudsonPath为hudson.war的目录路径。
启动tomcat,访问http://localhost:8080/hudson便能访问我们的持续集成应用了。Jboss环境中,复制war包到default目录下即可。如下为安装好以后的hudson访问界面。

安装插件

系统管理选择管理插件

图片描述
根据自己项目需要选择需要安装的插件,当然hudson也支持自己开发插件上传,这里就不赘述。
图片描述

系统配置

系统管理中进入系统设置

图片描述

图片描述
由于使用了gradle进行打包,上一步已经安装好了ant和gradle的插件。不过前提是安装好了jdk,git,gradle等的运行环境。具体怎么安装这里也不赘述,你可以去去问GG(google)

新建任务(job)

这里讲解两种,在我们的项目中也是有两种包,一种是jar包,也就是一些基础jar包,需要提供给其它项目使用。
另一种是服务包(tar),里面有4种内容,配置文件,自身的jar包,依赖的libs包,和相关的脚本(gradle和启服停服脚本)

基础的jar包(举例)

配置job明细如下:

配置任务信息

图片描述

配置脚本

由于每次发布jar到maven私服需要手动打开Nexus移除陈旧的jar包,这样比较耽误时间,这里补充一个shell脚本配置方式,在每次打发布jar包前,将maven私服中对应的jar包移除掉,再执行打包发布.配置如下:

图片描述
[注意:这里是hudson和maven私服是在同一个服务器上,如果不是得需ssh上去进行相应的操作]

拉取最新的代码到本地仓库,配置如下:

图片描述
[注意:/fishsaying/admin/code_server.txt这个文件是用来配置需要打包的代码的分支 配置好的效果如图所示]

图片描述图片描述

git仓库配置

需要将远程仓库的代码克隆到本地服务器,如/fishsaying/build_dir/sys
编写脚本获取需要动态选择的分支的最新代码到本地 代码如下
图片描述

gradle脚本编写

利用groovy语音编写,不会的小伙伴可以学习一下这个在安卓开发中常用
build.gradle脚本文件如下

apply plugin: 'java'
apply plugin: 'maven-publish'

// 设置 JDK 版本
sourceCompatibility = 1.8
targetCompatibility = 1.8
//打包的版本
def _version = System.properties['version'];

// 设置编译使用utf-8编码
tasks.withType(JavaCompile) {
options.encoding = "UTF-8"
}
//maven仓库地址
repositories {
    maven {
        url "http://192.168.3.108:8081/nexus/content/groups/public/"
    }
}
//依赖的第三方jar包
dependencies {
compile "com.fasterxml.jackson.core:jackson-annotations:2.4.0",
"com.fasterxml.jackson.core:jackson-core:2.3.3",
"com.fish.saying:fishsaying-log-sdk:2.0.0"
testCompile "junit:junit:3.8.1"
}
//说明打包成jar文件
task apiJar(type: Jar) {
    baseName "fishsaying"
    from sourceSets.main.output
}
//推送到maven私服 设置好骨架
publishing {
    publications {
        api(MavenPublication) {
            groupId 'com.fs.fishsaying-service-api'
            artifactId 'fishsaying-service-api'
            version _version
            from components.java
        }
    }
}
//制定需要deploy的maven仓库地址
publishing {
    repositories {
        maven {
            url "http://192.168.3.108:8081/nexus/content/repositories/thirdparty/"
            credentials {
                username 'admin'
                password 'admin123'
            }
        }
    }
}

补充:如何搭建maven私服请google这里不再赘述。
整个流程做完就可以进行打包工作,这里选择的是手动打包,持续集成中的第一步完成,后续增加自动部署,测试,上线的内容,敬请期待……^_^

小福利:持续集成
图片描述

小福利:推荐一部美剧 《硅谷黑历史》 为什么?因为里面的程序员哥们也是用的这个工具hudson 点击下载 ……^_^


kevin
215 声望28 粉丝

stay hungry stay foolish