Как я могу локально протестировать изменения, внесенные в Jenkinsfile?

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

Есть ли способ выполнить их локально без фиксации кода?


person sorin    schedule 30.03.2016    source источник


Ответы (14)


Вы не можете выполнить сценарий конвейера локально, поскольку его вся цель - сценарий Jenkins. (Это одна из причин, по которой лучше сделать ваш Jenkinsfile кратким и ограниченным кодом, который на самом деле имеет дело с функциями Jenkins; ваша фактическая логика сборки должна обрабатываться с помощью внешних процессов или инструментов сборки, которые вы вызываете с помощью однострочного sh или bat шага. .)

Если вы хотите протестировать изменение Jenkinsfile в реальном времени, но без фиксации его, используйте функция воспроизведения, добавленная в 1.14.

JENKINS-33925 отслеживает желаемое для автоматизированной среды тестирования.

person Jesse Glick    schedule 31.03.2016
comment
В сообщении блога говорится, что есть кнопка «воспроизвести». Есть идеи где? Кажется, я не могу его найти. - person BoltzmannBrain; 25.02.2017
comment
@BoltzmannBrain, перейдите на страницу Jenkins вашего задания по сборке. Слева вы должны увидеть список предыдущих запусков сборки. При наведении указателя мыши на идентификатор запуска сборки (например, # 123) или дату запуска сборки появляется небольшая стрелка вниз. При нажатии на нее открывается контекстное меню, в котором есть опция «Воспроизвести». Опция также доступна на странице запуска сборки. - person Good Night Nerd Pride; 07.03.2017
comment
Concourse позволяет вам выполнять ваши локальные сценарии на целевом сервере сборки, поэтому вы можете проверить, действительно ли он будет работать и на удаленном сервере, прежде чем вносить изменения. concourse.ci/fly-cli.html. Функция воспроизведения Jenkins в чем-то аналогична этому, за исключением того, что у нее есть ограничения, и вам необходимо сначала создать сборку, чтобы воспроизвести ее. - person mdo123; 20.07.2017
comment
Вы можете взглянуть на этот проект, цель которого - предоставить то, что вы ищете. - person Romain; 30.05.2019
comment
Или, лучше, чем sh или bat, используйте многоплатформенный язык, например python. Теперь вы можете (возможно) поменять местами узлы Windows и Linux. - person cowlinator; 20.06.2019
comment
Было бы неплохо иметь возможность запускать большинство наших скриптов вне jenkins, чтобы упростить их отладку. Но как мы могли бы использовать служебные функции конвейера Jenkins (например, readMavenPom и writeMavenPom)? - person Ferran Maylinch; 02.08.2019
comment
Взгляните на JenkinsPipelineUnit (github.com/jenkinsci/JenkinsPipelineUnit) - person user864279; 27.11.2019
comment
Я думаю, что имело бы смысл, если бы вы все еще могли запускать код конвейера из Jenkins, но указывая его на локальную версию Jenkinsfile. Затем вы можете запустить его с локального компьютера, чтобы проверить, работает ли он, а затем отправить изменение, если оно есть. - person Mig82; 09.06.2020

У меня есть решение, которое мне подходит. Он состоит из локального jenkins, работающего в докере, и веб-перехватчика git для запуска конвейера в локальных jenkins при каждой фиксации. Вам больше не нужно отправлять данные в репозиторий github или bitbucket для тестирования конвейера.

Это было протестировано только в среде Linux.

Сделать это довольно просто, хотя эта инструкция довольно длинная. Большинство шагов уже есть.

Это то, что вам нужно

  • Docker установлен и работает. Это не входит в данную инструкцию.
  • A Jenkins running in docker locally. Explained how below.
    • The proper rights (ssh access key) for your local Jenkins docker user to pull from your local git repo. Explained how below.
    • Проект конвейера Jenkins, который извлекается из вашего локального репозитория git. Объясняется ниже.
    • Пользователь git в вашем локальном Jenkins с минимальными правами. Объясняется ниже.
  • Проект git с веб-перехватчиком после фиксации, который запускает проект конвейера. Объясняется ниже.

Вот как ты это делаешь

Дженкинс Докер

Вместо вашего выбора создайте файл с именем Dockerfile. Я помещаю его в /opt/docker/jenkins/Dockerfile и заливаю вот так:

FROM jenkins/jenkins:lts
USER root
RUN apt-get -y update && apt-get -y upgrade
# Your needed installations goes here
USER jenkins

Создайте образ local_jenkins

Это вам нужно будет сделать только один раз или после того, как вы что-то добавили в Dockerfile.

$ docker build -t local_jenkins /opt/docker/jenkins/

Запустите и перезапустите local_jenkins

Время от времени вы хотите легко запускать и перезапускать jenkins. Например. после перезагрузки вашей машины. Для этого я сделал псевдоним, который поместил .bash_aliases в свою домашнюю папку.

$ echo "alias localjenkinsrestart='docker stop jenkins;docker rm jenkins;docker run --name jenkins -i -d -p 8787:8080 -p 50000:50000 -v /opt/docker/jenkins/jenkins_home:/var/jenkins_home:rw local_jenkins'" >> ~/.bash_aliases
$ source .bash_aliases  # To make it work

Убедитесь, что папка /opt/docker/jenkins/jenkins_home существует и у вас есть права на чтение и запись в нее.

Чтобы запустить или перезапустить ваши jenkins, просто введите:

$ localjenkinsrestart

Все, что вы делаете в локальных jenkins, будет храниться в папке / opt / docker / jenkins / jenkins_home и сохраняться между перезапусками.

Создайте ключ доступа ssh в докере jenkins

Это очень важная часть для работы. Сначала мы запускаем контейнер докера и создаем для него оболочку bash:

$ localjenkinsrestart
$ docker exec -it jenkins /bin/bash

Теперь вы вошли в контейнер докеров, это вы можете увидеть по чему-то вроде jenkins@e7b23bad10aa:/$ в вашем терминале. Хеш после @ обязательно будет отличаться.

Создайте ключ

jenkins@e7b23bad10aa:/$ ssh-keygen

Нажимайте клавишу ВВОД для всех вопросов, пока не получите ответ

Скопируйте ключ на свой компьютер. Если вам интересно, внутри контейнера докеров ваш компьютер 172.17.0.1.

jenkins@e7b23bad10aa:/$ ssh-copy-id [email protected]

user = ваше имя пользователя, а 172.17.0.1 - это IP-адрес вашего компьютера из контейнера докеров.

На этом этапе вам нужно будет ввести свой пароль.

Теперь давайте попробуем завершить цикл, отправив ssh-соединение на ваш компьютер из контейнера докеров.

jenkins@e7b23bad10aa:/$ ssh [email protected]

На этот раз пароль вводить не нужно. Если да, значит, что-то пошло не так, и вам нужно попробовать еще раз.

Теперь вы окажетесь в домашней папке вашего компьютера. Попробуйте ls и посмотрите.

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

$ exit
jenkins@e7b23bad10aa:/$ exit

Верно! Теперь мы вернулись и готовы продолжить.

Установите Jenkins

Вы найдете свой локальный Jenkins в своем браузере по адресу http://localhost:8787.

Когда вы впервые укажете в браузере локальный Jenkins, вас откроет мастер установки. По умолчанию все в порядке, однако убедитесь, что вы установили плагин конвейера во время установки.

Настройте дженкинс

очень важно, чтобы вы активировали безопасность на основе матрицы на http://localhost:8787/configureSecurity/ и предоставьте себе все права, добавив себя в матрицу и отметив все поля. (Справа есть значок с флажками)

  • Выберите Jenkins’ own user database в качестве области безопасности
  • В разделе «Авторизация» выберите Matrix-based security.
  • Напишите свое имя пользователя в поле User/group to add: и нажмите кнопку [ Add ].
  • В таблице над вашим именем пользователя должно появиться всплывающее окно со значком людей рядом с ним. Если он перечеркнут, вы неправильно ввели свое имя пользователя.
  • Перейдите в крайний правый угол таблицы и нажмите кнопку «Отметить все» или вручную отметьте все поля в строке.
  • Убедитесь, что флажок Prevent Cross Site Request Forgery exploits не установлен. (Так как этот Jenkins доступен только с вашего компьютера, это не такая уж большая проблема)
  • Нажмите [ Save ] и выйдите из Jenkins, а затем снова, чтобы убедиться, что он работает. Если это не так, вам придется начинать все сначала и очищать папку /opt/docker/jenkins/jenkins_home перед перезапуском

Добавьте пользователя git

Нам нужно разрешить нашему git-хуку входить в наш локальный Jenkins с минимальными правами. Достаточно просто увидеть и построить рабочие места. Поэтому мы создаем пользователя с именем git и паролем login.

Направьте свой браузер на http://localhost:8787/securityRealm/addUser и добавьте git в качестве имени пользователя и login в качестве пароль. Щелкните [ Create User ].

Добавьте права пользователю git

Перейдите на страницу http://localhost:8787/configureSecurity/ в своем браузере. Добавьте пользователя git в матрицу:

  • Напишите git в поле User/group to add: и нажмите [ Add ]

Пришло время установить флажки для минимальных прав для пользователя git. Только это необходимо:

  • в целом: читать
  • работа: строить
  • работа: открыть
  • работа: читать

Убедитесь, что флажок Prevent Cross Site Request Forgery exploits снят, и нажмите [ Save ].

Создать проект конвейера

Мы предполагаем, что у нас есть имя пользователя user, а наш проект с поддержкой git с Jenkinsfile в нем называется project и расположен по адресу /home/user/projects/project.

В свой http://localhost:8787 Jenkins добавьте новый проект конвейера. Я назвал его для справки.

  • Щелкните New Item в меню Jenkins.
  • Назовите проект hookpipeline
  • Нажмите на конвейер
  • Нажмите [ OK ]
  • Установите флажок Poll SCM в разделе "Триггеры сборки". Оставьте расписание пустым.
  • In the Pipeline section:
    • select Pipeline script from SCM
    • в поле Repository URL введите [email protected]:projects/project/.git
    • в поле Script Path введите Jenkinsfile
  • Сохраните проект трубопровода
  • Один раз создайте hookpipeline вручную, это необходимо для того, чтобы SCM опроса начал работу.

Создайте крючок git

Перейдите в папку /home/user/projects/project/.git/hooks и создайте файл с именем post-commit, содержащий следующее:

#!/bin/sh
BRANCHNAME=$(git rev-parse --abbrev-ref HEAD)
MASTERBRANCH='master'

curl -XPOST -u git:login http://localhost:8787/job/hookpipeline/build
echo "Build triggered successfully on branch: $BRANCHNAME"

Сделайте этот файл исполняемым:

$ chmod +x /home/user/projects/project/.git/hooks/post-commit

Протестируйте хук после фиксации:

$ /home/user/projects/project/.git/hooks/post-commit

Проверьте в Jenkins, был ли запущен ваш проект hookpipeline.

Наконец, внесите произвольное изменение в свой проект, добавьте изменения и сделайте фиксацию. Теперь это запустит конвейер в вашем локальном Jenkins.

Счастливые дни!

person javabeangrinder    schedule 06.12.2017
comment
Мне пришлось заменить docker build -t local_jenkins /opt/docker/jenkins/Dockerfile на docker build -t local_jenkins /opt/docker/jenkins, потому что Docker жаловался на невозможность подготовить контекст: контекст должен быть каталогом. - person Etienne Neveu; 05.07.2018
comment
Я получаю эту ошибку на Mac. Может ли кто-нибудь помочь мне в этом? ›› ОШИБКА: ssh: подключиться к хосту 172.17.0.1 порт 22: в соединении отказано - - person Manoj Shrestha; 17.01.2019
comment
@ManojShrestha: ip 172.17.0.1 - это ip по умолчанию для машины, на которой запущены контейнеры докеров. Вместо этого вы можете использовать ip ваших машин (MAC: s). - person javabeangrinder; 17.01.2019
comment
@ManojShrestha: Вы также можете попытаться узнать IP-адрес шлюза вашей установки следующим образом: $ docker inspect jenkins | grep Gateway - person javabeangrinder; 17.01.2019
comment
Если ваш хост-докер установлен в macOS и вы хотите войти в него по ssh из контейнера докера, вам следует ssh [email protected] вместо использования IP-адреса. Также убедитесь, что вы включили функцию удаленного входа в систему в системных настройках macOs - ›меню« Общая папка ». - person pangiole; 27.11.2019
comment
Большое спасибо за такое подробное руководство, именно то, что я искал! - person Islam Murtazaev; 15.03.2020
comment
Примечание. Команда CURL после фиксации изменена для новых версий Jenkins. Используйте curl -v -XPOST -u git:$API_TOKEN http://localhost:8787/job/VMInit/build после получения значения токена API из пользовательского интерфейса через страницу конфигурации вашего пользователя (правый верхний угол. См. jenkins.io/doc/book/system-administration/) - person millebi; 19.06.2020
comment
Спустя 3 года эти инструкции немного не работают, но прекрасно работают. Совет для тех, кто обнаруживает, что контейнер работает от имени пользователя Jenkins и вы хотите настроить / etc / hosts без root: просто docker exec -u 0 -it jenkins /bin/bash и вы root! Делай плохие дела! - person millebi; 02.09.2020

TL; DR

Расширенная версия
Тестирование Jenkins Pipeline становится все более сложной задачей. В отличие от классического подхода к конфигурации декларативного задания, когда пользователь был ограничен тем, что предоставляет пользовательский интерфейс, новый конвейер Jenkins представляет собой полноценный язык программирования для процесса сборки, в котором вы смешиваете декларативную часть со своим собственным кодом. Как хорошие разработчики, мы хотим иметь несколько модульных тестов и для такого кода.

При разработке Jenkins Pipelines необходимо выполнить три шага. шаг 1. должен охватывать 80% случаев использования.

  1. Сделайте как можно больше в сценариях сборки (например, Maven, Gradle, Gulp и т. Д.). Затем в ваших сценариях конвейера просто вызываются задачи сборки в правильном порядке. Конвейер сборки просто организует и выполняет задачи сборки, но не имеет какой-либо основной логики, требующей специального тестирования.
  2. Если предыдущее правило не может быть полностью применено, перейдите к Общие библиотеки конвейера где вы можете самостоятельно разработать и протестировать пользовательскую логику и интегрировать ее в конвейер.
  3. Если все вышеперечисленное вам не поможет, вы можете попробовать одну из тех библиотек, которые появились недавно (март-2017). Платформа тестирования Jenkins Pipeline Unit или pipelineUnit (примеры). С 2018 года также существует Jenkinsfile Runner, пакет для выполнения конвейеров Jenkins из инструмента командной строки.

Примеры

Репозиторий GitHub pipelineUnit содержит несколько примеров Spock о том, как использовать Платформа тестирования Jenkins Pipeline Unit

person Vadimo    schedule 18.03.2017
comment
Не могли бы вы также включить краткое сравнение этих двух библиотек? - person sorin; 03.07.2017

В Jenkins есть функция «Воспроизведение», которая позволяет быстро воспроизвести задание без обновления источников:

Функция воспроизведения

person AhmedDrira    schedule 04.07.2018
comment
Обратите внимание, что он отображается на странице сборки, а не на странице проекта или ветки. - person ArtOfWarfare; 27.09.2019

На момент написания (конец июля 2017 г.) с Blue Ocean плагин, вы можете проверить синтаксис декларативного конвейера прямо в редакторе визуального конвейера. Редактор работает из пользовательского интерфейса Blue Ocean, когда вы нажимаете «настроить» только для проектов github (это известная проблема, и они работают над тем, чтобы она работала также и на git и т. Д.).

Но, как объясняется в этом вопросе, вы можете открыть редактор, просмотрев :

[Jenkins URL]/blue/organizations/jenkins/pipeline-editor/

Затем щелкните в центре страницы и нажмите Ctrl+S, это откроет текстовое поле, куда вы можете вставить декларативный сценарий конвейера. Когда вы нажимаете Обновить, если есть синтаксическая ошибка, редактор сообщит вам, где синтаксическая ошибка. Как на этом скриншоте:

«В

Если синтаксической ошибки нет, текстовое поле закроется, и на странице отобразится ваш конвейер. Не волнуйтесь, он ничего не сохранит (если это проект на github, он зафиксирует изменение Jenkinsfile).

Я новичок в Jenkins, и это очень полезно, без этого мне приходилось много раз фиксировать Jenkinsfile, пока он не заработал (очень раздражает!). Надеюсь это поможет. Ваше здоровье.

person firepol    schedule 26.07.2017
comment
Причина в том, что по состоянию на 2017 год Jenkins по-прежнему нацелен на решение проблем программистов, использующих метод «укажи и щелкни»;) .... По крайней мере, у Atom есть достойный Groovy линтер. Это только Groovy, но это помогает. - person sorin; 26.07.2017
comment
Редактор с подсветкой синтаксиса также является частью классического пользовательского интерфейса jenkins. - person Vadimo; 02.11.2017

