GitLab CI .yaml中的两个Docker映像

时间:2019-01-23 15:50:20

标签: docker gitlab-ci gitlab-ci-runner

我正在尝试在GitLab上扩展我的一项CI作业:

deploy-stage:
  image: python:3.5
  environment: stage
  script:
  - pip install awscli
  - aws s3 cp dist s3://$S3_BUCKET_STAGE/ --recursive
  only:
    - stage

我想要实现的是能够从Vue.js文件构建代码(通过使用npm run build),但是要做到这一点,我需要Node.js。但是我还需要Python才能将文件上传到S3。我该如何实现?

3 个答案:

答案 0 :(得分:1)

您可以仅使用2个单独的构建步骤,并使用工件在步骤之间传递构建。

您可以做的是,在第一步构建中,将映像与vue.js一起使用,然后运行npm run build和其他需要执行的步骤。

在工作结束时,您指定artifacts

artifacts:
  paths:
    - build

这会将文件夹构建传递给下一个作业。

然后,您可以使用python运行第二个作业,将内容上载到S3。

这使您可以自由地以所需的方式构建程序,而不必将自己局限于特定的环境。

如果找不到能够满足您需要的映像,则可以创建自己的映像,或者,如果构建时间不重要,则可以使用基本映像并安装所需的一切作为工作的一部分。 / p>

image: node:alpine
  before_script:
    - yum install curl -y && yum update -y
  script:
    - npm run build

上面的代码片段将把curl安装在节点高山图像上。

答案 1 :(得分:1)

从这里获得一些帮助之后,我最终得到了这样的gitlab-ci.yml配置:

build-stage:
  stage: build
  image: node:latest
  environment:
    name: stage
  script:
    - npm install
    - npm run build-stage
  only:
    - stage
  artifacts:
    expire_in: 2 hrs
    paths:
      - dist/

deploy-stage:
  stage: deploy
  image: python:3.5
  environment:
    name: stage
  script:
    - pip install awscli
    - aws s3 cp dist s3://$S3_BUCKET_STAGE/ --recursive
  dependencies:
    - build-stage
  only:
    - stage

简单易读。不需要来自Docker的任何自定义映像-只需完成一项工作,然后将结果移至下一项工作即可。就像魅力一样。

答案 2 :(得分:0)

我建议采取以下方法:

首先,很简单。使用通用容器作为基本映像,假设ubuntu并在其中安装pythonnpm

为什么不使用python映像并将其安装在npm上,反之亦然:

  • 除非您指定apt或其他任何内容,否则包管理器(apk / python:3-alpine)将变为隐式。我个人更喜欢明确的定义,因为您的队友会对“ npm图像的管理者是什么?”这个问题感到困惑。如果他们不熟悉。

  • 预安装软件包的集合也是未定义的,并且可以随版本而变化。 bash中是否存在python:3

  • 如果将某个工具的版本用作所有其他工具的基础版本,则更改该工具的版本(可以说python2 -> python3)可能会极大地影响该图像。

  • 明天您将需要在图像中添加第3个工具(gcc?)。

因此,拥有一个明确安装了所有必需工具的通用基础映像对我来说是一个最好的主意。

还要注意,您可能需要将图像构建过程与使用此图像分开。我更喜欢在prepare CI中进入第一个gitlab阶段,该阶段将构建所有必需的映像并将其放入由GitLab私有docker注册中心提供的映像。