Два изображения Docker в GitLab CI .yaml - PullRequest
0 голосов
/ 23 января 2019

Я пытаюсь расширить одно из своих заданий CI на GitLab:

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 голосов
/ 24 января 2019

Вы можете просто использовать 2 для разделения шагов сборки и использовать артефакты для передачи сборки между шагами.

Что вы можете сделать, так это то, что на первом шаге сборки вы используете образ с vue.js и запускаете npm run build и любые другие необходимые шаги.

В конце задания вы указываете артефакты .

artifacts:
  paths:
    - build

Это передаст сборку папки следующему заданию.

Затем вы можете запустить второе задание, используя python для загрузки содержимого в S3.

Это даету вас есть свобода строить свою программу так, как вы хотите, без необходимости ограничивать себя конкретной средой.

Если вы не можете найти изображение, которое делает то, что вам нужно, вы можете создать свое собственное или, есливремя сборки не важно, вы можете использовать базовый образ и установить все, что вам нужно, как часть вашей работы.

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

Приведенный выше фрагмент кода установит curl на образе узла alpine.

0 голосов
/ 24 января 2019

После некоторой помощи отсюда я получил такую ​​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 - просто выполните одну работу, а затем переместите результаты на следующую работу. Работает как шарм.

0 голосов
/ 23 января 2019

Я бы предложил следующие подходы:

Во-первых, просто.Используйте контейнер общего назначения в качестве базового образа, скажем, ubuntu и установите там python и npm.

Почему бы не использовать python образ и установить его npm или наоборот:

  • ваш менеджер пакетов (apt / apk) становится неявным, если толькоВы указываете python:3-alpine или что-то еще.Я лично предпочитаю четкое определение, потому что ваши товарищи по команде могут быть перепутаны с вопросом "Что такое менеджер для образа npm?"если они не знакомы с ним.

  • набор предустановленных пакетов также не определен и может меняться от версии к версии.bash существует в python:3?

  • изменение версии одного инструмента (скажем, python2 -> python3) может существенно повлиять на изображение, если оно будет использоваться в качестве базового для всех остальных.

  • завтра вам нужно будет добавить третий инструмент (gcc?) К вашему изображению.

Так что наличие базового образа общего назначения со всеми необходимыми инструментами, установленными явно, ищет менякак лучшая идея.

Также следует отметить, что вам, вероятно, придется отделить процесс создания своего изображения от использования этого изображения.Я предпочитаю иметь первый prepare этап в моем gitlab CI, который собирает все необходимые образы и помещает их в предоставленный реестром GitLab частный докер.

...