如何使用 Jenkins & Ant 从 Git 存储库子目录构建?



我已将 Jenkins CI 配置为与 GitHub 配合使用。 它成功填充了我的 ${workspace},但我想构建的实际项目位于存储库的子目录中:

https://github.com/androidfu/CodeExamples

从 Jenkins 中调用 Ant 表示它找不到 build.xml。 嗯,这是因为build.xml实际上存在于${workspace}/DeveloperDebugPreferences中。

你可以配置 Ant 在 Jenkins 中使用的构建文件。如果要浏览到 Jenkins 服务器上的作业,可以选择"配置",然后选择 Ant 目标下方的"高级"选项。

如果您希望编辑config.xml文件,则应看到如下所示的构建设置:

<builders>
  <hudson.tasks.Ant>
    <targets>your_target_name</targets>
    <buildFile>${workspace}/DeveloperDebugPreferences/build.xml</buildFile>
  </hudson.tasks.Ant>
</builders>
我想更

进一步,制作一个在提交到 Git 时启动的构建系统,它将检查代码,构建它并通过 SSH 发布它。此外,我希望在文件名中标记构建的提交。第一步是使用 git 中的 post-receive 和本地安装的 Jenkins 启动构建过程。如果是远程的,则需要指定一个 URL 并使用 wget 或 curl。作为参考,这是我们的 Git 分支模型。


Git 后接收

# This must be read using read because the values are passed on 
# STDIN not as command-line arguments.
read OLDREV NEWREV REFNAME
BRANCH=${REFNAME#refs/heads/} 
. /usr/share/doc/git-core/contrib/hooks/post-receive-email
if [ ${BRANCH} == "master" ]; then
    /usr/local/bin/jenkins-start "Our Project - Android - Releases"
elif [ ${BRANCH} == "develop" ]; then
    /usr/local/bin/jenkins-start "Our Project - Android - Development"
fi

詹金斯

开发

方面与发布基本相同,但我们不是 master,而是建立在对开发分支的提交之上。由于该服务器仅托管 git 和 Jenkins,并且 Eclipse 和 Xcode 环境安装在 Mac Mini 上,因此 Jenkins 配置为使用 SSH 和证书进行登录。Jenkins 服务器 SSH 到构建服务器,签出代码,构建代码,并将结果 SSH 发送到我们的软件架上。唯一特殊的部分是 Ant 构建.xml这是完成这项工作的部分。

在"构建 - 执行外壳"下 - 我们放置的命令

~/android-sdks/tools/android update project -p "$WORKSPACE/OurProject" 

在调用 Ant 下

-buildfile "$WORKSPACE/OurProject/build.xml" clean debug

蚂蚁属性

这是我们放置有关用于对二进制文件进行签名的密钥库的信息的位置。

key.store=ourProject.keystore
key.alias=release
key.store.password=aBigSecret
key.alias.password=aBigSecret

构建.xml

因此,在项目构建中.xml我们覆盖了几个目标,以使 git 提交哈希出现在文件名中。例如,OurProject 1.0.0 (deadbeef(-release.apk。构建完成后,Jenkins 将文件复制到我们的软件架上。

<target name="-set-debug-files" depends="-set-mode-check">
    <exec executable="git" outputproperty="git.revision" failifexecutionfails="false" errorproperty="">
        <arg value="rev-parse"/>
        <arg value="--short"/>
        <arg value="HEAD"/>
    </exec>
    <xpath input="AndroidManifest.xml"
           expression="/manifest/@android:versionName"
           output="android.app.version.name"
           default="Unknown" />
    <property name="out.packaged.file" location="${out.absolute.dir}/${ant.project.name}-debug-unaligned.apk" />
    <property name="out.final.file" location="${out.absolute.dir}/${ant.project.name}-${android.app.version.name} (${git.revision})-debug.apk" />
    <property name="build.is.mode.set" value="true" />
</target>
<target name="-set-release-mode" depends="-set-mode-check">
    <exec executable="git" outputproperty="git.revision" failifexecutionfails="false" errorproperty="">
        <arg value="rev-parse"/>
        <arg value="--short"/>
        <arg value="HEAD"/>
    </exec>
    <xpath input="AndroidManifest.xml"
           expression="/manifest/@android:versionName"
           output="android.app.version.name"
           default="Unknown" />
    <property name="out.packaged.file" location="${out.absolute.dir}/${ant.project.name}-release-unsigned.apk" />
    <property name="out.final.file" location="${out.absolute.dir}/${ant.project.name}-${android.app.version.name} (${git.revision})-release.apk" />
    <property name="build.is.mode.set" value="true" />
    <!-- record the current build target -->
    <property name="build.target" value="release" />
    <property name="build.is.instrumented" value="false" />
    <!-- release mode is only valid if the manifest does not explicitly
         set debuggable to true. default is false. -->
    <xpath input="AndroidManifest.xml" expression="/manifest/application/@android:debuggable"
            output="build.is.packaging.debug" default="false"/>
    <!-- signing mode: release -->
    <property name="build.is.signing.debug" value="false" />
    <!-- Renderscript optimization level: aggressive -->
    <property name="renderscript.opt.level" value="${renderscript.release.opt.level}" />
    <if condition="${build.is.packaging.debug}">
        <then>
            <echo>*************************************************</echo>
            <echo>****  Android Manifest has debuggable=true   ****</echo>
            <echo>**** Doing DEBUG packaging with RELEASE keys ****</echo>
            <echo>*************************************************</echo>
        </then>
        <else>
            <!-- property only set in release mode.
                 Useful for if/unless attributes in target node
                 when using Ant before 1.8 -->
            <property name="build.is.mode.release" value="true"/>
        </else>
    </if>
</target>

软件架

这只是一个可公开访问的网页,PHP 脚本在其中按日期顺序显示构建。

<?php
require('header.html'); 
?>
<h2>All builds</h2>
<table>
<?php
$dir = dirname($_SERVER[SCRIPT_FILENAME]);
$filenames = scandir($dir);
$files = array();
$fileTimes = array();
$j = 0;
$n = count($filenames);
for ($i = 0; $i < $n; $i++) {
  $filename = $filenames[$i];
  if ( is_file($filename) && pathinfo($filename, PATHINFO_EXTENSION) == "apk" ) {
    $time = filemtime($filename);
    $files[$j] = array("name"=>$filename, "time"=>$time );
    $fileTimes[$j] = $time;
    $j++;
  }
}
array_multisort($fileTimes, SORT_DESC, $files);
$tablerow_classes = array("t0", "t1");
$current_class = 0;
$m = count($files);
for ( $i = 0; $i < $m; $i++ ) {
  $name = $files[$i]["name"];
  $time = date ("d/m/Y H:i:s", $files[$i]["time"]);
  $class = $tablerow_classes[$current_class];
  $current_class++;
  if ( $current_class > 1 ) {
    $current_class = 0;
  }
  echo "<tr class="$class"><td><a href="$name">$name</a></td><td>$time<br /></tr>";
}

?>
</table>
<?php
require('footer.html');

总之,该系统提供了一个完整的构建系统,它允许您将特定的二进制文件跟踪回特定的提交。

相关内容

  • 没有找到相关文章

最新更新