CircleCI
В этом разделе мы будем использовать CircleCI в качестве сервиса непрерывной интеграции. В двух словах, CircleCI автоматизирует сборку, тестирование и развертывание вашего программного обеспечения. Сервис поддерживает разные языки программирования и, в частности, язык Crystal.
В этом разделе мы рассмотрим примеры конфигурации, чтобы увидеть, как CircleCI реализует некоторые концепции непрерывной интеграции.
Орбы CircleCI
Прежде чем перейти к примерам, стоит упомянуть орбы CircleCI. Согласно официальной документации:
Орбы определяют повторно используемые команды, исполнители и задания, позволяя объединить часто используемые фрагменты конфигурации в одну строку кода.
В нашем случае мы будем использовать орб Crystal
Сборка и запуск спецификаций
Простой пример с использованием latest
Начнем с простого примера. Мы запустим тесты с использованием последней версии Crystal:
workflows:
version: 2
build:
jobs:
- crystal/test
orbs:
crystal: manastech/crystal@1.0
version: 2.1
Вот и всё! Это было просто! Орбы предоставляют уровень абстракции, благодаря которому файл конфигурации становится более понятным и удобным для чтения.
Если вам интересно, что делает задание crystal/test, вы всегда можете посмотреть исходный код.
Использование nightly
Использовать ночную сборку Crystal так же просто:
workflows:
version: 2
build:
jobs:
- crystal/test:
name: test-on-nightly
executor:
name: crystal/default
tag: nightly
orbs:
crystal: manastech/crystal@1.0
version: 2.1
Использование определенной версии Crystal
workflows:
version: 2
build:
jobs:
- crystal/test:
name: test-on-0.30
executor:
name: crystal/default
tag: 0.30.0
orbs:
crystal: manastech/crystal@1.0
version: 2.1
Установка пакетов shards
Об этом не нужно беспокоиться, поскольку задание crystal/test выполняет команду орба crystal/shard-install.
Установка бинарных зависимостей
Нашему приложению или некоторым shards могут потребоваться библиотеки и пакеты. Эти бинарные зависимости можно установить с помощью команды Apt.
Вот пример установки пакета разработки libsqlite3:
workflows:
version: 2
build:
jobs:
- crystal/test:
pre-steps:
- run: apt-get update && apt-get install -y libsqlite3-dev
orbs:
crystal: manastech/crystal@1.0
version: 2.1
Использование сервисов
Теперь запустим тесты с использованием внешнего сервиса (например, MySQL):
executors:
crystal_mysql:
docker:
- image: 'crystallang/crystal:latest'
environment:
DATABASE_URL: 'mysql://root@localhost/db'
- image: 'mysql:5.7'
environment:
MYSQL_DATABASE: db
MYSQL_ALLOW_EMPTY_PASSWORD: 'yes'
workflows:
version: 2
build:
jobs:
- crystal/test:
executor: crystal_mysql
pre-steps:
- run:
name: Waiting for service to start (check dockerize)
command: sleep 1m
- checkout
- run:
name: Install MySQL CLI; Import dummy data
command: |
apt-get update && apt-get install -y mysql-client
mysql -h 127.0.0.1 -u root --password="" db < test-data/setup.sql
orbs:
crystal: manastech/crystal@1.0
version: 2.1
Примечание
Явное checkout в pre-steps нужно, чтобы файл test-data/setup.sql был доступен.
Кэширование
При использовании задания crystal/test кэширование включено по умолчанию, поскольку внутри оно использует команду command with-shards-cache
To the extent possible under law, the persons who contributed to this workhave waived
all copyright and related or neighboring rights to this workby associating CC0 with it.
https://crystal-lang.org/reference/1.2/guides/ci/circleci.html