星期一, 12月 11, 2017

git sparse checkout

有時候我們只想拿 Git 上的一兩個檔案,但整個儲存庫很大,或歷史悠久,實在有點浪費。首先有個下指令 sparse checkout 指定要取的路徑,也可以搭配深度省略不需要的歷史:
  • git init <repository_name>
  • cd <repository_name>
  • git config core.sparseCheckout true
  • echo '/path/to/file1' > .git/info/sparse-checkout
  • echo '/path/to/files/*' >> .git/info/sparse-checkout
  • git remote add origin https://<repository_url>
  • git pull --depth 1 origin master
指令有點多,用 api 看有沒有好一點?以無需認證的 GitHub repository 為例:
  • curl -H 'Accept: application/vnd.github.v3.raw' -O -L https://api.github.com/repos/:owner/:repo/contents/:path
需認證的 GitLab 比較麻煩些:
  • curl -H 'PRIVATE-TOKEN: <token>' https://<git_host>/api/v4/projects/:id/repository/files/<url_encoded_file_path>/raw?ref=master -o output.ext
    • token 要取一個 scope 包含 api,尚在有效期限內的 personal access token
    • project id 可在專案的一般設定找到,通常是個數字
    • 以專案第一層 a 目錄下的 b.txt 為例,url_encoded_file_path 會是 a%2Fb.txt
    • master 是分支名,也可以是 tag 或 commit id
    • output.ext 是輸出檔名

星期一, 12月 04, 2017

GIT_ASKPASS timeout on Jenkins

有些 Jenkins Project 在運作一陣子之後,某天突然出現取不到 Git 原始碼(逾時)的問題,目前只找到兩個共同特徵:
  • using GIT_ASKPASS to set credentials
  • Jenkins node on Windows
在一些文章中提到,若在 Jenkins 使用帳密(非 ssh token)登入 Git,事實上只能由 GIT_ASKPASS 傳遞帳密,但這機制又不是那麼穩,有時會壞的。解法是:
  • Command Prompt (Admin) > git config --system --unset credential.helper

星期二, 11月 28, 2017

Docker shared folder between host and containers

因為很多 Docker Image 都陽春到沒有方便的交換檔案做法,像是要從 Host 複製檔案進 Docker Container,或反方向,或是 Docker Container 之間互相分享檔案,也許連平常視為基本的 SCP SSH 都沒有。幸好 Docker 有專門設計 Volume 給我們用,方法也不只一種,這邊講個最簡單又通用的:
  • docker volume create <your_volume_name> 建立新的共享目錄
  • docker volume ls 查詢目前有哪些共享目錄
  • docker volume inspect <your_volume_name> | grep Mountpoint 查詢共享目錄在主機上的實體路徑
  • docker volume rm <your_volume_name> 刪除共享目錄
當我們要開一個新的 Container,可以掛上這個共享目錄,如:
  • docker run
    • -d
    • --name <your_container_name>
    • -v <your_volume_name>:/tmp
    • <your_image_name>
就能在 Container 的 /tmp 找到我們放在 Mountpoint 的檔案。

星期六, 11月 18, 2017

Intranet jail break

我們常開發了一些網站應用程式,部署在個人開發環境、內網測試環境與客戶測試環境,因為各有各的用途與限制,三者缺一不可,但又瑣碎費時。
  • 個人開發環境:通常與開發工具結合,不太需要擔心如何部署,但配備要夠(資料庫不一定是隨便一部電腦就跑得動吧?)。
  • 內網測試環境:為了整合測試,或給 SA 驗收確認,可以搭配 Jenkins 持續部署。
  • 客戶測試環境:為了給客戶 Prototyping,請工程師帶個人開發環境(筆電)秀給客戶看?或請客戶提供機器讓我們去裝一套?或請公司的 MIS 把內網開給客戶?
現在有個神器 ngrok 能幫忙,原理應該是與分享檔案的 JustBeamIt 類似,只要是內網測試環境,我們自己就能把內網開給客戶。下載解壓之後,只有一個執行檔,請在內網執行環境的主機上開終端機/命令提示字元,執行類似如下的指令:
  • ./ngrok http 80
就會把本機的 http port 80 公開在 Internet 上,網址是隨時産生的。這時再把網址傳給客戶,我們這些廢宅工程師就免出門吹風了。

星期三, 10月 25, 2017

VirtualBox VT-x

對於這個選項放在每個 Guest VM 上,一直以來引人誤解為「只要勾選就能讓 Guest VM 相當於 BIOS 設定啟用 VT-x」,其實只是代表「Host 在啟動 Guest 時能用到 VT-x」,這篇有比較詳細的討論。
如果想讓 Guest VM 支援 VT-x,專業術語叫 nested virtualization,大家已對 VirtualBox 喊話很久了。

星期四, 10月 19, 2017

Confirm your Jenkins Deploy

以我大多接觸的都是 Web Application 而言,可概分
  • 淺層-網路通暢
  • 中層-版本正確
  • 深層-功能正確
淺層在 Jenkins 有個好用的 Http Request Plugin,只要輸入任一頁的 URL,這個外掛就可以試著要求,並檢查回傳的 Http Status Code 是否在預期內,通常是 2xx 或 3xx。
最近有個特例是要檢查部署的結果,但對面並不接受 http(s) 協定,在 Linux 上的 Jenkins Slave 可以用 nc -vz <IP> <Port>。
中層的話,如果部署的 Web Application 除了服務人,也服務機器(Web API),建議就考慮增加一個供外界查詢版本的 Web API,Jenkins 可透過核對 curl <Web API> 確認部署的狀況;如果是只服務人又不想改得多,可以挑一個靜態網頁的角落放版號,用 Selenium BDD 簡單的腳本確認。
深層的話,要準備 Selenium BDD 比較複雜的腳本,錄製工具似乎有些變化,所幸直接用 Node.js 來寫也不太困難。

[2017/10/23 補充]
有些 Linux 版本上 nc 似乎相容性不是很好,可用 nmap <IP> -p<Port> | grep open 試試能否取代?

星期二, 10月 17, 2017

Samba cannot communicate with Windows WINS servers

不敢令人相信的標題!出自於
當 Windows 與 Linux 混處於同個網段上,Linux 想識別那些 WINS server 掌管的 NetBIOS 機器名稱,竟然不是我一直肖想的架個 Samba 就好?目前只知一種解法(在安裝 Samba 之後):
  • nmblookup -U <WINS_ip> -R <NetBIOS_name>