安卓Jenkins持续化集成

安装篇

1.打开你的浏览器,输入www.baidu.com
2.搜索jenkins点开第一个,然后等待加载转圈圈https://www.jenkins.io/zh/

官网.png

3.下载左边的,稳定版,不下每周更新版
下载.png

4.MAC Linux Windows都下载自己的版本
5.安装后打开,各种默认化配置,有下一步点击下一步
image.png

6.等待插件下载完,部分下载失败也没事,不用管,能进入主页直接进入主页
image.png

7.看到这个,恭喜,你安装并且登录成功了
image.png

使用篇 以ubantu为例

问题1:jenkins配置局域网其他电脑可访问(自己百度找,就是把127.0.0.1改成0.0.0.0)
https://blog.csdn.net/weixin_33860147/article/details/89752482
问题2:jenkins配置环境变量
Manage Jenkins ->Configure System->Environment variables 配置一些你的环境变量
系统默认的path可用,可以输出path以示例。
问题3:开启用户认证,或者说多用户体系
默认只有单用户,在Manage Jenkins ->Configure Global Security->勾选允许用户注册,勾选项目矩阵授权策略,效果如下,给对应的用户,对应的权限,允许用户注册,由管理员管理

image.png

问题4,插件安装
Manage Jenkins ->Manage Plugins->点击可选插件->在搜索栏输入对应关键字,示例如下
image.png

已安装,或者已更新里面都可以找找,高级里面有安装本地插件的选项。
问题5.安装gradle版本(你得先安装gradle插件,默认推荐已经安装了)
Manage Jenkins ->Global Tool Configuration->找到gradle安装->新增gradle->选个版本填个名字保存
image.png

准备工作基本完毕,然后就是创建项目

1.回到jenkins首页,点击新建item。输入个名字,选择freestyle project完成(其他类型的,有兴趣自己搞,我没用到)


image.png

2.step1


image.png

3.step2
image.png

4.step3
这里就是一些钩子,中文描述已经很清楚,你不想点击可以选择其中一种,轮询scm,可以设置定时检查,这个不用钩子,根据规则写一句话就好了


image.png

5.step4
构建步骤,与构建后操作,只要你想要,自己添加,构建操作可以执行python,sh,windows command等,习惯哪个用哪个。个人喜欢用sh调用本地python脚本,方便调试跟脚本管理。也可以选择这里上传pgy等(要安装个pgy插件,按提示操作就好)
image.png

然后你就可以愉快的使用jenkins了。。

目前我用的解决方案

1.使用jenkins进行项目构建,
2.构建完成后,调用预写好的python脚本,做一系列操作
3.自己打包个qrcode.jar。生成二维码用
4.下载360加固的jiagu.jar。加固包使用
5.下载walle的jar包。打渠道包用
6.下载tomcat,起服务器用
7.python脚本具体流程实现为,保存mapping(解混淆使用),执行加固,加固完成后,移动到备份的文件夹,执行walle打渠道包,打完后,将至复制到tomcat的webapp下,然后根据所在路径生成二维码,然后从git中,取出一些信息,比如多少条提交日志,所在分支,或者构建参数等,组成推送文案,调用企业微信机器人的发消息方法通知到测试群,测试或者开发同学自行扫码下载即可

附其中部分python脚本方法。

import base64
import hashlib
import json
import os
import shutil
import socket
import time
import urllib.request
import urllib.error

import requests

# 新建任务需要执行的脚本需要修改的地方
# 渠道名字,复制粘贴的时候记得改
channel = "demo 名字自己设置"
# 这里对应jenkins任务目录,复制粘贴的时候记得改
rootPath = "/var/lib/jenkins/workspace/demo jenkins项目地址"
# 对应渠道的keystore名字
key_store_name = "keystore.jks的名字"
# keystore的账号密码,空格不可删除
key_store_pass = ' 密码 别名 别名密码'

