# Переход с Jenkins на GitHub Actions

GitHub Actions и Jenkins имеют несколько сходств в конфигурации, что делает миграцию на GitHub Actions относительно простой.

## Введение

Jenkins и GitHub Actions позволяют создавать рабочие процессы, которые автоматически выполняют сборку, тестирование, публикацию, выпуск и развертывание кода. Jenkins и GitHub Actions используют некоторые сходства в конфигурации рабочего процесса.

* Jenkins создает рабочие процессы с помощью *декларативных конвейеров*, которые аналогичны файлам рабочих процессов GitHub Actions.
* Jenkins использует *этапы* для выполнения коллекции шагов, а GitHub Actions использует задания для группирования одного или нескольких шагов или отдельных команд.
* Jenkins и GitHub Actions поддерживают сборки на основе контейнеров. Дополнительные сведения см. в разделе [Создание действия контейнера Docker](/ru/actions/creating-actions/creating-a-docker-container-action).
* Шаги или задачи можно повторно использовать и предоставлять сообществу.

Дополнительные сведения см. в разделе [Понимание GitHub Actions](/ru/actions/learn-github-actions/understanding-github-actions).

## Основные отличия

* Jenkins имеет два типа синтаксиса для создания конвейеров: декларативный конвейер и конвейер со скриптами. GitHub Actions использует YAML для создания рабочих процессов и файлов конфигурации. Дополнительные сведения см. в разделе [Синтаксис рабочего процесса для GitHub Actions](/ru/actions/using-workflows/workflow-syntax-for-github-actions).
* Развертывания Jenkins обычно являются локальными, при этом пользователи обслуживают серверы в своих центрах обработки данных. GitHub Actions предлагает гибридный облачный подход, размещая собственные средства выполнения, которые можно использовать для выполнения заданий, а также поддерживая локальные средства выполнения. Дополнительные сведения см. в разделе [Локальные средства выполнения тестов](/ru/actions/hosting-your-own-runners/managing-self-hosted-runners/about-self-hosted-runners).

## Сравнение возможностей

### Распространение сборок

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

