使用Ant构建Jenkins插件

时间:2013-07-26 11:25:12

标签: ant jenkins jenkins-plugins

我的公司只使用Ant来构建项目。但是,Jenkins only suggests Maven作为插件开发的构建工具。

如何使用Ant将我的Jenkins插件打包到.hpi文件并不惜一切代价避免使用Maven?

2 个答案:

答案 0 :(得分:1)

这是一种使用Ant构建Jenkins插件的方法。让我们创建一个构建plugin skeleton的脚本,其名称是“真棒”。

默认插件arborescence

awesome-plugin/
-- awesome/
   -- src/
   -- pom.xml

<强>说明

  1. 添加包含以下jar的lib/文件夹:
    • 可以在Jenkins主目录Jenkins\war\WEB-INF\lib中找到( note :您必须使用当前Jenkins使用的完全相同的版本):
      • 访问变性剂的注释-1.4.jar
      • 桥法的注释-1.4.jar
      • 公地-IO-1.4.jar
      • 番石榴11.0.1.jar
      • 詹金斯核-1.513.jar
      • JS​​ON-LIB-2.4詹金斯-1.jar
      • 远程-2.23.jar
      • sezpoz-1.9.jar
      • 订书机1.207.jar
    • 可在网上找到(您可以选择上次发布的版本):
  2. 将现有pom.xml替换为以下build.xml
  3. 在Ant脚本中,您应该适应:
    • 项目名称,此处awesome
    • 插件版本,
    • 此插件的Jenkins版本,
    • 项目group.id(主程序包),org.jenkinsci.plugins.awesome此处。
  4. 新插件arborescence

    awesome-plugin/
    -- awesome/
       -- src/
       -- lib/
          -- you should have 10 jars here
       -- build.xml
    

    的build.xml

    <!-- Project dependent properties -->
    <property name="project_name" value="awesome"/>
    <property name="project_version" value="1.0"/>
    <property name="jenkins_version" value="1.513"/> <!-- which version of Jenkins is this plugin built against? -->
    <property name="project_groupid" value="org.jenkinsci.plugins.awesome"/>
    
    <!-- Build properties -->
    <property name="lib_dir" value="./lib"/>
    <property name="bin_dir" value="./bin" />
    <property name="target_dir" value="./target"/>
    <property name="target_bin_dir" value="${target_dir}/${project_name}"/>
    <property name="plugin_targetMetaInf_dir" value="${target_bin_dir}/META-INF"/>
    <property name="plugin_targetWebInf_dir" value="${target_bin_dir}/WEB-INF"/>
    <property name="plugin_targetWebInfBin_dir" value="${plugin_targetWebInf_dir}/classes"/>
    
    <!-- Project paths -->
    <path id="project.source.path">
        <pathelement path="src/main/java" />
    </path>
    <path id="project.class.path">
        <fileset dir="${lib_dir}" includes="*.jar"/>    
    </path>
    
    <!-- Build flow -->
    <target name="build">
        <antcall target="clean" />
        <antcall target="compile" />
        <antcall target="createTreeDirectory" />
        <antcall target="copyBin"/>
        <condition property="has_file">
            <and>
                <available file="${target_dir}/${project_name}.hpi" type="file"/>
            </and>
        </condition>
        <antcall target="createHpi"/>
        <condition property="has_dir">
            <and>
                <available file="${target_bin_dir}" type="dir"/>
            </and>
        </condition>
        <antcall target="cleanTargetDirectory" />
    </target>
    
    <!-- Cleans existing binaries -->
    <target name="clean">
        <delete includeEmptyDirs="true" quiet="true">
            <fileset dir="${bin_dir}" />
        </delete>
        <mkdir dir="${bin_dir}"/>
    </target>
    
    <!-- Compiles JAVA code -->
    <target name="compile">
        <javac includeantruntime="false" destdir="${bin_dir}" debug="false" optimize="${optimize}" deprecation="${deprecation}" classpathref="project.class.path">
            <src refid="project.source.path" />
        </javac>
    </target>
    
    <!-- Creates necessary target folders -->
    <target name="createTreeDirectory" >
        <mkdir dir="${target_bin_dir}"/>
        <mkdir dir="${plugin_targetMetaInf_dir}"/>
        <mkdir dir="${plugin_targetWebInf_dir}"/>
        <mkdir dir="${plugin_targetWebInfBin_dir}"/>
    </target>
    
    <!-- Moves new binaries to the plugin target -->
    <target name="copyBin">
        <copy todir="${plugin_targetWebInfBin_dir}" >
            <fileset dir="${bin_dir}"/>
            <fileset dir="src/main/resources"/>
        </copy>
    </target>
    
    <!-- Cleans the target directory -->
    <target name="cleanTargetDirectory" if="has_dir">
        <delete dir="${target_bin_dir}"/>
    </target>
    
    <!-- Backup previous plugin -->
    <target name="saveOldHpiFile" if="has_file">
        <move file="${target_dir}/${project_name}.hpi" tofile="${target_dir}/${project_name}.save.hpi"/>
    </target>
    
    <!-- Archives the plugin -->
    <target name="createHpi">
        <antcall target="saveOldHpiFile"/>
        <jar destfile="${target_dir}/${project_name}.hpi" basedir="${target_bin_dir}">
            <manifest>
                <attribute name="Manifest-Version" value="{project_version}"/>
                <attribute name="Built-By" value="${user.name}"/>
                <attribute name="Created-By" value="${user.name}"/>
                <attribute name="Build-Jdk" value="${ant.java.version}"/>
                <attribute name="Extension-Name" value="${project_name}"/>
                <attribute name="Implementation-Title" value="${project_name}"/>
                <attribute name="Implementation-Version" value="${version}"/>
                <attribute name="Group-Id" value="${project_groupid}"/>
                <attribute name="Short-Name" value="${project_name}"/>
                <attribute name="Long-Name" value="${project_name}"/>
                <attribute name="Plugin-Version" value="${project_version}"/>
                <attribute name="Jenkins-Version" value="${jenkins_version}"/>
                <attribute name="Hudson-Version" value="${jenkins_version}"/>
            </manifest>
        </jar>
    </target>
    

    要向cd启动构建,build.xml并输入ant

答案 1 :(得分:0)

我知道你“不惜一切代价”说过,但妥协可能会减少努力,仍然可以提供超快速的构建。我试图避免maven的一个重要原因是编译时间是sloooowwwwww。也就是说,maven非常擅长创建hpl文件和处理依赖项。以下目标对于帮助设置超快速非maven构建非常有用:

  • 使用'mvn hpi:hpl'生成hpl文件
  • 使用'mvn dependency:copy-dependencies'下载所有依赖项,并将它们放入目标/依赖项中,在这里很容易从ant脚本中引用它们(如果需要,可以从lib到目标添加符号链接) /依赖性)