# 以下不需要改动
# 加固宝的位置
jiaguPath = "/var/lib/jenkins/workspace/task/360jiagubao_linux_64/jiagu""#你放哪,就填哪里
# apk的位置
apkRootPath = rootPath + "/app/build/outputs"
# 归档文件夹的主目录
copyfilePath = "/home/haha/NewDisk/归档"
# 归档文件夹的子目录
outPutFolder = int(round(time.time() * 1000)).__str__()
# 管理员密码
sudoPassword = "1"#ubantu 的管理员密码,有些操作需要管理员权限
# tomecat服务器目录
tomcatPath = "/home/haha/studio/tomcat/webapps/examples"
# 二维码生成jar包的路径
qrcodeJarPath = "/var/lib/jenkins/workspace/task/myqrcode.jar"


def getNewestMessage():
    result2 = os.popen("git name-rev --name-only HEAD")
    outPut = result2.buffer.read().decode('utf-8')
    return outPut


def getCommitMsg():
    outPut = os.popen("git log --pretty=format:\"%H\" | head -10")
    idArray = outPut.buffer.read().decode('utf-8').split('\n')
    for i in range(0, len(idArray)):
        result2 = os.popen("git log --pretty=format:\"%s\" " + idArray[i] + " -1")
        outPut = result2.buffer.read().decode('utf-8')
        if "Merge branch" in outPut:
            continue
        else:
            return outPut
    return "无额外提交信息"


# 获取apk路径
def apkPath(file_dir):
    list = []
    for root, dirs, files in os.walk(file_dir):
        if len(files) > 0:
            for file in files:
                if file.endswith(".apk"):
                    list.append(root + "/" + file + '')
    return list


# 获取apk版本号
def file_name():
    for root, dirs, files in os.walk(apkRootPath):
        if len(files) > 0:
            for file in files:
                if file.endswith(".apk"):
                    a = file.split("_")
                    return a[len(a) - 2]


# 创建文件夹
def create_folder(check_path):
    if not os.path.exists(check_path):
        os.makedirs(check_path)


# 拷贝目录到子文件
def copyfile():
    # 创建归档目录
    out_path = os.path.join(copyfilePath, channel, file_name(), outPutFolder)
    create_folder(out_path)
    # 获取需要拷贝的apk列表
    list = apkPath(apkRootPath)
    if len(list) > 0:
        for path in list:
            shutil.copy(path, out_path)


def copyMapping():
    # 创建归档目录
    os.chdir(copyfilePath)
    # create_folder(os.path.join(file_name(), outPutFolder))

    folder1 = os.path.join(apkRootPath, "mapping")
    folder2 = os.path.join(copyfilePath, channel, file_name(), outPutFolder, "mapping")
    shutil.copytree(folder1, folder2, ignore=shutil.ignore_patterns("output.json"))


def exec_360_jiagu(path):
    output_path = os.path.join(copyfilePath, file_name(), outPutFolder)
    if not os.path.exists(output_path):
        os.mkdir(output_path)
    jiagu_cmd = 'java -jar jiagu.jar -jiagu ' + path + ' ' + output_path + ' -autosign'
    result = os.system('echo %s|sudo -S %s' % (sudoPassword, jiagu_cmd))
    if not result:
        print("========" + str(result) + "  加固成功")
    else:
        print("加固失败")


def jiagu():
    # 检查输出路径是否存在
    folder0 = os.path.join(copyfilePath, file_name(), outPutFolder)
    create_folder(folder0)

    # 登陆加固程序
    os.chdir(jiaguPath)
    command = 'java -jar jiagu.jar -login 18268065891 ff623893'
    os.system('echo %s|sudo -S %s' % (sudoPassword, command))

    folder1 = os.path.join(rootPath, "app", key_store_name)
    command = 'java -jar jiagu.jar -importsign ' + folder1 + key_store_pass
    os.system('echo %s|sudo -S %s' % (sudoPassword, command))
    # 获取需要加固的APK列表
    list = apkPath(apkRootPath)
    if len(list) > 0:
        for path in list:
            # 开始加固
            exec_360_jiagu(path)


