2017-03-31 139 views
0

我們使用Docker來構建/部署NodeJS應用程序。我們有一個由Jenkins構建的test容器,並執行我們的單元測試。該Dockerfile看起來是這樣的:碼頭集裝箱內的rsync文件?

FROM node:boron 

# <snip> some misc unimportant config here 

# Run the tests 
ENTRYPOINT npm test 

我想修改這一步,讓我們運行npm run test:cov,運行單元測試+生成覆蓋率報告的HTML文件。我修改了Dockerfile來說:

# Run the tests + generate coverage 
ENTRYPOINT npm run test:cov 

...哪些工作。好極了!

...但現在我不確定如何將覆蓋率報告(由Dockerfile中的上述命令生成)覆蓋報告到遠程服務器。

在詹金斯,上述的配置被調用這種方式:

docker run -t test --rm 

其中,再次,運行上述測試和存在該容器。

如何在entrypoint命令執行後添加一些額外的步驟,例如將rsync的某些結果輸出到遠程服務器?

回答

0

製作腳本以執行入口點並將這些命令放入腳本中。調用docker run時,您傳入參數並將其傳遞給腳本。

該文檔有一個postgres圖像腳本的例子。你可以建立起來。

Docker Entrypoint Docs

0

我不是一個「節點」專家,所以在細節上多多包涵。

首先,您可以考慮是否需要單獨的Dockerfile來運行測試。理想情況下,您希望構建圖像,然後進行測試,而不修改實際圖像。

建立該應用程序使用您的NodeJS作爲基礎圖像(FROM my-nodejs-image)的測試圖像可以做的伎倆,但如果所有你需要做的就是在運行不同命令/入口點可能不需要圖片。

其次;有狀態數據(覆蓋報告屬於該類別)不應該存儲在容器內(即,不存儲在容器的文件系統中)。你希望你的容器是短暫的,並且任何超出容器生命週期的東西(在容器本身消失後應該保留的任何東西)應該被存儲在容器的外部之外;無論是在「卷」還是在一個綁定安裝的目錄中。

讓我從「單獨的Dockerfile」開始。假設您的NodeJS應用程序Dockerfile看起來像這樣;

FROM node:boron 

COPY package.json /usr/src/app/ 
RUN npm install && npm cache clean 
COPY . /usr/src/app 

CMD [ "npm", "start" ] 

您可以構建您的圖像,並使用其構建的提交對其進行標記;例如,

docker build -t myapp:$GIT_COMMIT . 

一旦圖像構建成功,您想要測試它。可能是一個快速測試,以驗證它實際上「運行」。有很多方法可以做到這一點,或許是這樣的;

docker run \ 
    -d \ 
    --rm \ 
    --network=test-network \ 
    --name test-{$GIT_COMMIT} \ 
    myapp:$GIT_COMMIT 

而一個容器來測試它實際上做了什麼;

docker run --rm --network=test-network my-test-image curl test-{$GIT_COMMIT} 

一旦測試(和臨時容器中取出),但是,您可以運行覆蓋測試,而不是寫在容器內覆蓋報告,它寫入卷或結合安裝型。你可以用覆蓋命令在docker run的容器中運行;

mkdir -p /coverage-reports/{$GIT_COMMIT} 
docker run \ 
    --rm \ 
    --name test-{$GIT_COMMIT}\ 
    -v /coverage-reports/{$GIT_COMMIT}:/usr/src/app/coverage \ 
    myapp:$GIT_COMMIT npm run test:cov 

上述命令;

  • 創建一個唯一的本地目錄來存儲測試工件(覆蓋報告)
  • 運行你構建(和標籤myapp:$GIT_COMMIT)在usr/src/app/coverage
  • 綁定貼裝的/coverage-reports/{$GIT_COMMIT}到容器的圖像運行覆蓋率測試(如果我沒有弄錯的話,這將寫入/usr/src/app/coverage--再次,不是節點專家)
  • 移除容器一旦退出

容器退出後,覆蓋率報告存儲在主機上的/coverage-reports/{$GIT_COMMIT}中。您可以使用常規工具rsync那些你想要的。

作爲一種替代方案,您可以使用volume plugin將結果寫入(例如)s3存儲區,這樣您就不必rsync結果。

一旦測試成功,您可以使用docker tag圖像將您的應用程序的版本(例如docker tag myapp:1.0.12345),docker push添加到您的註冊表中,並部署新版本。