安装配置Jenkins
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
# 要求Java 1.8 $ yum install java $ yum install subversion $ yum install tomcat $ /bin/systemctl restart tomcat.service $ wget https://get.jenkins.io/war/2.254/jenkins.war $ cp jenkins.war /usr/share/tomcat/webapps/ $ /bin/systemctl restart tomcat.service # 服务器访问地址 # http://158.220.155.188:8080/jenkins/ # apache $ yum install httpd $ /bin/systemctl restart httpd.service # apache 默认工作目录 /var/www/html/ |
为了安全考虑,首先需要解锁Jenkins
在Jenkins服务器上查询管理员密码
1 2 |
[root@centos7-1 ~]# cat /usr/share/tomcat/.jenkins/secrets/initialAdminPassword 250d0360e2a149dbb7402f96a26945e2 |
点击[跳过插件安装]
插件安装
安装插件Subversion
,前往https://plugins.jenkins.io/,搜索Subversion
,如下图:
根据出错提示,逐个安装解决依赖包
目前的依赖安装顺序如下(严格按照按照顺序操作):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 |
# 简单操作可以直接去 https://updates.jenkins.io/download/plugins/xxxx/ 去下载 # 比如 https://updates.jenkins.io/download/plugins/structs/ 去下载 # JDK JDK_Parameter_Plugin-1.0.hpi # SVN structs-1.20.hpi credentials-2.3.12.hpi trilead-api-1.0.8.hpi ssh-credentials-1.18.1.hpi scm-api-2.6.3.hpi mapdb-api-1.0.9.0.hpi workflow-scm-step-2.11.hpi subversion-2.13.1.hpi # Gradle ace-editor-1.1.hpi workflow-step-api-2.22.hpi jquery-detached-1.2.1.hpi workflow-api-2.40.hpi workflow-support-3.5.hpi workflow-cps-2.82.hpi script-security-1.74.hpi durable-task-1.34.hpi workflow-durable-task-step-2.36.hpi apache-httpcomponents-client-4-api-4.5.10-2.0.hpi display-url-api-2.3.3.hpi mailer-1.32.hpi workflow-basic-steps-2.20.hpi workflow-job-2.39.hpi gradle-1.36.hpi # 条件构建使用的插件 token-macro-2.12.hpi run-condition-1.3.hpi javadoc-1.6.hpi jsch-0.1.55.2.hpi maven-plugin-3.7.hpi conditional-buildstep-1.3.6.hpi parameterized-trigger-2.37.hpi # 用来设置环境变量 JAVA_HOME,ANDROID_SDK_ROOT envinject-api-1.7.hpi envinject-2.3.0.hpi # 用户权限验证相关的插件 authorize-project-1.3.0.hpi # 配置备份 thinBackup-1.10.hpi |
构建编译需要的Maven仓库
从本地构建项目的Gradle
缓存中提取项目依赖的jar
/aar
资源,反向生成项目依赖的Maven
仓库下载连接地址,部署到自己的服务器上,提供Gradle
编译的时候下载。
1 2 3 4 5 6 7 |
$ cd ~/.gradle $ bash gradle_cache.sh #在当前目录下生成jcenter目录,整个目录上传到编译服务器的apache目录下 $ scp -r jcenter root@158.220.155.188:/var/www/html/ |
具体脚本内容如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 |
#!/bin/bash #use .gradle/caches/modules-2/files-2.1/ to create jcenter SHPATH=$(cd "$(dirname "$0")"; pwd) DIR="${SHPATH}/caches/modules-2/files-2.1/" ROOT_DIR=${SHPATH}/jcenter DIR_LENGTH=${#DIR} if [ `uname` = "Darwin" ]; then #mac will add "/" DIR_LENGTH=$((DIR_LENGTH+1)) fi rm -rf ${ROOT_DIR} find ${DIR} -type f | grep -Ev "DS_Store" | while read line do SRC=${line} URL=${line:${DIR_LENGTH}} ORG=${URL%%/*} URL=${URL#*/} MODULE=${URL%%/*} URL=${URL#*/} REVISION=${URL%%/*} URL=${URL#*/} SHA1=${URL%%/*} URL=${URL#*/} FILE=${URL} #echo "ORG=$ORG, MODULE=$MODULE, REVISION=$REVISION, SHA1=$SHA1, FILE=$FILE" DST=${ROOT_DIR}/${ORG//.//}/${MODULE}/${REVISION}/${FILE} echo "$DST" mkdir -p `dirname ${DST}` if [ ! -f ${DST} ]; then cp -a ${SRC} ${DST} fi done # .pom DIR_LENGTH=${#ROOT_DIR} if [ `uname` = "Darwin" ]; then #mac will add "/" DIR_LENGTH=$((DIR_LENGTH+1)) fi find ${ROOT_DIR} -name "*.aar" -or -name "*.jar" | while read line do SRC=${line} EXT=".${SRC##*.}" LOCAL_POM=${SRC/${EXT}/.pom} if [ -f ${LOCAL_POM} ]; then continue fi # source ,javadoc ignore ,they do'nt have .pom file if [ ".jar" = `echo "${EXT}" | tr [A-Z] [a-z]` ]; then if [[ ${SRC} = *-javadoc${EXT} ]] || [[ ${SRC} = *-sources${EXT} ]]; then continue fi fi echo "$LOCAL_POM not found" URL=${line:${DIR_LENGTH}} URL=${URL/${EXT}/.pom} REMOTE_POM=https://repo1.maven.org/maven2/${URL} # try find file from maven center , if not found try google STATUS=$(curl -L -I -m 10 -o /dev/null -s -w %{http_code} ${REMOTE_POM}) if [ "404" = "${STATUS}" ]; then REMOTE_POM=https://dl.google.com/dl/android/maven2/${URL} STATUS=$(curl -L -I -m 10 -o /dev/null -s -w %{http_code} ${REMOTE_POM}) if [ "404" = "${STATUS}" ]; then REMOTE_POM=https://repo.spring.io/libs-release/${URL} STATUS=$(curl -L -I -m 10 -o /dev/null -s -w %{http_code} ${REMOTE_POM}) if [ "404" = "${STATUS}" ]; then # jar's source ,doc does not have pom files echo "$REMOTE_POM not found" continue fi fi fi #reverse to get it FILE=${URL##*/} URL=${URL%/*} REVISION=${URL##*/} URL=${URL%/*} MODULE=${URL##*/} URL=${URL%/*} ORG=${URL} echo "ORG=$ORG, MODULE=$MODULE, REVISION=$REVISION, FILE=$FILE" DST=${ROOT_DIR}/${ORG}/${MODULE}/${REVISION}/${FILE} echo "$DST" mkdir -p `dirname ${DST}` if [ ! -f ${DST} ]; then wget -O ${DST} ${REMOTE_POM} fi done # 手工下载几个缺失的库的POM/JAR文件 VER="3.10.0" DIR="com/google/protobuf/protobuf-parent/${VER}" mkdir -p "${ROOT_DIR}/${DIR}" DST="${DIR}/protobuf-parent-${VER}.pom" wget -O "${ROOT_DIR}/${DST}" https://repo1.maven.org/maven2/${DST} DIR="com/google/protobuf/protobuf-bom/${VER}" mkdir -p "${ROOT_DIR}/${DIR}" DST="${DIR}/protobuf-bom-${VER}.pom" wget -O "${ROOT_DIR}/${DST}" https://repo1.maven.org/maven2/${DST} VER="28.1-jre" DIR="com/google/guava/guava-parent/${VER}" mkdir -p "${ROOT_DIR}/${DIR}" DST="${DIR}/guava-parent-${VER}.pom" wget -O "${ROOT_DIR}/${DST}" https://repo1.maven.org/maven2/${DST} VER="2.3.2" DIR="com/google/errorprone/error_prone_parent/${VER}" mkdir -p "${ROOT_DIR}/${DIR}" DST="${DIR}/error_prone_parent-${VER}.pom" wget -O "${ROOT_DIR}/${DST}" https://repo1.maven.org/maven2/${DST} VER="1.18" DIR="org/codehaus/mojo/animal-sniffer-parent/${VER}" mkdir -p "${ROOT_DIR}/${DIR}" DST="${DIR}/animal-sniffer-parent-${VER}.pom" wget -O "${ROOT_DIR}/${DST}" https://repo1.maven.org/maven2/${DST} VER="50" DIR="org/codehaus/mojo/mojo-parent/${VER}" mkdir -p "${ROOT_DIR}/${DIR}" DST="${DIR}/mojo-parent-${VER}.pom" wget -O "${ROOT_DIR}/${DST}" https://repo1.maven.org/maven2/${DST} VER="3.9.0" DIR="com/squareup/okhttp3/parent/${VER}" mkdir -p "${ROOT_DIR}/${DIR}" DST="${DIR}/parent-${VER}.pom" wget -O "${ROOT_DIR}/${DST}" https://repo1.maven.org/maven2/${DST} VER="1.13.0" DIR="com/squareup/okio/okio-parent/${VER}" mkdir -p "${ROOT_DIR}/${DIR}" DST="${DIR}/okio-parent-${VER}.pom" wget -O "${ROOT_DIR}/${DST}" https://repo1.maven.org/maven2/${DST} VER="2.6.2" DIR="com/google/code/gson/gson-parent/${VER}" mkdir -p "${ROOT_DIR}/${DIR}" DST="${DIR}/gson-parent-${VER}.pom" wget -O "${ROOT_DIR}/${DST}" https://repo1.maven.org/maven2/${DST} VER="1.6.6" DIR="org/powermock/powermock-modules/${VER}" mkdir -p "${ROOT_DIR}/${DIR}" DST="${DIR}/powermock-modules-${VER}.pom" wget -O "${ROOT_DIR}/${DST}" https://repo1.maven.org/maven2/${DST} VER="1.6.6" DIR="org/powermock/powermock/${VER}" mkdir -p "${ROOT_DIR}/${DIR}" DST="${DIR}/powermock-${VER}.pom" wget -O "${ROOT_DIR}/${DST}" https://repo1.maven.org/maven2/${DST} VER="1.6.6" DIR="org/powermock/powermock-api/${VER}" mkdir -p "${ROOT_DIR}/${DIR}" DST="${DIR}/powermock-api-${VER}.pom" wget -O "${ROOT_DIR}/${DST}" https://repo1.maven.org/maven2/${DST} VER="1.6.6" DIR="org/powermock/powermock-classloading-module/${VER}" mkdir -p "${ROOT_DIR}/${DIR}" DST="${DIR}/powermock-classloading-module-${VER}.pom" wget -O "${ROOT_DIR}/${DST}" https://repo1.maven.org/maven2/${DST} VER="2.4" DIR="org/objenesis/objenesis-parent/${VER}" mkdir -p "${ROOT_DIR}/${DIR}" DST="${DIR}/objenesis-parent-${VER}.pom" wget -O "${ROOT_DIR}/${DST}" https://repo1.maven.org/maven2/${DST} VER="1.4.9" DIR="com/thoughtworks/xstream/xstream-parent/${VER}" mkdir -p "${ROOT_DIR}/${DIR}" DST="${DIR}/xstream-parent-${VER}.pom" wget -O "${ROOT_DIR}/${DST}" https://repo1.maven.org/maven2/${DST} VER="37" DIR="org/apache/commons/commons-parent/${VER}" mkdir -p "${ROOT_DIR}/${DIR}" DST="${DIR}/commons-parent-${VER}.pom" wget -O "${ROOT_DIR}/${DST}" https://repo1.maven.org/maven2/${DST} VER="38" DIR="org/apache/commons/commons-parent/${VER}" mkdir -p "${ROOT_DIR}/${DIR}" DST="${DIR}/commons-parent-${VER}.pom" wget -O "${ROOT_DIR}/${DST}" https://repo1.maven.org/maven2/${DST} VER="2" DIR="com/google/auto/auto-parent/${VER}" mkdir -p "${ROOT_DIR}/${DIR}" DST="${DIR}/auto-parent-${VER}.pom" wget -O "${ROOT_DIR}/${DST}" https://repo1.maven.org/maven2/${DST} VER="18.0" DIR="com/google/guava/guava-parent/${VER}" mkdir -p "${ROOT_DIR}/${DIR}" DST="${DIR}/guava-parent-${VER}.pom" wget -O "${ROOT_DIR}/${DST}" https://repo1.maven.org/maven2/${DST} VER="4.0.1-6197926" DIR="com/android/tools/build/aapt2/${VER}" mkdir -p "${ROOT_DIR}/${DIR}" DST="${DIR}/aapt2-${VER}.pom" wget -O "${ROOT_DIR}/${DST}" https://dl.google.com/dl/android/maven2/${DST} DST="${DIR}/aapt2-${VER}-linux.jar" wget -O "${ROOT_DIR}/${DST}" https://dl.google.com/dl/android/maven2/${DST} VER="4.0.2-6197926" DIR="com/android/tools/build/aapt2/${VER}" mkdir -p "${ROOT_DIR}/${DIR}" DST="${DIR}/aapt2-${VER}.pom" wget -O "${ROOT_DIR}/${DST}" https://dl.google.com/dl/android/maven2/${DST} DST="${DIR}/aapt2-${VER}-linux.jar" wget -O "${ROOT_DIR}/${DST}" https://dl.google.com/dl/android/maven2/${DST} DST="${DIR}/aapt2-${VER}-windows.jar" wget -O "${ROOT_DIR}/${DST}" https://dl.google.com/dl/android/maven2/${DST} DST="${DIR}/aapt2-${VER}-osx.jar" wget -O "${ROOT_DIR}/${DST}" https://dl.google.com/dl/android/maven2/${DST} VER="4.1.0-6503028" DIR="com/android/tools/build/aapt2/${VER}" mkdir -p "${ROOT_DIR}/${DIR}" DST="${DIR}/aapt2-${VER}.pom" wget -O "${ROOT_DIR}/${DST}" https://dl.google.com/dl/android/maven2/${DST} DST="${DIR}/aapt2-${VER}-linux.jar" wget -O "${ROOT_DIR}/${DST}" https://dl.google.com/dl/android/maven2/${DST} DST="${DIR}/aapt2-${VER}-windows.jar" wget -O "${ROOT_DIR}/${DST}" https://dl.google.com/dl/android/maven2/${DST} DST="${DIR}/aapt2-${VER}-osx.jar" wget -O "${ROOT_DIR}/${DST}" https://dl.google.com/dl/android/maven2/${DST} VER="4.1.3-6503028" DIR="com/android/tools/build/aapt2/${VER}" mkdir -p "${ROOT_DIR}/${DIR}" DST="${DIR}/aapt2-${VER}.pom" wget -O "${ROOT_DIR}/${DST}" https://dl.google.com/dl/android/maven2/${DST} DST="${DIR}/aapt2-${VER}-linux.jar" wget -O "${ROOT_DIR}/${DST}" https://dl.google.com/dl/android/maven2/${DST} DST="${DIR}/aapt2-${VER}-windows.jar" wget -O "${ROOT_DIR}/${DST}" https://dl.google.com/dl/android/maven2/${DST} DST="${DIR}/aapt2-${VER}-osx.jar" wget -O "${ROOT_DIR}/${DST}" https://dl.google.com/dl/android/maven2/${DST} # robolectric相关 # `Robolectric`在执行测试的时候,会去动态下载依赖,下载的依赖会存储在`~/.m2/repository/org/robolectric/`目录下。 # https://oss.sonatype.org/content/groups/public/org/robolectric/android-all/9-robolectric-4913185-2/android-all-9-robolectric-4913185-2.jar VER="4913185-2" DIR="org/robolectric/android-all/9-robolectric-${VER}" mkdir -p "${ROOT_DIR}/${DIR}" DST="${DIR}/android-all-9-robolectric-${VER}.pom" wget -O "${ROOT_DIR}/${DST}" https://oss.sonatype.org/content/groups/public/${DST} DST="${DIR}/android-all-9-robolectric-${VER}.jar" wget -O "${ROOT_DIR}/${DST}" https://oss.sonatype.org/content/groups/public/${DST} VER="5803371" DIR="org/robolectric/android-all/10-robolectric-${VER}" mkdir -p "${ROOT_DIR}/${DIR}" DST="${DIR}/android-all-10-robolectric-${VER}.pom" wget -O "${ROOT_DIR}/${DST}" https://oss.sonatype.org/content/groups/public/${DST} DST="${DIR}/android-all-10-robolectric-${VER}.jar" wget -O "${ROOT_DIR}/${DST}" https://oss.sonatype.org/content/groups/public/${DST} VER="4.1.2_r1-robolectric-r1" DIR="org/robolectric/android-all/${VER}" mkdir -p "${ROOT_DIR}/${DIR}" DST="${DIR}/android-all-${VER}.pom" wget -O "${ROOT_DIR}/${DST}" https://oss.sonatype.org/content/groups/public/${DST} DST="${DIR}/android-all-${VER}.jar" wget -O "${ROOT_DIR}/${DST}" https://oss.sonatype.org/content/groups/public/${DST} |
配置Gradle本地下载
1 2 3 4 5 6 7 8 9 |
$ mkdir distributions $ cd distributions $ wget https://services.gradle.org/distributions/gradle-6.6.1-all.zip -O distributions/gradle-6.6.1-all.zip $ cd .. $ scp -r distributions root@158.220.155.188:/var/www/html/ |
配置Android SDK
下载Android SDK
,目前Google
已经不提供单独的Android SDK
下载了,都是通过Android Studio
进行下载安装。但是对于离线模式来说,还是需要单独下载Android SDK
,这时候,我们就需要从Android Studio
的配置信息中找到对应的SDK
下载地址。
如上图箭头指向的位置,我们下载https://dl.google.com/android/repository/repository2-1.xml
可以从里面找到相关的Android SDK
下载文件名,手工拼接一下地址就可以正常下载。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
$ mkdir android $ cd android # Android SDK,注意版本 # SDK 30 $ wget https://dl.google.com/android/repository/platform-30_r03.zip # SDK 33 # wget https://dl.google.com/android/repository/platform-33-ext3_r03.zip # 系统工具,注意版本 $ wget https://dl.google.com/android/repository/platform-tools_r30.0.4-linux.zip # 构建工具,注意版本 $ wget https://dl.google.com/android/repository/build-tools_r30.0.2-linux.zip # Android Studio 我们使用Android Studio自带的JDK编译工程,因此需要下载,注意版本 $ wget https://dl.google.com/edgedl/android/studio/ide-zips/4.0.1.0/android-studio-ide-193.6626763-linux.tar.gz # cmake # wget https://dl.google.com/android/repository/cmake-3.10.2-linux-x86_64.zip # wget https://dl.google.com/android/repository/cmake-3.10.2-windows-x86_64.zip # wget https://dl.google.com/android/repository/cmake-3.22.1-linux.zip # wget https://dl.google.com/android/repository/cmake-3.22.1-windows.zip $ cd .. $ scp -r android root@158.220.155.188:/var/www/html/ |
创建持续构建项目
注意:某些版本的Gradle构建的时候,需要设置ANDROID_HOME环境变量,我们同时设置ANDROID_HOME跟ANDROID_SDK_ROOT为相同的目录(${WORKSPACE}/.android)即可解决问题。
里面的脚本命令如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
#!/bin/bash # 替换Gradle下载链接为本地 sed -i "s/https/http/g" gradle/wrapper/gradle-wrapper.properties sed -i "s/services.gradle.org/127.0.0.1/g" gradle/wrapper/gradle-wrapper.properties # 替换阿里云的Maven镜像为本地 sed -i "s/https:\/\/maven.aliyun.com\/nexus\/content\/repositories\/releases\//http:\/\/127.0.0.1\/jcenter\//g" build.gradle sed -i "s/https:\/\/maven.aliyun.com\/nexus\/content\/groups\/public\//http:\/\/127.0.0.1\/jcenter\//g" build.gradle # 替换华为HMS服务器链接为本地 sed -i "s/https:\/\/developer.huawei.com\/repo\//http:\/\/127.0.0.1\/jcenter\//g" build.gradle # 禁用Google/MavenCenter服务器 sed -i "s/^\s*google\(\)/\/\/google\(\)/g" build.gradle sed -i "s/^\s*mavenCentral\(\)/\/\/mavenCentral\(\)/g" build.gradle # 下载并配置Android SDK rm -rf .android mkdir .android cd .android wget http://127.0.0.1/android/platform-30_r03.zip mkdir platforms unzip platform-30_r03.zip -d platforms mv platforms/android-11 platforms/android-30 wget http://127.0.0.1/android/build-tools_r30.0.2-linux.zip mkdir build-tools unzip build-tools_r30.0.2-linux.zip -d build-tools mv build-tools/android-11 build-tools/30.0.2 wget http://127.0.0.1/android/android-studio-ide-193.6626763-linux.tar.gz tar xvf android-studio-ide-193.6626763-linux.tar.gz |
其他的用户权限配置部分,参考网上其他文章即可。
如果需要检查编译之后的APK的版本号,包名等信息是否符合规范,可以在构建步骤中增加如下脚本:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 |
#!/bin/bash ANDROID_PACKAGE_NAME=com.xx.xxx ANDROID_PACKAGE_VER_MAJOR=1.1 ANDROID_PLATFORM_VER=30 ANDROID_BUILD_TOOLS_VER=${ANDROID_PLATFORM_VER}.0.2 echo "校验APK包名,版本号信息" #获取svn构建版本号 VER=`LANG=C svn info |grep Revision` echo "版本号:${VER}" #从第10位截取版本号 VERSION=${VER:10} # 期望的包名 EXP_PACKAGE_NAME="name='${ANDROID_PACKAGE_NAME}'" # 期望的版本号 EXP_VER_CODE="versionCode='${VERSION}'" # 期望的版本名 EXP_VER_NAME="versionName='${ANDROID_PACKAGE_VER_MAJOR}.${VERSION}'" # 期望的编译SDK版本 EXP_COMP_SDK_VER="compileSdkVersion='${ANDROID_PLATFORM_VER}'" ROOT_DIR=${WORKSPACE}/app/build/outputs/apk find ${ROOT_DIR} -name "*.apk" | while read line do FILE=${line} # 获取APK包信息 PKG_INFO=`${WORKSPACE}/.android/build-tools/${ANDROID_BUILD_TOOLS_VER}/aapt2 dump badging "${FILE}" | grep "package:"` # 根据空格拆分返回的包信息 SP_ARR=($PKG_INFO) # 包名 name='com.xx.xxx' PACKAGE_NAME="${SP_ARR[1]}" # 版本号 versionCode='xxxx' VER_CODE="${SP_ARR[2]}" # 版本名 versionName='1.1.xxxx' VER_NAME="${SP_ARR[3]}" # 编译目标版本 compileSdkVersion='30' COMP_SDK_VER="${SP_ARR[6]}" if [ "$EXP_PACKAGE_NAME" != "$PACKAGE_NAME" ] || [ "$EXP_VER_CODE" != "$VER_CODE" ] || [ "$EXP_VER_NAME" != "$VER_NAME" ] || [ "$EXP_COMP_SDK_VER" != "$COMP_SDK_VER" ]; then echo "编译配置的版本信息错误:" echo "期望的包名: "$EXP_PACKAGE_NAME" 实际包名:"$PACKAGE_NAME echo "期望版本号:"$EXP_VER_CODE" 实际版本号:"$VER_CODE echo "期望版本名:"$EXP_VER_NAME" 实际版本名:"$VER_NAME echo "期望编译SDK版本:"$EXP_COMP_SDK_VER" 实际SDK版本:"$COMP_SDK_VER exit -1 fi done echo "校验包信息成功:" echo "编译包名: "$EXP_PACKAGE_NAME" echo "版本号:"$EXP_VER_CODE" echo "版本名:"$EXP_VER_NAME" echo "编译SDK版本:"$EXP_COMP_SDK_VER" |
部署到Nexus OSS 2.x版本
如果我们需要内网部署Nexus OSS,则需要进行如下配置。
首先去Nexus OSS官网下载2.x的Tomcat版本。目前最新的是 2.14.19-01 版本(本站下载)。
1 2 3 4 5 |
$ wget http://www.sonatype.org/downloads/nexus-latest.war $ cp nexus*.war /usr/share/tomcat/webapps/nexus.war $ /bin/systemctl restart tomcat.service |
访问服务器,可以看到如下界面:
默认的用户名admin
,密码admin123
。
执行如下脚本批量上传到服务器上,如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
#!/bin/bash SHPATH=$(cd "$(dirname "$0")"; pwd) ROOT_DIR=${SHPATH}/jcenter NEXUS_USR="admin" NEXUS_PWD="admin123" NEXUS2_HOST="http://158.220.174.251:8080/nexus" NEXUS2_API="/service/local/repositories/" NEXUS2_REP="maven-releases" NEXUS2_URL=${NEXUS2_HOST}${NEXUS2_API}${NEXUS2_REP}"/content/" DIR_LENGTH=${#ROOT_DIR} if [ `uname` = "Darwin" ]; then #mac will add "/" DIR_LENGTH=$((DIR_LENGTH+1)) fi find ${ROOT_DIR} -name "*.aar" -or -name "*.jar" -or -name "*.pom" | while read line do SRC=${line} REL=${SRC:DIR_LENGTH} curl -v -u ${NEXUS_USR}:${NEXUS_PWD} --upload-file ${SRC} ${NEXUS2_URL}${REL} done |
可能遇到的问题
Gradle构建失败
如果升级com.android.tools.build:gradle:4.1.x
版本,那么在编译的时候,可能会报告如下错误:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
FAILURE: Build failed with an exception. * What went wrong: Execution failed for task ':app:mergeDevDebugResources'. > Could not resolve all files for configuration ':app:_internal_aapt2_binary'. > Could not find aapt2-4.1.1-6503028-linux.jar (com.android.tools.build:aapt2:4.1.1-6503028). Searched in the following locations: http://127.0.0.1/jcenter/com/android/tools/build/aapt2/4.1.1-6503028/aapt2-4.1.1-6503028-linux.jar * Try: Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights. * Get more help at https://help.gradle.org BUILD FAILED in 15s |
这个现象的奇怪点在于,如果登陆到设备上,直接执行bash gradlew clean build
是能成功编译的,即使通过su -u tomcat
切换到tomcat
用户,也能成功编译,但是Jenkins
就是报告上面的错误。
同时,如果编译工具版本降级到com.android.tools.build:gradle:4.0.x
版本,也是能正常编译通过的。
经过几个小时的排查,发现,由于Jenkins
是使用Tomcat
来运行的,因此运行时候的用户就是tomcat
。可是tomcat
这个用户,默认是没有自己的私有用户目录的。默认情况下Gradle
会存放到USER_HOME/.gradle
目录下。
这就造成一个问题,就是Gradle
去服务器上下载的文件(JAR/AAR/POM),是没有地方存放的!!
早期版本,会在内存开辟一份空间,然后暂时存放到这个空间里。但是com.android.tools.build:gradle:4.1.x
版本开始,没有这样处理。这就要求必须给Gradle
一个暂时存放临时文件的地方。默认情况下Gradle
会存放到USER_HOME/.gradle
目录下。
有两种解决方法:
- 给予
tomcat
用户指定一个可写的目录。 - 使用
-g
参数,指定一个存储目录给Gradle
,要求Gradle
存放到这个目录下面。
一般还是建议使用-g
参数,给每个独立的项目指定一个私有的存储目录,避免项目之间的相互污染。
比如: bash gradlew -g ${WORKSPACE}/.cache clean build
。
ThinBackup存储目录
默认情况下,不进行任何设置的时候,ThinBackup存储目录为"~/",这个目录在Centos 7系统的默认位置在"/usr/share/tomcat/"目录下。
参考链接
- Jenkins持续集成01—Jenkins服务搭建和部署
- Jenkins系列(一) —— 离线安装
- Gradle之持续集成 - 使用Jenkins构建Gradle项目
- gradle cache目录(.gradle)剖析
- linux中shell curl命令获取http状态码
- 使用find命令查找多个文件名,多种方法
- Android Studio Gradle无法获取pom文件
- SDK 平台工具版本说明
- robolectric 依赖库下载踩坑记录
- Jenkins保留多种编译结果文件
- Configuring Robolectric
- gradle传递system property
- 加速 Robolectric 下载依赖库及原理剖析
- Gradle传递System Property
- gradle命令参数
- Where is the Nexus OSS war file?
- nexus默认用户名和密码
- nexus批量上传jar和pom
- CentOS 7 下安装和配置 Nexus 3.3 .1 实战
- Maven私服Nexus3.x环境构建操作记录
- Upload artifact to Nexus Repository Manager using RESTful API
- Upload artifact to Nexus using Jenkins pipeline