在 Jenkins 上显示打包二维码(jenkins打包报错)
off999 2024-10-04 18:59 24 浏览 0 评论
前言
在Jenkins上显示二维码,是为了每次打完包之后都能方便的用手机下载,不必再使用数据线安装。
本文涉及以下内容
- 架设Web服务器(https)
- Jenkins的history显示图片
- Mac安装Homebrew和Python3
- 本地生成二维码
- shell生成manifest.plist
- 微信扫码跳转
- Jenkins的Job之间传递变量
准备
在Jenkins上显示二维码的思路是修改BuildDescription并放置二维码图片的链接
因此我们需要准备以下内容
项目备注Web服务器用来存放打出来的安装包,可以参照 这里 部署二维码将安装包的链接转换为二维码图片build-name-setterJenkins插件,修改BuildName(新版本为Build Name and Description Setter,集成了修改BuildDescription的功能)
动手
一、在Jenkins上显示二维码图片
1. 安装Jenkins插件
- 进入Jenkins工作台系统管理>插件管理>可选插件>过滤>build-name-setter,勾选对应插件直接安装
- 返回工作台首页,选择一个Build工程>配置
- 可以看到构建环境处多了一个Set Build Name的选项,即插件安装成功
2. 配置Set Build Name插件
查看Jekins的环境变量参数,我们可以看到
BUILD_NUMBER The current build number, such as "153" BUILD_DISPLAY_NAME The display name of the current build, which is something like "#153" by default.
- Set Build Name就是修改这个BUILD_DISPLAY_NAME,默认为#${BUILD_NUMBER}
- Jenkins的默认安全设置,会把所有的输入都当成纯文本,为了使图片链接生效,需要更改一下系统管理>全局安全配置>标记格式器,将纯文本选项改为Safe HTML,保存设置
- 点击Set Build Name的高级,会出现Build Description的设置,可以在这里写入一个图片的链接 <img src="http://ww1.sinaimg.cn/large/007x9vWyly1g2zgykchtmj30a7064dk4.jpg" height="200" width="200/>
- Build完成之后即可在Build历史中看到对应的图片链接
二、生成二维码图片
生成二维码的方法有很多,可以自行网上查找,我们这里使用一个比较简单的MyQR(Github),MyQR依赖于Python,如果已经安装好Pyhton 3,点击这里跳转到第三步
1. 安装Homebrew
Mac上自带python是2.7.x版本,血和泪的教训告诉我们没事千万不要动他,有可能造成一些工具无法正常使用(如:Xcode)。这里我们通过Homebrew(官网)安装一下Python 3
ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
安装完毕后brew -v验证是否安装成功
$ brew -v Homebrew 2.1.2 Homebrew/homebrew-core (git revision 48bc; last commit 2019-05-13)
如果出现
-bash: brew: command not found
可能是环境变量没有配置好,配置环境变量并更新使其生效
2. 安装Python 3
安装完Homebrew之后,通过命令安装Python 3,Homebrew中的Python默认是Python 3,因此:
$ brew install python
安装完毕后,输入python3和pip3验证是否安装成功
$ python3 Python 3.7.3 (default, Mar 27 2019, 09:23:15) [Clang 10.0.1 (clang-1001.0.46.3)] on darwin Type "help", "copyright", "credits" or "license" for more information. >>> exit()
$ pip3 Usage: pip3 <command> [options] Commands: install Install packages. ···
3. 安装MyQR
$ pip3 install myqr
验证安装是否成功
$ myqr -h
4. MyQR生成二维码
- MyQR的常用参数:
myqr Words [-v {1,2,3,...,40}] [-l {L,M,Q,H}] [-n output-filename] [-d output-directory] [-p picture_file] [-c] [-con contrast] [-bri brightness]
- 生成二维码,会在当前目录下生成指定的二维码
myqr 'hello word'
可以通过-n和-d来设置生成文件名和路径
$ myqr 'hello word' -n hellow.png -d ../path/
常用参数说明:
-v 控制边长,范围是1至40,数字越大边长越大; -l 控制纠错水平,范围是L、M、Q、H,从左到右依次升高。 -n 控制文件名,格式可以是 .jpg, .png ,.bmp ,.gif ; -d 控制位置。 -p 用来将QR二维码图像与一张同目录下的图片相结合,产生一张黑白图片。 -c 可以使产生的图片由黑白变为彩色的。 -con 用以调节图片的对比度,1.0 表示原始图片,更小的值表示更低对比度,更大反之。默认为1.0。 -bri 用来调节图片的亮度,其余用法和取值与 -con 相同。
缺点是不能识别中文,优点是一行代码即可生成,比较方便,字符范围:
数字 0 到 9 大小写的英文字母 常用英文标点符号和空格 · , . : ; + - * / \ ~ ! @ # $ % ^ & ` ' = < > [ ] ( ) ? _ { } | and (space)
三、规范安装包链接地址
1. 修改Apache默认站点目录
为了方便管理和处理权限问题,我们需要修改Apache的默认站点路径
- 先创建一个新的Web路径
$ cd /Users/{$username}/ $ mkdir WebSites $ cd WebSites $ pwd /Users/{$username}/WebSites
- 修改Apache的httpd.conf配置 $ sudo vim /private/etc/apache2/httpd.conf 找到DocumentRoot配置 DocumentRoot "/Library/WebServer/Documents" <Directory "/Library/WebServer/Documents"> 修改为 DocumentRoot "/Users/{$username}/WebSites" <Directory "/Users/{$username}/WebSites">
- 修改Apache的httpd-ssl.conf配置 $ sudo vim /private/etc/apache2/extra/httpd-ssl.conf 找到DocumentRoot配置 DocumentRoot "/Library/WebServer/Documents" 修改为 DocumentRoot "/Users/{$username}/WebSites"
- 在新的Web路径下创建一个主页 $ cd /Users/{$username}/WebSites $ vim index.html 插入内容 <html> <body> <h1>Hello New World!</h1> </body> </html>
- 重启Apache服务 $ sudo apachectl restart
- 验证修改
访问服务器IP或域名进行验证,http://和https://都需验证
页面出现Hello New World!证明修改成功
2. 创建安装包存放路径
$ mkdir app $ cd app $ mkdir and $ cd and $ mkdir qrimg ···
创建文件路径如下
|-- app //总目录 |-- and //存放Android相关文件 | |-- apk //存放apk | |-- qrimg //存放对应的二维码图片 |-- ios //存放iOS相关文件 |-- icon //存放plist中对应的icon |-- ipa //存放ipa |-- plist //存放ipa对应plist文件 |-- ssl //存放SSL证书 |-- qrimg //存放对应的二维码图片
四、修改脚本路径并生成二维码
现在我们需要将打包脚本中生成的文件存储在对应的目录下
1. Android脚本修改
Android脚本比较好修改,只需在Jenkins生成apk时,将生成路径修改为上面存放的路径/Users/{$username}/WebSites/app/apk,具体打包脚本不便贴出,这里将相关变量和修改的代码贴一下
# parameters always curlTime=`date +%Y%m%d%H%M%S` outputpath=/Users/{username}/Desktop/package/Android_package/apk packagename=Test platform=android webApk=/Users/{username}/WebSites/app/and/apk cp $outputpath/$packagename.apk $webApk/$packagename\_$curlTime.apk apkUrl='http://主机地址/app/and/apk/'$packagename\_$curlTime'.apk' myqr $apkUrl -n andqr_${JOB_NAME}${BUILD_NUMBER}.png -d /Users/{$username}/WebSites/app/and/qrimg qrUrl='http://主机地址/app/and/qrimg/andqr_${JOB_NAME}${BUILD_NUMBER}.png'
此时,我们得到了Android包的下载地址的二维码,然后把这个地址放在Set Build Name>高级>Build Description里即可
再Build时,就可以在构建历史中看到对应的二维码了
2. iOS脚本修改
iOS脚本修改的原理和Android类似,不同的是ipa不像apk一样可以直接安装,需要通过OTA的方式安装(详见这篇文章),因此我们要生成ipa对应的plist文件和对应的二维码
- 相关变量
# parameters always curlTime=`date +%Y%m%d%H%M%S` packagename=Zeus ipaName=$packagename\_$curlTime exportPath=/Users/xt/Desktop/package/iOS_package/ipa ipaPath=/Users/xt/WebSites/app/ios/ipa #生成的ipa拷到指定位置 cp $exportPath/Unity-iPhone.ipa $ipaPath #manifest.plilst需要的参数 ipaUrl='https://主机地址/app/ios/ipa/'$ipaName'.ipa' disImg='https://主机地址/app/ios/icon/57.png' fullImg='https://主机地址/app/ios/icon/512.png' bundleId=com.xxx.yyy bundleVersion=0.0.1 displayName=Zeus
- 根据上面参数生成manifest.plist
cd /Users/xt/WebSites/app/ios/plist cat << EOF > ${ipaName}.plist <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>items</key> <array> <dict> <key>assets</key> <array> <dict> <key>kind</key> <string>software-package</string> <key>url</key> <string>${ipaUrl}</string> </dict> <dict> <key>kind</key> <string>display-image</string> <key>url</key> <string>${disImg}</string> </dict> <dict> <key>kind</key> <string>full-size-image</string> <key>url</key> <string>${fullImg}</string> </dict> </array> <key>metadata</key> <dict> <key>bundle-identifier</key> <string>${bundleId}</string> <key>bundle-version</key> <string>${bundleVersion}</string> <key>kind</key> <string>software</string> <key>title</key> <string>${displayName}</string> </dict> </dict> </array> </dict> </plist> EOF
- 将plist对应的超链接生成二维码
plistUrl="itms-services://?action=download-manifest&url=https://主机地址/app/ios/plist/${ipaName}.plist" myqr $plistUrl -n iosqr_${JOB_NAME}${BUILD_NUMBER.png -d /Users/xt/WebSites/app/ios/qrimg
把这个地址放在Set Build Name>高级>Build Description里即可
- 再把SSL证书做一个下载二维码,放在JOB说明中,方便第一次的安装下载
$ cd /Users/xt/WebSites/app/ios/ssl $ myqr http://主机地址/app/ios/ssl/ip211.crt
3. 微信扫码的处理
在实际应用过程中,大多数人的扫码工具还都是微信,但是微信内置浏览器的解析方式和其他浏览器不一样,我们还需要对这种情况进行处理。
- 判断是否是微信浏览器
微信官方推荐JS做法
var ua = navigator.userAgent.toLowerCase(); var isWeixin = ua.indexOf('micromessenger') != -1; if (isWeixin) { return true; }else{ return false; }
完整的HTML示例如下:
<html> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <body> <h1 id='jump'>ooooo</h1> <script> #测试时候为了刷新缓存 window.onpageshow = function(event) { if (event.persisted) { window.location.reload() } }; #判断是否在微信浏览器 var ua = navigator.userAgent.toLowerCase(); var isWeixin = ua.indexOf('micromessenger') != -1; if (isWeixin) { document.getElementById("jump").innerHTML="请在sarfri中打开"; }else{ document.getElementById("jump").innerHTML="请在sarfri中打开"; window.location.href="itms-services:///?action=download-manifest&url=https://主机地址/xyz.plist"; } </script> </body> </html>
可参考上面生成plist的方式,生成对应的apk,ssl证书和plist对应的html文件,然后将html的地址生成二维码。
补充
这样做完后单个JOB命令过长,可将不同任务拆分成不同的JOB,此时需要注意在不同JOB之间传递变量
# 将之前的内容删除 if [ -f "${WORKSPACE}/tempParams.txt" ];then rm "${WORKSPACE}/tempParams.txt" else echo "File not exist" fi # 变量写入文件 echo bundleID="${bundleId}" >> "${WORKSPACE}/tempParams.txt" echo ipaUrl="${bundleId}" >> "${WORKSPACE}/tempParams.txt" ····
其他JOB开始时读取变量
source "${WORKSPACE}/tempParams.txt"
相关推荐
- python爬取电子课本,送给居家上课的孩子们
-
在这个全民抗疫的日子,中小学生们也开启了居家上网课的生活。很多没借到书的孩子,不得不在网上看电子课本,有的电子课本是老师发的网络链接,每次打开网页去看,既费流量,也不方便。今天我们就利用python的...
- 高效办公!Python 批量生成PDF文档是如何做到的?
-
前言:日常办公中,经常会使用PDF文档,难免需要对PDF文档进行编辑,有时候PDF文档中的大部分内容都是一样的,只是发送对象不同。这种模板套用的场景下,使用Python进行自动化就尤为方便,用最短的时...
- 如何用Python将PDF完整的转成Word?
-
PDF文件完整的转为Word,转换后格式排版不会乱,图片等信息完整显示不丢失。这个很简单,有很多方法都可以实现。方法一:Python利用Python将PDF文件转换为Word,有许多库可以帮你实现这一...
- 使用Python拆分、合并PDF(python合并多个pdf)
-
知识点使用Python操作PDF!主要内容有:1、PDF拆分;2、PDF合并。在工作中,难免会和PDF打交道,所以掌握一点处理PDF的技能非常有必要,本文将介绍几个常用的功能。PDF拆分很多时候,获取...
- 10分钟实现PDF转Word神器!看DeepSeek如何用Python解放打工人
-
开篇痛点每个被PDF折磨过的职场人都懂——领导发来的扫描件要修改,手动抄到Word需要2小时;网上下载的报告想复制数据,却变成乱码…今天我们用Python+DeepSeek,10分钟打造一个智能转换工...
- 《Python知识手册》,高清全彩pdf版开放下载
-
Python编程还不懂?今天我要把我参与编写的这套《Python知识手册》免费分享出来,看完文末有惊喜哦。...
- 利用python进行数据分析,PDF文档给你答案
-
本书详细介绍利用Python进行操作、处理、清洗和规整数据等方面的具体细节和基本要点。虽然本书的标题是“数据分析”,重点却是Python编程、库,以及用于数据分析的工具。兄弟,毫无套路!PDF版无偿获...
- OCRmypdf:一款可以让扫描PDF文件变得可搜索、可复制!
-
简介在日常工作中,我们经常会接触到各种PDF文件,其中不少是扫描版文档。处理这些扫描PDF时,尽管内容看似完整,但往往无法直接复制或搜索其中的文本。尤其是在需要对大量文档进行文本分析、存档或后期编辑时...
- 高效的OCR处理工具!让扫描PDF文件变得可搜索、可复制!
-
在工作中,我们常常遇到各种各样的PDF文件,其中不乏一些扫描版的文档。而在处理扫描的PDF文件时,虽然文件内容看似完整,但你却无法复制、搜索其中的文本。特别是对大量文档需要进行文本分析、存档、或者...
- 三步教你用Elasticsearch+PyMuPDF实现PDF大文件秒搜!
-
面对100页以上的大型PDF文件时,阅读和搜索往往效率低下。传统关系型数据库在处理此类数据时容易遇到性能瓶颈,而Elasticsearch凭借其强大的全文检索和分布式架构,成为理想解决方案。通过...
- 用 Python 去除 PDF 水印,你学会吗?
-
今天介绍下用Python去除PDF(图片)的水印。思路很简单,代码也很简洁。首先来考虑Python如何去除图片的水印,然后再将思路复用到PDF上面。这张图片是前几天整理《数据结构和算法...
- 扫描PDF档案效率提升300%!OCRmyPDF:告别无法搜索的PDF噩梦,这款26K Star的开源神器让文本识别轻松上手!
-
要在PDF中搜索某个关键词,结果发现啥也找不到?这种情况大多数人都遇到过吧,特别是处理扫描文档或图片PDF时。就在前几天,我还在为这事抓狂呢!后来无意中发现了OCRmyPDF这个宝藏项目...简直就...
- Python自动化办公之PDF版本发票识别并提取关键信息教程(上篇)
-
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Python自动化办公发票数据处理的问题,一起来看看吧。二、实现过程这个问题在实际工作中还是非常常见的,实用性和通用性都比...
- PDF解锁神器:用PyMuPDF与pdfplumber告别手动提取
-
前言大家好,今天咱们来聊聊如何用Python中的PyMuPDF和pdfplumber库,轻松提取PDF文件里的文本和元数据。你是否曾经在处理一个复杂的PDF文件时,感到信息难以触及,提取过程让人抓狂?...
- 《Python知识手册》,高清pdf免费获取
-
今天我要把我参与编写的这套《Python知识手册》免费分享出来,真正弘扬Python开源精神!手册的部分页面如下:获取方式:...
你 发表评论:
欢迎- 一周热门
- 最近发表
-
- python爬取电子课本,送给居家上课的孩子们
- 高效办公!Python 批量生成PDF文档是如何做到的?
- 如何用Python将PDF完整的转成Word?
- 使用Python拆分、合并PDF(python合并多个pdf)
- 10分钟实现PDF转Word神器!看DeepSeek如何用Python解放打工人
- 《Python知识手册》,高清全彩pdf版开放下载
- 利用python进行数据分析,PDF文档给你答案
- OCRmypdf:一款可以让扫描PDF文件变得可搜索、可复制!
- 高效的OCR处理工具!让扫描PDF文件变得可搜索、可复制!
- 三步教你用Elasticsearch+PyMuPDF实现PDF大文件秒搜!
- 标签列表
-
- python计时 (73)
- python安装路径 (56)
- python类型转换 (93)
- python自定义函数 (53)
- python进度条 (67)
- python吧 (67)
- python字典遍历 (54)
- python的for循环 (65)
- python格式化字符串 (61)
- python静态方法 (57)
- python串口编程 (60)
- python读取文件夹下所有文件 (59)
- java调用python脚本 (56)
- python操作mysql数据库 (66)
- python字典增加键值对 (53)
- python获取列表的长度 (64)
- python接口 (63)
- python调用函数 (57)
- python人脸识别 (54)
- python多态 (60)
- python匿名函数 (59)
- python打印九九乘法表 (65)
- python赋值 (62)
- python异常 (69)
- python元祖 (57)