Рубрики
Uncategorized

Как я построил сервер CI, используя Docker

В этой статье определяются различные детали для надежного CI Server и исследуют, как объединить их вместе с помощью Docker.

Автор оригинала: Oscar.

Вступление

Непрерывная интеграция , СИ, быстро становится укоренившейся частью каждой инженерной команды. И из различных практик CI, самостоятельные формы часто служат основным фокусом для многих проектов, поэтому популярные услуги, такие как Circleci , Herokuci , Travesci , Семафор С AWS CodeBuild ETC выращивались, чтобы обеспечить легкие интеграции для утверждения достоверности данного изменения кода, как определено прилагаемыми тестами. Эти интеграции часто включают в себя сервер CI, который постоянно контролирует репозиторий кода проекта и изменениями в репозитории, устанавливает беспристрастную среду, чтобы утверждать состояние проекта с произошедшим изменением.

Вот выдержка из Мыселые На каком типичном режиме непрерывной интеграции выглядит как:

  • Разработчики проверяют код в их частные рабочие места
  • Когда закончите, совершите изменения в репозитории
  • Сервер CI контролирует репозиторий и проверяет изменения, когда они происходят
  • Сервер CI создает систему и прогонствует модуль и тесты интеграции
  • Сервер CI выпускает развертываемые артефакты для тестирования
  • Сервер CI назначает этикетку сборки на версию кода это просто построило
  • Сервер CI информирует команду успешного или неудачного строить

Часто возникают ситуации, когда существует разногласия между результатами испытаний на машине разработчика и среде сервера CI. Исследования такого разногласия часто невыразится различия в обеих средах, которые вызывают причинные элементы. Проводя многие из этих исследований, я нахожу себя все более интересующимся тем, что происходит за кулисами в этих серверах Ci и различными (возможными) элементами, которые объединяются, чтобы составить CI Server. И с увеличением любопытства и смыслом для приключений я вступил в путешествие в (Re) создать один такой сервер.

В этой статье определяются различные детали для надежного CI Server и исследуют, как объединить их вместе с помощью Docker.

Обзор

Типичный сервис CI будет иметь интерфейс для пользователей для входа в систему и подключить контрольные учетные записи версии своего проекта, такими как Github и Bitbucket. После подключения пользователь должен иметь возможность указывать проекты в этих учетных записях, что сервер Ci будет мониторировать для событий изменения кода, таких как коммиты и запросы по тяги. Как только какие-либо из этих изменений произойдут, CI проверит изменение, чтобы установить его интегрируемость с помощью кодовой базы.

Реализация

Реализация сильно сосредоточена на GitHub, но конечный результат легко расширяется для работы с любым другим веб-сервисом хостинга управления GIT Version.

Веб-приложение предоставляет интерфейс, в котором пользователи входят в систему, используя Github Oauth, позволяя CI Server доступ к просмотру проектов GitHub. Пользователи представлены со списком их проектов, и они могут выбрать, какие проекты CI Server должен отслеживать. CI Server регистрирует веб -ook на Github для общих событий (запросы на потяну и коммитарию) на выбранные проекты, чтобы всякий раз, когда любые из этих действий, Github уведомляет сервер CI. А при получении таких уведомлений сервер CI вытягивает последнее изменение кода в проекте и запускает сопровождающие тесты с выходом и прогрессом, отображаемым на интерфейсе для просмотра пользователя.

Эта реализация прохождения легко намекает на два основных раздела к серверу CI:

  • Раздел для прямого взаимодействия пользователя: вход, подписка на проект, просмотр прогресса испытаний. I.e Эти детали требуют присутствия пользователя к ведущему в действие
  • Раздел для вытягивания кода проекта, выполняя тесты и регистрацию результатов ; I.e не требует ввода пользователя (будь то онлайн или нет), чтобы сделать это.

Первая часть, я ссылаюсь на веб-приложение, а второе в качестве CI и вместе они делают CI Server (который я звоню Sicuro .)

