如何 Debug GitLab CI

有時候明明沒有更動 .gitlab-ci.yml,但是 GitLab CI 卻突然 Build Fail。看 Build Log 會發現一些以前沒有出現過的錯誤。如果 .gitlab-ci.yml 都是使用 lastest 的 tag,這時候可能會懷疑是版本升級產生的錯誤。不論是 Docker, Image, Python, pip, awscli,都有可能因為版本升級而出錯,如下面的 Log。

Failed building wheel for PyYAML
Running setup.py clean for PyYAML
Failed to build PyYAML
Installing collected packages: colorama, docutils, six, python-dateutil, jmespath, botocore, s3transfer, PyYAML, pyasn1, rsa, awscli
Running setup.py install for PyYAML: started
Running setup.py install for PyYAML: finished with status 'error'
Complete output from command /usr/local/bin/python -u -c "import setuptools, tokenize;__file__='/tmp/pip-install-ni_3hnnt/PyYAML/setup.py';f=getattr(tokenize, 'open', open)(__file__);code=f.read().replace('\r\n', '\n');f.close();exec(compile(code, __file__, 'exec'))" install --record /tmp/pip-record-g_q8xwm4/install-record.txt --single-version-externally-managed --compile:
error: command 'gcc' failed with exit status 1

----------------------------------------
Command "/usr/local/bin/python -u -c "import setuptools, tokenize;__file__='/tmp/pip-install-ni_3hnnt/PyYAML/setup.py';f=getattr(tokenize, 'open', open)(__file__);code=f.read().replace('\r\n', '\n');f.close();exec(compile(code, __file__, 'exec'))" install --record /tmp/pip-record-g_q8xwm4/install-record.txt --single-version-externally-managed --compile" failed with error code 1 in /tmp/pip-install-ni_3hnnt/PyYAML/
ERROR: Job failed: exit code 1

Solution

這時候可以根據你在 .gitlab-ci.yml 使用到的 image,跑起來,並且一步一步 Run Scripts,確認哪個環節出錯,再 Run 比較舊版本的 image,交叉比對是不是版本升級造成 Build Fail。

以下提供:如何在容器(Container)中除錯

docker run -it --rm --name some-docker python:3.6 sh
docker run -it --privileged --name some-docker docker:18.02-git sh

Conclusion

最好在使用任何 Library, Image 的地方都要指定版本,避免 Build Fail。

當然也可以都使用 latest 的 tag,保持最新或是避免一些零時差攻擊的可能性,但相對就要花比較多的時間維護 CI/CD 了!