這是本文件的舊版!


透過SCP執行某些跨平台工作

某天我們有了要在exe檔上sign certificate的需求,然而我們的build server是在linux上的jenkins。整理一下目前狀況:

  • Signtool Server: Windows Server 2003,32位元。
  • Build Server: CentOS6,64位元。
  • 簡化後的Build Process: 從版控系統checkout code後,開始編譯,產生各專案artifacts;透過installanywhre產生出installer;計算CRC code,並包成一個壓縮檔。

基於以上需求,我開始思考有哪些做法:

  1. 拆解build job: 將步驟拆成多個build job,透過jenkins slave將產生的installer丟到Signtool Server上執行。
  2. 不拆解build job: 讓Signtool Server上有類似jenkins slave的程式,可以接收我們的指令,而動作可以在ant script內完成。

使用第一種做法,我需要refactor build script,並且要考慮installer放置可抓取位置的問題。而第二個做法呢? 考慮可以傳輸檔案、執行指令:

  1. 透過ssh server: 可使用cygwin或其它現有的ssh server。
  2. 透過rest api: 可基於sprint restapi去實作。

為了簡單也不需要額外實作,我選擇了ssh server的方式。

select ssh server - apache sshd

在ssh server的選擇上,首先我使用了cygwin。在Signtool Server上安裝cygwin後,首先遇到類似以下的訊息

could not be located in the dynamic link library KERNEL32.dll
嘗試過不同版本的cygwin依然無法解決,接著改用apache sshd。我使用的是1.2.0的版本,我遇到以下問題:

  1. sshd.bat找不到main class: 從source code得知,bat launch的class名稱需改為org.apache.sshd.server.SshServer。
  2. 連線後該如何登入: 從source code得知,只要給一個帳號與密碼是相同即可登入。如果有疑慮就需要自己override PasswordAuthenticator,可以參考link
  3. 執行發生找不到jvm.dll的問題: 由於apache sshd必須使用java7以上,且windows 2003不支援java8,因此我使用java 7。而這個問題只要將jre7/bin/client複製到jre7/bin/server後,即可解決。

在成功啟動apache sshd後,可以透過putty連線測試一下。

register the sshd as a service

將程式註冊為service有不少方法,最簡單的方法是透過mssm。首先透過mssm執行:

mssm.exe install apache-sshd
接著會出現如下圖畫面,去選擇你sshd.bat:
安裝完成後,可以透過sc指令確認並啟動:
sc query apache-sshd
sc start apache-sshd

請記得再次確認:

  1. 重新啟動後會自動啟動。
  2. 可透過putty連線。