Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/178.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何使用Jenkins&;从Git存储库子目录构建;蚂蚁?_Android_Git_Ant_Jenkins_Gitosis - Fatal编程技术网

Android 如何使用Jenkins&;从Git存储库子目录构建;蚂蚁?

Android 如何使用Jenkins&;从Git存储库子目录构建;蚂蚁?,android,git,ant,jenkins,gitosis,Android,Git,Ant,Jenkins,Gitosis,我已将Jenkins CI配置为与GitHub一起工作。它成功地填充了我的${workspace},但我要构建的实际项目位于repo的子目录中: 从Jenkins内部调用Ant表示它找不到build.xml。这是因为build.xml实际上存在于${workspace}/DeveloperDebugPreferences中。您可以为Ant配置构建文件,以便在Jenkins中使用。如果要浏览Jenkins服务器上的作业,可以选择Configure,然后选择Ant目标下方的Advanced选项 如

我已将Jenkins CI配置为与GitHub一起工作。它成功地填充了我的${workspace},但我要构建的实际项目位于repo的子目录中:


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

您可以为Ant配置构建文件,以便在Jenkins中使用。如果要浏览Jenkins服务器上的作业,可以选择Configure,然后选择Ant目标下方的Advanced选项

如果您想编辑
config.xml
文件,您应该看到如下生成设置:

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

你的目标是什么
${workspace}/DeveloperDebugPreferences/build.xml

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


邮政接收 詹金斯 事物的开发方面基本上与发行版相同,但我们不是基于master,而是基于commit-to-Development分支。由于该服务器只托管git和Jenkins,Eclipse和Xcode环境安装在我们用作构建服务器的MacMini上,Jenkins被配置为使用SSH和证书进行登录。Jenkins服务器将SSHs发送到构建服务器,签出代码,构建代码,并将结果发送到我们的软件架。唯一特殊的部分是Ant build.xml部分,它使这项工作正常

在Build-executeshell-Command下

~/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
编译文件 因此,在project build.xml中,我们覆盖了几个目标,以使git提交散列显示在文件名中。例如,我们的项目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>

$time
“; } ?>
回答很好,但是硬编码config.xml来代替特定的作业。我认为这不是一个好的做法。
<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
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');