線上持續整合部署(CI & CD) 使用Docker架構

CI(Continuous integration, CI) 持續整合,CI是為了提高程式碼的品質,維持系統或是網站的穩定性,他的核心理念就是,當有新的程式碼被提交時,就會自動進行一連串的自動化步驟:編譯,測試,和部署 等。

如果是Compile語言的話,就會先進行編譯看是否程式碼可以通過自動化編譯,再來就是最重要的自動化測試,當一個新功能完成,或是新的程式碼提交後,很難保證網站或是系統的功能都是在事先預料的情況下運作, 如果只是進行人工驗證, 通常會有預想不到且沒有驗證到的情況發生,而造成網站出現沒事先預料的錯誤。

因此做自動化測試將所有應該要驗證的功能都透過自動化去驗證一遍,自動化測試包含:測試每個class或是method的正確性的單元測試,測試API是否正確運作,整合測試等。

線上Rails的Production環境, 分享一下我們用Docker架設的CI環境。

1. Docker 環境

curl -sSL https://get.docker.com/ | sh

2. Docker Compose

docker compose 是Docker一個非常棒的工具,可以將docker如何運作整個寫在一個 docker-compose.yml 檔裡面。

根據設定檔啟動Docker

docker-compose up

停止Docker

docker-compose down

在ubuntu上安裝:

curl -L https://github.com/docker/compose/releases/download/1.14.0/docker-compose-`uname -s`-`uname -m`> /usr/local/bin/docker-compose` `sudo chmod +x /usr/local/bin/docker-compose

更詳細資料參考 https://docs.docker.com/compose/install/#where-to-go-next

3. GitLab Git版本控制是CI環境的核心

我們使用Gitlab來管理我們的源碼

https://github.com/sameersbn/docker-gitlab

4. Jenkins

我們用Jenkins來跑一些自動化測試的動作,完成後再在做自動化部屬

sudo docker run  -d  -p 8080:8080 \
--name jenkins  --restart=always -v /mnt/jenkins_home:/var/jenkins_home \
-v /var/run/docker.sock:/var/run/docker.sock jayqqaa12/jenkins`

ps: 這裡要注意的地方就是將運作Jenkins的Docker Contaniner裡的 docker.sock 掛載到Host的 docker.sock,這樣Jenkins的container雖然沒有安裝docker,但是也可以執行docker, 因為他直接呼叫Host的docker來執行,所以Jenkins編譯完成Docker Image會出現在Host上。

5. Jenkins && GitLab Plugins

GitLab有和Jenkins整合的Plugins,當有新的程式碼被commit時,會自動Triger Jenkins執行自動化測試的動作。

參考以下資料 https://docs.gitlab.com/ee/integration/jenkins.html

6. Jenkins 跑 自動化測試

我們的做法是gitlab當有新的個更新時,呼叫Jenkins去做一些工作。

Jenkins的工作會產生一個臨時的工作Docker,

在Docker裡面再跑一個Docker,

由這個Docker去執行自動化測試(Rspec等…),

沒問題後用個Docker跑自動化部屬。

#echo -e "[************************************************************ Run Test ************************************************************]"
docker run -e APPDIR='/app_path' -e RUN_SHELL_FILE='/app_path/test.sh' -e 
GIT_REPOSITORY_URL='ssh://app_path.git' registry.app.work:5000/docker_run_test:latest`

7.Capistrano && Docker

Capistrano是Rails的常用的自動化部屬工具,

如果自動化測試都沒問題後,由臨時的工作Docker呼叫Capistrano自動部署到線上的Server。

如果有自己架設 Docker registry 可以直接運行 速度會快很多。

Run Auto Tesing in a clear Docker

在做自動化測試有一個很重要的要注意的地方,就是要使用乾淨的環境進行測試。 所以上面的臨時的工作Docker,就是利用Jenkins Build一個乾淨且專門用於跑自動化測試和自動化測試的環境。

參考文章

  1. http://my.oschina.net/jayqqaa12/blog/633683
  2. http://www.ithome.com.tw/article/94710