CI.

Единственная цель сервера CI будет запущена тесты для данного проекта и предоставление проведения прогресса и результата теста. Для выполнения этой задачи потребуется такая информация, как:

  • Имя проекта
  • URL проекта (на Github)
  • Целевая ветвь проекта или фиксация хеша
  • Язык проекта (I.e. Ruby, JavaScript, Golang, Python …)

Альтернатива языку проекта будет точным командованием для запуска теста, но, как объяснено в Тестовые контейнеры Раздел (ниже), мы нашли бы язык более полезным.

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

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

Сделайте это все вместе с Голангом, наш сервер CI должен напоминать:

sicuro-ci-server.go

Примечания:

  1. JobDetails Структура детали Информация, необходимая для запуска сервера. Интересное дополнение это UpdateBuildStatus Функция обратного вызова, которая запускается в конце теста, прогона с состоянием теста. Мы найдем использование для него позже в веб-приложении.
  2. Беги FUNC служит основной точкой входа, и это обязанности, включают в себя:
  • Создание файла журнала (если оно не существует)
  • Обеспечение, не существует активных заданий CI, чтобы запросить файл журнала ( lsof filename )
  • Настройка работы CI для запуска тестов. Работа запускаются в Goroutines разрешить обработку одновременного запроса.
  1. Он связывает контейнер к возможным услугам по требованию, как базу данных, и настроить необходимые переменные среды для подключения к ним. Для простоты у нас будут следующие услуги, постоянно использующие и использующие Дочсерская контейнерная сеть Мы подключаем тестовые контейнеры к ресурсам по мере необходимости, добавив контейнеры на ci_default сеть.

Конечная команда выполнена для запуска теста, будет чем-то в форме:

docker run -it --rm \ 
   -v [PATH-TO-SSH-KEYS-FOLDER]:/.ssh \ 
    -e PROJECT_REPOSITORY_URL=[THE-PROJECT-REPO-URL] \ 
    -e PROJECT_REPOSITORY_NAME=[PROJECT-NAME] \ 
    -e PROJECT_BRANCH=[PROJECT-TARGET-BRANCH] \ 
    -e DATABASE_URL=[POSTGRES-DATABASE-URL]\ 
    -e REDIS_URL=[REDIS-DATABASE-URL] \ 
    --network ci_default \ 
    [DOCKER_IMAGE_REPO]/sicuro_[PROJECT-LANGUAGE]

Учитывая образец Проект Rails с деталями работы

{ 
  LogFileName: "0sc/activestorage-cloudinary-service/master",
    ProjectRepositoryURL: "git@github.0sc/activestorage-cloudinary-service",
    ProjectBranch: "master", 
    ProjectLanguage: "ruby", 
    ProjectRespositoryName: "activestorage-cloudinary-service"
 }

Команда будет

docker run -it --rm \
  -v ci/.ssh:/.ssh \ 
    -e PROJECT_REPOSITORY_URL=git@github.0sc/activestorage-cloudinary-service \ 
    -e PROJECT_REPOSITORY_NAME=activestorage-cloudinary-service \ 
    -e PROJECT_BRANCH=master \ 
    -e DATABASE_URL=postgres://postgres@postgres:5432/postgres \ 
    -e REDIS_URL=redis://redis:6379 \ 
    --network ci_default \ 
    xovox/sicuro_ruby:0.2

Тестовые контейнеры

Необходимая среда для бегового теста отличается для разных проектов. Одной очевидной разницы является необходимая среда выполнения в зависимости от языка программирования проекта. Проект Ruby имеет зависимость выполнения, отличную от проекта JavaScript, который отличается для проекта Python и т. Д. И эти различия должны быть приняты во внимание CI Server.

