使用單個Dockerfile在CI中運行多個node版本

Docker在持續集成方面邁出了一大步。須要在CI主機中設置一百個工具或啓動整個虛擬機的日子已經一去不復返了。如今,您只需安裝Docker,就能夠開始使用了大部分程序。node

針對不一樣的node.js版本測試項目。如何在Jenkins實現這一目標的。docker

假設您有一個能夠運行docker的Jenkins。相似於這樣:npm

docker run --name jenkins -itd \
       -p 8081:8080 \
       -p 50000:50000 \
       -v ~/jenkins:/var/jenkins_home \
       -v /var/run/docker.sock:/var/run/docker.sock \
       -v /usr/local/bin/docker:/usr/bin/docker \
       jenkins/jenkins:lts

項目的結構是這樣的json

├── package-lock.json
├── package.json
└── src
    ├── file.js
    └── file.test.js

該項目使用npm來管理其依賴項,並具備一個lock文件以確保每次咱們運行時npm install都安裝徹底相同的版本。咱們的代碼位於包含測試文件的src文件夾下。package.jsontest任務是檢查項目。緩存

若是要針對一個特定的node版本檢查該項目,則可使用如下命令構建映像Dockerfilebash

FROM node:12.14

ENV NODE_VERSION=12.14

RUN mkdir -p /app/src
WORKDIR /app
ENV HOME=/app

COPY package.json package-lock.json ./
RUN npm install --ci

COPY src src
CMD npm test

並設置咱們的Jenkins做業以運行如下腳本:app

docker build -t node-ci:12.14  .
docker run -it --rm node-ci:12.14

Dockerfile的詳細信息或運行方式並不重要。能夠根據須要調整圖像。您能夠掛載卷覺得其設置緩存node_modules或避免複製代碼。請注意,官方node鏡像已經設置了NODE_VERSION環境變量,所以咱們實際上並不須要第3行。ide

多Node版本

每一個項目都應定義須要檢查的節點版本。咱們須要調整,Dockerfile以接受可修改將要使用的基本映像的構建ARG。該ARG指令定義了一個變量,用戶能夠在構建時docker build使用帶有--build-arg <varname>=<value>標誌的命令將其傳遞給構建器。工具

ARG NODE_VERSION
FROM node:$NODE_VERSION

ARG NODE_VERSION
ENV NODE_VERSION=$NODE_VERSION

RUN mkdir -p /app/src
WORKDIR /app
ENV HOME=/app

COPY package.json package-lock.json ./
RUN npm install --ci

COPY src src
CMD npm test

最後,咱們修改腳本以迭代定義的節點版本,傳遞NODE_VERSION ARG來構建映像並運行它。測試

#!/bin/bash -e

versions="10.16 12.14"

for version in $versions; do
  echo "========== node $version ==========="
  docker build -t node-ci:$version --build-arg NODE_VERSION=$version .
  docker run -it --rm node-ci:$version
done

就是這樣:在CI中針對一個單一的多個節點版本運行做業Dockerfile

設置Jenkins使用Docker容器運行CI做業很是容易。這爲配置做業和運行做業的環境提供了極大的靈活性。利用和一些腳本中的ARG+ FROM語法Dockerfile,您能夠減輕在Jenkins中針對不一樣節點版本運行相同做業的痛苦。一樣,該方法能夠應用於您選擇的任何其餘語言或技術。

DevOps流水線實踐教程已上線,須要的同窗能夠點擊連接獲取哦https://edu.51cto.com/sd/36f6e

相關文章
相關標籤/搜索