Рубрики
Без рубрики

Circle-CI 2.0 для проектов с открытым исходным кодом

Смотрите, как использовать CircleCI для запуска тестов для вашего проекта с открытым исходным кодом Linux и macOS.

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

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

Популярность Travis-CI имеет свою цену. Поскольку все больше и больше проектов с открытым исходным кодом используют бесплатный сервис Travis-CI и все больше проектов запускают больше тестов, выполнение всех тестов занимает больше времени.

Я все еще думаю, что Travis-CI-отличный сервис, особенно теперь, когда он поддерживает этапы сборки .

Здесь я представляю CircleCI как способ использовать предложения, предоставляемые Circle-CI сообществу с открытым исходным кодом.

Я предлагаю запустить половину ваших сборок на Travis-CI, а другую половину на CircleCI.. и если вам нужна Windows, запустите тесты Windows на Appevyor , поскольку Appveyor также бесплатен для проектов с открытым исходным кодом.

Ресурсы Circle-CI с открытым исходным кодом

Для проектов с открытым исходным кодом команда CircleCI достаточно щедра и предоставляет следующие ресурсы бесплатно:

  • 4 параллельные сборки Linux docker (после включения функций с открытым исходным кодом)
  • Начальный план для сборок macOS (после отправки электронного письма в Circle-CI billing)

У Travis-CI также есть сборки Mac OS для проектов с открытым исходным кодом, но очереди на Travis-CI всегда были длинными.

До сих пор на Circle-CI сборки проводили в очереди не более 5 секунд, в то время как на Travis-CI это были часы. Может быть, Трэвису-КИ сейчас лучше.

Активация функций с открытым исходным кодом

Предполагая, что вы включили CircleCI для своего проекта (репозитория), по умолчанию вы не получите все ресурсы, доступные для проектов с открытым исходным кодом.

Они должны быть включены на странице Advances Settings вашего репо. URL – адрес выглядит как https://circleci.com/gh/ORG-NAME/REPO-NAME/edit#advanced-settings

Возможно, вы захотите включить следующие функции:

  • Бесплатный и с открытым исходным кодом – чтобы получить 4 докера Linux вместо 1.
  • Построить разветвленные запросы на вытягивание – чтобы позволить внешним участникам запускать тесты в рамках PR
  • Только запросы на сборку (необязательно)- чтобы не тратить ресурсы на коммиты, выталкиваемые за пределы aPR.

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

Не забудьте включить значок Circle-CI в файл README вашего репо. URL – адрес для получения кода для велосипеда выглядит следующим образом https://circleci.com/gh/ORG-NAME/REPO-NAME/edit#badges

Как только вы настроитесь, не забудьте добавить доступ к администрированию CircleCI для других разработчиков из вашего сообщества. Таким образом, можно настроить CircleCI, даже когда вас нет рядом. URL – адрес выглядит как https://circleci.com/team/gh/ORG-NAME .

Уведомления в CircleCI

Если вы знакомы с Travis-CI, вы можете настроить уведомления.

CircleCI предоставляет все обычные функции уведомлений (электронная почта, Slack, IRC). На данный момент эти конфигурации недоступны из конфигурационного файла YAML, и вам нужно будет настроить их из пользовательского интерфейса Circle-CI.

Настройки уведомлений по электронной почте находятся в вашем личном кабинете (даже для уведомлений проекта), поэтому ознакомьтесь с ними по адресу https://circleci.com/account/notifications

Пример проекта Python в Linux и mac OS

Я не буду вдаваться в подробности здесь, так как документация Circle-CI версии 2.0 довольно хороша.

Для Linux Circle-CI-это все о Docker. Вместо того, чтобы иметь фиксированную ОС (например, старую Ubuntu 12.04 или 14.04), вы можете запустить ее в любом контейнере docker. В начале я предлагаю использовать один из готовых образов и начать с простого примера.

Одна вещь, которую я хочу показать вам здесь, заключается в том, что вы можете использовать сборки macOS для чего угодно, а не только для проектов XCode. Для этого примера я сохраняю его простым и использую версию Python, предоставленную macOS. У вас есть полный контроль над системой Mac OS, поэтому вы можете установить Homebrew и запустить свою собственную среду.

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

В большинстве случаев, если вы забудете определить переменную или ваш код нарушает стандарт кодирования, вы получите глупую сборку, и окончательная сборка все равно завершится неудачей. Вам все равно придется повторно запускать тесты, так зачем тратить время на тестирование?

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

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

Вот полный рабочий пример. Вот и все. Счастливого тестирования!

version: 2

jobs:
  static_checkers:
    working_directory: ~/static-checkers
    docker:
      - image: circleci/python:2.7
    steps:
      # Get the source.
      - checkout

      - run:
          name: Prepare the environment.
          command: |
            python --version
            pip install -q --user --ignore-installed --upgrade virtualenv
            pip install -q tox --user
            echo 'export PATH=~/.local/bin:$PATH' >> $BASH_ENV

      # Run each checker in a separate step.
      - run:
          name: Check the release notes.
          command: |
            tox -r -e newsfragment
      - run:
          name: Check manifest-checker.
          command: |
            tox -r -e manifest-checker
      - run:
          name: Check pyflakes.
          command: |
            tox -r -e pyflakes


  #
  # Documentation tests are slow so we execute them in a separate job.
  #
  documentation:
    working_directory: ~/documentation
    docker:
      - image: circleci/python:2.7
    steps:
      # Get the source.
      - checkout

      - run:
          name: Prepare the environment.
          command: |
            python --version
            pip install -q --user --ignore-installed --upgrade virtualenv
            pip install -q tox --user
            echo 'export PATH=~/.local/bin:$PATH' >> $BASH_ENV

      - run:
          name: Check the narrative documentation.
          command: |
            tox -r -e narrativedocs

      - run:
          name: Check the API documentation.
          command: |
            tox -r -e apidocs


  #
  # We run pyflakes with Python 3 .
  #
  pyflakes3:
    working_directory: ~/pyflakes3
    docker:
      - image: circleci/python:3.6
    steps:
      # Get the source.
      - checkout

      - run:
          name: Prepare the environment.
          command: |
            python --version
            pip install -q --user --ignore-installed --upgrade virtualenv
            pip install -q tox --user
            echo 'export PATH=~/.local/bin:$PATH' >> $BASH_ENV

      - run:
          name: Check the API documentation.
          command: |
            tox -r -e pyflakes3

  #
  # MacOS with Python2.7 and default reactor.
  #
  macos_py27_default_reactor:
    macos:
      # We don't use the xcode, but we need to put something here.
      xcode: "9.0"

    working_directory: ~/repo

    steps:
      # Get the source.
      - checkout

      - run:
          name: Prepare the macOS environment.
          command: |
            python --version
            pip install -q --user --ignore-installed --upgrade virtualenv
            pip install -q tox --user
            echo 'export PATH=/usr/local/bin:$PATH:/Users/distiller/Library/Python/2.7/bin' >> $BASH_ENV

      # Run tests with tox without any cached dependencies.
      - run:
          name: Test with the default reactor.
          command: |
            tox -r -e py27-alldeps-withcov-posix twisted


# First we run the static checkers, and only if they pass we spin the macOS.
# in this way we should save some macOS minutes.
workflows:
  version: 2
  all-tests:
    jobs:
      - static_checkers
      - macos_py27_default_reactor:
          requires:
            - static_checkers
      - documentation:
          requires:
            - static_checkers
      - pyflakes3:
          requires:
            - static_checkers