Обычный способ обращения состоит в том, чтобы иметь один пребул «Бог» имидж, который устанавливается со всеми основными зависимостями для каждого языка. Точно так же, как любая единственная машина Dev Machine может быть настроена для запуска проектов на разных языках, поэтому тестовые контейнеры могут быть подготовлены со всеми потребностями для проведения проектов на всех языках. В основном докер изображения с необходимой средой выполнения и зависимостями для каждого (поддерживаемого) языка: Ruby, JavaScript, PHP и т. Д. Этот подход имеет очевидное преимущество в том, что он удаляет бремя для озабочечных языковых проблем и твики, и это предпочтительная реализация для многих популярных доступных CI.

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

Докерфайлы для различных языков можно найти здесь Отказ Вот ruby dockerfile:

Sicuro-Ruby-Dockerfile

И, как вы, возможно, наблюдали в коде CI, каждое результирующее изображение должно быть помечено Sicuro_ [язык] E.G Sicuro_Ruby.

Но независимо от языка изображения, все они имеют подобное docker-entrypoint.sh скрипт

Точка входа докеров

Sicuro-default-ententpoint

Этот скрипт организовал тестовый исполнительный поток. Он запускается, добавив несколько общих клавиш SSH для клонирования проектов GitHub. И поскольку мы заинтересованы только в общедоступных репозиториях, любая комбинация ключей SSH, которая должным образом зарегистрирована на GitHub, должна работать. (Однако, чтобы обеспечить доступ к частным репоим, это легко будет расширено, чтобы пользователи предоставить определенные ключи SSH для их учетных записей GitHUB).

С помощью ключей SSH настроен, он переходит к клонированию проекта. Напомним, что Project_Repository_url и Project_Repository_name являются частью информации, предоставленной при запуске контейнера. Эта информация используется здесь, чтобы клонировать проект в папку с именем проекта. Для нашей выборки это приводит к:

git clone ${PROJECT_REPOSITORY_URL} ${PROJECT_REPOSITORY_NAME}
# git clone git@github.0sc/activestorage-cloudinary-service activestorage-cloudinary-service

Теперь у нас есть проект, CD в папку и Оформить заказ к желаемой ветви. Помните Project_Branch , Правильно?

cd activestorage-cloudinary-service
git checkout master

На данный момент мы могли бы установить некоторые стандартные языковые определенные переменные среды. Например, проект рельсов выиграет от знания Rails_env и/или Rack_env в котором работает проект, а также Secret_key_base значения для данной среды. То же самое для приложения Nodejs с Node_env Отказ

Это также будет хорошее время, чтобы настроить некоторые твики специфики машины, например, начать Безголовый браузер Для тестов интеграции Capybara и т. Д. Цель состоит в том, что в конце этого все конфигурации у машины должны быть на месте.

Теперь мы обращаем внимание на настройку проекта по умолчанию для языка. Настройка приложения Nodejs начинается с Установка NPM , приложение Python: PIP Установить , Установите комплект Для приложения Ruby … Там может быть иначе необходимая стандартная установка, подобная; Настройка БД и бегущих миграций … и т. Д. Со всем этим заботимся, мы наконец готовы выполнить стандартную команду теста для языка проекта.

Вот обзор некоторых по умолчанию для Ruby на Rails и Nodejs

Рейк тест Рубин Установка пакета Rails_env.
NPM тест Oddjs Установка NPM Node_env.

До сих пор до тех пор, пока данный проект придерживается языка по умолчанию, наш сервер Ci сможет успешно справиться с ним. Но, к сожалению, очень мало проектов.

История Sicuro.yaml

Как и каждый (хороший) CI, в сторону по умолчанию по умолчанию, должны быть опции для настройки каждого процесса выполнения теста (т. Е. Машинные зависимости, настройки, тестовые фазы) на проекты. Проекты часто находят необходимость более чем предложения по умолчанию языка проекта; Альтернативная структура тестирования ( rspec вместо Министерзирует , Ruby), альтернативный менеджер зависимости ( Glide вместо d , Голанг), задача Runner ( Gulp , Nodejs) и т. Д. Приспосабливание этих вариаций порождает Circle.yml , Travis.yml … используется соответствующими крупными предложениями Ci. И в нашем случае, Sicuro.json.

