前言
在使用 CI 工具進行持續整合的時候, 免不了要定義配置檔案, 並在配置檔案中定義專案的工作流程. Circle 是一個對開源專案友好的 CI 工具, 本文將以 CircleCI 入手, 解析配置檔案中定義 Docker 映象的配置項: image欄位.
對於大多數初次嘗試使用 CircleCI 的使用者, 最難以拿捏的莫過於使用 docker 映象時, 配置中 docker 欄位下 image 的定義, 本文將介紹如何配置 image 選項 - 使用 CircleCI Convenience Image, 以及與之相關配置的最佳實踐.
Convenience Image 的兩種型別
CircleCI 為我們提供了語言類映象和服務類映象兩種型別的 Convenience Image, 在這些映象中預設了很多依賴, 可以為我們進行持續整合提供便利.語言類映象
語言類映象內建了某種語言相關的依賴和工具.
語言類映象需要在 docker 欄位下的第一個 image 欄位中定義, 作為執行時的首要容器.
語言類映象支援的語言列表:
- Android
- Clojure
- Elixir
- Go (Golang)
- JRuby
- Node.js
- OpenJDK (Java)
- PHP
- Python
- Ruby
- Rust
格式
docker:
-image: circleci/language:version[-tag]
複製程式碼
配置示例
docker:
-image: circleci/golang:1.9
複製程式碼
語言類映象變體
在語言類映象的基礎上, CircleCI 還提供了這類映象的變體, 即在提供了某種語言依賴的基礎上增加了更多的依賴, 預裝了其他的語言和工具
通過新增以下字尾, 就可以使用在某種 Convenience Image 的基礎上預置了更多依賴的映象
-
-node
- 新增了 Nodejs 相關依賴
-
-browsers
- 新增了 瀏覽器 相關依賴
- includes Chrome, Firefox, Java 8, and Geckodriver
-
-browsers-legacy
- 大致同上, 略有區別
- includes Chrome, Firefox, Java 8, and PhantomJS
-
-node-browsers
- 同時新增了 -node 變體 和 -browser 映象變體所提供的依賴
-
-node-browsers-legacy
- 同時新增了 -node 變體 和 -browsers-legacy 映象變體所提供的依賴
配置示例
- image: circleci/node:10-jessie-browsers
複製程式碼
服務類映象
服務類映象主要是為專案提供服務 (例如資料庫服務) 時使用的.
它們必須要在語言類映象後面定義, 作為次要映象.
CircleCI 為以下服務提供了服務類映象
- buildpack-deps
- DynamoDB
- MariaDB
- MongoDB
- MySQL
- PostgreSQL
- Redis
配置示例
- image: circleci/mongo:4.1.7-xenial
複製程式碼
服務類映象變體
CircleCI 僅僅為服務類映象提供了一種變體, -ram
配置示例
- image: circleci/postgres:9.5-postgis-ram
複製程式碼
配置映象的最佳實踐 Best Practices
配置 CircleCI Convenience Image 的最佳實踐是定義最精確版本的映象.這是因為 CircleCI Convenience Image 是基於最新版本的上游映象製作的, 例如映象 circleci/ruby:2.4-node
是基於最新的 Ruby 2.4-node
容器映象製作的.
使用最精確的映象可以避免由於上游的映象更新而導致的 Convenience Image 的更新從而所帶來的不穩定性, 從而保證專案執行環境的穩定性.
配置 Image 的最佳實踐就是通過一個額外的標籤來固定映象的版本.
也就是說, 與其使用 circleci/ruby:2.4-node 映象, 不如加上一個標籤 -jessie 或 -stretch 來固定映象所用的作業系統, 來確保專案使用的映象是基於某個特定版本的 Debian 系統 ( 例如 circleci/ruby:2.3.7-jessie )
我們也可以通過指定映象的 SHA 版本來使用最精確的映象.
使用精確映象的兩種方法:
- 使用一個標籤來固定映象的系統型別
- 使用一個明確的 Docker 映象 ID
# 最佳實踐示例
# 示例 1
# 使用固定系統的映象
- image: circleci/ruby:2.4.2-jessie-node
# 示例 2
# 使用固定版本映象
- image:circleci/ruby@sha256:df1808e61a9c32d0ec110960fed213ab2339451ca88941e9be01a03adc98396e
複製程式碼
所有 Convenience Image 映象的可用字尾
請查詢該檔案: circleci.com/docs/2.0/do…
示例配置
一個應用了 Node.js 語言映象和 MongDB 服務映象的 CircleCI 專案配置檔案
# .circleci/config.yml
version: 2.1
jobs:
build:
docker:
- image: circleci/node:10.13-jessie-browsers
- image: circleci/mongo:4.0.4-xenial-ram
steps:
- run: echo "A first hello"
複製程式碼