差異處
這裏顯示兩個版本的差異處。
Both sides previous revision 前次修改 下次修改 | 前次修改 | ||
java:ant:execute_job_with_scp [2017/01/08 12:48] tony [run scp with ant] |
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]] | ||
行 99: | 行 110: | ||
* [[https://sourceforge.net/projects/jsch/|jsch]] | * [[https://sourceforge.net/projects/jsch/|jsch]] | ||
* [[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://docs.microsoft.com/zh-tw/dotnet/framework/tools/signtool-exe|timestamp server]] | ||
+ | |||
+ | ===== ===== | ||
+ | ---- | ||
+ | \\ | ||
+ | ~~DISQUS~~ |