Sicuro.json является необязательным файлом конфигурации, который может быть включен в корню любого проекта для настройки/переопределения различных этапов: зависимости , Настройка и Тест Разделы процесса выполнения теста CI. Если файл присутствует, содержимое прочитано и учитывается при выполнении тестов:

Вот образец

образец-sicuro.json.

Для простоты настройки ограничены двумя возможностями:

  • Выполнения по умолчанию можно отключить для проекта, установленные: Переопределить: true.
  • И пользовательские казни также могут быть включены в проект

Обе настройки не являются взаимоисключающими. Так сказать, что данный проект Nodejs требует Фантомс Для включения в установку и использует ворчание Образец выше будет действительным Sicuro.json Файл для проекта будет.

Sicuro.json Файл анализируется с использованием Nifty JQ библиотека; «Легкая и гибкая командная линия JSON-процессор». JQ это потрясающий инструмент и среди многих преимуществ, для нашего использования, это Альтернативный оператор , // , приходит в удобное. Это позволяет определять отблески для пропущенных ключей в сценарии JSON, который мы используем, чтобы сделать предоставление различных клавиш в Sicuro.json Файл необязательный.

Бросать Sicuro.json разбор через JQ в смесь, выполнение логика для каждого из тестовых разделов, становится

  • Если Sicuro.json настоящее
  • Если флаг переопределения установлен, пропустите команду по умолчанию
  • Если флаг переопределения не установлен. Выполните команды по умолчанию
  • Если настраиваемый флаг установлен, выполните пользовательские команды

С этим docker-entrypoint.sh Сценарий обновляется до

sicuro-dockerentrypoint.sh

В двух словах:

  • CI Server получит запрос на работу, содержащий имя проекта, URL, язык, язык
  • Выруются только в том случае, если в данный момент не работает другая задача одинаковой подписи.
  • Устанавливает необходимые переменные среды для создания таких ресурсов, как база данных, доступной для тестовой среды
  • Отображает контейнер Docker на основе языка проекта с необходимыми деталями для запуска теста и прикрепляет выходы журнала контейнера к указанному файлу журнала
  • Сценарии входа в контейнер установлены необходимые ключи SSH и переходят к клонированию проекта
  • Проверки Если у проекта есть какие-либо Sicuro.json файл
  • Настройка конкретных зависимостей машин для проекта с учетом содержания и инструкций в Sicuro.json Файл (если присутствует)
  • Настройка проекта конкретные зависимости для проекта с учетом содержания и инструкции в Sicuro.json Файл (если присутствует)
  • Запускает тест на проект с учетом содержания и инструкций в Sicuro.json Файл (если присутствует)

Веб-приложение

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

Веб-приложение обслуживает двух основных клиентов, (человеческих) пользователей, которые приходят, чтобы подписаться на свои проекты для сервера CI для мониторинга и VCS (Система управления версиями) серверы (например, GitHub), где размещены эти проекты.

Пользовательский интерфейс

Чтобы контролировать проект сервера CI Server, пользователю нужно будет подписаться на проект. Подписавшаяся проект требует, чтобы пользователь разрешить CI Server зарегистрировать веб -ook с помощью онлайн-проекта VC сервер. Большинство VCS Предоставляйте веб-капоны, которые позволяют приложениям подписаться на определенные события на проекте. И когда срабатывает один из этих событий, VCS отправляет полезную нагрузку на настроенный URL-адрес веб -ook.

Первый этап для настройки этого — иметь интеграцию OAUTH, позволяющую пользователям войти в систему с учетной записью GitHUB. Знак потока упакован с необходимой авторизацией, необходимой для веб-приложения для чтения и перечисления пользователей (публичных) проектов на GitHub.

Это прохождение Подробнее Как зарегистрировать приложение GitHub Oauth и получите Github_client_id и Github_client_secret коды. Процесс регистрации потребует URL-адрес обратного вызова, который вы можете установить на localhost сейчас. Позже в Хостинг Раздел ниже, мы обновим это на URL AWS для размещенного приложения.

