4

Jenkins 自动生成二维码到构建历史

 2 years ago
source link: https://www.lfhacks.com/tech/jenkins-qrencode
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

Jenkins 自动生成二维码到构建历史

扫一扫,用手机分享 jenkins-qrencode
822.jpg

我们希望将构建好的文件自动生成下载链接,然后自动生成下载链接对应的二维码,再将二维码图片显示在 Jenkins 的构建历史(Build History)区块中。有几种不同的方法可以实现,本文介绍其中一种。

希望能将构建好的文件传到 Jenkins 中,自动在构建历史中显示文件下载链接的二维码。如下图:

668.png

构建的文件可能来自上一个构建 Job,也可能有人工上传,本文假设需要人工上传,下面介绍详细的实现步骤:

显示二维码的原理

构建历史中的每一个 build,都由两部分组成: build name 和 build description,我们只要自动生成二维码图片(第一步),再将图片的 html 链接放入 build description (第二步)即可实现。

670.png

设置 Jenkins 允许显示 HTML

首先要让 Jenkins 允许在 build description 中显示 html 内容,这牵涉到安全性。所以在Jenkins 管理界面的全局安全配置(Configure Global Security)栏目下,寻找 “标记格式器”,如下图:

669.png

选择 Safe HTML,这样无论是 build 还是 job 的 description 都支持 html.

配置 Jenkins 的文件上传

具体上传方法见这篇文章。但是本文所需的脚本有所不同,具体见 下节

处理上传的文件名

接下来可以将上传的 testfile 进行一番预处理。首先在构建步骤中增加 Execute Shell:

然后利用 配置 Jenkins 的文件上传 中的“文件路径” 变量操作,恢复原来文件的名字,并且加上时间戳。填入下面脚本:

# 假设原始文件 abc.zip

BASENAME=${testfile%.*}
# abc

EXTNAME=${testfile##*.}
# zip

TIMESTAMP=`date "+%y%m%d-%H%M%S"`
# 20191010-121101

NEWNAME=${BASENAME}-${TIMESTAMP}
# abc-20191010-121101

SHA=$(md5sum testfile)
SHA=${SHA:0:8}
# 1234abcd

mv testfile ${NEWNAME}.${EXTNAME}
# abc-20191010-121101.zip

比如说你上传了 abc.zip 文件,经过 上面这一系列 操作后,就得到 abc-20191010-121101.zip 的文件名。这样即使多次上传同一个文件,也能保证上传后的文件不会发生覆盖。

此外,还得到了文件的 md5,作为文件的元信息,保存在 ${SHA} 中,后面会用到。

自动成生二维码图片

许多编程语言都有 生成二维码 的方案,考虑到由于 处理上传的文件名 一节中使用了 shell ,所以继续使用 shell 生成二维码将更方便。

本文使用 福地健太郎 提供的 libqrencode 库本站下载链接 )可以实现在 bash 命令行下输出 png 格式的图片。

libqrencode 库 需要安装一些组件,如果要生成 PNG 图片,则必须安装 libpng 库,它在不同的Linux发行版下,有不同的名字:

Ubuntu
# apt-get install libpng12-dev   

CentOs
# yum install libpng12-devel    

其他需要安装的组件可能有:

autoconf
automake
autotools-dev
libtool
pkg-config

组件安装好后,将压缩包(qrencode-4.0.2.tar.gz)上传到 jenkins 主机的 /usr/local/src中,执行 tar 命令解压:

# tar zxvf qrencode-4.0.2.tar.gz

在解压后的文件夹里执行下列命令:

# cd qrencode-4.0.2
# ./configure
# make
# sudo make install
# sudo ldconfig

编译后,会在 /usr/local/bin 中得到可执行文件 qrencode ,这时候在任意位置下即可直接运行:

# qrencode
qrencode version 4.0.2
Copyright (C) 2006-2017 Kentaro Fukuchi
Usage: qrencode [OPTION]... [STRING]
Encode input data in a QR Code and save as a PNG or EPS image.

  -h           display this message.
  ...

现在可以用这条命令方便的将字符串编译为一个带有其信息的 PNG 图片文件,最简单的用法:

$ qrencode -o show.png 'hello world!'

就能得到 672.png 这样一个 PNG 文件。

接下来就可以续写 这一节 中的 shell 脚本,加入下面的命令:

