# Jenkins에서 GitHub Actions 마이그레이션

GitHub Actions와 Jenkins는 여러 면에서 유사하므로 GitHub Actions로의 마이그레이션은 비교적 간단합니다.

## 소개

Jenkins와 GitHub Actions 둘 다 코드를 자동으로 빌드, 테스트, 게시, 릴리스 및 배포하는 워크플로를 만들 수 있습니다. Jenkins와 GitHub Actions는 워크플로 구성 측면에서 몇 가지 유사점이 있습니다.

* Jenkins는 워크플로 파일과 유사한 *선언적 파이프라인을* 사용하여 워크플로를 GitHub Actions 만듭니다.
* Jenkins는 *단계를* 사용하여 단계 컬렉션을 실행하는 반면 GitHub Actions 작업을 사용하여 하나 이상의 단계 또는 개별 명령을 그룹화합니다.
* Jenkins 및 GitHub Actions 컨테이너 기반 빌드를 지원합니다. 자세한 내용은 [Docker 컨테이너 작업 만들기](/ko/actions/tutorials/use-containerized-services/create-a-docker-container-action)을(를) 참조하세요.
* 단계 또는 작업을 다시 사용하고 커뮤니티와 공유할 수 있습니다.

자세한 내용은 [GitHub Actions에 대한 이해](/ko/actions/get-started/understand-github-actions)을(를) 참조하세요.

## 주요 차이점

* Jenkins에는 파이프라인을 만들기 위한 두 가지 유형의 구문인 선언적 파이프라인과 스크립팅된 파이프라인이 있습니다.
  GitHub Actions 에서는 YAML을 사용하여 워크플로 및 구성 파일을 만듭니다. 자세한 내용은 [GitHub Actions에 대한 워크플로 구문](/ko/actions/reference/workflows-and-actions/workflow-syntax)을(를) 참조하세요.
* Jenkins 배포는 일반적으로 자체 호스팅되며 사용자는 자체 데이터 센터에서 서버를 유지 관리합니다.
  GitHub Actions는 작업 실행에 사용할 수 있는 자체 실행기를 제공하는 동시에 자체 호스팅 실행기도 지원하여 하이브리드 클라우드 방식을 제공합니다. 자세한 내용은 [자체 호스팅 실행기](/ko/actions/concepts/runners/self-hosted-runners)을(를) 참조하세요.

## 기능 비교

### 빌드 배포

Jenkins를 통해 단일 빌드 에이전트에 빌드를 보내거나 여러 에이전트에 배포할 수 있습니다. 운영 체제 유형과 같은 다양한 특성에 따라 에이전트를 분류할 수도 있습니다.