Примечание : Если вы хотите продлить доступ к частным репоим, в стороне, включая то, что в запрошенном разрешении, как упоминалось ранее, вам также нужно будет настроить раздел SSH в разделе Pocker Compose, чтобы использовать определенные ключи, предварительно одобренные пользователем. Таким образом, часть процесса регистрации может быть, чтобы пользователь добавил эту клавишу на их учетную запись GitHub, чтобы получить необходимый доступ и обновление контейнеров Docker, чтобы использовать упомянутые клавиши для проектов пользователя (см. Раздел на Обработка кредитов с S3).

Сейчас с доступом к проектам пользователя мы можем начать исследовать экспансивные предложения API проекта GitHub Отказ Главный интерес на данный момент это Repository WebHook API который содержит информацию о подписке в веб-кавказках для данного проекта региператора. С этой информацией Мы проверяем

  • Если проект еще не подписан и предоставляет пользователю возможность подписаться
  • Если проект уже подписан, предоставьте пользователю возможность просмотреть тестовые сборки для проекта

Мы также могли бы бросить вариант, чтобы отписаться, но в этом нет веселья в этом

Вот фрагмент кода для достижения этого

Sicuro-Check-webhook.go

Вы могли бы легко легко зацикливаться через все пользовательские репо и оценивать ISREPOSUBSCRIBED для каждого из них

Результаты тестовых сборки для проекта — это агрегация журналов тестирования. Проект будет иметь несколько модулей, соответствующих различным коммитариям, запросам по тяги и другим событиям, которые происходят в проекте. И простой способ адекватно хранить это (так как мы используем файловой хранилище) — использовать хеш-файл в качестве имени файла журнала. Каждая сборка может иметь информацию, такую как состояние сборки, время, автор, хэш … и т. Д. API GitHub предоставляет богатый массив деталей, чтобы выбрать.

Помните ActiveSessions Func с сервера CI? Мы используем здесь здесь, чтобы показать пользователю, если сборка в настоящее время выполняется. Для завершенных сборки мы предоставляем возможность пользователям снова запустить сборку снова и возможность просмотреть результаты тестовых сборки.

Последний бит показывает пользователю фактический вывод журнала из контейнера и классной детали, обновления в реальном времени от построения в реальном времени. Для этого мы используем подключение Websocket. Веб-каркас Goorilla для Golang имеет образец Websocket Это простое внедрение того, что нам нужно.

