DevOps


https://developer.android.com/training/testing/continuous-integration
https://developer.android.com/training/testing/continuous-integration/automation
https://developer.android.com/training/testing/continuous-integration/features
CI (Continuous Integration)

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

CD (Continuous Delivery)

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

GitHub Actions

GitHub Actions — встроенный CI/CD инструмент на GitHub, который позволяет автоматизировать сборку, тестирование и развертывание проектов прямо из репозитория. Поддерживает контейнеры и серверные задачи, а также легко интегрируется с другими сервисами GitHub.

on

Содержит события, которые будут триггерить запуск workflow. Этот раздел позволяет задать как автоматические события (например, push, pull_request), так и вручные (workflow_dispatch).

push

Запускает workflow при пуше в репозиторий. Можно настроить для определённых веток, тегов или типов файлов.

on:
  push:
    branches:
      - main
    tags:
      - 'v*' # Срабатывает при пуше тегов, начинающихся с "v"
    paths:
      - 'src/**' # Срабатывает при изменении файлов в папке src
pull_request

Запускает workflow при создании или обновлении pull request. Как и с push, можно ограничить запуск для определённых веток или типов файлов.

on:
  pull_request:
    branches:
      - main
    paths-ignore:
      - '**/*.md' # Игнорирует изменения только в .md файлах
workflow_dispatch

Добавляет возможность вручного запуска workflow.

on:
  workflow_dispatch:
    inputs:
      environment:
        description: 'Deployment environment'
        required: true
        default: 'production'
        type: choice
        options:
          - development
          - staging
          - production
schedule

Позволяет настроить запуск по расписанию, используя cron-формат.

on:
  schedule:
    - cron: '0 3 * * *' # Запускается ежедневно в 3:00 UTC
release

Запускает workflow при создании, публикации или изменении релиза.

on:
  release:
    types: 
      - created # Срабатывает при создании релиза
      - published # Срабатывает при публикации
issues

Позволяет запускать workflow при действиях с issue (например, открытие, закрытие, комментарий и т.д.).

on:
  issues:
    types: [opened, edited]
concurrency

Используется для управления параллельным выполнением workflow, чтобы избежать одновременного запуска конфликтующих задач, оптимизировать использование ресурсов и предотвратить избыточные запуски. Этот параметр позволяет объединять workflow в группы и при необходимости отменять уже выполняющиеся задачи.

group

Определяет группу для workflow, которые не должны выполняться одновременно. Задав группу, можно указать, что workflow из этой группы не могут быть запущены параллельно. Значение группы может быть статическим или динамическим с использованием переменных.

concurrency:
  group: build-${{ github.ref }}
cancel-in-progress

Контролирует, должны ли уже запущенные workflow в этой группе быть отменены при запуске нового.

true отменяет текущие выполняющиеся workflow из этой группы при запуске нового.

false оставляет текущие запущенные workflow в группе, не отменяя их.

concurrency:
  group: build-${{ github.ref }}
  cancel-in-progress: true
jobs

Представляют собой отдельные задачи, которые выполняются в рамках одного workflow. Каждый job содержит набор шагов (steps), определяющих, что должно быть выполнено в рамках этого задания. Задачи могут быть независимыми или зависеть друг от друга, и GitHub предоставляет гибкие возможности для их настройки.

Название задания

Каждый job может иметь уникальное имя, которое помогает организовать и понять назначение задачи в workflow.

jobs:
  build:
runs-on

Указывает, на каком типе виртуальной машины (runner) будет выполняться job. Например, ubuntu-latest, macos-latest, или windows-latest.

jobs:
  build:
    runs-on: ubuntu-latest
steps

Задаёт последовательность шагов, выполняемых в рамках job. Шаги могут включать команды, действия, сценарии и проверки.

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - name: Check out code
        uses: actions/checkout@v2
      - name: Run tests
        run: ./gradlew test
needs

Позволяет задать зависимость одного задания от другого. Например, если deploy должен выполняться только после успешного выполнения build, можно указать needs.

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - name: Build code
        run: ./gradlew build

  deploy:
    runs-on: ubuntu-latest
    needs: build
    steps:
      - name: Deploy application
        run: ./deploy.sh
if

Позволяет указать, при каких условиях job должен выполняться. Например, можно запускать job только при выполнении определённых условий (например, при пуше в основную ветку).

jobs:
  build:
    runs-on: ubuntu-latest
    if: github.ref == 'refs/heads/main'
    steps:
      - name: Build code
        run: ./gradlew build
timeout-minutes

Устанавливает максимальное время выполнения для job, после которого выполнение будет прервано, чтобы избежать бесконечных циклов или задержек.

jobs:
  build:
    runs-on: ubuntu-latest
    timeout-minutes: 10
    steps:
      - name: Build code
        run: ./gradlew build
env

Можно передавать секретные данные или переменные окружения, которые будут использоваться только в рамках этого job.

jobs:
  deploy:
    runs-on: ubuntu-latest
    env:
      DEPLOY_TOKEN: ${{ secrets.DEPLOY_TOKEN }}
    steps:
      - name: Deploy code
        run: ./deploy.sh
GitLab CI
https://docs.gitlab.com/ee/ci/

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

Bitrise
https://bitrise.io/

Bitrise — облачная CI/CD платформа, оптимизированная для мобильной разработки. Предоставляет преднастроенные шаги для тестирования и развертывания iOS и Android приложений.

Fastlane
https://fastlane.tools/

Fastlane — инструмент, ориентированный на автоматизацию рутинных задач в мобильной разработке, таких как сборка, тестирование, публикация и управление сертификатами. Часто используется вместе с другими CI/CD системами, такими как Jenkins или Bitrise.

CircleCI
https://circleci.com/

CircleCI — популярная платформа для CI/CD, которая предлагает как облачные, так и локальные решения. Хорошо интегрируется с GitHub и Bitbucket и поддерживает параллельное выполнение задач для ускорения процессов.

Jenkins
https://www.jenkins.io/

Jenkins — open-source CI/CD сервер с широкими возможностями кастомизации через плагины. Поддерживает различные языки программирования и инструменты, что делает его одним из наиболее гибких решений.

Travis CI
https://www.travis-ci.com/

Travis CI — облачная платформа CI/CD, которая предоставляет простую конфигурацию через файл .travis.yml. Хорошо интегрируется с GitHub, и часто используется для open-source проектов.

TeamCity
https://www.jetbrains.com/teamcity/

TeamCity — мощный CI/CD инструмент от JetBrains, поддерживающий гибкую настройку билдов и интеграцию с различными IDE и системами контроля версий. Хорошо подходит для больших команд благодаря своим функциям для параллельных билдов и отчетности.

Вопросы на собесе (1)
  1. Для чего используется CI?

    Для автоматизации сборки и тестирования кода при каждом изменении, чтобы быстро выявлять ошибки и поддерживать стабильность проекта.