有这样的场景,我们的ftp上都是些重要的资料,所以大家基本只有可看的权限,只有部分管理人员有可读可写的权限,但是jenkins上基本使用的都是ftp的路径,这个时候就存在一些问题,某些开发需要将自己构建的apk放到ftp上,通过jenkins构建传到阿里云服务器上测试,就没办法做了。
比如:A员工在测试apk升级,他打了一个包,要测试升级,正常的流程是,他把包给ftp的管理员,管理员放到ftp上,然后云平台测试人员在云平台发布这个apk,触发jenkins构建,传包到阿里云上,并返回apk在阿里云上的路径。
也比如:员工B要将已经在乐固上加固过的apk重新签名,他也要给包到管理员,管理员放到ftp上,触发jenkins构建来签名,结束后返回这个已经签好名的apk在ftp上的路径。
这个时候,我们就会想,要是有个固定的可以访问的本地路径可以用就好了。
但是我查找了,jenkins没有可以选择本地文件上传的插件(如果再看这篇博客的你知道有这个插件,麻烦告诉我一下,嘻嘻!),这个时候我们就要转变思路了。我们知道jenkins的slave节点的实用性,就比如我们,会根据不同平台的需要,添加不同类型的jenkins的从机,目前,我们有mac,centos,windows的从机,关于主从jenkins的搭建,可以参考我的另外的博客https://www.cnblogs.com/zndxall/p/8297356.html,我们发现上面的两个案例都可以在windows平台实现,所以我们有两种选择:一种是使用其中一台windows的从机来做一个中转站,将需要处理的apk放到windows的从机路径下,并设置该路径共享(这类路径,我们一版不会放重要文件,所以可以设置可读可写的权限);另一种方法是将要处理的apk放在本地的特定路径下,设置自己的主机的ip是固定的,设置这个特定路径为共享路径(可读可写),在jenkins构建时,填写这个路径就可以了。由于我们公司的ip都是自动分配的,所以我只能采用第一种方式。下面我会详细介绍。
假设windows从机的ip是192.168.1.211,
我的jenkins的配置如下,其中已经写明白了详细的使用说明:
这个jenkins上的build_host就是对应的windows从机的节点名称,在我的另一篇博客https://www.cnblogs.com/zndxall/p/8297356.html中已经写的很清楚了,这里就不赘述了。
这个jenkins任务的构建设置如下:
这里涉及到的文件如下,稍后我们逐一介绍:
我们可以看到有winscp,这里会说明winscp的使用,首先我们先看下入口脚本:
@echo off
setlocal ENABLEDELAYEDEXPANSION
set up_dir=C:uild_bat
set apk_dir=C:apkupgrade_test
set local_sign_path=C:apksender_sign_apk
set ftp_sign_path=\192.168.1.2ftpoutputSign_apkapp_for_anl
::由于ftp只开启了ftp服务,所以需要用url的形式显示
set ftp_signed_apk=ftp://192.168.1.2/output/Sign_apk/app_for_anl
set cur_path=%cd%
::阿里云的域名
set ftp_url=http://download.mirrorcast.cn/test
set datevar=%date:~0,4%%date:~5,2%%date:~8,2%
set min=%time:~3,2%
Set hour=%time:~0,2%
::时间9点之前构建会出现传文件失败,因为有空格
if %hour% leq 9 ( set hour=0%hour:~1,1%)
set mytime=%hour%%min%
set result_dir=%datevar%%mytime%
::获取传入的参数
set app_repo=%1
set send_apk_sign=%2
if "%app_repo%" == "0" (
echo app_repo is 0 and meaning apk upgrade test do nothing
)else (
echo this is apk upgrade building ...
copy %apk_dir%*.apk .
::获取apk的名字,并重名了apk,涉及到环境变量延迟扩展,可自行查阅
for /F %%h in ( 'dir /B %cur_path% ^|findstr ".apk" ' ) do (
set apk_name=%%h
echo apk_name=!apk_name!
ren !apk_name! %result_dir%_!apk_name!
echo new_name=%result_dir%_!apk_name!
)
set apk_new_name=%result_dir%_!apk_name!
echo apk_new_name=!apk_new_name!
::sender app
if "%app_repo%" == "1" (
::将发送端apk传到阿里云上
%up_dir%winscp.exe /console /script=%up_dir%ascp_put_sender_files.txt
echo pkg_path=%ftp_url%/phoenix_send_app/!apk_new_name!
)
::reciever app
if "%app_repo%" == "2" (
::将接收端app传到阿里云
%up_dir%winscp.exe /console /script=%up_dir%ascp_put_rec_files.txt
echo pkg_path=%ftp_url%/phoenix_app/!apk_new_name!
)
)
if "%send_apk_sign%" == "0" (
echo send_apk_sign is 0 and meaning sender apk sign do nothing
)else (
echo this is send_apk_sign building
copy %up_dir%mirrorcast_aw.key .
echo cur_path=%cur_path% and ftp_path=%ftp_sign_path%
copy %local_sign_path%*.apk .
md target
for /F %%h in ( 'dir /B %cur_path% ^|findstr ".apk" ' ) do (
set apk_name=%%h
echo apk_name=!apk_name!
::调用shell脚本签名(实现需要安装gitbash)
call %up_dir%sign_tool.sh !apk_name!
)
for /F %%h in ( 'dir /B %cur_path% arget ^|findstr ".apk" ' ) do (
set signed_apk_name=%%h
echo signed_apk_name=!signed_apk_name!
)
ping 127.0.0.1
xcopy target*.apk %ftp_sign_path%
echo ftp_path=%ftp_signed_apk%/!signed_apk_name!
)
涉及到的ascp_put_sender_files.txt如下:
option batch on
option confirm off
option transfer binary
open "test:source!@#321@120.1.1.11"
put *.apk /source/apk/test/send_app/
close
exit
以及ascp_put_rec_files.txt如下:
option batch on
option confirm off
option transfer binary
open "test:source!@#321@120.1.1.11"
put *.apk /source/apk/test/rec_app/
close
exit
说明:关于winscp的详细使用,请自行查阅,在这里,我要说明下我遇到的问题,open "test:source!@#321@120.1.1.11"这一句很明显是登陆阿里云主机的,在调用这句之前,请务必使用winscp.exe登陆过这台主机,因为首次登陆会涉及到一下信任关系,类似如下:
此外,我用了很久在处理在winscp.exe下调用open "test:source!@#321@120.1.1.11"一下子成功一下子失败的问题,虽然知道里面含有特殊字符,但是不清楚为啥会一下可以,一下不可以,后面加了双引号就ok了,希望可以给大家起到借鉴的作用,免得浪费时间。
另外涉及到的sign_tool.sh,调用java自带的jarsigner来给apk签名,如下:
#!/bin/bash
echo ==========sign $apk_name=====================
time_now=`date "+%Y%m%d%H%M"`
jarsigner -verbose -digestalg SHA1 -sigalg SHA1withRSA -keystore mirrorcast_aw.key -signedjar target/"$time_now"_signed_"$apk_name" $apk_name mirrorcast_aw -storepass mirro12
涉及到的文件介绍就上面这些了,具体看下效果:
上传apk:
配置选择:
结果显示:
登陆阿里云,也可以在对应路径下看到这个apk。
签名apk:
配置如下:
结果显示如下: