差異處

這裏顯示兩個版本的差異處。

連向這個比對檢視

Both sides previous revision 前次修改
下次修改
前次修改
java:ant:execute_job_with_scp [2017/01/08 12:49]
tony [Reference]
java:ant:execute_job_with_scp [2023/06/25 09:48] (目前版本)
行 2: 行 2:
 ====== 透過SCP執行某些跨平台工作 ====== ====== 透過SCP執行某些跨平台工作 ======
 ===== Problem ===== ===== Problem =====
-某天我們有了要在exe檔上sign certificate的需求,而我們的build server是在linux上的jenkins。整理一下目前狀況:​+某天我們有了要在exe檔上sign certificate的需求,而我們目前狀況如下:
   * Signtool Server: Windows Server 2003,32位元。   * Signtool Server: Windows Server 2003,32位元。
-  * Build Server: CentOS6,64位元。+  * Build Server: ​Jenkins,CentOS6,64位元。
   * 簡化後的Build Process: 從版控系統checkout code後,開始編譯,產生各專案artifacts;透過installanywhre產生出installer;計算CRC code,並包成一個壓縮檔。   * 簡化後的Build Process: 從版控系統checkout code後,開始編譯,產生各專案artifacts;透過installanywhre產生出installer;計算CRC code,並包成一個壓縮檔。
 ===== Thinking ===== ===== Thinking =====
 基於以上需求,我開始思考有哪些做法:​ 基於以上需求,我開始思考有哪些做法:​
-  - 拆解build job: 將步驟拆成多個build job,透過jenkins slave將產生的installer丟到Signtool Server上執行。 +  - 拆解build job: 將步驟拆成多個build job。signtool server為jenkins slave,其中一個job可以將產生的installer丟過去執行。 
-  - 不拆解build job: 讓Signtool Server上有類似jenkins slave的程式,可以接收我們的指令,而動作可以在ant script內完成。 +  - 不拆解build job: 讓Signtool Server上有類似jenkins slave的程式,可以接收我們的指令,而動作可以在一個build流成內完成。 
-使用第一種做法,我需要refactor build script,並且要考慮installer放置可抓取位置問題。而第二個做法呢?​ 考慮可以傳輸檔案、執行指令:​+使用第一種做法,我需要refactor build script,並且要考慮installer傳輸或放置可抓取位置問題。而第二個做法呢?​ 考慮容易且可以傳輸檔案、執行指令的protocol:
   - 透過ssh server: 可使用cygwin或其它現有的ssh server。   - 透過ssh server: 可使用cygwin或其它現有的ssh server。
-  - 透過rest api: 可基於[[https://​spring.io/​guides/​gs/​rest-service/​|sprint restapi]]去實作。+  - 透過rest api: 可基於[[https://​spring.io/​guides/​gs/​rest-service/​|sprint restapi]]去實作,有sprint boot後,實作或發布app簡單很多
 為了簡單也不需要額外實作,我選擇了ssh server的方式。 為了簡單也不需要額外實作,我選擇了ssh server的方式。
 ===== How to? ===== ===== How to? =====
行 26: 行 26:
 在成功啟動apache sshd後,可以透過putty連線測試一下。 在成功啟動apache sshd後,可以透過putty連線測試一下。
 ==== register the sshd as a service ==== ==== register the sshd as a service ====
 +(此部分需參考後記)\\
 將程式註冊為service有不少方法,最簡單的方法是透過mssm。首先透過mssm執行:​ 將程式註冊為service有不少方法,最簡單的方法是透過mssm。首先透過mssm執行:​
 <code bash> <code bash>
行 31: 行 32:
 </​code>​ </​code>​
 接著會出現如下圖畫面,去選擇你sshd.bat:​\\ 接著會出現如下圖畫面,去選擇你sshd.bat:​\\
-{{:​java:​ant:​mssm_register_sshd.png|}}+(後記: 預設Logon帳號為System Account,但在sign certificate上會有問題,需特別指定帳號。可參考下個章節。)\\ 
 +{{:​java:​ant:​mssm_register_sshd.png|}}\\
 安裝完成後,可以透過sc指令確認並啟動:​ 安裝完成後,可以透過sc指令確認並啟動:​
 <code bash> <code bash>
行 42: 行 44:
   - 可透過putty連線。   - 可透過putty連線。
 ==== run scp with ant ==== ==== run scp with ant ====
-ant scp的task會基於[[https://​sourceforge.net/​projects/​jsch/​|jsch]],請記得先下載並放於ANT_HOME/​lib下。以下為我client side的ant script:+ant scp的task會基於[[https://​sourceforge.net/​projects/​jsch/​|jsch]],請記得先下載並放於ANT_HOME/​lib下。以下為我client side的ant script:
 <code xml> <code xml>
 <project name="​test-sign">​ <project name="​test-sign">​
行 92: 行 94:
 然後改用原本的sshexec,果不其然,成功了:​\\ 然後改用原本的sshexec,果不其然,成功了:​\\
 {{:​java:​ant:​run_signtool_without_psexe.png|}} {{:​java:​ant:​run_signtool_without_psexe.png|}}
 +===== 後記 =====
 +某天正式開始啟用此功能後,發現傳大檔案都會發生問題。經過trace,發現是由於nssm註冊為service後,會一分鐘重新啟動一次:​\\
 +{{:​java:​ant:​nssm_with_sshd_bat_crashed_period.png|}}\\
 +詳細原因我沒有深究,但我把啟動的prcoess由bat改為exe就正常了:​\\
 +{{:​java:​ant:​nssm_install_sshd_with_java_exe.png|}}\\
 +使用的Arguments如下,請改成你自己對應路徑,我是echo bat內容複製貼上的:​
 +<code bash>
 +-server -Xmx512M -Dcom.sun.management.jmxremote ​ -classpath ";​D:​\apache-sshd-1.2.0\scripts\..\lib\bcpg-jdk15on-1.54.jar;​D:​\apache-sshd-1.2.0\scripts\..\lib\bcpkix-jdk15on-1.54.jar;​D:​\apache-sshd-1.2.0\scripts\..\lib\bcprov-jdk15on-1.54.jar;​D:​\apache-sshd-1.2.0\scripts\..\lib\slf4j-api-1.7.16.jar;​D:​\apache-sshd-1.2.0\scripts\..\lib\slf4j-jdk14-1.7.16.jar;​D:​\apache-sshd-1.2.0\scripts\..\lib\sshd-core-1.2.0.jar;​D:​\apache-sshd-1.2.0\scripts\..\lib\tomcat-apr-5.5.23.jar"​ -Dsshd.home="​D:​\apache-sshd-1.2.0\scripts\.."​ org.apache.sshd.server.SshServer
 +</​code>​
 ===== Reference ===== ===== Reference =====
   * [[https://​mina.apache.org/​sshd-project/​|apache sshd]]   * [[https://​mina.apache.org/​sshd-project/​|apache sshd]]
行 100: 行 111:
   * [[https://​technet.microsoft.com/​en-us/​sysinternals/​pxexec.aspx|psexe]]   * [[https://​technet.microsoft.com/​en-us/​sysinternals/​pxexec.aspx|psexe]]
   * [[https://​dotblogs.com.tw/​kevinya/​2016/​02/​16/​153912|遠端執行程式(psexec)]]   * [[https://​dotblogs.com.tw/​kevinya/​2016/​02/​16/​153912|遠端執行程式(psexec)]]
 +  * [[https://​docs.microsoft.com/​zh-tw/​dotnet/​framework/​tools/​signtool-exe|timestamp server]]
  
 =====    ===== =====    =====