마찬가지로 GitHub Actions는 작업을 GitHub 호스팅 또는 자체 호스팅 실행기로 보낼 수 있으며, 레이블을 사용하여 다양한 특성에 따라 실행기를 분류할 수 있습니다. 자세한 내용은 [GitHub Actions에 대한 이해](/ko/actions/get-started/understand-github-actions#runners) 및 [자체 호스팅 실행기](/ko/actions/concepts/runners/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`](/ko/actions/reference/workflows-and-actions/workflow-syntax#jobsjob_idruns-on) <br> [`jobs.<job_id>.container`](/ko/actions/reference/workflows-and-actions/workflow-syntax#jobsjob_idcontainer) |
| [`post`](https://jenkins.io/doc/book/pipeline/syntax/#post)     | None                                                                                                                                                                                                                       |
| [`stages`](https://jenkins.io/doc/book/pipeline/syntax/#stages) | [`jobs`](/ko/actions/reference/workflows-and-actions/workflow-syntax#jobs)                                                                                                                                                 |
| [`steps`](https://jenkins.io/doc/book/pipeline/syntax/#steps)   | [`jobs.<job_id>.steps`](/ko/actions/reference/workflows-and-actions/workflow-syntax#jobsjob_idsteps)                                                                                                                       |

## Using 지시문

Jenkins는 지시문을 사용하여 \_선언적 파이프라인\_을 관리합니다. 지시문은 워크플로의 특성 및 실행 방법을 정의합니다. 아래 표에서는 이러한 지시문이 내의 개념에 매핑되는 방법을 보여 줍니다 GitHub Actions.

| Jenkins 지시문                                                                                                        | GitHub Actions                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |
| ------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| [`environment`](https://jenkins.io/doc/book/pipeline/syntax/#environment)                                          | [`jobs.<job_id>.env`](/ko/actions/reference/workflows-and-actions/workflow-syntax#env) <br> [`jobs.<job_id>.steps[*].env`](/ko/actions/reference/workflows-and-actions/workflow-syntax#jobsjob_idstepsenv)                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        |
| [`options`](https://jenkins.io/doc/book/pipeline/syntax/#options)                                                  | [`jobs.<job_id>.strategy`](/ko/actions/reference/workflows-and-actions/workflow-syntax#jobsjob_idstrategy) <br> [`jobs.<job_id>.strategy.fail-fast`](/ko/actions/reference/workflows-and-actions/workflow-syntax#jobsjob_idstrategyfail-fast) <br> [`jobs.<job_id>.timeout-minutes`](/ko/actions/reference/workflows-and-actions/workflow-syntax#jobsjob_idtimeout-minutes)                                                                                                                                                                                                                                                                                                                       |
| [`parameters`](https://jenkins.io/doc/book/pipeline/syntax/#options)                                               | [`inputs`](/ko/actions/reference/workflows-and-actions/metadata-syntax#inputs) <br> [`outputs`](/ko/actions/reference/workflows-and-actions/metadata-syntax#outputs-for-docker-container-and-javascript-actions)                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |
| [`triggers`](https://jenkins.io/doc/book/pipeline/syntax/#triggers)                                                | [`on`](/ko/actions/reference/workflows-and-actions/workflow-syntax#on) <br> [`on.<event_name>.types`](/ko/actions/reference/workflows-and-actions/workflow-syntax#onevent_nametypes) <br> [<code>on.\<push>.\<branches\|tags></code>](/ko/actions/reference/workflows-and-actions/workflow-syntax#onpushbranchestagsbranches-ignoretags-ignore) <br> [<code>on.\<pull\_request>.\<branches></code>](/ko/actions/reference/workflows-and-actions/workflow-syntax#onpull_requestpull_request_targetbranchesbranches-ignore) <br> [<code>on.\<push\|pull\_request>.paths</code>](/ko/actions/reference/workflows-and-actions/workflow-syntax#onpushpull_requestpull_request_targetpathspaths-ignore) |
| [`triggers { upstreamprojects() }`](https://jenkins.io/doc/book/pipeline/syntax/#triggers)                         | [`jobs.<job_id>.needs`](/ko/actions/reference/workflows-and-actions/workflow-syntax#jobsjob_idneeds)                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              |
| [Jenkins cron syntax](https://jenkins.io/doc/book/pipeline/syntax/#cron-syntax)(Jenkins cron 구문)                   | [`on.schedule`](/ko/actions/reference/workflows-and-actions/workflow-syntax#onschedule)                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           |
| [`stage`](https://jenkins.io/doc/book/pipeline/syntax/#stage)                                                      | [`jobs.<job_id>`](/ko/actions/reference/workflows-and-actions/workflow-syntax#jobsjob_id) <br> [`jobs.<job_id>.name`](/ko/actions/reference/workflows-and-actions/workflow-syntax#jobsjob_idname)                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |
| [`tools`](https://jenkins.io/doc/book/pipeline/syntax/#tools)                                                      |                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   |
| \[                                                                                                                 |                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   |
| GitHub-호스팅 러너의 사양]\(/actions/concepts/runners/github-hosted-runners#preinstalled-software-for-github-owned-images) |                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   |
| [`input`](https://jenkins.io/doc/book/pipeline/syntax/#input)                                                      | [`inputs`](/ko/actions/reference/workflows-and-actions/metadata-syntax#inputs)                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |
| [`when`](https://jenkins.io/doc/book/pipeline/syntax/#when)                                                        | [`jobs.<job_id>.if`](/ko/actions/reference/workflows-and-actions/workflow-syntax#jobsjob_idif)                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |

## 순차 스테이지 사용

### 병렬 작업 처리

Jenkins는 병렬로 `stages``steps` 실행할 수 있습니다.
GitHub Actions 는 작업을 병렬로 실행하고 단계 수준 구문을 사용하여 작업 내에서 동시에 단계를 실행할 수도 있습니다. 자세한 내용은 [GitHub Actions에 대한 워크플로 구문](/ko/actions/reference/workflows-and-actions/workflow-syntax#jobsjob_idstepsbackground)을 참조하세요.

| Jenkins 병렬처리                                                        | GitHub Actions                                                                                                                      |
| ------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------- |
| [`parallel`](https://jenkins.io/doc/book/pipeline/syntax/#parallel) | [`jobs.<job_id>.strategy.max-parallel`](/ko/actions/reference/workflows-and-actions/workflow-syntax#jobsjob_idstrategymax-parallel) |

### 행렬

둘 다 GitHub Actions 와 Jenkins를 사용하면 행렬을 사용하여 다양한 시스템 조합을 정의할 수 있습니다.

| Jenkins                                                                  | GitHub Actions                                                                                                                                                                                      |
| ------------------------------------------------------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| [`axis`](https://jenkins.io/doc/book/pipeline/syntax/#matrix-axes)       | [`strategy/matrix`](/ko/actions/how-tos/write-workflows/choose-what-workflows-do/run-job-variations#about-matrix-strategies) <br> [`context`](/ko/actions/reference/workflows-and-actions/contexts) |
| [`stages`](https://jenkins.io/doc/book/pipeline/syntax/#matrix-stages)   | [`steps-context`](/ko/actions/reference/workflows-and-actions/contexts#steps-context)                                                                                                               |
| [`excludes`](https://jenkins.io/doc/book/pipeline/syntax/#matrix-stages) | None                                                                                                                                                                                                |

### 단계를 사용하여 작업 실행

Jenkins는 `steps`를 `stages`에서 그룹화합니다. 각 단계는 스크립트, 함수 또는 명령일 수 있습니다. 마찬가지로, GitHub Actions는 `jobs`의 특정 그룹을 실행하기 위해 `steps`를 사용합니다.

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

## 일반 작업의 예

### `cron`을 사용하여 파이프라인을 실행하도록 예약하기

#### `cron`을(를) 사용한 Jenkins 파이프라인

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

#### GitHub Actions`cron`을 사용하는 워크플로

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

`schedule` 이벤트 및 허용되는 Cron 구문에 대한 자세한 내용은 [워크플로를 트리거하는 이벤트](/ko/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@v7
        with:
          node-version: 20
      - run: npm install -g bats
      - run: bats tests
        working-directory: ./scripts/myapp
```