zoukankan      html  css  js  c++  java
  • jenkins使用小记--打包android和系统固件包

    由于公司需要在服务器上自动打包安卓应用和系统固件,因此需要用到genkins,下面记录一下从安装到使用jenkins打包一个安卓应用。安卓应用使用gradle打包,而系统固件是运行shell脚本打包。

    安装

    从https://jenkins.io/下载jenkins.war,然后放到tomcat的webapps目录下运行即可,安装时选择安装推荐的插件。安装过程比较简单就不列出详细的安装过程,在安装插件过程中,因为网络问题,可能会遇到提示网络为offline,只需重新打开一个新的插件管理的页面,然后将升级的接口从https改为http即可,然后重启一下tomcat。该问题具体可以参考:https://blog.csdn.net/txyzqc/article/details/77885367

    Jenkins默认在当前用户的主目录下创建.jenkins目录,所有的配置文件、数据库都存放在里面,只需要备份这个目录就备份了整个CI配置。构建时,生成的文件在.jenkins目录下是workspace目录中。

    配置

    安装好jenkins后需要配置一下全局工具配置和全局属性

    1、全局工具配置

    主要配置的是JDK,Git,Gradle板块,分别配置这三个的路径。

    首先在服务器上分别安装好jdk,git,gradle,然后在全局工具配置中配置它们。

     

    • JDK:别名=任意,JAVA_HOME=JDK目录。jdk可以配置多个
    • Git:别名=任意, Path to Git executable=Git安装目录ingit.exe
    • Gradle:别名=任意,GRADLE_HOME=gradle安装目录:/opt/gradle/gradle-4.4
      Gradle尽量配置多个,因为项目的gradle版本可能不一样,所以需要选择不同的Gradle版本进行编译

    git的配置

    git是在gitlab上拉取代码到jenkins中,所以需要把公钥放在gitlab上,把私钥放到jenkins中。

    1、首先在服务器上生成公钥和私钥

    2、将公钥id_rsa.pub部署到gitlab上的Deploy Keys中

    3、将私钥id_rsa添加到全局凭据中,类型为SSH Username with private key

    2、全局属性

    打包android应用时,因为android需要使用android sdk的相关接口,所以需要在服务器上先安装androidSdk。然后在全局属性中配置ANDROID_HOME,配置的路径为,系统管理->系统设置->全局属性版块勾选上环境变量选项

    服务上安装androidSdk,首先打开https://developer.android.com/studio/然后在Command line tools only模块下,下载sdk-tools-linux-4333796.zip工具,这是一个androidSdk管理工具,下载好之后使用sdkmanager去下载和管理androidSdk,sdkmanager具体使用方法参考官网https://developer.android.com/studio/command-line/sdkmanager

    服务器上下载好androidSdk后的目录如下build-tools  licenses  platforms  platform-tools,在platforms 中为具体安装的androidSdk的版本。

    打包

    1、创建项目

    参数化构建

    1、在general中选择jdk版本

    2、配置git仓库地址,默认选择master作为打包分支

    3、构建中,选择Invoke Gradle script,选择gradle版本

    4、构建完成之后归档,并发送消息给钉钉(发送消息给钉钉,需要安装钉钉插件)

    5、构建时,可以选择构建的参数,比如上图中使用了SIGN_KEY,如果下面构建的时候使用执行shell脚本的方式构建的话,则可以直接使用,构建时选择的参数,shell中可以

    直接使用${SIGN_KEY}获取,构建时选择的值。

    最后附上一个执行shell打包android固件系统的shell

    #!/bin/bash
    set -x
    env
    
    export JAVA_HOME=/usr/lib/jvm/java-1.7.0-openjdk-amd64;export PATH=${JAVA_HOME}/bin:${JAVA_HOME}/lib:${JAVA_HOME}/jre/bin:${JAVA_HOME}/jre/lib:$PATH
    export PATH=$PATH:/opt/gcc-arm-none-eabi-6-2017-q2-update/bin:/opt/gcc-linaro-aarch64-none-elf-4.8-2013.11_linux/bin:/opt/gcc-linaro-aarch64-linux-gnu-4.9-2014.09_linux/bin
    git_url=""
    product_name="p211"
    build_time="$(date +%Y%m%d.%H%M%S)"
    build_time1="$(date +%Y-%m-%d %H:%M:%S)"
    build_number=$product_name"_"$build_time
    
    rm -rf *
    
    git_url="ssh://git@xxxxxxxx/mingwork/mingsqure_1.git"
    git clone $git_url $build_number
    
    cd $build_number
    git checkout ${BRANCH}
    
    echo "git_url=$git_url" > ../repo_url.txt
    
    if [ "${CHECK_COMMIT}" = "TRUE" ]; then
    if [ "" = "$LAST_BUILD_TIME" ]; then
    	echo "has new commit, continue..."
    else
    	new_commit="$(git log --since='$LAST_BUILD_TIME' --oneline --reverse)"
    	if [ "" = "$new_commit" ]; then
    		echo "There is no new commit, skip this build!"
    		echo "git_url=$git_url" > ../repo_url.txt
    		echo "BUILD_RESULT=SUCCESS" > ../build_result.txt
    		echo "UPLOAD_OSS_URL=no new commit, skip this build!" > ../object_url.txt
    	exit 0
    	fi
    fi 
    fi
    
    if [ "yes" = "${WITH_ADBD}" ]; then
    	export WITH_ADBD=yes
        adb_suffix="_withadb"
    else
    	export WITH_ADBD=no
    fi
    
    
    export DINGBOX_VERSION=${VERSION}
    
    if [ "${SIGN_KEY}" = "debug" ]; then
    	signkey_branch="debug"
        subdir=unsigned
    else
        cd build/target/product
    	rm -rf security
    	signkey_branch="release"
        subdir=signed
        git clone git@xxxxxxxxxxx/android_sign_key.git -b $signkey_branch security
        cd -
        rm -rf dingtalk/prebuilts/UUID/uuid
        mv dingtalk/prebuilts/UUID/uuid_rel dingtalk/prebuilts/UUID/uuid
        rm -rf dingtalk/prebuilts/Fota/Fota.apk
        mv dingtalk/prebuilts/Fota/Fota_release.apk dingtalk/prebuilts/Fota/Fota.apk
    fi
    mkdir external/chromium_org/third_party/angle/.git
    touch external/chromium_org/third_party/angle/.git/index
    source build/envsetup.sh
    lunch p211-${BUILD_VARIANT}-32
    make otapackage -j24
    
    build_version="$(cat out/target/product/$product_name/system/build.prop | grep ^ro.dingtalk.build.version | awk -F '=' '{print $2}')"
    if [ -f "$WORKSPACE/$build_number/out/target/product/$product_name/aml_upgrade_package.img" ]; then
    	./imgout $product_name
        echo "adding img to zip..."
        cd release-$product_name
        zip -qry -9 ../$build_version$adb_suffix.zip .
        cd -
        echo "uploading img to oss..."
        /usr/bin/oss/ossupload_mingbox.sh $build_version$adb_suffix.zip ${subdir} ${BUILD_VARIANT}
        md5="$(md5sum $build_version$adb_suffix.zip)"
        echo "MD5=$md5" > ../md5
        git tag -f -a $build_version -m "jenkins build tag:$build_version"
    	git push origin $build_version
        echo "build success !!!" 
        echo "BUILD_RESULT=SUCCESS" > ../build_result.txt
        echo "LAST_BUILD_TIME=$build_time1" > ../.last_build_time
    else
    	echo "build failed !!!"
        echo "BUILD_RESULT=FAILED" > ../build_result.txt
        exit 1
    fi
    

      

    遇到的错误

    1、gradle4.4使用jdk1.8.0时报错

    Caused by: java.lang.VerifyError: Uninitialized object exists on backward branch 70
    Exception Details:
      Location:
        com/android/build/gradle/tasks/BuildArtifactReportTask.newArtifact(Lcom/android/build/api/artifact/BuildableArtifact;)Lcom/android/build/gradle/tasks/BuildArtifactReportTask$BuildableArtifactData; @119: goto
      Reason:
        Error exists in the bytecode
      Bytecode:
        0000000: bb00 f459 2bb9 0139 0100 c000 6b2b b901
        0000010: 3d01 0001 b901 4302 0059 1301 45b8 0148
        0000020: c000 374d 3a0d 3a0c 3a0b 2c4e bb00 6859
        0000030: 2c10 0ab8 003d b700 69c0 006b 3a04 2db9
        0000040: 0054 0100 3a05 1905 b900 5a01 0099 002d
        0000050: 1905 b900 5e01 003a 0619 0419 06c0 014a
        0000060: 3a07 3a0e 1907 b901 4d01 003a 0f19 0e19
        0000070: 0fb9 0075 0200 57a7 ffcf 1904 c000 773a
        0000080: 0e19 0b19 0c19 0d19 0eb7 0150 b0
    

    遇到这个问题后,后来将jdk版本切换至jdk1.8.0_181即可

  • 相关阅读:
    [C++ Primer Plus] 第9章、内存模型和名称空间(二)课后习题
    [C++ Primer Plus] 第9章、内存模型和名称空间(一)程序清单
    [c/c++] programming之路(28)、结构体存储和内存对齐+枚举类型+typedef+深拷贝和浅拷贝
    [c/c++] programming之路(27)、union共用体
    [c/c++] programming之路(26)、结构体
    opencv学习之路(37)、运动物体检测(二)
    [Python]基础教程(4)、Python 变量类型
    opencv学习之路(36)、运动物体检测(一)
    opencv学习之路(35)、SURF特征点提取与匹配(三)
    opencv学习之路(34)、SIFT特征匹配(二)
  • 原文地址:https://www.cnblogs.com/kangjianrong/p/9556559.html
Copyright © 2011-2022 走看看