線上持續整合部署(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

TEAM工作流程

每個人:

  1. 每個人需要注意 自己被分配的任務
  2. 當開始進行自己的任務時, 記得將狀態更新為 “進行中”
  3. 如果任務開始處理後,當然無法完成, 記得填上 完成百分比, 如果可以填上進行任務時所花費的時數是最好
  4. 記得需要在完成日期前完成, 如果無法如期完成, 記得尋求大家協助

開發技術團隊:

  1. 每個人需要注意 自己被分配的任務
  2. 當開始進行自己的任務時, 記得將狀態更新為 “進行中”
  3. 如果任務開始處理後,當然無法完成, 記得填上 完成百分比, 如果可以填上進行任務時所花費的時數是最好
  4. 記得需要在完成日期前完成, 如果無法如期完成, 記得尋求大家協助
  5. 開始進行任務時, 從master開一個branch, 命名為 t+票號, 例如:222任務, 就開一個t222的branch在上面工作
  6. 完成後push到遠端的專案版本控制, 然後 發送pull request, 目前先指定我幫忙code review, 然後在code review的內容填上這個任務的工作內容, 和你覺得需要注意的地方
  7. 本機測試通過
  8. 自動化CI測試通過

系統開發SOP

SOP

  1. 和客戶確認他要做什麼東西 和客戶一起把user story寫下來

    可以由不懂技術的人員做這一塊 但是知道怎麼去用自然語言描述客戶的需求 轉成一個一個的使用者故事

  2. tecLeader 根據user story 來選擇要使用什麼樣的技術來做

    需要什麼樣的專業人員在協助和人員配置

    例如: 後端使用什麼技術 例如使用Ruby on Rails 4.2.1, Ruby 2.2.2 前端使用什麼技術 例如:RWD,bootstrap,reactjs 什麼樣風格的設計師設計出的風格是客戶所要的

  3. teamwork tool standing by (1) Redmine (2) Git Server (Github or Bitbucket or self server) (3) Staging Server

  4. tecLeader 做系統分析

  5. tecLeader 開始根據人員配置和系統分析摟的結果和案子時程 來進行開票和控管進度流程