背景:
我遇到这个问题是在CI/CD中 编译打包 我们的全端代码 vue项目。在 npm run build 结束之后会生成 dist目录, 在打docker镜像的时候需要把 install stage 中的dist 传递给 build-image stage
技术选择:
一开始想到两个解决办法:
1.做一个功能齐全的docker image 里面既可以执行npm /yarn命令打包,又可以使用docker 命令,执行打包docker镜像 和镜像推送。
2.实现同一流水线中不同容器之间数据传递
总结一下:这两个方法各有各的好处。
方法一:优点,使用简单,流水线简化 ,缺点,镜像过大,拉取镜像耗时,需要定制化镜像
方法二:优点,镜像轻量化,单个job实现单个功能,很明确。缺点,流水线需要多几个stage,略显复杂
对比之后我选择方法二去构建我的流水线,但是又有问题,怎么实现数据传递呢?
gitlab-ci在这块也有两个办法 : cache ,和artifacts
通过学习,发现cache 配置简单,只需定义一个全局的cache即可 ,但是存在命中率问题,不一定每一次都有效果;artifacts 配置比cache略显复杂,但是每次都可以成功。
所以,我选择了artifacts 构建我的前端node流水线
关键部分gitlab-ci.yml文件展示

stages:
  - Install
  - Build-Images
  install:
  image: node:latest
  stage: Install
  script:
    - yarn install
    - nohup yarn run build  &       #这里使用后台化的方式运行  yarn run build ,是为了避免命令执行玩之后交互式的ctrl+c 
    - sleep 600 
    - ls -al
  artifacts:
    paths:
    - dist/
  only:
    - ci-test
Build-Images:
  stage: Build-Images
  script:
    - echo  'build docker image and push image to harbor'
    - ls -al 
    - pwd
    - mkdir  dockerbuild 
    - mv dockerfile dockerbuild
    - mv dist dockerbuild
    - cd dockerbuild
    - docker  build  -f dockerfile  -t  cfss-vue:v2 .
    - docker login -u name -p  pw @  ip:port
    - docker  push  cfss-vue:v2
  dependencies:
  - install
  only:
    - ci-test
Logo

前往低代码交流专区

更多推荐