有这样的场景,我们的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传本地文件到远程服务器上的更多相关文章

  1. 用java 代码下载Samba服务器上的文件到本地目录以及上传本地文件到Samba服务器

    引入: 在我们昨天架设好了Samba服务器上并且创建了一个 Samba 账户后,我们就迫不及待的想用JAVA去操作Samba服务器了,我们找到了一个框架叫 jcifs,可以高效的完成我们工作. 实践: ...

  2. 在Mac机器上给ITerm2配置lrzsz,便捷的传输文件到远程服务器上

    可直接参考文档:http://danqingdani.blog.163.com/blog/static/18609419520141201215750 需要使用到的github脚本:https://g ...

  3. svn git 导入本地文件到远程服务器 import

    以前,想要把本地的一个文件上传到svn 或者git 服务器的时候,都要先把服务器上的文件夹down 下来,然后把要添加的文件添加进去,然后提交. 想想都麻烦. 现在我们用import 命令就可以做到, ...

  4. linux采用scp命令拷贝文件到本地,拷贝本地文件到远程服务器

    // 假设远程服务器IP地址为 192.168.1.100 1.从服务器复制文件到本地: scp root@192.168.1.100:/data/test.txt /home/myfile/ roo ...

  5. java调用svnkit工具类上传本地文件到svn服务器

    package org.jenkinsci.plugins.svn.upload.step; import java.io.*; import org.tmatesoft.svn.core.SVNCo ...

  6. scp复制文件到远程服务器上

    scp -P 22 -r 2028792_www  root@120.79.172.45:/usr/local/src Linux scp命令用于Linux之间复制文件和目录. scp是 secure ...

  7. gradle上传本地文件到远程maven库(nexus服务器)

    自定义aar-upload.gradle文件 artifacts { archives file('./build/outputs/aar/Lib_ads-baidu-debug.aar') } up ...

  8. window下如何使用Git上传代码到github远程服务器上(转)

    注册账户以及创建仓库 首先你得有一个github账号,没有自行注册,登录成功后应该是这样 在页面上方用户菜单上选择 "+"->New repository 创建一个新的仓库 ...

  9. SSH命令行传输文件到远程服务器

    Ubuntu操作系统 SCP命令 使用方式如下: 1.上传本地文件到远程服务器 scp /var/www/test.php root@192.168.0.101:/var/www/ 把本机/var/w ...

随机推荐

  1. solus下 修改 crate-react-app 的默认下载依赖方式为 yarn

    vim /usr/local/share/.config/yarn/global/node_modules/create-react-app/createReactApp.js 或者是 修改 /usr ...

  2. 坑!vue.js在ios9中失效

    坑!vue.js在ios9中失效! 接到实现,在移动端生成一个分享链接,分享到微信,在微信中打开,加入! 好,用vue实现----------------------->写代码--------- ...

  3. Javascript扩展Date的prototype实现时间format函数 2017-06-29T09:10:00.000Z日期转换

    /*时间格式化 公用方法*/ Date.prototype.format = function(fmt) { // var o = { "M+": this.getMonth() ...

  4. .NET Core开发日志——Global Tools

    .NET Core 2.1引入了一个新的功能,Global Tools,其本质是包含控制台应用程序的nuget包,目前而言,还没有特别有用的工具,不过相信随着时间的推移,各种有创意或者实用性强的Glo ...

  5. [No0000130]WPF 4.5使用标记扩展订阅事件

    自从我上次写到关于标记扩展的时候已经有一段时间了...... Visual Studio 11 Developer Preview的发布给WPF带来了一些新功能,让我有理由再次使用它们.我要在这里讨论 ...

  6. React event

    React event 组件: React 自有方法 用户定义方法 一.虚拟事件对象 事件处理器将会传入 虚拟事件对象 的实例,一个对浏览器本地事件的跨浏览器封装.它有和浏览器本地事件相同的属性和方法 ...

  7. MVC 实用构架实战(一)——项目结构搭建

    一.前言 在<上篇>中,已经把项目整体结构规划做了个大概的规划.在本文中,将使用代码的方式来一一解说各个层次.由于要搭建一个基本完整的结构,可能文章会比较长.另外,本系列主要出于实用的目的 ...

  8. [development][PCRE] old PCRE

    介绍, man手册 txt版 http://www.pcre.org/original/pcre.txt html版 http://www.pcre.org/original/doc/html/pcr ...

  9. [daily][archlinux][shell][fish] 使用最炫酷的shell工具fish

    用了好久的zsh, 才知道用那么多年的bash是多么的原始. 然而比zsh更好用的其实是fish, 但是不与bash兼容, 所以最终还是选择了zsh. 关于zsh的使用,配置方法, 可以翻前文查阅. ...

  10. 转:JAVA 的wait(), notify()与synchronized同步机制

    原文地址:http://blog.csdn.net/zyplus/article/details/6672775 转自:https://www.cnblogs.com/x_wukong/p/40097 ...