Немного поздно для вечеринки, но именно поэтому я написал jenny, небольшую повторную реализацию некоторых основных шагов Jenkinsfile. (https://github.com/bmustiata/jenny)

person bogdan.mustiata    schedule 11.05.2018
comment
Без обид, но если вы постоянно не обновляете свои материалы, это будет довольно бесполезно, поскольку синтаксис конвейера находится в постоянном состоянии изменения, как кажется, на данный момент. - person krad; 19.09.2018
comment
Не принято. Из того, что я видел до сих пор, синтаксис конвейера в значительной степени стандартизирован для основных шагов конвейера (jenkins.io/doc/pipeline/steps/workflow-basic-steps). Пользуюсь им уже ~ 2 года, не сталкиваясь ни с какими обратно несовместимыми изменениями. Плагины Jenkins не должны использоваться imho, а изменяющийся API можно абстрагировать с помощью пользовательских команд в общих библиотеках, где у вас будут гарантии API. Если вы говорите о декларативном синтаксисе, это может быть правдой. Я использую только программный API в своих конвейерах, и это то, что поддерживает Дженни. Скала :) - person bogdan.mustiata; 19.09.2018

Насколько мне известно, этот Pipeline Plugin является «движком» новая механика Jenkinsfile, так что я вполне уверен, что вы можете использовать ее для локального тестирования своих скриптов.