После установления подключения WebSocket Connects установлено, настраивается бесконечная петля, которая следит за данным файлом журнала для модификаций (путем проверки MOST Последнее изменение в ... И всякий раз, когда файл изменен, он толкает эту информацию клиенту.

Сотрудничество JS Client Side код:

Sicuro-Chrientside-Websocket.js

Все хорошо

Взаимодействие VCS

В сторону аутентификации пользователей, у нас есть 3 других бизнеса с VCS серверы

  • Регистрация веб-капонов для событий, которые мы заботимся о проектах
  • Получение полезной нагрузки события веб -ook
  • Общая тестовая сборка прогресса и результаты

Github имеет Обширная документация На всем есть к их API WebHook. Чтобы настроить веб -ook Требования к отправке Пост Запрос на /repos/: владелец/: репо/крючки С полезной нагрузкой, включая событие (ы), для которого крючок срабатывает. Эта функциональность рядом с другими функциями часто доступна из коробки с GitHub SDK для разных языков. Библиотека GoLang имеет все, что он включен с функцией Call:

Sicuro-образец-подписка-веб -ook.go

Когда зарегистрирован веб -ook, GitHub будет пинговать URL-адрес подписанного обратного вызова с фиктивной полезной нагрузкой, чтобы выяснить, что заданная конечная точка достижима. С этим мы можем настроить начальный прогон для каждого запроса подписки проекта.

Сделать это вместе, поток регистрации веб -ook становится:

Пользователь нажимает ссылку подписания для данного проекта. Когда запрос достигает бэкэнд-сервера, мы отправляем запрос подписки на Github для PR и Commit. Когда GitHub выступает за предоставленным URL-адресом обратного вызова для подтверждения доступности, мы вызываем первую работу для прогонских испытаний проекта на ветке Master.

С помощью WebHook зарегистрирован успешно, всякий раз, когда какое-либо из мероприятия по тягу или коммитку происходит в проекте REPO, Github отправляет полезную нагрузку на событие в URL Recorbback WebHook Recorback ранее зарегистрированным. И при получении этой полезной нагрузки приложение разрабатывает необходимую информацию от полезной нагрузки, Создает соответствующую полезную нагрузку на работу на работу И заканчивайте инструкцию на сервер CI для запуска.

Одна из прохладных вещей о таких интеграциях, как это, это то, что большинство VCS позволяют обратно (успех или неудачу) от активности веб -ook; который открыто отображается встроенным с изменением, поэтому пользователь может легко увидеть.

Как вы догадались, это где updatebuildfunc Функция обратного вызова, упомянутая кратко в разделе CI Server приходит удобно. Вот реализация образца для функции обратного вызова:

Сикуро-образец-обзор обновление-сборки-статус-навязчик.

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

Хостинг

Теперь, когда у нас есть гайки и болты CI вместе, он должен быть развернут и использовать. Хотя в этом разделе я обсудим, как развернуть приложение к AWS, любой другой из других облачных провайдеров GCP, Azure, Digitalocean и т. Д., работает. Я на самом деле попробовал разных провайдеров, прежде чем урегулировать для AWS; Примечания от попытки сделают для другой записи Отказ

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

  • Docker и Docker составляют
  • GO Runtime
  • Действующие клавиши GitHub SSH и другие учетные данные проекта
  • Копия приложения

Давайте начнем настроить это на AWS.

Примечание: я предполагаю, что знакомство с основами AWS; Особенно запускающие экземпляры EC2, роли AMI, S3. Если я потерпел неудачу вас с этим предположением, рассмотрите возможность взглянуть на любую из доступных ресурсов по этому вопросу. Я нахожу Этот плютарный курс полезный.

Пользовательский AMI

Изображение Amazon Machine (AMI) — это основание, из которой предусмотрены экземпляры EC2. Они « … содержат конфигурацию программного обеспечения (операционную систему, сервер приложений и приложения), необходимые для запуска вашего экземпляра ». Выбор AMI в значительной степени зависит от требований приложения, которые будут развернуты на нем.

Sicuro, как мы подробно описали выше, требуют Docker, Docker Compose и Golang Runtime; И как часто бывает в случае для специализированных приложений, не готовятся не пребужденно AMI, которые связывают все требования. Поэтому мы должны откатить нашего собственного.

Во-первых, мы раскрутим общий экземпляр EC2, выполняющий базовый образ, который имеет столько же, что требуется зависимость проекта. Пользовательские AMI, как вы ожидаете (и много похожего на Docker Images), основаны с существующими изображениями и в нашем случае здесь мы будем базоваться Amazon Linux AMI 2017.09.1 (HVM), тип объема SSD (В основном потому, что он имеет право на свободный уровень AWS )

Далее в разделе «Настройка экземпляра» под обновленными деталями мы установим следующую команду для выполнения

#!bin/sh
curl https://gist.githubusercontent.com/0sc/71975ba7e9c1a32d37c815e2e2806920/raw | sh

Это выполняет следующий скрипт для установки Докер , Docker-Compose и Голанг на изображении

AWS-GO + DOCKER_SETUP.SH

С помощью этого набора мы можем идти вперед и запустить изображение.

Как только экземпляр работает, SSH в него и подтвердите, что Докер , Docker-Compose и Голанг где установлено

Все теперь установлено для нас, чтобы создать изображение из запущенного экземпляра. Выберите рабочий экземпляр из приспособления EC2 экземпляра на консоли AWS; Затем выберите Действия> Изображение> Создать опцию изображения . Дайте свое изображение интересное имя и создать.

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

Учетные данные с S3

Как и каждый хороший проект, нам нужно осторожно о том, как мы обращаемся к учетным данным и секретам проекта. Секреты, требуемые Sicuro, включают

  • Github SSH ключей
  • ID клиента и секрет клиента для приложения GitHub Oauth
  • WebHook Secret для регистрации веб-качников на проектах GitHub
  • Секреты сеанса для обработки сеансов пользователей для веб-приложения

Есть пара способов незаметно сделать эту информацию доступной приложением во время выполнения. Один из подходов, который мы будем использовать, это подход S3 подробно в Этот блог пост Отказ

Создать ведро на S3; Звоните это сказать Сикуро-секреты Отказ Загрузить свою копию .env Файл, содержащий производственные кредиты на ведро.

GITHUB_CLIENT_ID=YOUR-GITHUB-CLIENT-ID
GITHUB_CLIENT_SECRET=YOUR-GITHUB-CLIENT-SECRET
GITHUB_WEBHOOK_SECRET=YOUR-GITHUB-WEBHOOK-SECRET
SESSION_SECRET=SOME-LONG-RANDOM-STRING-FOR-ENCODING-USER-SESSION
DOCKER_IMAGE_REPO=xovox

Настройка (другой) клавиша SSH GitHub для вашей учетной записи GitHUB после пошаговать здесь Отказ Конечный результат должен быть два файла: id_rsa и id_rsa.pub.pub. Содержащие ваши частные и публичные ключи соответственно. Добавьте это к .ssh Папка и загрузка на Ключи Подпапка в ведре S3. Вот что должна выглядеть окончательная структура файлов:

sicuro-secrets 
  |-- keys 
    	|-- .ssh 
            |-- id_rsa 
            |-- id_rsa.pub 
  |-- .env

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

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

Все теперь установлено, чтобы запустить приложение в EC2.

Развертывание приложения

На панели инструментов EC2 нажмите, чтобы создать новый экземпляр. При предложении для использования AMI нажмите, чтобы выбрать из Мой амис Разделы и выберите пользовательское изображение, созданное в Пользовательский AMI раздел выше.

В конфигурации экземпляра назначьте его роль IAM, созданную в разделе выше и в разделе «Усовершенствованные детали», добавьте следующий скрипт запуска (в поле пользовательских данных в виде текста):

#!bin/bash
curl https://gist.githubusercontent.com/0sc/c2d80f5a127ad6b12744ab416e73e8aa/raw | sh

Это выполняет следующий скрипт запуска

sicuro-startup.sh

Скопируйте свой Public DNS и установите его как URL обратного вызова для Github Oauth Войти в Пользовательский интерфейс Раздел E.g http://ec2-52-43-89-100.us-west-2.compute.amazonaws.com:808g/gh/callback.

Ваша CI готов; Посетите URL и возьмите его для спина

  • Войти с github
  • Подписаться одним из ваших проектов
  • Просмотр журналов, поскольку CI запускает ваш тест
  • Создайте PR или выдвигать новые изменения в проект и Observer CI потяните изменения, вызвать новую сборку и запустить тесты

Резюме

Интересно различные движущиеся части к серверу CI и как они сотрудничают для проверки изменений кода. В этой статье я исследовал каждую из этих частей и как их переоценить. Реализация образца, используемая для этой статьи, доступна на GitHub с инструкциями о том, как запустить его локально, Проверьте это здесь Отказ

Спасибо за чтение и обязательно поделитесь своими мыслями в разделе комментариев.

Переиздается со среднего.com (https://medium.com/@oskarr3/sicuro-ci-2f40ba138233)

Оригинал: «https://www.codementor.io/@oskarr3/how-i-built-a-ci-server-using-docker-g4jtry3h3»