Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
GitLab CI.yaml中的两个Docker图像_Docker_Gitlab Ci_Gitlab Ci Runner - Fatal编程技术网

GitLab CI.yaml中的两个Docker图像

GitLab CI.yaml中的两个Docker图像,docker,gitlab-ci,gitlab-ci-runner,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。但

我正在尝试在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。我如何才能做到这一点?

我建议采用以下方法:

首先,简单。使用通用容器作为基础映像,比如说
ubuntu
,并在那里安装
python
npm

为什么不使用
python
image并在那里安装
npm
,反之亦然:

  • 您的包管理器(
    apt
    /
    apk
    )将成为隐式的,除非您指定了
    python:3-alpine
    或其他内容。我个人更喜欢明确的定义,因为如果你的队友不熟悉npm形象,他们会被“什么是npm形象的管理者”这个问题弄糊涂

  • 预安装的软件包集也未定义,可以在不同版本之间更改。
    bash
    是否存在于
    python:3

  • 更改一个工具的版本(比如说
    python2->python3
    )可能会极大地影响图像,如果它被用作所有其他工具的基础版本

  • 明天,您需要将第三个工具(
    gcc
    ?)添加到您的图像中

因此,有一个带有所有需要的工具的通用基本映像,这对我来说是一个最好的主意


还要注意的是,您可能需要将图像构建过程与使用此图像分开。我更喜欢在我的
gitlab
CI中有第一个
prepare
阶段,它构建所有必要的映像并将它们放入gitlab private docker registry提供的中。

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

您可以做的是,在第一个构建步骤中,使用带有
vue.js
的映像,运行
npm run build
以及您需要执行的任何其他步骤

在指定的作业结束时

这将把文件夹生成传递到下一个作业

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

这使您可以自由地以自己想要的方式构建程序,而无需将自己限制在特定的环境中

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

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

上面的代码片段将在节点alpine映像上安装curl。

在这里提供了一些帮助之后,我最终得到了这样的
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的任何自定义图像-只需执行一个作业,然后将结果移动到下一个作业。很有魅力。

这很有趣。我是否可以只使用GitLab CI构建这个通用基础映像,或者我必须先在本地准备一个,然后将其上载到private Docker注册表?我是Dockrof课程的初学者,你可以用gitlab构建它。使用
docker:dind
服务和
docker:latest
作为构建器您需要连接
docker:dind
作为共享服务,并基于
docker:latest
docker:stable
(例如)映像创建新作业(在
prepare
阶段)。在您的工作中,您可以调用
docker
CLI,而服务将提供Daemon。我应该阅读哪些内容才能完全理解这些内容?我还没有完全理解这个想法,我想:)是的,这似乎更容易做到。我将深入研究它——我最近读到,我还必须为工件设置
expire
,这样它们就不会永远停留在那里:P我想我将为节点构建映像,然后
npm运行build
,然后使用python进行第二项工作,awsAh yes。如果它是一个稳定流动的项目,我倾向于将工件保留一周。如果到那时还没有问题,那就好了。最糟糕的情况是,如果您需要,您总是可以从提交重新运行管道来重新创建工件。
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