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:

配置如下:

 

結果顯示如下:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM