Ubuntu搭建Jenkins+Android自动化打包
Posted 郭霖
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Ubuntu搭建Jenkins+Android自动化打包相关的知识,希望对你有一定的参考价值。
11月18日,联想因国内外打折促销活动政策的不同,引发消费者争论。联想方面回复北青报记者表示,一些误解可能来源于把国内售价与海外不含税且不含软硬件的价格相对比,国内的商品一般提供预装软件和鼠标等配件。同时,联想在不同的国家(地区)独立经营的,采取不同的产品规划策略和销售政策。
大家周一好,新的一周继续努力加油!
本篇来自 Android_sheng 的投稿,分享了在Ubuntu系统下如何搭建Jenkins+android自动化打包平台相关的知识。一起来看看!希望大家喜欢。
https://www.jianshu.com/u/43cf6103c128
前言
本文主要介绍如何在Ubuntu搭建Jenkins实现Android项目的自动化打包,一般部署在我们的服务器,这里我通过虚拟机安装Ubuntu来进行演示。
正文
环境配置
下载并配置java环境
通过java官网下载对应jdk版本。打开终端,输入以下命令行进行解压
tar -zxvf jdk-8u181-linux-x64.tar.gz
将解压后的文件夹移动到/opt目录下
sudo mv jdk1.8.0_181 /opt/
修改环境变量
sudo vi ~/.bashrc
在末尾添加如下配置
#set Java environment
export JAVA_HOME=/opt/jdk1.8.0_181
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=${JAVA_HOME}/bin:$PATH
保存退出,使用source命令使其生效
source ~/.bashrc
验证java环境是否配置成功
java -vsersion
Git安装
sudo apt-get install git
安装配置nginx
为了使得外部能下载相关资源,安装并配置本地目录映射
sudo apt-get install nginx
sudo service nginx start
sudo vi /etc/nginx/nginx.conf
简单修改配置文件,添加如下内容
server {
listen 81;
server_name 192.168.80.140;
client_max_body_size 4G;
root /home/cc/pkg_bak;
location / {
autoindex on;
autoindex_exact_size on;
autoindex_localtime on;
}
}
使配置生效
sudo service nginx reload
Jenkins安装
可以根据Jenkins官网文档进行安装
wget -q -O - https://pkg.jenkins.io/debian/jenkins-ci.org.key | sudo apt-key add -
sudo sh -c 'echo deb http://pkg.jenkins.io/debian-stable binary/ > /etc/apt/sources.list.d/jenkins.list'
sudo apt-get update
sudo apt-get install jenkins
修改Jenkins配置
sudo vi /etc/default/jenkins
修改端口号
# 默认是8080端口
HTTP_PORT=8081
启动Jenkins
sudo service jenkins start
启动完成,通过浏览器访问 http://192.168.80.140:8081 即可看到启动界面
启动jenkins.png
根据提示通过查看 /var/lib/jenkins/secrets/initialAdminPassword 获取到密码即可。然后根据提示安装需要的插件,创建用户,完成后出现下面的界面,Jenkins 搭建完成
搭建完成.png
配置Android项目编译环境
安装常用插件
路径:系统管理-插件管理-可选插件,在搜索框输入你需要安装的插件进行安装即可
常用插件有以下:
Git plugin
Git Parameter
GitLab Plugin
Gradle Plugin
Android Emulator Plugin
Android Lint Plugin
description setter plugin
Checkstyle Plug-in
FindBugs Plug-in
PMD Plug-in
SSH Agent
Role-based Authorization Strategy
OWASP Markup Formatter Plugin
配置Git
路径:系统管理-全局工具配置-Git
因为Ubuntu已经安装了Git,所以默认配置即可
配置Git.png
配置JDK
路径:系统管理-全局工具配置-JDK
下载需要一个Oracle的帐号,添加完账户就可以了
配置JDK.png
配置Gradle
路径:系统管理-全局工具配置-Gradle
配置Gradle.png
配置Android SDK
路径:系统管理-系统设置-Android
填写SDK的存放路径,同时勾选自动下载,警告可以忽略
配置AndroidSDK.png
这个时候有一个问题需要注意,必须在sdk的目录下 添加license文件,去你本地的sdk下拷贝一份进去
新建工程
新建工程.png
填写General
一般会勾选丢弃旧的构建,防止服务器累计过多次的编译
填写General.png
填写源码管理
使用Git来拉取代码
填写源码管理.png
构建配置
配置构建界面.png
上内容述执行的是:
重置,清空项目内容
将存在服务器的密钥信息、sdk目录等信息(local.properties),拷贝到项目中
使用工程下的gradlew来构建项目,保持gradle版本与本地一致,Tasks中输入项目要编译的任务
因为我的密钥读取是放到 local.properties 文件中的,所以可以做到服务器管控打包密钥,local.properties 内容如下
KEY_STORE=密钥路径
KEY_STORE_PASSWORD=密码
KEY_ALIAS=密钥别名
KEY_ALIAS_PASSWORD=密码
sdk.dir=sdk路径
构建后配置
需要收集相应的apk和mapping文件
配置构建后界面.png
最后点击保存,通过简单配置,到此已经可以实现项目的构建了
更多定制化配置
通过Git Parameter插件实现分支选择
填写GitParameter.png
集成360加固
从360官方下载相关文件,拷贝到/home/cc/backup/360jiagu目录,使用命令行的方式进行加固,详细可以查看官方说明文档,这里采用编写脚本文件实现自动加固,文件内容如下:
脚本jiagu_360.sh存放路径/home/cc/backup/360jiagu/jiagu
#!/bin/bash
BASE_JAR=/home/cc/backup/360jiagu/jiagu/jiagu.jar
JIA_GU_NAME=账号
JIA_GU_PSD=密码
echo "------ jiagu running! ------"
java -jar ${BASE_JAR} -version
java -jar ${BASE_JAR} -login ${JIA_GU_NAME} ${JIA_GU_PSD}
LOCAL_PATH=$1
echo "local.properties:${LOCAL_PATH}"
KEY_STORE=`cat ${LOCAL_PATH} |grep KEY_STORE= | awk -F= '{print $2}'`
KEY_STORE_PASSWORD=`cat ${LOCAL_PATH} |grep KEY_STORE_PASSWORD= | awk -F= '{print $2}'`
KEY_ALIAS=`cat ${LOCAL_PATH} |grep KEY_ALIAS= | awk -F= '{print $2}'`
KEY_ALIAS_PASSWORD=`cat ${LOCAL_PATH} |grep KEY_ALIAS_PASSWORD= | awk -F= '{print $2}'`
java -jar ${BASE_JAR} -importsign ${KEY_STORE} ${KEY_STORE_PASSWORD} ${KEY_ALIAS} ${KEY_ALIAS_PASSWORD}
java -jar ${BASE_JAR} -showsign
BuildApkLine=$2
Build_JiaGu_Dir=$3
echo "BuildApkLine:${BuildApkLine}, Build_JiaGu_Dir=${Build_JiaGu_Dir}"
java -jar ${BASE_JAR} -jiagu $BuildApkLine $Build_JiaGu_Dir -autosign
echo "------ jiagu finished! ------"
生成二维码,在构建历史展示更多信息
安装description setter plugin插件
在Ubuntu上安装qrencode, 用于生成二维码图片
sudo apt-get install qrencode
修改构建任务,在项目编译完加固完成后执行下面命令
BuildApkLine=`find ./jiagu -name *_jiagu_sign.apk`
# 备份到文件服务器
PkgBakDir="/home/cc/pkg_bak/${JOB_NAME}"
if [ ! -d "$PkgBakDir" ]; then
mkdir $PkgBakDir
fi
BuildDir="$PkgBakDir/${BUILD_NUMBER}"
if [ ! -d "$BuildDir" ]; then
mkdir $BuildDir
fi
ApkName=${BuildApkLine##*/}
LastestApkName="dev_lastest.apk"
cp $BuildApkLine $BuildDir
if [ -f "$PkgBakDir/$LastestApkName" ]; then
rm $PkgBakDir/$LastestApkName
fi
ln -s "$BuildDir/$ApkName" "$PkgBakDir/$LastestApkName"
QrcodeValue="http://192.168.80.140:81/${JOB_NAME}/${BUILD_NUMBER}/$ApkName"
echo "QrcodeValue is $QrcodeValue"
LastQrcodeValue="http://192.168.80.140:81/${JOB_NAME}/$LastestApkName"
echo "LastQrcodeValue is $LastQrcodeValue"
# 将debug apk的下载地址 生成二维码,以供下载
qrencode -o qrcode.png $QrcodeValue
# 将debug apk的下载地址 生成二维码,以供下载
qrencode -o last_qrcode.png $LastQrcodeValue
# 输出debug apk的下载地址,机械号,版本名称
echo "BuildUrl: $QrcodeValue,$VersionCode,$VersionName,$dev_branch,$Tasks"
构建后操作,添加Set build description
构建后操作.png
这里解释一下这两个参数:
Regular expression:BuildUrl: (.),(.),(.),(.)
Description
描述,这里以html格式输出其中 1,2..分别对应上面匹配的4个参数
完成后的结果如下:
效果图.png
集成fir自动上传
打包完成后实现自动上传到fir,可参考 fir官方文档,这里我们通过编写Python脚本实现自动上传功能,脚本代码如下:
#!/usr/bin/python
# -*- coding: UTF-8 -*-
import requests
import json
import sys
# 需要的参数
REQUEST_PARAM = {
'api_token': '这里填写自己的token信息',
'type': 'android',
'applicationId': 'com.xxx.xxx',
'appName': '应用名称',
'versionName': '1.0.1.0',
'versionCode': '10',
'changelog_path': 'changelog文件地址',
'apk_path': 'apk地址'
}
# 初始化传入的参数
def init_param():
print('获取到传递过来的参数:', str(sys.argv))
REQUEST_PARAM['type'] = sys.argv[1]
REQUEST_PARAM['applicationId'] = sys.argv[2]
REQUEST_PARAM['appName'] = sys.argv[3]
REQUEST_PARAM['versionName'] = sys.argv[4]
REQUEST_PARAM['versionCode'] = sys.argv[5]
REQUEST_PARAM['changelog_path'] = sys.argv[6]
REQUEST_PARAM['apk_path'] = sys.argv[7]
# 获取上传凭证
def get_cert():
print('发起获取上传凭证请求')
param = {'type': REQUEST_PARAM['type'],
'bundle_id': REQUEST_PARAM['applicationId'],
'api_token': REQUEST_PARAM['api_token']}
print('获取上传凭证请求参数:', param)
req = requests.post(url='http://api.fir.im/apps', data=param)
cert_response = req.content
print('获取上传凭证响应:', str(cert_response))
return cert_response
# 上传到fir
def upload_fir(binary, apk_path):
binary_key = binary['key']
binary_token = binary['token']
binary_upload_url = binary['upload_url']
print('开始上传Apk')
changelog_str = open(REQUEST_PARAM['changelog_path']).read()
file = {'file': open(apk_path, 'rb')}
param = {
"key": binary_key,
"token": binary_token,
"x:name": REQUEST_PARAM['appName'],
'x:version': REQUEST_PARAM['versionName'],
'x:build': REQUEST_PARAM['versionCode'],
"x:changelog": changelog_str
}
req = requests.post(binary_upload_url, files=file, data=param)
print('上传结果:', req.content)
if __name__ == '__main__':
init_param()
response = get_cert()
# 得到获取上传凭证回调信息
cert_json = json.loads(response)
cert_binary = cert_json['cert']['binary']
# 上传fir
upload_fir(cert_binary, REQUEST_PARAM['apk_path'])
脚本代码注释也比较详细,不再展开说明,最后通过在上面加固完成后的shell脚本后面追加以下内容来实现自动上传
# 编写日志内容
ChangeLog=changelog.txt
echo "Uploaded by fir cli" >> $ChangeLog
echo "构建编号:${BUILD_NUMBER}" >> $ChangeLog
echo "修改记录:" >> $ChangeLog
echo "${SCM_CHANGELOG}" >> $ChangeLog
cat $ChangeLog
python /home/cc/backup/fir/uploadFir.py android $ApplicationId $AppName $VersionCode $VersionName $ChangeLog $BuildApkLine
常见问题
Jenkins启动可能出现的问题
Job for jenkins.service failed because the control process exited with error code. See “systemctl status jenkins.service” and “journalctl -xe” for details.
根据提示输入sudo systemctl status jenkins.service
● jenkins.service - LSB: Start Jenkins at boot time
Loaded: loaded (/etc/init.d/jenkins; generated)
Active: failed (Result: exit-code) since Thu 2018-10-18 11:19:37 CST; 21s ago
Docs: man:systemd-sysv-generator(8)
Process: 3896 ExecStart=/etc/init.d/jenkins start (code=exited, status=1/FAILURE)
10月 18 11:19:37 cc-virtual-machine systemd[1]: Starting LSB: Start Jenkins at boot time...
10月 18 11:19:37 cc-virtual-machine jenkins[3896]: ERROR: No Java executable found in current PATH: /bin:/usr/bin:
10月 18 11:19:37 cc-virtual-machine jenkins[3896]: If you actually have java installed on the system make sure the
10月 18 11:19:37 cc-virtual-machine systemd[1]: jenkins.service: Control process exited, code=exited status=1
10月 18 11:19:37 cc-virtual-machine systemd[1]: jenkins.service: Failed with result 'exit-code'.
10月 18 11:19:37 cc-virtual-machine systemd[1]: Failed to start LSB: Start Jenkins at boot time.
从错误日志可以看出找不到java路径,解决方法:创建一条软链接
sudo ln -s /opt/jdk1.8.0_191/bin/java /usr/bin/java
Jenkins权限问题
Jenkins在执行shell脚本的时候可能出现权限问题,我们可以把jenkins账户加入到root组
将jenkins账户加入到root组
sudo gpasswd -a root jenkins
修改 /etc/default/jenkins 内容
# user and group to be invoked as (default to jenkins)
JENKINS_USER=root
JENKINS_GROUP=root
重启jenkins
sudo service jenkins restart
查看是否已经加入到root组
cat /etc/group |grep jenkins
jenkins:x:127:root
文件权限问题
错误信息
/home/cc/backup/360jiagu/jiagu/jiagu_360.sh ./local.properties app/build/bakApk/resguard/ry_taxi_passenger20_1.0.2.0.apk ./jiagu
/tmp/jenkins9129980792461988922.sh: 20: /tmp/jenkins9129980792461988922.sh: /home/cc/backup/360jiagu/jiagu/jiagu_360.sh: Permission denied
修改该文件权限即可
chmod 777 /home/cc/backup/360jiagu/jiagu/jiagu_360.sh
欢迎长按下图 -> 识别图中二维码
以上是关于Ubuntu搭建Jenkins+Android自动化打包的主要内容,如果未能解决你的问题,请参考以下文章
Ubuntu使用Jenkins配置自动化打包Android APK
Ubuntu使用Jenkins配置自动化打包Android APK
Ubuntu使用Jenkins配置自动化打包Android APK