TeamCity에서 GitLab으로 마이그레이션

Tier: Free, Premium, Ultimate Offering: GitLab.com, Self-managed, GitLab Dedicated

TeamCity에서 GitLab CI/CD로 마이그레이션하는 경우, TeamCity 워크플로를 복제하고 향상시키는 CI/CD 파이프라인을 생성할 수 있습니다.

주요 유사점 및 차이점

GitLab CI/CD와 TeamCity는 몇 가지 유사점이 있는 CI/CD 도구입니다. GitLab과 TeamCity는 모두:

  • 대부분의 언어에 대해 작업을 실행할 수 있는 유연성을 가지고 있습니다.
  • 온프레미스 또는 클라우드에 배포할 수 있습니다.

또한 두 가지 사이에는 몇 가지 중요한 차이점이 있습니다:

  • GitLab CI/CD 파이프라인은 YAML 형식의 구성 파일에서 구성되며, 이를 수동으로 편집하거나 파이프라인 편집기를 사용할 수 있습니다. TeamCity 파이프라인은 UI에서 구성하거나 Kotlin DSL을 사용하여 구성할 수 있습니다.
  • GitLab은 내장된 SCM, 컨테이너 레지스트리, 보안 스캔 등을 갖춘 DevSecOps 플랫폼입니다. TeamCity는 이러한 기능을 위해 일반적으로 통합에 의해 제공되는 별도의 솔루션이 필요합니다.

구성 파일

TeamCity는 UI에서 구성할 수 있습니다.
또는 Kotlin DSL 형식의 Teamcity Configuration 파일에서 구성할 수 있습니다.
TeamCity 빌드 구성은 소프트웨어 프로젝트가 어떻게 빌드되고, 테스트되고, 배포되어야 하는지를 정의하는 일련의 지침입니다.
구성에는 TeamCity에서 CI/CD 프로세스를 자동화하는 데 필요한 매개변수와 설정이 포함됩니다.

GitLab에서 TeamCity의 빌드 구성에 해당하는 것은 .gitlab-ci.yml 파일입니다.
이 파일은 프로젝트에 대한 CI/CD 파이프라인을 정의하며, 이를 통해 프로젝트를 빌드, 테스트 및 배포하는 데 필요한 단계, 작업 및 명령을 지정합니다.

기능 및 개념 비교

많은 TeamCity 기능 및 개념은 GitLab에서 동일한 기능을 제공하는 등가물로 존재합니다.

작업

TeamCity는 여러 빌드 단계로 구성된 빌드 구성을 사용하며, 이곳에서 코드 컴파일, 테스트 실행 및 아티팩트 패키징과 같은 작업을 실행할 명령 또는 스크립트를 정의합니다.

다음은 Docker 파일을 빌드하고 단위 테스트를 실행하는 Kotlin DSL 형식의 TeamCity 프로젝트 구성 예제입니다:

package _Self.buildTypes

import jetbrains.buildServer.configs.kotlin.*
import jetbrains.buildServer.configs.kotlin.buildFeatures.perfmon
import jetbrains.buildServer.configs.kotlin.buildSteps.dockerCommand
import jetbrains.buildServer.configs.kotlin.buildSteps.nodeJS
import jetbrains.buildServer.configs.kotlin.triggers.vcs

object BuildTest : BuildType({
    name = "Build & Test"

    vcs {
        root(HttpsGitlabComRutshahCicdDemoGitRefsHeadsMain)
    }

    steps {
        dockerCommand {
            id = "DockerCommand"
            commandType = build {
                source = file {
                    path = "Dockerfile"
                }
            }
        }
        nodeJS {
            id = "nodejs_runner"
            workingDir = "app"
            shellScript = """
                npm install jest-teamcity --no-save
                npm run test -- --reporters=jest-teamcity
            """.trimIndent()
        }
    }

    triggers {
        vcs {
        }
    }

    features {
        perfmon {
        }
    }
})

GitLab CI/CD에서는 파이프라인의 일환으로 실행할 작업을 정의합니다.
각 작업은 하나 이상의 빌드 단계를 가질 수 있습니다.

위의 예제에 해당하는 GitLab CI/CD .gitlab-ci.yml 파일은 다음과 같습니다:

workflow:
  rules:
    - if: $CI_COMMIT_BRANCH != "main" || $CI_PIPELINE_SOURCE != "merge_request_event"
      when: never
    - when: always

stages:
  - build
  - test

build-job:
  image: docker:20.10.16
  stage: build
  services:
    - docker:20.10.16-dind
  script:
    - docker build -t cicd-demo:0.1 .

run_unit_tests:
  image: node:17-alpine3.14
  stage: test
  before_script:
    - cd app
    - npm install
  script:
    - npm test
  artifacts:
    when: always
    reports:
      junit: app/junit.xml

파이프라인 트리거

TeamCity 트리거는 빌드를 시작하는 조건을 정의합니다. 여기에는 VCS 변경, 일정 트리거 또는 다른 빌드에 의해 트리거된 빌드가 포함됩니다.

GitLab CI/CD에서 파이프라인은 브랜치 또는 병합 요청 및 새로운 태그에 대한 변경과 같은 다양한 이벤트에 대해 자동으로 트리거될 수 있습니다. 파이프라인은 API를 사용하거나 예약된 파이프라인을 사용하여 수동으로 트리거될 수도 있습니다. 자세한 내용은 CI/CD 파이프라인을 참조하세요.

변수

TeamCity에서는 빌드 매개변수 및 환경 변수를 정의합니다. 빌드 구성 설정에서 정의할 수 있습니다.

GitLab에서는 variables 키워드를 사용하여 CI/CD 변수를 정의합니다.