def notifyQyWx(downloadPath):
    url = 'https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=f38fa1f7-8193-4e28-bfff-d6fbd5680770'

    os.chdir(rootPath)

    con = {"msgtype": "text",
           "text": {"content": "打包成功了:下载链接 \n" + downloadPath + "\n打包分支:" + getNewestMessage()}, }

    jd = json.dumps(con).encode('utf-8')

    req = urllib.request.Request(url, jd)

    req.add_header('Content-Type', 'application/json')

    response = urllib.request.urlopen(req)


def notifyQyWxText():
    url = 'https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=aaaa'

    os.chdir(rootPath)

    result2 = os.popen("echo $message")
    back_message = result2.buffer.read().decode('utf-8')

    con = {"msgtype": "text",
           "text": {"content": "打包成功了\n版本号:" + file_name() + "\n提交日志:" + getCommitMsg()+"\n所在分支:" + getNewestMessage()+"\n备注信息:"+back_message}, }

    jd = json.dumps(con).encode('utf-8')

    req = urllib.request.Request(url, jd)

    req.add_header('Content-Type', 'application/json')

    response = urllib.request.urlopen(req)




def wx_image(image):
    with open(image, 'rb') as file:  # 转换图片成base64格式
        data = file.read()
        encodestr = base64.b64encode(data)
        image_data = str(encodestr, 'utf-8')

    with open(image, 'rb') as file:  # 图片的MD5值
        md = hashlib.md5()
        md.update(file.read())
        image_md5 = md.hexdigest()

    url = "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=aaaa"  # 填上机器人Webhook地址
    headers = {"Content-Type": "application/json"}
    data = {
        "msgtype": "image",
        "image": {
            "base64": image_data,
            "md5": image_md5
        }
    }
    result = requests.post(url, headers=headers, json=data)
    return result


def generateQrcode():
    # 加固的输出目录
    input_path = os.path.join(copyfilePath, channel, file_name(), outPutFolder)
    # list = apkPath(input_path)
    # if len(list) > 0:
    #     for path in list:
    #         # 开始加固
    #         exec_360_jiagu(path)
    output_path = os.path.join(tomcatPath, "apk", channel, file_name())
    if os.path.exists(output_path):
        shutil.rmtree(output_path)
    shutil.copytree(input_path, output_path, ignore=shutil.ignore_patterns("mapping"))
    server_path = "http://" + get_host_ip() + ":8088"
    list = apkPath(output_path)
    downloadpaths = ""
    if len(list) > 0:
        notifyQyWxText()
        for path in list:
            qrcode_content = server_path + path.replace("/home/haha/studio/tomcat/webapps", "")
            pic_path = tomcatPath + "/img/" + channel + "/" + file_name() + ".png"
            command = "java -jar " + qrcodeJarPath + " src=" + qrcode_content + " path=" + pic_path
            os.system('echo %s|sudo -S %s' % (sudoPassword, command))
            wx_image(pic_path)
            downloadpaths = downloadpaths \
                .__add__(qrcode_content) \
                .__add__("\n")
    # 通知到企业微信(暂时不用)
    # notifyQyWx(downloadpaths)
    # 复制文件到tomcat


def get_host_ip():
    """
    查询本机ip地址
    :return:
    """
    try:
        s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
        s.connect(('8.8.8.8', 80))
        ip = s.getsockname()[0]
    finally:
        s.close()
    return ip


if __name__ == '__main__':
    # 初始化存储目录
    # copyMapping() 测试不需要拷贝mapping
    # jiagu() 测试包不需要加固

    copyfile()
    generateQrcode()

附二维码生成qrcode.jar
使用方法 java -jar myqrcode.jar src=aa path=D:/aaa.png //这里反斜杆不要输入错
链接:https://pan.baidu.com/s/1sOOihVTCXGGzU62CzoXWpw
提取码:8pzb

你可能感兴趣的:(安卓Jenkins持续化集成)