• 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: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:

    配置如下:

    结果显示如下:

  • 相关阅读:
    我已经发表的文章:2,《上帝的小蚂蚁》(未经作者本人同意,不得转载!)
    【windows环境下】RabbitMq的安装和监控插件安装
    Apache FtpServer扩展【动手实现自己的业务】
    我的博客开始之旅
    curl和wget的区别和使用 wanglf
    ceph集群部署 wanglf
    ansible实现SSH配置免密互信 wanglf
    kubernetes(k8s) helm安装kafka、zookeeper wanglf
    django项目中使用KindEditor富文本编辑器 wanglf
    下一代网页:当HTML5取代Flash
  • 原文地址:https://www.cnblogs.com/zndxall/p/9621366.html
Copyright © 2020-2023  润新知