創提部落格
希望我們能與您分享和探討成長中的點點滴滴
Windows上應用Docker容器技術的動態程式碼測試
分享到
“轉載自維克多汽車技術(上海)有限公司,作者Vector China”
隨著軟體專案複雜度的提升和不可控的團隊資源變更,研發組織對DevOps部署的靈活性、可快速遷移和適配CI/CD的反覆運算提出了更高的要求。傳統的虛擬機器方案,即類比出一個完整作業系統,對這類需求顯得力不從心;而輕巧和便捷的容器技術通過在宿主機作業系統上應用虛擬化,直接勝出。本文主要介紹容器技術的代表產品Docker,並對Docker與虛擬機器進行對比,以及如何在Windows上應用Docker開展動態程式碼測試和實現與Jenkins的持續集成。
Docker簡介
Docker是一組PaaS(Platform as a Service,平臺即服務)產品,通過作業系統層級的虛擬化提供稱為容器的打包軟體服務。Docker起源自2008年在巴黎初創的dotCloud公司,後於美國進行孵化和註冊,於2013年3月宣佈遵從Apache2.0協議開源,同年9月正式更名為Docker,次年在0.9版本上用Go語言編寫的libcontainer元件替代了LXC(Linux Container)。
圖1|Docker架構圖
如圖1(https://docs.docker.com/get-started/overview/)所示,Docker可以讓開發者基於選定的鏡像(Image),打包目標應用以及依賴包到一個羽量級、可移植的容器(Container)中,並通過用戶端的docker命令實現對Docker主機內容器的操控;當前容器也可創建成新的鏡像,而所有鏡像都存放在倉庫(Registry)中,類似GitHub一樣分為共有倉庫和私有倉庫。
容器技術與虛擬機器的比較
容器和虛擬機器雖然都使用虛擬化技術,但容器(圖2)並不是類比一個完整的作業系統,而是在宿主機作業系統上應用虛擬化技術;勝在“輕巧”,可實現軟體應用的秒級啟動和回應。相比而言,虛擬機器冗餘步驟多、啟動太慢、佔用記憶體硬碟資源,過於笨重。
此外,容器彼此間互相隔離,可通過預定管道進行通信(即共用宿主機的作業系統)。基於鏡像可便捷地創建容器和分發構建環境,契合DevOps和敏捷開發等對快速部署和應用的需求。
圖2|容器與虛擬機器的比較
Windows上使用Docker運行VectorCAST
Windows上Docker安裝資訊可參照:https://docs.docker.com/desktop/windows/install/
3.1 運行帶GUI的Ubuntu鏡像,創建並啟動容器
鏡像使用參照https://hub.docker.com/r/dorowu/ubuntu-desktop-lxde-vnc/
參數解析
1. docker,Docker的二進位執行檔。
2. run,與前面的docker組合來運行一個容器。
3. -p,指埠綁定。
4. -v,設定共用目錄,為了將安裝包保存到容器中,需要指定目錄。D:\Docker\Data指本地目錄,可以自訂;/dev/shm是指容器中的目錄。將需要複製到容器中的檔放置到D:\Docker\Data中,在容器中就可以進入/dev/shm來訪問這些檔。
5. –name,設定容器名稱,如不指定,則設置一個隨機生成的名字。
6. :xenial,指定鏡像的版本,如不指定,則默認使用最新版本。
7. dorowu/ubuntu-desktop-lxde-vnc:xenial,指定要運行的鏡像,Docker 首先從本地主機上查找鏡像是否存在,如果不存在,Docker就會從鏡像倉庫Docker Hub下載公共鏡像。
上述命令完整的意思可以解釋為:Docker以dorowu/ubuntu-desktop-lxde-vnc:xenial鏡像創建一個名為ubuntu-desktop的容器,指定埠6080:80進行通信,指定D:\Docker\Data以及/dev/shm為Windows和Ubuntu的共用目錄。
3.2 在容器中安裝並使用VectorCAST
a. 在流覽器中打開http://127.0.0.1:6080/,進入Ubuntu的桌面介面,打開命令列。
圖3|打開Ubuntu容器的命令列
b. 進入/dev/shm目錄找到在Windows的D:\Docker\Data下存放的VectorCAST安裝檔,並按Linux下的安裝方法常規安裝以及配置,在此不作贅述。
圖4|容器內安裝VectorCAST
*若提示找不到命令時(鏡像未安裝),可執行apt update以及apt install命令進行安裝即可。
c. 運行VectorCAST,確認獲取到License。
圖5|打開VectorCAST工具
d. 創建環境並執行測試用例。
圖6|VectorCAST中創建環境並執行用例
3.3 基於已有容器創建私有鏡像
為實現工具安裝的快速部署和避免依賴包可能導致的不相容問題,在安裝VectorCAST的容器基礎上創建私有鏡像提交至本地並打包,即可通過推送或分發達成需求。
a. docker images查看現有鏡像:
圖7|用docker images命令查看現有鏡像
b. docker ps查看在運行中的容器:
圖8|用docker ps命令查看在運行中的容器
此容器已經安裝了VectorCAST,在此基礎上創建鏡像。Commit命令需要使用這裡的紅框內容器ID。
c. docker commit創建鏡像,並用docker images查看已創建的鏡像myubuntu:2.0:
• docker commit -m "create ubuntu with VectorCAST installed" -a "vector" e94998fcde2f myubuntu:2.0
圖9|用docker commit命令創建新的鏡像
d. 基於創建的新鏡像創建容器並啟動:
• docker run -p 6081:80 --name ubuntu_new myubuntu:2.0
圖10|基於創建的新鏡像創建容器並啟動
e. 進入Ubuntu桌面,確認容器中有已安裝好的VectorCAST:
圖11|確認基於新鏡像的容器
f. Docker save打包鏡像至tar檔,可以拷貝至其他宿主機使用:
• docker save -o my_ubuntu_v2.tar 919c1693ccee
圖12|docker save命令打包鏡像
Jenkins + Docker實現CI/CD
Docker為DevOps提供了很好的基礎支撐:
• 輕量。可以快速啟動和部署一個複雜的開發環境;
• 通過編寫Dockerfile可以將業務容器化。將Dockerfile提交到程式碼倉庫中,在持續集成的過程中基於已有的Dockerfile來構建鏡像 ,極大提升持續集成的構建速度;
• 鏡像倉庫使分發變得十分簡單。當鏡像構建完成後,無論在哪裡只需要執行docker pull命令就可以快速地將鏡像拉取到本地並且啟動應用。
圖13|基於Docker+Jenkins部署CI/CD
接下來介紹從Jenkins Pipeline中啟動Docker容器,運行VectorCAST測試環境並生成測試報告的過程。
4.1 編寫測試腳本
在容器中編寫運行VectcorCAST測試工程的腳本start_vcast_cmd.sh,後續會在Pipeline中調用此腳本:
圖14|在容器中編寫運行VectorCAST工程的腳本
4.2 宿主機上創建Jenkins Pipeline
圖15|創建Jenkins Pipeline
圖16|編寫Pipeline腳本
jenkins_run_docker.bat檔中主要執行開啟容器以及運行容器中事先準備的腳本start_vcast_cmd.sh:
圖17|編寫Pipeline調用的批次處理腳本
4.3 構建Pipeline並查看報告
圖18|查看build Pipeline結果
共用目錄中生成了測試報告Full_Status.html,用戶可以在宿主機上進行查看:
圖19|宿主機生成的測試報告
4.4 引入看板工具Squore分析測試結果
看板管理工具Squore可以在Jenkins Pipeline中進行部署和配置,自動導入VectorCAST測試結果進行分析,以便用戶直觀地查看程式碼品質和趨勢分析,實現對專案管理和決策的優化。
圖20|引入Squore看板工具分析測試結果