星期二, 11月 29, 2016

VirtualBox Windows Guest + USB SmartCard Reader

不需要安裝 Guest Additions,但步驟如下可能會順利許多:
  1. 安裝 Windows Guest VM,關機。
  2. 插上讀卡機,在 VM USB (ver. 1.1 / 2.0) 設定勾選該裝置。
  3. 拔除讀卡機。
  4. 開啟 Windows Guest VM,開機完成再插入讀卡機。

Ping VirtualBox Windows Guest Fail?

想從 VirutalBox Host ping 到 Windows Guest?兩個條件:
  • VirtualBox Settings -> Network -> Host-only Adapter
  • Windows Guest Firewall -> Inbound Rules -> Virtual Machine Monitoring (Echo Request - ICMPv4-In / ICMPv6-In) -> Profile: Public / All -> Enable

星期四, 11月 24, 2016

Java 8 + JBoss 4.x + JSP

要安裝 JBoss 4.x,可先在下載,解壓縮即可。解壓後的目錄在下文以 <JBoss_Home> 表示。

啟動指令是 <JBoss_Home>/bin/run.sh -b <hostName_or_IP> &,如果省略 -b binding 的部份也可以,就只會允許伺服器本機的來源訪問;如果省略尾巴的 & 也可以,就變成前景執行(好像比較難管)?

停機指令是 <JBoss_Home>/bin/shutdown.sh -S -s <hostName_or_IP>,-s 的部份可省略,視如何開啟決定。

JBoss 4.x 接受 .war 熱部署,也就是把檔案直接丟 <JBoss_Home>/server/default/deploy 即可。

重點來了:如果底下是 Java 8 的話,.war 裡面的 JSP 如果有用到字串取代,在編譯時會拋出以下的錯誤:
依據這篇文章的說法,改 Java 7 即可解決。在安裝 Java 7 之後的程序如下:
怪的是,若再改回 Java 8 也不會有錯?其實原因在編譯結果已存在 JBoss 的其他位置,所以若將 JBoss 重新解壓縮到另一個目錄,那邊的 JSP 仍然會有問題。

星期六, 11月 19, 2016

Alpine quick start

因為 Docker 的關係,才注意到 Alpine 這種超輕量級的 Linux 最近很紅,以下紀錄一些初探的心得。

首先由官網下載 ISO,開機過程中有些問題要回答,大部份依照預設值即可。值得注意的是:
  • 首次登入的帳號是 root,無需密碼。
  • 登入後第一個命令在提示訊息也可看到:setup-alpine。
  • 網路必須要通,依預設會用 dhcp 連外。
  • 在意時區的話,可輸入 Asia/Taipei。
  • 鏡像站 mirror 的選擇,可依預設讓每一個都測試過反應時間,自動挑最快的。
  • 除非當作 LiveCD 用,可以一直按 enter 依預設值下去。若要安裝在硬碟的話,還是必須選擇裝在 sda 之類的裝置上,接著「如何使用」請回答 sys,為了要清除舊磁區內容還必須再回答 y。
  • 這階段完成會提示要 reboot,請先移除光碟再重啟。
重啟之後用新的帳密登入,接著來認識這個陌生的套件管理系統 apk:
  • 以 openjdk 為例,指令 apk search openjdk 搜尋沒有結果。
  • vi /etc/apk/repositories 可看到先前實測過最快的鏡像站,並且預設只接受官方套件,在此試著修改以增加社群等其他來源,存檔。
  • 執行 apk update,再次搜尋 openjdk 就有結果。
  • 執行 apk add openjdk8-jre (不需完整套件名稱)即可安裝。
  • 詳細列表可參考這裡,不過這裡的搜尋條件要用 openjdk* 的型式。
任務完成,Alpine 沒有 shutdown,請改用 poweroff。

Jenkins farm on Docker

單獨一部 Docker based Jenkins 不稀奇:
  • docker run -d --name jenkins -p 80:8080 jenkins
假設開起來了,查一下配到的 IP:
  • docker inspect jenkins | grep IPAddress
這裡得到的結果是 172.17.0.2,用瀏覽器訪問 http://localhost 與 http://172.17.0.2:8080 的結果應該是一樣的,我們用後者。首先需要 Unlock Jenkins。在 Terminal 下指令:
  • docker exec -it jenkins cat /var/jenkins_home/secrets/initialAdminPassword
再把結果複製,貼到網頁裡,接著裝一下眾插件,設好管理帳號,Jenkins Standalone 就可以用了。