DOWNLOAD=${JOB_URL}ws/${NEWNAME}.${EXTNAME}
# http://server/jenkins/job/foo/ws/abc-20191010-121101.zip

qrencode -o ${NEWNAME}.png ${DOWNLOAD}
# http://server/jenkins/job/foo/ws/abc-20191010-121101.png

上面第一行 ${DOWNLOAD} 表示上传文件的下载链接。第二行下载链接的字符串转换为二维码,并且二维码图片的文件名称与原文件相同。这个图片将在后面步骤里以 HTML 形式插入构建历史。

将二维码图片插入构建历史

现在生成了二维码的图片文件,接下来需要显示在构建历史(Build History)列表中。Jenkins 没有提供直接修改 build description 的功能,我们需要安装插件 Description Setter 。安装好后,点开 “构建后操作步骤” 按钮,会出现新选项:Set build description

这个插件的原理是,用正则表达式搜索出现在 build log 中的文字,匹配出来的第一个结果,作为 build description. 首先在插件的Regular Expression一栏中填入:

^appDescription: (.*)

如下图所示:

这里的 appDescription 是关键字,可以按你的意愿自己定义,只要保证在整个 build console log 中不重复出现即可,不然匹配出来的就可能不是你想要的了。然后在 Description填入 \1 ,表示将上面正则表达式中括号中的部分 (.*) ,作为此次的 build 描述使用。

为了让 build log 中出现我们想要的关键字:appDescription,我们在 上一节 的 shell 脚本中,加入下面一行:

echo "appDescription: <img src=\"${JOB_URL}ws/${NEWNAME}.png\">"

到这里,二维码就能出现在构建历史(Build History)列表中了。

微调二维码图片的透明度

显示出的图片,可能有些白茫茫的。这是因为 Jenkins 的自带样式里设置了opacity,只要修改样式文件即可。样式文件在Jenkins主目录下,一般来说主目录名字叫 .jenkins (在Jenkins配置页面里显示了主目录的绝对路径),那么样式文件的路径是 .jenkins/war/css/style.css (新版的 Jenkins 中, css 文件更换到了: .jenkins/war/jsbundles/base-styles-v2.css),搜索 buildHistory,就能找到对应的样式:

#buildHistory .desc {
  ...
  opacity: 0.6;
}

改为 opacity: 1; 即可。

在图片旁边同时显示其他信息

加上文件的信息

前面一节中 中,我们还生成了文件的MD5,为了和图片一起显示出来,我们修改 上节中 中的 shell 脚本为:

echo "appDescription: <img src=\"${JOB_URL}ws/${NEWNAME}.png\">\
<br><span>${SHA} <a href=\"${DOWNLOAD}\">下载</a></span>"

就可以在图片下方显示文件的 MD5,同时提供了文件下载的链接。效果如下图:

来自 job 的参数

也可以在 job 中添加参数,用于在上传文件的时候增加备注。比如在文件中增加一个叫 note 的参数:

然后脚本中添加 appDescription 这一步可以改为:

echo "appDescription: <span>${note} by ${BUILD_USER}</span><br><img src=\"${JOB_URL}ws/${NEWNAME}.png\">\
<br><span>${SHA} <a href=\"${DOWNLOAD}\">下载</a></span>"

${BUILD_USER} 是触发此次 job 的用户名。

完整的 shell 脚本如下:

BASENAME=${testfile%.*}
EXTNAME=${testfile##*.}
TIMESTAMP=`date "+%y%m%d-%H%M%S"`
NEWNAME=${BASENAME}-${TIMESTAMP}
SHA=$(md5sum testfile)
SHA=${SHA:0:8}
mv testfile ${NEWNAME}.${EXTNAME}
DOWNLOAD=${JOB_URL}ws/${NEWNAME}.${EXTNAME}
qrencode -o ${NEWNAME}.png ${DOWNLOAD}
echo "appDescription: <img src=\"${JOB_URL}ws/${NEWNAME}.png\">\
<br><span><a href=\"${DOWNLOAD}\">${SHA}</a></span>"

这可能不是最简便的方案,但至少是一个可行的方案。

下载认证问题

上传到 workspace 中的文件可能必须先登录Jenkins 才能下载,如果想直接匿名下载就不可以。不过这不是难事,可以参考 这篇文章 搭建一个匿名下载服务器。然后在 shell 代码mv 一步直接转移到下载服务器内,即可匿名下载。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK