在 Jenkins 构建期间动态添加 Android 项目依赖项

Posted

技术标签:

【中文标题】在 Jenkins 构建期间动态添加 Android 项目依赖项【英文标题】:Dynamically add an Android project dependency during Jenkins build 【发布时间】:2020-02-17 02:05:20 【问题描述】:

我目前有一个构建我的 android APK 的 Jenkins 管道。我正在努力寻找一种在构建过程中动态添加依赖项的好方法。

我不想更改主存储库中当前的 build.grade 文件:

dependencies 
    api 'androidx.appcompat:appcompat:1.1.0'
    ...

我有一个来自另一个私有存储库的依赖项:

api 'com.private.library:some-library:1.0'

是否可以从 Jenkins 管道访问 build.gradle 文件依赖项并动态添加依赖项?我可以将当​​前的 android 项目包装在另一个包含依赖项的 gradle 文件中吗?或者可能是在构建时添加依赖项的另一种好方法?

【问题讨论】:

【参考方案1】:

取决于您的管道是如何定义的。您可以在克隆存储库之后和构建 apk 之前添加一个在管道中运行 shell 命令的步骤。例如,如果在 linux 上运行,请使用 sed 添加要添加的行。

stages 
    stage('Clone repo') ...
    stage('Add dependency') 
        steps 
            sh '''
                sed -i "/api 'androidx.appcompat:appcompat:1.1.0'/a api 'com.private.library:some-library:1.0'" ./path/to/build.gradle
            '''
        
    
    stage('Build') ...

这将在 appcompat 依赖项之后的新行上添加私有 repo 依赖项。

编辑: 如果您想采用这种方法,此命令可能是更好的选择。

echo "dependencies  api 'com.private.library:some-library:1.0' " >> path/to/build.gradle 

此命令不具有 sed 文本依赖项(如果原始 build.gradle 在主存储库中更改,则风险较小)。它只是在文件末尾添加了另一个包含您的私有 repo 依赖项的依赖项块。你可以在同一个文件中定义多个依赖块,所以如果定义了其他依赖也没有问题,它不会覆盖。

【讨论】:

当然可以,但相当脆弱,因为对原始依赖项的任何更改都可能会扰乱搜索。真的希望有一种“gradle”的方式来管理这样的事情。 IE 可能会将现有的 gradle 文件包装在另一个中,从而在不修改原始 gradle 文件的情况下将依赖项添加到项目中。 是的,我同意使用“gradle 解决方案”会更好。我似乎找不到一个。希望你有更好的运气!如果您采用这种方法,我会用一个更可靠的例子更新我的答案。关键是您可以运行 shell 命令(非常强大)。

以上是关于在 Jenkins 构建期间动态添加 Android 项目依赖项的主要内容,如果未能解决你的问题,请参考以下文章

Jenkins 服务在节点 js 构建期间完全停止,在 Ubuntu 上使用 nginx 设置获得 502 错误网关

jenkins构建:参数化构建

Jenkins作业无法在构建期间将整数参数传递给python脚本

Jenkins的参数化构建

Jenkins的参数化构建

Docker动态构建Jenkins Slave