Почему действие GitHub
Grage Grage изначально реализовано его автоматизированное тестирование с Дженкинс (построен на Azure) и GitHub WebHook. Когда открывается запрос на тягу, добавление готовного для тестирования этикетки вместе с комментарием «Jenkins Go» автоматически запускает соответствующий процесс тестирования блока:
Это решение не экономически эффективно, поскольку сервер облака Azure сдается в аренду, а компиляция графика небулы требует высоких серверов производительности.
Итак, мы рассматривали альтернативу Azure Cloud Server с прошлого года. Новое решение также должно поддерживать многоэтажные тесты.
Мы сделали некоторые исследования и нашли следующие кандидаты:
- Travisci
- Circleci
- Лазурный трубопровод
- Дженкинс на K8S (самостоятельно)
В целом, эти продукты дружелюбны. Хотя есть некоторые ограничения на проекты с открытым исходным кодом.
Учитывая предыдущий опыт использования Gitlab CI, мы поняли, что первый выбор — это продукт с глубокой интеграцией с GitHub, что означает, что вы можете поделиться всей экосистемой Github с открытым исходным кодом и вызвать апис.
По совпадению, действие Github 2.0 было выпущено в 2019 году. Таким образом, график туманности стал исследователем.
Для нас действие GitHub потрясающе в следующих способах:
- Это бесплатно Отказ Чтобы открыть исходные проекты, доступна не только полный набор функций, но он также предлагает Высокопроизводительные машины , бесплатно.
- Идеальный экосистема с открытым исходным кодом . Все действия с открытым исходным кодом могут быть непосредственно использованы для всего процесса CI (непрерывной интеграции). Он также поддерживает пользовательские действия. Действие GitHub поддерживает настройку в Docker, что означает, что вы можете создать пользовательские действия с помощью командных команд Bash.
- Поддержка нескольких систем Отказ Развертывание одним щелчком на Windows, MacOS и Linux делает межплатформенные операции проще.
- Взаимодействие с API GitHub Отказ Прямой доступ Github API V3 С GitHub_token, чтобы вы могли загружать файлы, проверять PR-статус с командой curl.
- Github Hosted Runners Отказ Просто добавьте файл описания рабочего процесса в каталоге. Github/Workflows/каждый коммит автоматически запускает новое выполнение действий.
- Рабочий процесс Описание Файл в ЯМЛ , что более лаконично и читается, чем рабочий процесс действий 1.0.
Перед погружением на практике давайте уточним основную цель графика небулы на использование Action Github, то есть автоматизированное тестирование.
Тестирование не может быть перенесено для решения для решения базы данных. На графике туманности тестирование в основном разделено на тестирование и тестирование устройства и интеграционное тестирование. Действие GitHub в основном используется для автоматизации тестирования подразделения. Между тем он используется в качестве подготовки к тестированию интеграции, например, Docker Image Pasting и установщик упаковки. Наконец, он решает требования к выпуску для PM Lady. Таким образом, мы создали первую версию процесса CI/CD.
PR-тест
В качестве проекта с открытым исходным кодом, размещенным на GitHub, Githuble Grage должен решить первичную проблему тестирования быстрого проверки изменений в PR, совершенном вносящим участником. Следующие аспекты следует учитывать:
- Код соответствует нашему стилю кодирования?
- Может ли код быть скомпилирован на разных системах?
- Проходит ли это все модульные тесты?
- Упал ли кодовое покрытие?
Только если все вышеперечисленные требования выполнены, и существует как минимум два одобрения, изменения могут быть объединены в мастеру.
С помощью инструментов с открытым исходным кодом, такими как CPPlint или Clang-формат, требование № 1 можно легко встретить. Если STEP1 не удается, следующие шаги будут пропущены автоматически, и весь процесс не будет продолжен.
Для требования # 2 мы надеемся скомпилировать исходный код Graph Nebula на поддерживаемых в настоящее время систем. Таким образом, здание непосредственно на физических машинах больше не является выбором. Ведь цена одной машины довольно высокая, не говоря уже о одной машине недостаточно. Чтобы обеспечить консистенцию среды компиляции и максимально снизить потери производительности, мы наконец-то выберем докер. Процесс прошел гладко с действием GitHub работа матрицы и его поддержка для Докер Отказ
Как показано выше, изображение компиляции графика нетубула поддерживается в Наш проект Docker Image Отказ Изменения или обновление компилятора или третьих сторонних зависимостей автоматически запускают задачу сборки Docker Hub (см. Рисунок ниже). Когда предан новый запрос на тяга, действие GitHub будет запущено, чтобы начать вытягивать новейшее изображение компиляции и выполнить компиляцию.
Для полного описания PR Workflow см. pull_request.yaml. . Между тем, учитывая, что не каждый PR должен быть немедленно тестирован, а самосовестные машинные ресурсы ограничены, мы установили следующие ограничения на триггеру CI:
- Только PRS, которые проходят проверку линта, обеспечит последующую работу на самообъективный бегун. Задача Lint является относительно легким взвешенным и может быть выполнена в машине, размещенной действием GitHub, избегая принять наши собственные ресурсы.
- Только PR, помеченные готовыми к тестированию, приведут выполнение действий. Во время маркировки нуждаются в полномочиях, бегун может быть запущен только за счет сертифицированных запросов на тягу. Смотрите код ниже для ограничения маркировки PR:
jobs: lint: name: cpplint if: contains(join(toJson(github.event.pull\_request.labels.\*.name)), 'ready-for-testing')
Вот как это выглядит, когда PR пройдет все тесты:
Подробнее о том, как покрытие кода проводится на небуле, пожалуйста, смотрите Интеграция тестового покрытия CodeCov с туманным графом Отказ
Ночное здание
Интегрированная структура тестирования Graph Nebula требует, чтобы все испытательные случаи выполнялись в коде в кодовой базе каждую ночь. В то же время мы хотим, чтобы некоторые новые функции были быстро упакованы и доставлены пользователям для тест-драйва. Это требует, чтобы система CI предоставляла Docker Image и RPM/DEC-пакет кодовой базы каждый день.
В дополнение к типу события Pull_Request, действие GitHub также может быть запущено Расписание тип. Похоже на Crontab, расписание позволяет пользователям указывать время запуска любых повторяющихся задач. Например, выполнение задач в 2:00 утра каждый день:
on: schedule: - cron: '0 18 \* \* \*'
GitHub использует время UTC, так что 2:00 утра CST — 6:00 UTC в предыдущий день.
Докер
Ежедневное построенное изображение Docker необходимо нажать в концентратор докена и помечена ночной меткой. Здесь мы устанавливаем метод вытягивания изображения как всегда в кластере K8S для интеграции тестирования. Таким образом, ежедневный запрос на обновление по небуловой графике будет вызвать прокат обновления до последнего образа Docker текущего дня, то есть ночной версией для интеграции теста. Мы стараемся не оставлять проблемы, поднятые сегодня к завтрашнему дню, нет дополнительного тега свидания на ночное изображение. Смотрите детали действия ниже:
- name: Build image env: IMAGE\_NAME: ${{ secrets.DOCKER\_USERNAME }}/nebula-${{ matrix.service }}:nightly run: | docker build -t ${IMAGE\_NAME} -f docker/Dockerfile.${{ matrix.service }} . docker push ${IMAGE\_NAME} shell: bash
Упаковка
Действие GitHub предоставляет Артефакты Позволять пользователям сохранять данные в рабочем процессе. GitHUB хранит эти артефакты в течение 90 дней, что более чем достаточно для хранения ночного установочного пакета. Использование официальных действий/загрузки-Artifact @ V1 Action, вы можете легко загружать файлы в указанный каталог для артефактов. Ниже приведен то, как выглядит ночной пакет туманного графика:
Выпуск филиала
Для лучшего обслуживания и исправления ошибок Gramp Nebula принимает отпуск филиала, то есть замораживаем код перед каждым выпуском и создать новую ветку выпуска. Только исправление ошибки разрешено на ветви выпуска, а разработка функций не допускается. Исправление ошибки все равно будет привержена филиалу разработки, и, наконец, вишня, выбранная до отпуска.
В каждом выпуске, в дополнение к исходному коду, мы надеемся добавить установочный пакет в активы для загрузки пользователей. Делать это вручную, является оба, подверженным ошибкам, так и трудоемким. Действие GitHub идеально подходит для этого. Более того, упаковка и загрузка используют внутреннюю сеть GitHub, которая быстрее.
После того, как установочный пакет скомпилирован, вы можете напрямую вызовать API GitHUB через команду CURL, чтобы загрузить ее в активы. Сценарий выглядит следующим образом:
curl --silent \ --request POST \ --url "$upload\_url?name=$filename" \ --header "authorization: Bearer $github\_token" \ --header "content-type: $content\_type" \ --data-binary @"$filepath"
В то же время, ради безопасности, каждый раз, когда выделяется установочный пакет, мы хотим рассчитать его значение контрольной суммы и загружать значение активов для удобства пользователя для проверки целостности после загрузки. Шаги следующие:
jobs: package: name: package and upload release assets runs-on: ubuntu-latest strategy: matrix: os: - ubuntu1604 - ubuntu1804 - centos6 - centos7 container: image: vesoft/nebula-dev:${{ matrix.os }} steps: - uses: actions/checkout@v1 - name: package run: ./package/package.sh - name: vars id: vars env: CPACK\_OUTPUT\_DIR: build/cpack\_output SHA\_EXT: sha256sum.txt run: | tag=$(echo ${{ github.ref }} | rev | cut -d/ -f1 | rev) cd $CPACK\_OUTPUT\_DIR filename=$(find . -type f \( -iname \*.deb -o -iname \*.rpm \) -exec basename {} \;) sha256sum $filename > $filename.$SHA\_EXT echo "::set-output name=tag::$tag" echo "::set-output name=filepath::$CPACK\_OUTPUT\_DIR/$filename" echo "::set-output name=shafilepath::$CPACK\_OUTPUT\_DIR/$filename.$SHA\_EXT" shell: bash - name: upload release asset run: | ./ci/scripts/upload-github-release-asset.sh github\_token=${{ secrets.GITHUB\_TOKEN }} repo=${{ github.repository }} tag=${{ steps.vars.outputs.tag }} filepath=${{ steps.vars.outputs.filepath }} ./ci/scripts/upload-github-release-asset.sh github\_token=${{ secrets.GITHUB\_TOKEN }} repo=${{ github.repository }} tag=${{ steps.vars.outputs.tag }} filepath=${{ steps.vars.outputs.shafilepath }}
Посмотреть Release.yaml для полного файла рабочего процесса.
Команды
Действие GitHub предоставляет некоторые Команда оболочек Так что вы можете контролировать и отладки каждый шаг рабочего процесса в большей гранулярности прямо в консоли вашей оболочки. Некоторые часто используемые команды объясняются ниже.
Установка-вывод: настройка выходного параметра
::set-output name={name}::{value}
Иногда вам нужно пройти некоторые результаты среди рабочих шагов. Вы можете установить вывод_Value на переменную OUTPORT_NAME через команду echo «:: set-vish:: output_value».
В следующих шагах вы можете обратиться к вышеуказанному выводу через $ {{spads.step_id.outputs.output_name}}
Отказ
Этот метод используется в задании для загрузки активов, упомянутых в предыдущем разделе. Один шаг может установить несколько выходов, выполнив вышеуказанную команду несколько раз.
Set-Env: Установка переменной среды
::set-env name={name}::{value}
Подобно настроенным выходу, вы можете создать переменную среды для последующих шагов в текущем задании. Синтаксис: echo «:: Set-Env name = {имя}:: {Значение}».
Добавление: Добавление системы
Эта команда предназначена для добавления каталога к переменной пути системы для всех последующих шагов в текущем задании. Синтаксис: ECHO «:: Добавить-путь:: {путь}».
Самоведящий бегун
В дополнение к прослушиванию GitHub, действие также позволяет вам провести бегун на собственной машине. После установки Right Runner на машине следуйте за Учебное пособие Чтобы добавить его в свой репозиторий, и настройте прогонов: самоуверенные в файле рабочего процесса. У вас все настроено.
Вы можете назначить разные этикетки на ваши самих организму машины. Таким образом, вы можете распространять задачи на машину с определенной этикеткой. Например, если ваши машины работают на разных операционных системах, то задание может быть назначена на Указанная машина на основе прогонов на этикетке.
Улучшения безопасности
GitHub не рекомендует самих прослушиваемых бегунов для проектов с открытым исходным кодом, потому что любой может атаковать машину бегуна, совершив PR с опасным кодом.
Тем не менее, компиляция Graph Nebula требует большего хранения, чем двухъядерная среда GitHub, которая оставляет нас без выбора, кроме бегунов самоуверенности. Для обеспечения безопасности мы сделали следующее:
Развертывание на VM.
Все бегуны, зарегистрированные в Github Action, развернуты на виртуальных машинах, которые могут изолировать хост-машина и облегчить распределение ресурсов между виртуальными машинами. Высокопроизводительный хост-машина может выделить несколько виртуальных машин для выполнения всех полученных задач параллельно.
Если есть проблема с виртуальными машинами, вы можете легко восстановить окружающую среду.
Сетевая изоляция
Мы выделили все виртуальные машины, которые удерживают бегун из офисной сети, чтобы избежать прямого доступа к нашим внутренним ресурсам. Даже если PR содержит вредоносный код, он не может получить доступ к нашей внутренней сети для дальнейших атак.
Выберите правильное действие
Попробуйте выбрать действия из известных компаний или официальных выпусков. Если вы используете работы отдельных разработчиков, вам лучше проверить их код реализации, чтобы избежать жертв Утечка клавиш конфиденциальности Отказ
Вот Список официальных действий, предоставленные GitHub.
Частный верификация токена
Действие GitHub автоматически проверяет, есть ли частные токены в пр. Нет частных токенов (указывается с $ {{Secrets. My_tokens}}
), кроме github_token, можно использовать на PR-мероприятии, вызванное задание, чтобы предотвратить пользователей воровать токены, печатая ее в частном порядке через пр.
Строительство окружающей среды и очистки
Для самосоведочных бегунов удобно обмениваться файлами между различными заданиями. Но не забудьте убирать промежуточные файлы каждый раз после выполнения всего действия, в противном случае они могут повлиять на следующие задания и заниматься дисковым пространством.
- name: Cleanup if: always() run: rm -rf build
Установите рабочее состояние шага на всегда (), чтобы убедиться, что очистка выполняется каждый раз, даже если что-то пойдет не так во время выполнения.
Параллельное здание на основе Docker Matrix
Мы решили построить график туманности с контейнером, потому что ему необходимо компилировать и проверять на различных операционных системах, а контейнер позволяет легко отделить среды. Действие GitHub врасходованно поддерживает задачи на основе Docker.
Действие GitHub поддерживает стратегию матрицы для запуска задач, которые похоже на Travesci’s построить матрицу Отказ Объединяя системы и компиляторы, мы можем легко использовать GCC и Clang в каждой системе для компиляции исходного кода туманного графика. Пример матрицы показан ниже:
jobs: build: name: build runs-on: ubuntu-latest strategy: fail-fast: false matrix: os: - centos6 - centos7 - ubuntu1604 - ubuntu1804 compiler: - gcc-9.2 - clang-9 exclude: - os: centos7 compiler: clang-9
Приведенная выше стратегия генерирует 8 параллельных задач (4 компилятора OS X 2). Каждая задача — это комбинация ОС и компилятора. Это значительно уменьшает нагрузку на ручное определение для разных размеров.
Исключите определенную комбинацию в матрице, добавив его в опцию исключения. Если вы хотите получить доступ к значению в матрице в задаче, вы можете получить его, получив значение переменной контекста, такую как $ {{matrix.os}}
Отказ Эти методы могут очень удобны настроить ваши задачи.
Контейнер времени выполнения
Мы можем указать контейнерную среду для каждой задачи во время выполнения, чтобы все этапы задачи будут выполнены в внутренней среде контейнера. По сравнению с применением команды Docker на каждом шаге это проще и понятнее.
container: image: vesoft/nebula-dev:${{ matrix.os }} env: CCACHE\_DIR: /tmp/ccache/${{ matrix.os }}-${{ matrix.compiler }}
Для конфигурации контейнеров, как настроить службу в Docker Compose, вы можете указать изображение/ENV/порты/тома/варианты и другие Параметры Отказ В самообъектированном бегуне вы можете легко установить каталог на хост-машина для контейнера для обмена файлами.
Это контейнерные характеристики действия GitHub, которые позволяют удобно ускорить последующую компиляцию через кеш в докере.
Ускорение компиляции
Исходный код незвуковой графика написан на C ++, а процесс строительства довольно много времени. Перезапуск CI каждый раз приведет к отходу вычислительных ресурсов. Так что до тех пор, пока исходный код не обновляется, скомпилированный файл будет кэшироваться для ускорения. В настоящее время мы используем последнюю версию CCache для кэш цель. Он также помогает определить, был ли исходный файл был обновлен или не выглядит точно в процесс компиляции файла.
Хотя сам действие GitHub обеспечивает кэш Функция, мы отправляемся в стратегию локальной кэш-памяти, поскольку график туманности в настоящее время использует статическое соединение для корпусов для тестирования устройства, а его размер после компиляции превышает квоту, назначенную кэшем действий Github.
ccache.
ccache это инструмент кэш-памяти компилятора. Он ускоряет компиляцию, кэшируя предыдущие компиляции и поддерживающие компиляторы, такие как GCC/Clang. График Nebula принимает стандарт C ++ 14, который имеет проблемы с совместимостью с более низкой версией CCache, поэтому CCache во всех Vesoft/Nebula-dev картинки это скомпилирован и установлен вручную.
График Nebula автоматически определяет, установлен ли CCache в CMake Configuration и решает, включать ли это. Таким образом, вы настраиваете только CCache в контейнерной среде. Например, настройте максимальную емкость кэша в ccacch.conf как 1 гигабайт. Когда кеш превосходит порог, старый кеш автоматически заменен.
Мы предлагаем вам поставить файл конфигурации CCache.conf под каталог Cache, чтобы Ccache может удобно прочитать файл.
TMPFS.
TMPFS — это временная файловая система, расположенная в раздел памяти или подкачки, которые могут эффективно облегчить задержку, вызванную диском IO. Поскольку память о самоучлененной машине достаточно, тип монтажа каталогов CCache изменяется на TMPF для уменьшения чтения CCache и время записи. Для использования монтажного типа TMPFS в Docker, пожалуйста, обратитесь к Используйте MPFS Mounts документация. Соответствующие параметры конфигурации следующие:
env: CCACHE\_DIR: /tmp/ccache/${{ matrix.os }}-${{ matrix.compiler }} options: --mount type=tmpfs,destination=/tmp/ccache,tmpfs-size=1073741824 -v /tmp/ccache/${{ matrix.os }}-${{ matrix.compiler }}:/tmp/ccache/${{ matrix.os }}-${{ matrix.compiler }}
Поместите все файлы кэша, создаваемые CCache в каталоге, который монтируется как тип TMPFS.
Параллельная компиляция
Сам Common Comply поддерживает параллельную компиляцию нескольких исходных файлов. Configuration-J $ (NPROC) во время компиляции позволит то же количество задач, сколько количество ядер. Настройте шаги в действии следующим образом:
- name: Make run: cmake --build build/ -j $(nproc)
Вещи для улучшения
Мы много говорили о преимуществах и сильной степени действий GitHub, но есть ли недостатки? Потратив некоторое время, используя его, приведены некоторые мысли, чтобы поделиться с вами:
- Только системы поддержки новых версий Отказ Многие действия разработаны на основе новых версий Node.js и не могут быть использованы непосредственно в старых контейнерах Docker, такие как CentOS. 6. Это бросит ошибку «Файл библиотеки, который Nodejs зависит от не может быть найдена». Таким образом, действие не может быть запущено должным образом. Поскольку график небулы также поддерживает CentOS 6, задачи в этой системе должны обрабатываться по-разному.
- Не легко проверить локально Отказ Хотя есть проект с открытым исходным кодом Акт В сообществе все еще есть много ограничений в соответствии с нашим опытом. Иногда вам приходится несколько разбираться в своем собственном репозитории, чтобы обеспечить правильность модификации действий.
- Не хватает руководящих принципов в настоящее время Отказ При настраивании многочисленных задач, ощущается, как кодирование в конфигурации YAML. В настоящее время есть три основных подхода: а. Разделите файлы конфигурации на основе задач. б. Настройте действие через GitHub SDK. с. Напишите длинный скрипт оболочки, чтобы завершить задачи и вызвать скрипт в ваших задачах.
До сих пор это все еще при обсуждении в сообществе, какой подход лучше, сочетание небольших задач или больших задач. Согласно моему личному опыту, подход к комбинации небольших задач помогает легко определить сбой задач и определить время выполнения каждого шага.
4. Часть истории действия не может быть очищена Отказ Если имя рабочего процесса изменяется, старая проверка запуска прогона все равно останется на странице действий, влияющая на пользовательский опыт.
5. Не хватает ручной работы/задачи триггера, похоже на GitLab CI . Во время выполнения действия не допускается ручное вмешательство.
6. Развитие действий находится под постоянной итерацией Отказ Иногда необходимо поддерживать модернизацию, например, Оформить заказ @ v2 Отказ
Но в целом, действие GitHub — это удивительная система CI/CD. В конце концов, как продукт, который стоит на плечах предшественников, таких как Gitlab CI/TRUVIS CI, есть много, чтобы учиться.
Что дальше
Индивидуальное действие
Данное назад Docker выпустил свой первый Действие Чтобы упростить следующие задачи Docker. В будущем мы также настроим наши собственные действия, касающиеся сложных требований CI/CD и позволяют им во всех репозиториях небулы.
Для некоторых генерал, таких как припоминающие активы в функцию выпуска, мы поставим их в независимый репозиторий и публикуем их на рынке акций. Эксклюзивные будут размещены в каталоге каждого репозитория.
Это упрощает настройку YAML в рабочих процессах, вам нужно только использовать настроенное действие, которое имеет лучшую гибкость и расширяемость.
Интеграция с IM (Dingtalk/Slack)
Вы можете разрабатывать комплексные приложения для действия через GitHub SDK и комбинируйте его с настраиваемыми ботами IM Tools, таких как Dingtalk, и провисают, чтобы реализовать много автоматизированных и интересных приложений.
Например, когда PR будет одобрен более чем двумя рецензентами, и все проверки пропускаются, вы можете отправить сообщение в группу DingTalk и тег кого-то, чтобы объединить их. Это экономит инженеров от проверки каждого PR-состояния в PR-списке.
Любые идеи, как играть вокруг Действия GitHub? Оставьте комментарий ниже и давайте поговорим!
Вы также можете понравиться:
- Автоматизация ваших процессов проекта с действиями GitHub
- Практика Джепсен Тестовые рамки в небуле
- Интеграция тестового покрытия кодеков с туманным графом
Привет, я, я, инженер на туманном графике. Я заинтересован в двигателе запроса базы данных и хотел бы поделиться своим опытом в этом отношении. Надеюсь, мой пост поможет вам. Пожалуйста, дайте мне знать, если у вас есть какие-либо идеи об этом. Спасибо!
Первоначально опубликовано в https://nebula-graph.io 7 мая 2020 года.
Оригинал: «https://dev.to/nebulagraph/automate-workflows-with-github-action-in-nebula-graph-4fma»