接下來要準備讓 Slave 掛上來,首先在 Jenkins 管理介面建一個新 Node,假設取名為 slave1,並設定 Remote root directory 為 /var/opt/jenkins,存檔,再點進去,畫面會像這樣:



點選超連結下載 slave.jar 並移到新建的 ~/share 目錄,然後在 Terminal 下指令:
  • docker run -d --name slave -v ~/share:/var/opt/jenkins:Z -w /var/opt/jenkins java:8-jre-alpine java -jar slave.jar -jnlpUrl http://172.17.0.2:8080/computer/slave1/slave-agent.jnlp -secret 1689af1c531a13800eff7b69113622c383d30b218cf7d28fea1322b3faf651b4
請注意不要抄我的密文,要與網頁上的一致,就能看到最輕量級的 Jenkins Slave 已在待命。

[2016/11/27]
補充不在 Docker 又限制 https,若憑證是自簽或沒有預設信任的狀況下,當然增加信任根憑證是治本之道,不過也可以應急:
  • java -jar slave.jar -jnlpUrl https://172.17.0.2:8080/computer/slave1/slave-agent.jnlp -secret 1689af1c531a13800eff7b69113622c383d30b218cf7d28fea1322b3faf651b4 -noCertificateCheck

星期三, 11月 16, 2016

Building dynatrace easyTravel from Source

  1. 在 dynatrace 官網下載 easyTravel 的原始碼壓縮檔,假設解壓目錄名為 ~/Downloads/dynatrace-easytravel-src。
  2. 安裝 Java、Ant。
  3. 編輯 /etc/hosts,為本機增加一個名稱,例如 osboxes。
  4. 切換至 ~/Downloads/dynatrace-easytravel-src/Distribution 目錄,執行 ant 命令,將產生 dist 子目錄放置編譯結果。
  5. 編輯 dist/startDistribution.sh,找到一行「export WEBLAUNCHER=set-this-property」,改為「export WEBLAUNCHER=osboxes」,存檔並執行,即會出現 easyTravel 的網頁管理介面。
  6. 在管理介面關閉 Mobile 相關的前端,也不要自動產生模擬流量,以節省資源。
  7. 在管理介面啟動 Production -> Standard 模式,注意資料庫必須正常運作,否則請檢查紀錄並排除問題。
  8. Credit Card Auth. (C++) 啟動失敗可以忽略,另外兩項在啟動過程中逾時,事實上已在提供服務。若在意的話,停止再啟動應能成功,否則請檢查紀錄並排除問題。
  9. 透過瀏覽器登入,帳密可用 afrida / afrida,網頁應會回應「Hello Afrida Afwika!」。

星期三, 11月 02, 2016

SonarQube Time Zone

SonarQube 預設使用 UTC,對於不夠國際化的我們是有點不方便。要如何在地化?編輯 sonar.properties,應可找到以下不連續的三行:
  • #sonar.ce.javaAdditionalOpts=
  • #sonar.search.javaAdditionalOpts=
  • #sonar.web.javaAdditionalOpts=
修改如下即可:
  • sonar.ce.javaAdditionalOpts=-Duser.timezone=Asia/Taipei
  • sonar.search.javaAdditionalOpts=-Duser.timezone=Asia/Taipei
  • sonar.web.javaAdditionalOpts=-Duser.timezone=Asia/Taipei
參考來源在

[2016/12/15]
其實這個問題應該回歸到作業系統的時區設定才對,當初先這麼做但失敗了,後來細究原因,才發現可能是因為沒有依照這篇舊聞。因為我的 SonarQube 是一個 Docker Container,而底下的作業系統是 Debian,無意間又找到另一種做法,指令如下:
  • dpkg-reconfigure tzdata

星期二, 11月 01, 2016

Docker container crash?

我負責的許多 Application Server 逐漸移到 Docker 上,最近常遇到休個週末回來就不行了?原來是這些在 VM 裡的 Docker 為了節能減碳,公司的政策是預設每週會自動停機,當底下的 VM 重啟之後,可以檢查到 Application Server 即使是開著的,埠口是外露的,也都只能在 container 本機存取服務,外界一概連不進去。
如此一定先懷疑防火牆吧?怪的是又沒去改,為何上週可以而本週不行?而且即使是整個防火牆都關了,也只修好一半,由完全失聯到「准進不准出」,像是 Jenkins 連不到外面的 Plugin Update Center,或是 SonarQube 連不到認證的 LDAP Server 等等。
最後找到真正的解法是 Docker Service 必須重啟。