Что такое трубопроводы CircleCi? Могут ли они использоваться для запуска задания с параметрами? - PullRequest
0 голосов
/ 25 февраля 2020

Документация распространена, и это немного сложно gr asp Как использовать концепцию pipeline в языке Circle Ci? Кроме того, в чем смысл конвейеров и переменных конвейера?

Следующие документы были полезны, но их было недостаточно, чтобы я мог понять, как они на самом деле работают:

1 Ответ

0 голосов
/ 25 февраля 2020

TLDR-ответ;

pipelines в круге ci по сути являются триггерами - запускают все рабочие процессы для определенного c репо / ветви / тега, в том числе, когда круговые автозапуски из переменные конвейера push / merge et c.

, по-видимому, являются переменными, которые требуют объявления в config.yml и значений по умолчанию. Их значения могут быть установлены только при запуске «конвейера» через API 2.0.

Пример триггера через API 2.0 [github]: (ПРИМЕЧАНИЕ: требуется личный токен [не проект])

curl -u ${CIRCLECI_TOKEN}: -X POST --header "Content-Type: application/json" -d '{
  "branch": "feat",
  "parameters": {
    "image-tag": "4.8.2"
  }
}' https://circleci.com/api/v2/project/gh/<org>/<repo>/pipeline

Длинный ответ

Если вы чем-то похожи на меня, вы можете думать о слове pipeline в контексте CI как о иерархии рабочих мест с зависимостями между ними и Возможность передавать данные от одного шага к следующему. Эта функция существует в круге ci и является довольно мощной (за исключением того, что передача данных является довольно неудобной), но она называется workflow. Таким образом, оставляя вопрос о том, что означает круг ci с «конвейером», после того, как он немного поиграл с его запуском и просмотрел разные части документа, я пришел к выводу, что его, вероятно, следовало бы назвать «триггером» или «выполнением рабочего процесса» или чем-то в этом роде. По сути, он описывает запуск всех рабочих процессов в данной ветви / теге, в том числе, когда этот триггер автоматически c посредством push / merge.

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

Почему даже go там?

Я до сих пор не уверен, что это стоит того, чтобы быть честным, но в основном нас гонят:

  • Не оставайтесь на старых технологиях (и скоро их выбросят)
  • Сферы - довольно хороший способ DRY конвейеров, который работает только в конфигурации 2.1

Проблема?

Вариант использования 1. По сути, у нас есть задание, которое необходимо выполнить после развертываний в 3 разных репозиториях, и вместо того, чтобы вставлять копии и поддерживать код в 3 местах, мы поместил задание в 4-й репо и, используя circleci API 1.1, запустил его с входными параметрами из разных репо. Прекрасно работает в конфиге 2.0 circleci. Также невозможно достичь в конфигурации 2.1 после того, как круг ci ввел регрессию, чтобы больше не поддерживать запуск задания с параметрами.

Вариант использования 2. В некоторых других случаях полезно запускать с помощью параметров, если, скажем: выполнение задания занимает 2 часа, и вам не нужно ждать, чтобы что-то проверить в вашем конвейере.

Вариант использования 3: сбой задания 2, и вам нужно исправить его перед ручным повторным запуском с выводом задания 1.

Для простоты рассмотрим рабочий процесс 2 заданий:

+-------+      +-------+
| Job 1 |  ->  | Job 2 |
+-------+      +-------+

И мы хотим иметь возможность:

  • Передавать переменные из задания 1 в задание 2
  • Выполнять задание 2 через API, передавая параметры заданию

В circleci API 1.1 это просто вопрос передачи параметров в задание (через API), и они автоматически преобразуются в переменные окружения. Просто.

С включенными «конвейерами» и в конфигурации 2.1, кажется, нет элегантного способа добиться этого. Хотя это несколько облегчается наличием шаров и сохранением полного рабочего процесса в 1 репо (по крайней мере, вариант использования 1). Однако существует раздутый и хакерский способ сделать это с помощью конвейеров 2.1, который сводится к (пример PO C ниже):

  • Убедитесь, что есть параметр конвейера, который позволяет всем "нормальным" рабочим процессам не run.
  • Добавить параметр конвейера для запуска задания по требованию 2
  • Добавить параметры конвейера для фактических параметров, которые необходимо передать в задание 2.
  • Создать задание 3, который принимает параметры конвейера и передает их в задание 2 в качестве переменных env.
  • Создайте рабочий процесс, который запускает задание 3, а затем задание 2, когда переменная по требованию установлена ​​

Awkward ? О да. Я могу только догадываться, что у круга ci были некоторые другие варианты использования для введения переменных конвейера, потому что это просто не очень удобно.

Заключение

Я до сих пор не могу понять, как вы "должны" использовать конвейерные переменные. Возможно, в будущем у официальных документов будет больше ясности по этому вопросу.

Я действительно вижу необходимость в конвейерных переменных, и они могут быть довольно мощными, но их ограничения приводят к некоторой неловкости, по крайней мере для наших случаев использования. Меня больше всего раздражают следующие ограничения:

  • Нет способа (я думаю) установить переменную конвейера в задании 1, получить к нему доступ из задания 2.
  • Нет способа (я думаю ) для установки конвейерной переменной в определении задания.
  • Переменные должны быть предопределены.
  • Нет способа выборочно запустить только один рабочий процесс
  • Нет способа выборочно запустить только одно задание

Рабочий пример PO C config.yml для запуска job2 с использованием вывода из job1 или по требованию с параметрами, отправленными в пользовательский конвейер, пользовательский рабочий процесс и промежуточное задание 3:

version: 2.1

# Pipeline parameters
parameters:
  workflow_ondemand:
    type: boolean
    default: false
  workflow_job2_ondemand:
    type: boolean
    default: false
  workflow_job2_param1_version:
    type: string
    default: "invalid version"

workflows:
  version: 2

  normal-workflow:
    unless: << pipeline.parameters.workflow_ondemand >>
    jobs:
      - job1
      - job2:
          requires: [job1]
  workflow-job2-ondemand:
    when: << pipeline.parameters.workflow_job2_ondemand >>
    jobs:
      - job3
      - job2:
          requires: [job3]

# Trigger with:
#
# curl -u ${CIRCLECI_TOKEN}: -X POST --header "Content-Type: application/json" -d '{
#                             "branch": "feat",
#                             "parameters": {
#                                "workflow_ondemand": true,
#                                "workflow_job2_ondemand": true,
#                                "workflow_job2_param1_version": "version1"
#                              }
# }' https://circleci.com/api/v2/project/gh/<org>/<repo>/pipeline

jobs:
  job1:
    docker:
      - image: circleci/node:latest
    steps:
      - run:
          name: Fake build and generate random version number
          command: |
            echo export VERSION=$((1 + RANDOM % 100)) >> /tmp/.env
            source /tmp/.env
            echo "Version in job1: ${VERSION}"
      - persist_to_workspace:
          root: /tmp/
          paths: ['.env']

  job2:
    docker:
      - image: circleci/node:latest
    steps:
      - attach_workspace:
          at: /tmp
      - run:
          name: "Load and print version from previous step"
          command: |
            source /tmp/.env
            echo "Version in job2: ${VERSION}"

  job3:
    docker:
      - image: circleci/node:latest
    environment:
      VERSION: << pipeline.parameters.workflow_job2_param1_version >>
    steps:
      - run:
          name: "Save parameter value to .env"
          command: |
            echo export VERSION=${VERSION} >> /tmp/.env
            echo "Version in job3: ${VERSION}"
      - persist_to_workspace:
          root: /tmp/
          paths: ['.env']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...