2019年7月25日 星期四

在winodws container 使用 chrome headless 做 angular unit test

在winodws container 使用 chrome headless 做 angular unit test

現在 azure pipeline 來到前端的unit test 階段
想像中應該就像在自己電腦裡執行一樣,如果可以正常用chrome headless 執行 unit test 放到docker 應該不會有問題。BUT 事情總是沒有這麼單純。

以下是我部份的karma.config.js 跟DockerFile

module.exports = function (config) {
  config.set({
    customLaunchers: {
      ChromeHeadlessDocker: {
        base: 'ChromeHeadless',
        flags: [
          '--disable-web-security',
          '--no-sandbox',
          '--disable-setuid-sandbox',
          '--disable-dev-shm-usage',
          '--remote-debugging-port=9223',
          '--headless',
          '--disable-gpu'
        ]
      }
    },
    .
    .
    .
  });
};

DockerFile

RUN ng test --watch=false --code-coverage --browsers=ChromeHeadlessDocker --reporters=junit,progress

結果一直會出現

ChromeHeadless have not captured in 60000 ms, killing.

這才想到…我沒有裝chrome在docker container裡面

原本我是用

RUN Invoke-WebRequest -OutFile ChromeStandaloneSetup64.exe https://dl.google.com/tag/s/installdataindex/update2/installers/ChromeStandaloneSetup64.exe;
RUN ./ChromeStandaloneSetup64.exe /silent /install

但是卻一直裝不成功。( 如果有裝成功會在 C:\Program Files (x86)\ 底下有個Google 的目錄)
後來到 https://cloud.google.com/chrome-enterprise/browser/download/ 下載MSI的版本,先COPY到 image裡面再下指令裝

COPY ./GoogleChromeStandaloneEnterprise64.msi /
RUN Start-Process -FilePath msiexec -ArgumentList /q, /i, GoogleChromeStandaloneEnterprise64.msi -Wait ; `
Remove-Item -Force GoogleChromeStandaloneEnterprise64.msi

確認chrome有裝起來之後,再執行docker build 還是出現

ChromeHeadless have not captured in 60000 ms, killing.

把 karma.config.js 裡的 logLevel: config.LOG_INFO, 改成 config.LOG_DEBUG 也沒得到什麼有用的資訊

這個時候己經快瘋了,在這裡卡關卡了三天,無論改config或者一些奇奇怪怪的方法都沒效。

而且重點是網路上找到的方法,其實都是Linux container的解決方案。 Windows Container 根本一整個弱掉了。

後來終於在這裡找到 https://stackoverflow.com/questions/52948655/chrome-on-windows-docker-container-is-not-working 原來是缺少字型的問題. 一整個 WHAT THE ~~~

這位好心的 Prom3theu5 還提供了字型及安裝方法
https://github.com/prom3theu5/ServerCoreFonts

照著上面的方法,安裝字型之後終於可以看到開始測試的訊息了。

2019-07-08T00:39:39.6996247Z  [32m08 07 2019 08:39:39.675:INFO [karma-server]:  [39mKarma v3.1.1 server started at http://0.0.0.0:9876/

2019-07-08T00:39:39.6999650Z  [32m08 07 2019 08:39:39.698:INFO [launcher]:  [39mLaunching browsers ChromeHeadlessCI with concurrency unlimited

2019-07-08T00:39:39.7124483Z  [32m08 07 2019 08:39:39.710:INFO [launcher]:  [39mStarting browser ChromeHeadless

2019-07-08T00:40:35.5387718Z  [32m08 07 2019 08:40:35.537:INFO [HeadlessChrome 0.0.0 (Windows 10 0.0.0)]:  [39mConnected on socket Gsf6g9YFWi0lxoFVAAAA with id 57991930

2019-07-08T00:40:49.6356010Z HeadlessChrome 0.0.0 (Windows 10 0.0.0): Executed 0 of 439 SUCCESS (0 secs / 0 secs)

2019-07-08T00:40:49.7481854Z  [1A [2KHeadlessChrome 0.0.0 (Windows 10 0.0.0): Executed 1 of 439 SUCCESS (0 secs / 0.079 secs)

沒有留言:

張貼留言