구성 데이터를 재사용하거나, 더 동적 구성으로 만들거나, 중요한 값을 저장하기 위해 변수를 사용합니다.

변수는 전역으로 또는 작업별로 정의할 수 있습니다.

예를 들어, 변수를 사용하는 GitLab CI/CD .gitlab-ci.yml 파일은 다음과 같습니다:

default:
  image: alpine:latest

stages:
  - greet

variables:
  NAME: "Fern"

english:
  stage: greet
  variables:
    GREETING: "Hello"
  script:
    - echo "$GREETING $NAME"

spanish:
  stage: greet
  variables:
    GREETING: "Hola"
  script:
    - echo "$GREETING $NAME"

아티팩트

TeamCity의 빌드 구성에서는 빌드 프로세스 중에 생성된 아티팩트를 정의할 수 있습니다.

GitLab에서는 어떤 작업도 artifacts 키워드를 사용하여 작업이 완료될 때 저장될 아티팩트 집합을 정의할 수 있습니다. 아티팩트는 이후 작업에서 테스트 또는 배포에 사용할 수 있는 파일입니다.

예를 들어, 아티팩트를 사용하는 GitLab CI/CD .gitlab-ci.yml 파일은 다음과 같습니다:

stage:
  - generate
  - use

generate_cat:
  stage: generate
  script:
    - touch cat.txt
    - echo "meow" > cat.txt
  artifacts:
    paths:
      - cat.txt
    expire_in: 1 week

use_cat:
  stage: use
  script:
    - cat cat.txt

러너

GitLab의 TeamCity 에이전트에 해당하는 것은 러너입니다.

GitLab CI/CD에서 러너는 작업을 실행하는 서비스입니다. GitLab.com을 사용하는 경우, 자신의 자체 관리형 러너를 프로비저닝하지 않고도 작업을 실행하기 위해 인스턴스 러너 풀을 사용할 수 있습니다.

러너에 대한 주요 세부 정보는 다음과 같습니다:

  • 러너는 설정되어 인스턴스, 그룹별로 공유되거나 단일 프로젝트에 전용으로 설정할 수 있습니다.
  • tags 키워드를 사용하여 더 세밀한 제어를 할 수 있으며, 특정 작업과 러너를 연결할 수 있습니다. 예를 들어, 전용, 더 강력한 또는 특정 하드웨어가 필요한 작업에 태그를 사용할 수 있습니다.
  • GitLab은 러너 자동 스케일링 기능을 제공합니다. 필요할 때만 러너를 프로비저닝하고 필요하지 않을 때 축소하는 데 사용하세요.

TeamCity 빌드 기능 및 플러그인

TeamCity에서 빌드 기능 및 플러그인을 통해 활성화되는 일부 기능은
CI/CD 키워드 및 기능을 사용하여 GitLab CI/CD에서 기본적으로 지원됩니다.

TeamCity 플러그인 GitLab 기능
코드 커버리지 코드 커버리지테스트 커버리지 시각화
유닛 테스트 보고서 JUnit 테스트 보고서 아티팩트유닛 테스트 보고서
알림 알림 이메일Slack

마이그레이션 계획 및 수행

다음 권장 단계 목록은 GitLab CI/CD로의 마이그레이션을 신속하게 완료할 수 있었던 조직들을 관찰한 후 작성되었습니다.

마이그레이션 계획 작성

마이그레이션을 시작하기 전에 마이그레이션 계획을 작성하여
마이그레이션 준비를 해야 합니다.

TeamCity에서의 마이그레이션을 준비하면서 다음 질문을 스스로에게 해보세요:

  • 현재 TeamCity 작업에서 사용되는 플러그인은 무엇입니까?
    • 이러한 플러그인이 정확히 무엇을 하는지 알고 있습니까?
  • TeamCity 에이전트에 무엇이 설치되어 있습니까?
  • 사용 중인 공유 라이브러리가 있습니까?
  • TeamCity에서 어떻게 인증하고 있습니까? SSH 키, API 토큰 또는 기타 비밀을 사용하고 있습니까?
  • 파이프라인에서 접근해야 할 다른 프로젝트가 있습니까?
  • 외부 서비스에 접근하기 위해 TeamCity에서 자격 증명이 있습니까? 예를 들어 Ansible Tower,
    Artifactory, 또는 다른 클라우드 제공업체나 배포 대상이 있습니까?

필수 조건

마이그레이션 작업을 시작하기 전에 먼저:

  1. GitLab에 익숙해지세요.
  2. GitLab을 설정하고 구성하세요.

  3. GitLab 인스턴스를 테스트하세요.
    • 러너가 사용 가능하도록 확인하세요. GitLab.com 공유 러너를 사용하거나
      새 러너를 설치할 수 있습니다.

마이그레이션 단계

  1. SCM 솔루션에서 GitLab으로 프로젝트를 마이그레이션하세요.
  2. 각 프로젝트에 .gitlab-ci.yml 파일을 생성하세요.

  3. TeamCity 구성을 GitLab CI/CD 작업으로 마이그레이션하고 이들이 병합 요청에서 직접 결과를 표시하도록 구성하세요.

  4. 클라우드 배포 템플릿,
    환경, 및 Kubernetes용 GitLab 에이전트를 사용하여 배포 작업을 마이그레이션하세요.

  5. 서로 다른 프로젝트 간에 CI/CD 구성을 재사용할 수 있는지 확인한 후,
    CI/CD 템플릿 또는 CI/CD 구성 요소를 생성하고 공유하세요.

  6. 파이프라인 효율성을 참조하여
    GitLab CI/CD 파이프라인을 더 빠르고 효율적으로 만드는 방법을 알아보세요.

여기에서 답변되지 않은 질문이 있는 경우
GitLab 커뮤니티 포럼이 좋은 자원이 될 수 있습니다.