jenkins借助winscp传本地文件到远程服务器上
有这样的场景,我们的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:\build_bat
set apk_dir=C:\apk\upgrade_test
set local_sign_path=C:\apk\sender_sign_apk
set ftp_sign_path=\\192.168.1.2\ftp\output\Sign_apk\app_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%\target\ ^|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:
配置如下:

结果显示如下:

jenkins借助winscp传本地文件到远程服务器上的更多相关文章
- 用java 代码下载Samba服务器上的文件到本地目录以及上传本地文件到Samba服务器
引入: 在我们昨天架设好了Samba服务器上并且创建了一个 Samba 账户后,我们就迫不及待的想用JAVA去操作Samba服务器了,我们找到了一个框架叫 jcifs,可以高效的完成我们工作. 实践: ...
- 在Mac机器上给ITerm2配置lrzsz,便捷的传输文件到远程服务器上
可直接参考文档:http://danqingdani.blog.163.com/blog/static/18609419520141201215750 需要使用到的github脚本:https://g ...
- svn git 导入本地文件到远程服务器 import
以前,想要把本地的一个文件上传到svn 或者git 服务器的时候,都要先把服务器上的文件夹down 下来,然后把要添加的文件添加进去,然后提交. 想想都麻烦. 现在我们用import 命令就可以做到, ...
- linux采用scp命令拷贝文件到本地,拷贝本地文件到远程服务器
// 假设远程服务器IP地址为 192.168.1.100 1.从服务器复制文件到本地: scp root@192.168.1.100:/data/test.txt /home/myfile/ roo ...
- java调用svnkit工具类上传本地文件到svn服务器
package org.jenkinsci.plugins.svn.upload.step; import java.io.*; import org.tmatesoft.svn.core.SVNCo ...
- scp复制文件到远程服务器上
scp -P 22 -r 2028792_www root@120.79.172.45:/usr/local/src Linux scp命令用于Linux之间复制文件和目录. scp是 secure ...
- gradle上传本地文件到远程maven库(nexus服务器)
自定义aar-upload.gradle文件 artifacts { archives file('./build/outputs/aar/Lib_ads-baidu-debug.aar') } up ...
- window下如何使用Git上传代码到github远程服务器上(转)
注册账户以及创建仓库 首先你得有一个github账号,没有自行注册,登录成功后应该是这样 在页面上方用户菜单上选择 "+"->New repository 创建一个新的仓库 ...
- SSH命令行传输文件到远程服务器
Ubuntu操作系统 SCP命令 使用方式如下: 1.上传本地文件到远程服务器 scp /var/www/test.php root@192.168.0.101:/var/www/ 把本机/var/w ...
随机推荐
- MySQL-记一次备份失败的排查过程
山竹来临,窝在家里整理个人文档. 本篇文章主要讲解排查问题的思路,涉及linux 删除文件的原理.实例误删数据恢复.MySQL实例初始化参数优先级别等,虽然涉及知 ...
- JQuery EasyUI Layout 在from布局自适应窗口大小
在JQuery EasyUI中,如果直接在form上布局时当窗口大小调整布局不会改变,将布局应用于body时中间隔着一个form,横竖不好弄. 网上有多个解决方案,一般都是写代码,在窗口大小改变时设置 ...
- Android源码服务专家(申明:来源于网络)
Android源码服务专家(申明:来源于网络) 地址:http://www.javaapk.com/topics/demo/page/20/
- 【每日一题】 UVA - 1587 Box 二维有点偏序的感觉
一开始用set存xjb分类讨论,然后wa, 然后简化了一点,改用vector,然wa 最后又发现没有初始化,然wa wa了一个半小时 最后看了题解orz 然后找了一组样例把自己的代码改对了 /* 1 ...
- JS之JSON.parse和JSON.stringify
这两个函数有兼容性问题, 会报错JSON"未定义 解决方案, 引入json2.js,可以解决浏览器的兼容性 https://link.jianshu.com/?t=https://githu ...
- 2015年蓝桥杯省赛A组c++第4题
/* StringInGrid函数会在一个指定大小的格子中打印指定的字符串. 要求字符串在水平.垂直两个方向上都居中. 如果字符串太长,就截断. 如果不能恰好居中,可以稍稍偏左或者偏上一点. 下面的程 ...
- azkaban---visualize crontab--frontail
azkaban---visualize crontab azkaban--docker-----http://www.jkeabc.com/254015.html azkaban--tips ht ...
- Page4:线性系统的运动求解以及脉冲响应矩阵与传递函数的关系[Linear System Theory]
内容包含线性系统的运动求解,系统矩阵特征值和特征向量对运动的影响,脉冲响应矩阵与传递函数之间的关系
- xcrun: error: unable to find utility "PackageApplication", not a developer tool or in PATH
Xcode升级到8.3后 用命令进行打包 提示下面这个错误 xcrun: error: unable to find utility "PackageApplication", n ...
- AD采集问题
在调试AD采集时想问的一些问题 1.电路原理图中的VSS是什么意思? 2.电路原理图中的VDD是什么意思? 3.电路原理图中的VREF+和VREF-是什么意思? 4.电路原理图中的VBAT是用来干什么 ...