Я не уверен, нужны ли какие-либо дополнительные шаги при копировании в Jenkinsfile, однако синтаксис и т. Д. Должен быть точно таким же.

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

person Dominik Gebhart    schedule 30.03.2016

В моих настройках разработки - отсутствие подходящего редактора Groovy - большая часть проблем с Jenkinsfile возникает из-за простых синтаксических ошибок. Чтобы решить эту проблему, вы можете проверить файл Jenkins для своего экземпляра Jenkins (запущенного на $JENKINS_HTTP_URL):

curl -X POST -H $(curl '$JENKINS_HTTP_URL/crumbIssuer/api/xml?xpath=concat(//crumbRequestField,":",//crumb)') -F "jenkinsfile=<Jenkinsfile" $JENKINS_HTTP_URL/pipeline-model-converter/validate

Приведенная выше команда представляет собой слегка измененную версию из https://github.com/jenkinsci/pipeline-model-definition-plugin/wiki/Validating-(or-linting)-a-Declarative-Jenkinsfile-from-the-command-line

person Juuso Ohtonen    schedule 20.04.2017
comment
Это именно то, что я искал - к сожалению, он работает только для декларативных конвейеров, а не для конвейеров со сценариями :( - person thom_nic; 27.06.2017

Помимо функции воспроизведения, о которой уже упоминали другие (то же самое о ее полезности!), Я обнаружил, что следующие полезны:

  1. Создайте тестовое задание конвейера, в котором вы можете ввести код конвейера или указать на свое репо / ветку файла Jenkins, чтобы быстро что-то протестировать. Для более точного тестирования используйте Multibranch Pipeline, который указывает на ваш собственный форк, где вы можете быстро вносить изменения и фиксировать, не влияя на prod. Такие вещи, как BRANCH_NAME env, доступны только в Multibranch.
  2. Поскольку Jenkinsfile - это Groovy-код, просто вызовите его с помощью "groovy Jenkinsfile", чтобы проверить базовый синтаксис.
person Max Zheng    schedule 21.07.2017
comment
Использование отдельных заданий, которые можно спрятать и не запутать пользователей, - одна из самых важных вещей. Я редактирую файлы Jenkins с помощью IntelliJ. Он неплохо показывает синтаксические ошибки. Однако кнопка ответа - это главное. Я создаю ветку с запуском основных изменений, которая обычно идет немного не так. Затем я редактирую файл Jenkins, копирую и вставляю его в окно воспроизведения и запускаю снова - я повторяю это, пока он не работает нормально, а затем фиксирую рабочую версию. - person johnfo; 30.09.2017

Поместите свой SSH-ключ в свой профиль Jenkins, затем используйте декларативный линтер следующим образом:

ssh jenkins.hostname.here declarative-linter < Jenkinsfile

Это сделает статический анализ вашего Jenkinsfile. В редакторе по вашему выбору определите сочетание клавиш, которое запускает эту команду автоматически. В Visual Studio Code, который я использую, выберите «Задачи»> «Настроить задачи», а затем используйте следующий JSON для создания команды Проверить файл Jenkins:

{
  "version": "2.0.0",
  "tasks": [
    {
      "label": "Validate Jenkinsfile",
      "type": "shell",
      "command": "ssh jenkins.hostname declarative-linter < ${file}"
    }
  ]
}
person Hendrik M Halkow    schedule 16.02.2018

Для простоты вы можете создать Jenkinsfile в корне репозитория git, аналогично приведенному ниже примеру Jenkinsfile на основе отличного синтаксиса декларативного конвейера.

pipeline {

    agent any

    stages {
        stage('Build the Project') {
            steps {
                git 'https://github.com/jaikrgupta/CarthageAPI-1.0.git'
                echo pwd()
                sh 'ls -alrt'
                sh 'pip install -r requirements.txt'
                sh 'python app.py &'
                echo "Build stage gets finished here"
            }
        }
        stage('Test') {
            steps {
                sh 'chmod 777 ./scripts/test-script.sh'
                sh './scripts/test-script.sh'
                sh 'cat ./test-reports/test_script.log'
                echo "Test stage gets finished here"
            }
        }
}

https://github.com/jaikrgupta/CarthageAPI-1.0.git

Теперь вы можете настроить новый элемент в Jenkins как задание конвейера. Выберите Definition как Pipeline script from SCM и Git для параметра SCM. Вставьте ссылку на репозиторий проекта git в URL-адрес репозитория и Jenkinsfile в поле имени сценария. Затем щелкните параметр lightweight checkout и сохраните проект. Поэтому всякий раз, когда вы отправляете фиксацию в репозиторий git, вы всегда можете протестировать изменения, запускающие Build Now каждый раз в Jenkins.

Чтобы упростить настройку работы Jenkins Pipeline, следуйте инструкциям на приведенных ниже рисунках.

введите описание изображения здесь

введите описание изображения здесь

введите описание изображения здесь

введите описание изображения здесь

введите описание изображения здесь

person CodingChacha    schedule 21.08.2020

Я использую воспроизведение будущего, чтобы сделать некоторые обновления и быстро запустить.

person AhmedDrira    schedule 03.07.2018
comment
Не могли бы вы предоставить дополнительную информацию о том, как вы это делаете? - person kosnik; 03.07.2018
comment
Я использую Bit-bucket в качестве менеджера исходного кода, затем я создал проект на Jenkins, желающий автоматически обнаруживать мой репозиторий, я рекомендую этот пост. После каждого нажатия на мое репо Jenkins будет автоматически воспроизводить мой файл Jenkins, и если он не удастся, в левом меню есть кнопка Replay, == ›эта кнопка открывает редактор, содержащий ваш файл Jenkins, вы можете отредактировать его и воспроизвести задание , - person AhmedDrira; 04.07.2018

С некоторыми ограничениями и для скриптовых конвейеров я использую это решение:

  1. Конвейерная работа с встроенным Groovy-скриптом:

node('master') {
    stage('Run!') {
                def script = load('...you job file...')
    }
}

  1. Jenkinsfile для тестирования имеет ту же структуру, что и у lesfurets:

def execute() {
 ... main job code here ...
}
execute()
person user3148458    schedule 01.08.2018

Вы можете просто проверить свой конвейер, чтобы выявить проблемы с синтаксисом. У Jenkins есть хороший API для проверки Jenkisfile - https: // jenkins_url / конвейер-модель-преобразователь / проверка

Используя curl и передав свой .Jenkinsfile, вы мгновенно получите проверку синтаксиса

curl --user username:password -X POST -F "jenkinsfile=<jenkinsfile" https://jenkins_url/pipeline-model-converter/validate

Вы можете добавить этот рабочий процесс в редакторы:

person kraag22    schedule 08.02.2021