背景:项目使用的gitlabci,打包成docker镜像,最近打包越来越慢,打包一次需要40分钟左右,影响上线速度
分析:通过查看打包的日志,主要慢在了Creating cache 和 Uploading artifacts上面,以及docker镜像比较大,下图为优化前(左),优化后(右)的对比图
解决方案:
1.解决catch问题,主要是缓存了node_modules,原先是在全局中定义的,实际node_modules只在build-node这个job中使用了,只需要在这个job中缓存就可以了,减少重复缓存的时间
2.gitlab-ci.yml中artifacts中的untracked设置为false,表示不发送所有Git未跟踪的文件,在我们的项目里面,没有跟踪的基本是node_modules文件夹,可以设置未false
3.新增dockerignore文件,文件中指定在传递给 docker引擎 时需要忽略掉的文件或文件夹
完整代码gitlab-ci.yml
image: "docker:dind"
stages:
- build-node
- build-docker
before_script:
- export IMAGE_TAG=$(echo -en $CI_COMMIT_REF_NAME | tr -c '[:alnum:]_.-' '-')
- export IMAGE_NAME=registry.cn-hangzhou.aliyuncs.com/aticloud/CI_PROJECT_NAME:$IMAGE_TAG
build-node:
image: "node:13.13.0-stretch-slim"
stage: build-node
artifacts:
name: "dist"
untracked: false
expire_in: 60 mins
paths:
- $CI_PROJECT_DIR/dist
script:
- npm config set registry https://registry.npm.taobao.org
- npm config set sass_binary_site "https://npm.taobao.org/mirrors/node-sass/"
- npm config set chromedriver_cdnurl "https://cdn.npm.taobao.org/dist/chromedriver"
- npm install cnpm -g && cnpm install
- npm run lint
- echo $IMAGE_TAG"(buildtime:"$(date +%Y%m%d%H%M)")" > public/static/version.txt && ls ./public/static/
- npm run build
cache:
key: ${CI_PROJECT_NAME}
paths:
- node_modules/
tags:
- xxxx
build-docker:
stage: build-docker
dependencies:
- build-node
script:
- "docker build -t ${IMAGE_NAME} ."
- "docker push $IMAGE_NAME"
tags:
- xxxx
only:
- beta
- release
- tags