安装篇
1.打开你的浏览器,输入www.baidu.com
2.搜索jenkins点开第一个,然后等待加载转圈圈https://www.jenkins.io/zh/
3.下载左边的,稳定版,不下每周更新版
4.MAC Linux Windows都下载自己的版本
5.安装后打开,各种默认化配置,有下一步点击下一步
6.等待插件下载完,部分下载失败也没事,不用管,能进入主页直接进入主页
7.看到这个,恭喜,你安装并且登录成功了
使用篇 以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->勾选允许用户注册,勾选项目矩阵授权策略,效果如下,给对应的用户,对应的权限,允许用户注册,由管理员管理
问题4,插件安装
Manage Jenkins ->Manage Plugins->点击可选插件->在搜索栏输入对应关键字,示例如下
已安装,或者已更新里面都可以找找,高级里面有安装本地插件的选项。
问题5.安装gradle版本(你得先安装gradle插件,默认推荐已经安装了)
Manage Jenkins ->Global Tool Configuration->找到gradle安装->新增gradle->选个版本填个名字保存
准备工作基本完毕,然后就是创建项目
1.回到jenkins首页,点击新建item。输入个名字,选择freestyle project完成(其他类型的,有兴趣自己搞,我没用到)
2.step1
3.step2
4.step3
这里就是一些钩子,中文描述已经很清楚,你不想点击可以选择其中一种,轮询scm,可以设置定时检查,这个不用钩子,根据规则写一句话就好了
5.step4
构建步骤,与构建后操作,只要你想要,自己添加,构建操作可以执行python,sh,windows command等,习惯哪个用哪个。个人喜欢用sh调用本地python脚本,方便调试跟脚本管理。也可以选择这里上传pgy等(要安装个pgy插件,按提示操作就好)
然后你就可以愉快的使用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