Убийца Jenkins. TeamCity? Лучше — CircleCI!

Привет!
Хотел поделиться с вами небольшой находкой, которую я совсем недавно обнаружил. Речь пойдёт про прекрассный CI/CD сервис — CircleCI.

Когда мы говорим о непрерывной интеграции и деплое, чаще всего на ум приходят ровно два решения — Бесплатный, неприятный, лагающший, херовый Дженкикс и прекрасный, cool и даже pretty — ТимСити. Но он, сука, стоит кучу денег, а у нас кризис, импортозамещение, и вообще, жаба душит, не хочется кому-то платить бабло.

В этот момент люди вспоминают, что на рынке существует ещё овер дохера решений по CI/CD. Самое популярное из них — это Travis CI. Именно на тревис в основном дрочат все открытые проекты на гитхабе. Так сложилось чисто исторически, что это решение было первым на рынке cool CI.

Однако время идёт, мир меняется. Теперь мы не одним Тревисом едины. Есть и такой прекрасный сервис, как CircleCI. Сёкл-ом можно пользоваться, как бесплатно (у вас будет лишь одна нода для запуска процесса сборки), так и платно — платя по 50$ за каждый следующий воркер, после первого.

Как работает в общем CircleCI? Ничего хитрого. Вся сборка происходит на Линуксах, в Докер-контейнере. Для сборки задаётся один основной контейнер, который свойственнен вашему языку, а также ряд вторичных контейнеров, которые выступают в качестве сервисов. Самый типичный сервис — это БД, которую вы можете использовать для интеграционных тестов при сборки проекта.

Pipeline сборки описывается в отвратительном (моё оценочное суждение, nothing personal) yml-файле. Всё, как обычно, сначала конфигурируем рабочее окружение. Затем описываем набор step, в каждом из которых выполняется какое-то атамарное действие: checkout файлов с гита, запуск грэдл таска, ожидание запуска БД и тд.

Я для примера набросал простой spring boot проект (spring boot, jooq, flyway, postgresql) — https://github.com/Hixon10/spring-boot-circle-ci. Для тестирования данного приложения на Сёкле потребовалось написать такой конфиг:

# Java Gradle CircleCI 2.0 configuration file
#
# Check https://circleci.com/docs/2.0/language-java/ for more details
#
version: 2
jobs:
  build:
    docker:
      # specify the version you desire here
      - image: circleci/openjdk:8-jdk

      - image: circleci/postgres:9.6.2-alpine
        environment:
          POSTGRES_USER: spring-boot-user
          POSTGRES_DB: blog
          POSTGRES_PASSWORD: spring-boot-user
		  
    working_directory: ~/repo

    environment:
      # Customize the JVM maximum heap limit
      JVM_OPTS: -Xmx3200m
      TERM: dumb

    steps:
      - checkout

      # Download and cache dependencies
      - restore_cache:
          keys:
          - v1-dependencies-{{ checksum "build.gradle" }}
          # fallback to using the latest cache if no exact match is found
          - v1-dependencies-

      - run: gradle dependencies

      - save_cache:
          paths:
            - ~/.m2
          key: v1-dependencies-{{ checksum "build.gradle" }}

      - run:
          name: Wait for DB
          command: dockerize -wait tcp://localhost:5432 -timeout 1m

      # run tests!
      - run: gradle test

Как вы видите, ничего хитроного. Весьма стандартный способ описания Пайплайна в CI.

Подытожив статью, хочу выделить приятные стороны CircleCI:

  • Есть бесплатный аккаунт — можно использовать для Пет Проджектов.
  • Отличная документация. Есть даже скринкасты с прекрасными белыми американцами.
  • Большое количество примеров использования CI — всегда можно найти решение своей проблемы
  • Отличное API — даже, если в сервисе не реализована интеграция с вашим облаком, то вы можете сами написать скрипты деплоя.
  • Большое количество готовых решений — образов — https://circleci.com/docs/2.0/circleci-images/. Я, например, заюзал сервис Постгри для интеграционных тестов — и это делается буквально в несколько строк кода.

Категории: Программирование