Аналогично, GitHub Actions может отправлять задания в размещенные в GitHub или локальные средства выполнения, и вы можете с помощью меток классифицировать модули выполнения в соответствии с различными атрибутами. Дополнительные сведения см. в разделе \[AUTOTITLE и [Понимание GitHub Actions](/ru/actions/learn-github-actions/understanding-github-actions#runners)]\(/actions/hosting-your-own-runners/managing-self-hosted-runners/about-self-hosted-runners).

### Использование разделов для упорядочения конвейеров

Jenkins разделяет свои декларативные конвейеры на несколько разделов. Аналогично, GitHub Actions упорядочивает рабочие процессы по отдельным разделам. В приведенной ниже таблице сравниваются разделы Jenkins с рабочим процессом GitHub Actions.

| Директивы Jenkins                                               | GitHub Actions                                                                                                                                                                                                                   |
| --------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| [`agent`](https://jenkins.io/doc/book/pipeline/syntax/#agent)   | [`jobs.<job_id>.runs-on`](/ru/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idruns-on) <br> [`jobs.<job_id>.container`](/ru/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idcontainer) |
| [`post`](https://jenkins.io/doc/book/pipeline/syntax/#post)     | нет                                                                                                                                                                                                                              |
| [`stages`](https://jenkins.io/doc/book/pipeline/syntax/#stages) | [`jobs`](/ru/actions/using-workflows/workflow-syntax-for-github-actions#jobs)                                                                                                                                                    |
| [`steps`](https://jenkins.io/doc/book/pipeline/syntax/#steps)   | [`jobs.<job_id>.steps`](/ru/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idsteps)                                                                                                                          |

## Директивы using

Jenkins использует директивы для управления *декларативными конвейерами*. Эти директивы определяют характеристики рабочего процесса и порядок его выполнения. В приведенной ниже таблице показано, как эти директивы соответствуют концепциям в GitHub Actions.

| Директивы Jenkins                                                                          | GitHub Actions                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          |
| ------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| [`environment`](https://jenkins.io/doc/book/pipeline/syntax/#environment)                  | [`jobs.<job_id>.env`](/ru/actions/using-workflows/workflow-syntax-for-github-actions#env) <br> [`jobs.<job_id>.steps[*].env`](/ru/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsenv)                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        |
| [`options`](https://jenkins.io/doc/book/pipeline/syntax/#options)                          | [`jobs.<job_id>.strategy`](/ru/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstrategy) <br> [`jobs.<job_id>.strategy.fail-fast`](/ru/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstrategyfail-fast) <br> [`jobs.<job_id>.timeout-minutes`](/ru/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idtimeout-minutes)                                                                                                                                                                                                                                                                                                                                                                                                                    |
| [`parameters`](https://jenkins.io/doc/book/pipeline/syntax/#options)                       | [`inputs`](/ru/actions/creating-actions/metadata-syntax-for-github-actions#inputs) <br> [`outputs`](/ru/actions/creating-actions/metadata-syntax-for-github-actions#outputs-for-docker-container-and-javascript-actions)                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |
| [`triggers`](https://jenkins.io/doc/book/pipeline/syntax/#triggers)                        | [`on`](/ru/actions/using-workflows/workflow-syntax-for-github-actions#on) <br> [`on.<event_name>.types`](/ru/actions/using-workflows/workflow-syntax-for-github-actions#onevent_nametypes) <br> [<code>on.\<push>.\<branches\|tags></code>](/ru/actions/automating-your-workflow-with-github-actions/workflow-syntax-for-github-actions#onpushbranchestagsbranches-ignoretags-ignore) <br> [<code>on.\<pull\_request>.\<branches></code>](/ru/actions/automating-your-workflow-with-github-actions/workflow-syntax-for-github-actions#onpull_requestpull_request_targetbranchesbranches-ignore) <br> [<code>on.\<push\|pull\_request>.paths</code>](/ru/actions/automating-your-workflow-with-github-actions/workflow-syntax-for-github-actions#onpushpull_requestpull_request_targetpathspaths-ignore) |
| [`triggers { upstreamprojects() }`](https://jenkins.io/doc/book/pipeline/syntax/#triggers) | [`jobs.<job_id>.needs`](/ru/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idneeds)                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |
| [Синтаксис cron в Jenkins](https://jenkins.io/doc/book/pipeline/syntax/#cron-syntax)       | [`on.schedule`](/ru/actions/using-workflows/workflow-syntax-for-github-actions#onschedule)                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              |
| [`stage`](https://jenkins.io/doc/book/pipeline/syntax/#stage)                              | [`jobs.<job_id>`](/ru/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_id) <br> [`jobs.<job_id>.name`](/ru/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idname)                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |
| [`tools`](https://jenkins.io/doc/book/pipeline/syntax/#tools)                              |                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |

```
          [Спецификации для GitHubразмещенных средств выполнения](/actions/using-github-hosted-runners/about-github-hosted-runners#supported-software) |
```

\| [`input`](https://jenkins.io/doc/book/pipeline/syntax/#input)                              | [`inputs`](/ru/actions/creating-actions/metadata-syntax-for-github-actions#inputs) |
\| [`when`](https://jenkins.io/doc/book/pipeline/syntax/#when)                                | [`jobs.<job_id>.if`](/ru/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idif) |

## Использование последовательных этапов

### Обработка параллельных заданий

Jenkins может выполнять `stages` и `steps` параллельно, в то время как GitHub Actions в настоящее время выполняет задания только параллельно.

| Параллельное выполнение в Jenkins                                   | GitHub Actions                                                                                                                         |
| ------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------- |
| [`parallel`](https://jenkins.io/doc/book/pipeline/syntax/#parallel) | [`jobs.<job_id>.strategy.max-parallel`](/ru/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstrategymax-parallel) |

### «Матрица»

И GitHub Actions, и Jenkins позволяют использовать матрицу сборки для определения различных системных сочетаний.

| Jenkins                                                                  | GitHub Actions                                                                                                                                    |
| ------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------- |
| [`axis`](https://jenkins.io/doc/book/pipeline/syntax/#matrix-axes)       | [`strategy/matrix`](/ru/actions/using-workflows/about-workflows#using-a-build-matrix) <br> [`context`](/ru/actions/learn-github-actions/contexts) |
| [`stages`](https://jenkins.io/doc/book/pipeline/syntax/#matrix-stages)   | [`steps-context`](/ru/actions/learn-github-actions/contexts#steps-context)                                                                        |
| [`excludes`](https://jenkins.io/doc/book/pipeline/syntax/#matrix-stages) | нет                                                                                                                                               |

### Выполнение задач с помощью шагов

Jenkins группирует `steps` в `stages`. Каждый из этих шагов может быть, помимо прочего, скриптом, функцией или командой. Аналогично, GitHub Actions использует `jobs` для выполнения определенных групп `steps`.

| Jenkins                                                       | GitHub Actions                                                                                          |
| ------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------- |
| [`steps`](https://jenkins.io/doc/book/pipeline/syntax/#steps) | [`jobs.<job_id>.steps`](/ru/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idsteps) |

## Примеры распространенных задач

### Планирование запуска конвейера с помощью `cron`

#### Конвейер Jenkins с `cron`

```yaml
pipeline {
  agent any
  triggers {
    cron('H/15 * * * 1-5')
  }
}
```

#### Рабочий процесс GitHub Actions с `cron`

```yaml
on:
  schedule:
    - cron: '*/15 * * * 1-5'
```

Дополнительные сведения о `schedule` событиях и принятом синтаксисе cron см. в разделе [События, инициирующие рабочие процессы](/ru/actions/reference/workflows-and-actions/events-that-trigger-workflows#schedule).

### Настройка переменных среды в конвейере

#### Конвейер Jenkins с переменной среды

```yaml
pipeline {
  agent any
  environment {
    MAVEN_PATH = '/usr/local/maven'
  }
}
```

#### Рабочий процесс GitHub Actions с переменной среды

```yaml
jobs:
  maven-build:
    env:
      MAVEN_PATH: '/usr/local/maven'
```

### Выполнение сборки из вышестоящих проектов

#### Конвейер Jenkins, который строится из вышестоящего проекта

```yaml
pipeline {
  triggers {
    upstream(
      upstreamProjects: 'job1,job2',
      threshold: hudson.model.Result.SUCCESS
    )
  }
}
```

#### Рабочий процесс GitHub Actions, который создается из вышестоящего проекта

```yaml
jobs:
  job1:
  job2:
    needs: job1
  job3:
    needs: [job1, job2]
```

### Выполнение сборки с несколькими операционными системами

#### Конвейер Jenkins, который строится с несколькими операционными системами

```yaml
pipeline {
  agent none
  stages {
    stage('Run Tests') {
      matrix {
        axes {
          axis {
            name: 'PLATFORM'
            values: 'macos', 'linux'
          }
        }
        agent { label "${PLATFORM}" }
        stages {
          stage('test') {
            tools { nodejs "node-20" }
            steps {
              dir("scripts/myapp") {
                sh(script: "npm install -g bats")
                sh(script: "bats tests")
              }
            }
          }
        }
      }
    }
  }
}
```

#### Рабочий процесс GitHub Actions для сборки с несколькими операционными системами

```yaml
name: demo-workflow
on:
  push:
jobs:
  test:
    runs-on: ${{ matrix.os }}
    strategy:
      fail-fast: false
      matrix:
        os: [macos-latest, ubuntu-latest]
    steps:
      - uses: actions/checkout@v6
      - uses: actions/setup-node@v4
        with:
          node-version: 20
      - run: npm install -g bats
      - run: bats tests
        working-directory: ./scripts/myapp
```