Bitbucket Pipelines
1. 개요
1. 개요
Bitbucket Pipelines는 Atlassian이 개발한 Bitbucket Cloud에 완전히 통합된 지속적 통합(CI) 및 지속적 배포(CD) 서비스이다. 2016년에 처음 선보인 이 서비스는 개발자가 소스 코드 저장소에 코드 변경 사항을 푸시할 때마다 자동으로 빌드, 테스트, 배포 작업을 실행하는 파이프라인을 구성할 수 있게 해준다. 이를 통해 소프트웨어 개발 팀은 DevOps 관행을 쉽게 도입하여 개발부터 배포까지의 전 과정을 자동화하고 효율성을 높일 수 있다.
Bitbucket Pipelines의 핵심은 저장소 루트에 위치한 bitbucket-pipelines.yml 설정 파일이다. 이 YAML 파일에 파이프라인의 각 단계와 실행할 스크립트를 정의하면, Bitbucket은 Docker 컨테이너 기반의 격리된 환경에서 이를 실행한다. 주요 구성 요소로는 전체 작업 흐름을 정의하는 파이프라인, 파이프라인 내의 개별 작업 단위인 스텝, 스텝이 실행되는 컨테이너 환경인 이미지, 단계 간에 전달할 수 있는 파일인 아티팩트, 그리고 빌드 속도를 높이기 위한 캐시 등이 있다.
이 서비스는 Git 브랜치나 태그에 푸시되는 이벤트를 기반으로 파이프라인을 자동으로 트리거하는 것이 기본 동작 방식이다. 또한 사용자가 수동으로 실행하거나, 풀 리퀘스트가 생성될 때만 실행하는 등 다양한 트리거 조건을 설정할 수 있다. 병렬 실행을 통해 여러 스텝을 동시에 처리하여 전체 실행 시간을 단축하고, 환경 변수를 안전하게 관리하며, 스테이징이나 프로덕션과 같은 특정 배포 환경을 사전에 정의할 수 있는 기능도 제공한다.
Bitbucket Pipelines는 Bitbucket을 주요 버전 관리 시스템으로 사용하는 팀에게 특히 유용하다. 코드 저장소와 CI/CD 도구가 동일 플랫폼에 통합되어 있어 설정이 간편하고, 저장소의 코드 변경 이력과 파이프라인 실행 결과를 한 곳에서 통합적으로 관리할 수 있는 장점이 있다. 이를 통해 팀은 소프트웨어 제공 속도와 품질을 지속적으로 개선하는 데 집중할 수 있다.
2. 핵심 개념
2. 핵심 개념
2.1. bitbucket-pipelines.yml 파일
2.1. bitbucket-pipelines.yml 파일
bitbucket-pipelines.yml 파일은 Bitbucket Pipelines 서비스의 동작을 정의하는 구성 파일이다. 이 파일은 Bitbucket 저장소의 루트 디렉토리에 위치해야 하며, YAML 형식으로 작성된다. 파일의 내용은 코드 변경이 발생했을 때 실행할 빌드, 테스트, 배포 작업의 순서와 방법을 기술한다.
파일의 기본 구조는 파이프라인, 스텝, 스크립트로 구성된다. 최상위에는 pipelines: 키가 오며, 그 아래에 브랜치나 풀 리퀘스트와 같은 특정 이벤트를 트리거로 하는 개별 파이프라인을 정의한다. 각 파이프라인은 여러 개의 스텝으로 이루어지며, 각 스텝은 실행할 Docker 이미지와 그 안에서 수행할 셸 스크립트 명령어들을 포함한다.
이 파일을 통해 개발자는 자동화된 워크플로우를 구축할 수 있다. 예를 들어, 모든 풀 리퀘스트에 대해 자동으로 단위 테스트를 실행하거나, 메인 브랜치에 코드가 병합되면 스테이징 환경에 자동으로 배포하는 규칙을 설정할 수 있다. 또한 환경 변수를 정의하거나, 빌드 산출물인 아티팩트를 저장하거나, 의존성 설치 시간을 줄이기 위한 캐시를 구성하는 것도 이 파일에서 가능하다.
파일 작성 후 저장소에 푸시하면 Bitbucket이 이를 자동으로 인식하여 이후의 코드 변경 사항에 따라 정의된 파이프라인을 실행한다. 따라서 DevOps 실무에서 지속적 통합과 지속적 배포 프로세스를 구현하는 핵심 설정 파일 역할을 한다.
2.2. 파이프라인(Pipeline)
2.2. 파이프라인(Pipeline)
파이프라인은 Bitbucket 저장소에서 코드 변경 사항이 발생할 때 실행되는 자동화된 워크플로우이다. 이는 지속적 통합 및 지속적 배포 프로세스를 정의하는 핵심 단위로, 코드를 빌드, 테스트, 배포하는 일련의 단계를 포함한다. 파이프라인은 저장소 루트에 위치한 bitbucket-pipelines.yml 파일에 의해 구성되며, Git 푸시나 풀 리퀘스트 생성과 같은 이벤트에 의해 자동으로 트리거될 수 있다.
파이프라인은 하나 이상의 스텝으로 구성되며, 각 스텝은 특정 작업을 수행하는 독립적인 실행 환경에서 순차적으로 실행된다. 파이프라인 실행은 Docker 컨테이너 내에서 이루어지며, 사용자는 각 스텝에 적합한 Docker 이미지를 지정할 수 있다. 이를 통해 다양한 프로그래밍 언어와 도구를 위한 일관된 빌드 환경을 제공한다.
파이프라인은 브랜치나 태그에 따라 서로 다른 동작을 정의할 수 있어, 개발 브랜치에서는 테스트만 실행하고 메인 브랜치에서는 추가로 배포를 수행하는 등의 유연한 구성이 가능하다. 또한 병렬 실행을 통해 여러 스텝을 동시에 실행하여 전체 파이프라인의 실행 시간을 단축할 수 있다.
파이프라인 실행 중 생성된 아티팩트는 후속 스텝으로 전달될 수 있으며, 캐시를 활용하여 의존성 설치 시간을 줄일 수 있다. 이러한 설계를 통해 개발자는 코드 변경 사항에 대한 빠른 피드백을 받고, 안정적인 소프트웨어를 효율적으로 제공할 수 있는 CI/CD 흐름을 구축할 수 있다.
2.3. 스텝(Step)
2.3. 스텝(Step)
파이프라인을 구성하는 기본 실행 단위이다. 각 스텝은 파이프라인 내에서 순차적으로 실행되는 독립적인 작업 블록으로, 빌드나 테스트와 같은 특정 작업을 수행한다. 하나의 파이프라인은 여러 개의 스텝으로 구성될 수 있으며, 각 스텝은 별도의 도커 컨테이너에서 실행된다.
스텝은 bitbucket-pipelines.yml 파일 내에서 정의되며, step 키워드로 시작한다. 각 스텝에는 고유한 이름을 지정하고, 실행할 스크립트의 목록을 정의한다. 또한, 해당 스텝에서 사용할 Docker 이미지를 지정하거나, 아티팩트를 저장하거나, 캐시를 활용하는 등의 추가 설정을 포함할 수 있다.
스텝은 기본적으로 정의된 순서대로 실행되지만, 병렬 실행을 위한 설정이나 특정 조건(예: 특정 브랜치에서만 실행)에 따른 실행 제어도 가능하다. 이를 통해 지속적 통합 및 지속적 배포 워크플로우를 유연하게 설계할 수 있다. 각 스텝의 실행 성공 또는 실패는 전체 파이프라인의 상태에 직접적인 영향을 미친다.
2.4. 이미지(Image)
2.4. 이미지(Image)
Bitbucket Pipelines에서 이미지는 파이프라인을 실행하는 컨테이너의 기본 운영 체제와 런타임 환경을 정의한다. 각 스텝은 하나의 Docker 이미지를 기반으로 하는 컨테이너 내에서 실행되며, 이 이미지는 해당 스텝에서 사용할 수 있는 프로그래밍 언어, 도구, 라이브러리 등을 포함한다. 사용자는 Atlassian이 제공하는 공식 이미지나 Docker Hub 등의 공개 레지스트리에서 가져온 커스텀 이미지를 사용할 수 있다.
bitbucket-pipelines.yml 파일에서 이미지는 각 스텝 또는 전역 설정에서 image 키워드를 통해 지정한다. 예를 들어, Node.js 애플리케이션을 빌드하기 위해 node:16 이미지를 사용하거나, Python 프로젝트를 위해 python:3.9-slim 이미지를 선택할 수 있다. 또한, 데이터베이스나 캐시 서버와 같은 추가 서비스를 사용해야 할 경우 services 블록을 통해 별도의 서비스 컨테이너 이미지를 정의하여 메인 스텝 컨테이너와 연결할 수 있다.
적절한 이미지 선택은 파이프라인의 성능과 안정성에 직접적인 영향을 미친다. 경량화된 이미지를 사용하면 컨테이너 시작 시간을 단축하고 실행 속도를 높일 수 있다. 사용자는 프로젝트 요구사항에 맞는 특정 버전의 언어 런타임이나 빌드 도구가 포함된 이미지를 명시적으로 선택함으로써, 개발 환경과 CI/CD 환경의 일관성을 보장할 수 있다.
2.5. 아티팩트(Artifact)
2.5. 아티팩트(Artifact)
아티팩트는 파이프라인의 한 스텝에서 생성된 파일이나 디렉토리를, 동일 파이프라인의 후속 스텝에서 사용할 수 있도록 보존하고 전달하는 기능이다. 예를 들어, 빌드 스텝에서 생성된 실행 파일이나 패키지를 테스트 스텝에서 사용하거나, 테스트를 통과한 결과물을 배포 스텝에 전달하는 데 활용된다. 이를 통해 각 스텝은 독립된 컨테이너 환경에서 실행되더라도 필요한 작업 산출물을 공유할 수 있다.
아티팩트를 정의하려면 bitbucket-pipelines.yml 파일의 스텝 정의 내에 artifacts 키를 사용한다. 사용자는 보존할 파일의 경로를 지정할 수 있으며, 와일드카드 패턴을 사용하는 것도 가능하다. 정의된 아티팩트는 자동으로 Bitbucket Cloud에 업로드되어 저장되며, 파이프라인이 완료된 후에도 기본적으로 14일간 보관된다.
아티팩트는 파이프라인 실행 흐름을 효율적으로 구성하는 데 중요한 역할을 한다. 빌드 결과물을 매번 다시 생성하지 않고 재사용함으로써 전체 CI/CD 프로세스의 속도를 높일 수 있다. 또한, 단위 테스트 리포트, 코드 커버리지 리포트, 혹은 빌드된 Docker 이미지 파일과 같은 중요한 산출물을 보관하여 나중에 검토하거나 배포에 활용할 수 있다.
아티팩트 기능은 캐시와는 구별되는 개념이다. 캐시는 주로 의존성 패키지와 같이 다음 파이프라인 실행 시 재사용하여 빌드 시간을 단축하는 데 목적이 있는 반면, 아티팩트는 현재 실행 중인 파이프라인 내의 스텝 간에 데이터를 전달하는 데 주안점을 둔다.
2.6. 캐시(Cache)
2.6. 캐시(Cache)
캐시는 Bitbucket Pipelines에서 빌드 시간을 단축하기 위한 핵심 기능이다. 파이프라인이 실행될 때마다 의존성이나 빌드 산출물을 처음부터 다시 다운로드하거나 생성하지 않고, 이전 실행에서 저장해둔 데이터를 재사용할 수 있게 해준다. 이를 통해 반복적인 작업의 속도를 높이고, 전체 CI/CD 프로세스의 효율성을 개선한다.
캐시는 bitbucket-pipelines.yml 파일 내에서 정의한다. pipelines 섹션 하위에 definitions를 만들고, 그 안에 caches 키를 사용하여 캐시할 디렉토리 경로를 지정하는 방식으로 구성한다. 각 캐시는 고유한 키로 식별되며, 주로 노드 모듈이나 Gradle 래퍼, Python 가상 환경 패키지 디렉토리 등 빌드에 시간이 많이 소요되는 의존성 파일들을 대상으로 한다.
캐시는 파이프라인의 모든 스텝에서 공유하여 사용할 수 있다. 특정 스텝에서 캐시를 복원한 후, 해당 스텝이나 후속 스텝에서 생성된 파일을 다시 캐시에 저장할 수 있다. 캐시의 수명은 기본적으로 일주일로 설정되어 있으며, 이 기간 동안은 동일한 브랜치의 후속 파이프라인 실행에서 재사용된다. 캐시 정책을 통해 수명을 조정하거나, 캐시 키에 변수를 사용하여 브랜치별로 다른 캐시를 관리할 수도 있다.
적절한 캐시 전략을 수립하는 것은 소프트웨어 개발 생산성 향상에 중요하다. 자주 변경되지 않는 의존성에 대한 캐시를 효과적으로 활용하면, 개발자는 코드 변경에 대한 피드백을 더 빠르게 받을 수 있다. 그러나 캐시된 데이터가 오래되어 빌드 실패를 유발할 수 있으므로, 주기적인 캐시 무효화나 정리도 고려해야 한다.
3. 주요 기능
3. 주요 기능
3.1. 자동 및 수동 트리거
3.1. 자동 및 수동 트리거
Bitbucket Pipelines는 코드 변경에 따라 파이프라인을 자동으로 실행하거나, 필요에 따라 수동으로 트리거할 수 있는 유연한 방식을 제공한다. 자동 트리거는 지속적 통합 및 지속적 배포 워크플로우의 핵심으로, 리포지토리에 대한 푸시나 풀 리퀘스트 생성/업데이트와 같은 특정 이벤트가 발생하면 파이프라인이 자동으로 시작된다. 이는 코드 품질을 지속적으로 확인하고 조기에 문제를 발견하는 데 필수적이다.
수동 트리거는 사용자가 Bitbucket 웹 인터페이스나 API를 통해 직접 파이프라인 실행을 시작하는 방식이다. 이는 주로 스테이징 환경 또는 프로덕션 환경으로의 배포와 같이 승인이 필요한 단계를 실행할 때, 또는 특정 브랜치에 대한 테스트를 임의로 수행하고자 할 때 유용하게 사용된다. 파이프라인 정의 파일에서 특정 스텝을 수동 실행으로 설정할 수 있다.
트리거 설정은 bitbucket-pipelines.yml 파일을 통해 세밀하게 제어할 수 있다. 예를 들어, 특정 브랜치나 태그에 대해서만 파이프라인이 실행되도록 정의하거나, 커밋 메시지에 특정 키워드가 포함된 경우에만 실행을 건너뛰는 등의 규칙을 구성할 수 있다. 이러한 유연성 덕분에 개발 팀은 소프트웨어 개발 라이프사이클의 각 단계에 맞춘 효율적인 CI/CD 프로세스를 설계할 수 있다.
3.2. 브랜치 및 태그별 파이프라인
3.2. 브랜치 및 태그별 파이프라인
Bitbucket Pipelines는 브랜치나 태그에 따라 서로 다른 파이프라인 작업을 정의하고 실행할 수 있는 기능을 제공한다. 이를 통해 개발자는 특정 브랜치에 코드를 푸시하거나 태그를 생성할 때마다 상황에 맞는 자동화된 워크플로우를 실행할 수 있다. 예를 들어, main 브랜치에 대한 푸시는 프로덕션 배포를 위한 빌드와 테스트를 실행하고, 기능 브랜치에 대한 푸시는 단위 테스트만 실행하도록 구성하는 것이 가능하다.
파이프라인 정의는 bitbucket-pipelines.yml 파일에서 이루어지며, branches와 tags 키워드를 사용해 특정 패턴과 일치하는 브랜치나 태그에만 적용될 스텝을 지정한다. 와일드카드 패턴을 사용하여 여러 브랜치를 그룹화하거나, 정확한 브랜치 이름을 명시할 수도 있다. 태그 기반 파이프라인은 일반적으로 공식 릴리스 버전을 생성하거나 특정 환경에 배포할 때 활용된다.
이러한 분기별 설정은 소프트웨어 개발 수명 주기의 각 단계에 적합한 자동화를 구현하는 데 핵심적이다. 개발자는 기능 브랜치에서 빠른 피드백을 받는 동시에, 안정적인 브랜치에서는 더 엄격하고 포괄적인 검증 절차를 거칠 수 있다. 결과적으로 팀은 코드 품질을 유지하면서도 애자일한 개발과 배포 속도를 높일 수 있다.
3.3. 병렬 실행
3.3. 병렬 실행
Bitbucket Pipelines의 병렬 실행 기능은 파이프라인의 전체 실행 시간을 단축하는 데 핵심적인 역할을 한다. 하나의 파이프라인 내에서 정의된 여러 개의 스텝을 동시에 실행함으로써, 순차적으로 처리할 경우 발생하는 대기 시간을 줄이고 개발 생산성을 높인다. 이는 특히 단위 테스트, 통합 테스트, 린트 검사 등 독립적으로 수행 가능한 작업들이 많을 때 효과적이다.
병렬 실행은 bitbucket-pipelines.yml 구성 파일에서 parallel 키워드를 사용하여 설정한다. 사용자는 병렬로 실행하고자 하는 스텝들을 정의하고, 각 스텝은 서로 다른 도커 이미지를 기반으로 하거나 동일한 이미지를 공유할 수 있다. 각 병렬 스텝은 격리된 컨테이너 환경에서 실행되므로 서로의 작업에 영향을 주지 않는다.
구성 요소 | 설명 |
|---|---|
| 병렬 실행을 정의하는 최상위 키. 그 아래에 병렬 스텝 목록을 나열한다. |
병렬 스텝 |
|
단계(Stage) |
|
이 기능은 CI/CD 파이프라인의 효율성을 극대화하지만, 동시 실행 수는 Atlassian이 제공하는 계획에 따라 제한될 수 있다. 또한 병렬 스텝 간에 아티팩트나 캐시를 공유해야 하는 경우에는 추가 구성이 필요하다. 전반적으로 병렬 실행은 빠른 피드백 루프를 구현하는 데 필수적인 DevOps 실천법을 지원한다.
3.4. 환경 변수 관리
3.4. 환경 변수 관리
Bitbucket Pipelines에서 환경 변수 관리는 파이프라인 실행 시 필요한 구성 값과 비밀 정보를 안전하게 정의하고 사용하는 핵심 기능이다. 환경 변수는 파이프라인의 동작을 제어하거나, 외부 서비스(예: Docker 레지스트리, 클라우드 플랫폼, 데이터베이스)에 인증 정보를 제공하는 데 사용된다.
주요 관리 방식은 크게 세 가지로 구분된다. 첫째, Bitbucket Cloud 저장소 설정에서 직접 정의하는 저장소 변수(Repository variables)이다. 이 변수들은 해당 저장소의 모든 파이프라인에서 사용 가능하며, 값을 암호화하여 저장할 수 있어 API 키나 비밀번호 같은 민감 정보를 안전하게 관리할 수 있다. 둘째, 특정 배포 환경(예: 스테이징, 프로덕션)에 연결된 배포 변수(Deployment variables)이다. 이 변수들은 해당 배포 환경으로의 배포를 트리거하는 파이프라인 실행 시에만 주입된다. 셋째, 파이프라인 정의 파일(bitbucket-pipelines.yml) 내에서 직접 variables: 블록을 사용하여 인라인으로 정의하는 방법이다.
환경 변수는 파이프라인의 각 스텝 내 스크립트에서 $변수명 형태로 참조하여 사용한다. 변수의 우선순위가 존재하는데, 일반적으로 스텝 내에서 정의된 변수가 저장소 또는 배포 변수보다 높은 우선순위를 가진다. 이를 통해 특정 스텝에서만 다른 값을 임시로 사용하는 것이 가능하다. 또한, Atlassian은 Bitbucket Pipelines에 기본적으로 제공되는 여러 가지 기본 변수(예: $BITBUCKET_COMMIT, $BITBUCKET_BRANCH)를 가지고 있어, 현재 실행 중인 파이프라인의 컨텍스트 정보를 쉽게 얻을 수 있다.
3.5. 배포 환경 설정
3.5. 배포 환경 설정
배포 환경 설정은 Bitbucket Pipelines에서 지속적 배포를 구현하는 핵심 기능이다. 이를 통해 특정 배포 대상(예: 스테이징 서버, 프로덕션 서버, 클라우드 서비스)에 대한 접속 정보와 보안 자격 증명을 안전하게 관리하고, 파이프라인 스텝에서 이를 참조하여 배포 작업을 수행할 수 있다.
관리자는 Bitbucket Cloud 저장소 설정의 '배포' 메뉴에서 여러 배포 환경(예: 개발, 테스트, 프로덕션)을 정의할 수 있다. 각 환경에는 고유한 이름과 선택적 범주를 지정할 수 있으며, 여기에 환경 변수를 설정하여 API 키, 비밀번호, 서버 주소와 같은 민감한 정보를 저장한다. 이러한 변수는 파이프라인 실행 시 일반 텍스트가 아닌 보안 변수로 주입되어 로그에 노출되지 않는다.
bitbucket-pipelines.yml 파일에서는 특정 스텝을 특정 배포 환경과 연결하여 실행할 수 있다. 이를 통해 배포 단계를 명확히 분리하고, 수동 승인을 요구하거나 특정 브랜치의 코드 변경에 대해서만 프로덕션 배포를 트리거하는 정교한 워크플로우를 구성할 수 있다. 예를 들어, main 브랜치에 대한 머지가 발생하면 자동으로 스테이징 환경에 배포한 후, 수동 승인을 거쳐 프로덕션 환경에 배포하는 파이프라인을 구축할 수 있다.
이 설정은 AWS, Google Cloud, Azure와 같은 주요 클라우드 플랫폼이나 Kubernetes 클러스터, 자체 서버에 대한 배포를 자동화하는 데 필수적이다. 배포 환경별로 서로 다른 자격 증명을 사용함으로써 보안을 강화하고, 배포 대상을 쉽게 전환하며, 인프라 관리의 일관성을 유지할 수 있다.
4. 작성 방법
4. 작성 방법
4.1. 기본 구조
4.1. 기본 구조
Bitbucket Pipelines의 파이프라인은 저장소 루트에 위치한 bitbucket-pipelines.yml 파일로 정의된다. 이 YAML 파일은 파이프라인의 전체 구조와 동작 방식을 기술하는 구성 파일이다. 파일의 최상위에는 파이프라인을 정의하는 pipelines: 키가 위치하며, 그 아래에 브랜치, 태그, 풀 리퀘스트 등 다양한 트리거에 따른 실행 흐름을 세분화하여 기술한다.
파이프라인의 기본 구성 단위는 스텝이다. 각 스텝은 독립적인 컨테이너 환경에서 실행되며, 실행할 스크립트의 순서를 정의한다. 여러 스텝은 순차적으로 실행되어 하나의 작업 흐름을 완성한다. 또한, definitions: 섹션을 통해 공통적으로 사용할 서비스 컨테이너(예: 데이터베이스, 캐시 서버)나 재사용 가능한 스텝을 미리 정의하여 파이프라인 구성의 중복을 줄이고 가독성을 높일 수 있다.
bitbucket-pipelines.yml 파일의 구조는 크게 트리거 정의, 스텝 정의, 그리고 지원 리소스 정의로 구분된다. 트리거 정의에서는 branches:, tags:, pull-requests:와 같은 키를 사용하여 특정 브랜치에 푸시되거나 태그가 생성될 때 실행될 파이프라인을 지정한다. 각 트리거 블록 내부에는 실행될 스텝들의 리스트가 포함된다. 이렇게 모듈화된 구조를 통해 개발 팀은 애플리케이션의 라이프사이클에 맞춰 테스트, 빌드, 배포 작업을 효율적으로 자동화할 수 있다.
4.2. 스크립트 정의
4.2. 스크립트 정의
파이프라인의 각 스텝 내에서 실행할 명령어는 script 섹션을 통해 정의한다. script는 하나의 스텝이 수행할 핵심 작업을 지정하는 곳으로, YAML 배열 형태로 여러 줄의 명령어를 나열할 수 있다. 각 명령어는 순차적으로 실행되며, 한 줄의 명령어가 실패(0이 아닌 종료 코드 반환)하면 해당 스텝은 즉시 실패 처리되고 파이프라인 실행이 중단된다.
script에는 쉘 스크립트 명령어를 직접 작성할 수 있으며, 주로 의존성 설치, 코드 빌드, 테스트 실행, 배포 스크립트 호출 등의 작업을 포함한다. 예를 들어, Node.js 프로젝트의 경우 npm install로 패키지를 설치한 후 npm test로 테스트를 실행하는 식이다. 기본적으로 스텝에 지정된 도커 이미지의 기본 쉘 환경에서 명령어가 실행된다.
script 블록 외에도, before-script와 after-script를 사용하여 주요 작업 전후에 실행될 보조 명령어를 정의할 수 있다. before-script는 script 실행 전에, 예를 들어 환경을 추가로 설정하는 데 사용된다. after-script는 script의 성공 여부와 관계없이 항상 마지막에 실행되며, 로그 수집이나 정리 작업을 수행하는 데 적합하다. 이렇게 스크립트를 구조화함으로써 빌드 프로세스의 각 단계를 명확하게 제어할 수 있다.
4.3. 서비스 컨테이너 사용
4.3. 서비스 컨테이너 사용
파이프라인 스텝의 실행 환경은 기본 이미지로 정의되지만, 데이터베이스나 메시지 브로커와 같은 외부 서비스가 필요한 경우 서비스 컨테이너를 정의하여 사용할 수 있다. 서비스 컨테이너는 파이프라인 스텝과 동일한 도커 호스트 네트워크에서 실행되는 별도의 컨테이너로, 스텝 내의 스크립트에서 접근하여 활용한다.
bitbucket-pipelines.yml 파일 내에서 definitions 섹션 하위에 services를 정의하며, 각 서비스는 사용할 도커 이미지와 포트, 환경 변수 등을 지정한다. 이후 파이프라인이나 개별 스텝에서 정의된 서비스를 참조하여 사용한다. 예를 들어, 애플리케이션의 통합 테스트를 실행하기 위해 PostgreSQL 데이터베이스 서비스 컨테이너를 실행하고, 스텝 스크립트에서 해당 컨테이너의 호스트명(일반적으로 서비스 이름)과 포트로 연결할 수 있다.
서비스 컨테이너는 파이프라인 실행 시 자동으로 시작되며, 연결된 스텝의 실행이 종료되면 함께 정리된다. 이를 통해 테스트나 빌드 과정에 필요한 Redis, MySQL, Elasticsearch 등의 인프라 의존성을 쉽게 구성할 수 있으며, 실제 운영 환경과 유사한 조건에서의 테스트가 가능해진다.
4.4. 조건부 실행
4.4. 조건부 실행
파이프라인의 특정 스텝이나 전체 파이프라인이 특정 조건에서만 실행되도록 구성할 수 있다. 이를 통해 리소스를 효율적으로 사용하고, 필요에 따라 다른 작업 흐름을 정의할 수 있다.
주요 조건부 실행 규칙은 bitbucket-pipelines.yml 파일 내에서 rules 키워드를 사용해 정의한다. 가장 일반적인 조건은 브랜치 이름이나 태그 패턴을 기준으로 한다. 예를 들어, main 브랜치에 푸시될 때만 배포 스텝을 실행하거나, release/* 패턴의 태그가 생성될 때만 공식 빌드를 생성하도록 설정할 수 있다. 또한, 풀 리퀘스트 생성 또는 병합 시에만 특정 테스트 스위트를 실행하는 것도 가능하다.
변경 유형을 기준으로 조건을 걸 수도 있다. pipelines 섹션 하위에 changesets을 정의하여 특정 파일이나 디렉토리가 변경되었을 때만 관련 파이프라인을 트리거하도록 구성할 수 있다. 이는 모노레포 구조에서 특정 서비스나 라이브러리의 코드만 변경되었을 때 해당 부분에 대한 빌드와 테스트만 실행하는 데 유용하다.
조건부 실행은 사용자가 수동으로 파이프라인을 시작할 때도 적용된다. 수동 실행 시 사용자가 정의한 커스텀 파이프라인을 선택하거나, 특정 환경 변수 값을 입력하여 스텝의 동작을 분기시킬 수 있다. 이를 통해 동일한 파이프라인 정의를 유지하면서도, 테스트 환경 또는 프로덕션 환경 등 서로 다른 대상으로의 배포를 상황에 맞게 제어할 수 있다.
5. 사용 사례
5. 사용 사례
5.1. 테스트 자동화
5.1. 테스트 자동화
Bitbucket Pipelines를 사용한 테스트 자동화는 지속적 통합 및 지속적 배포 워크플로우의 핵심 요소이다. 개발자가 Git 저장소의 특정 브랜치에 코드를 푸시하거나 풀 리퀘스트를 생성하면, 미리 정의된 bitbucket-pipelines.yml 파일에 따라 자동으로 테스트 파이프라인이 실행된다. 이를 통해 코드 변경이 기존 기능을 깨뜨리지 않았는지 빠르게 검증하고, 소프트웨어 품질을 유지할 수 있다.
테스트 자동화 파이프라인은 일반적으로 유닛 테스트, 통합 테스트, 엔드투엔드 테스트 등 다양한 수준의 테스트를 포함한다. 파이프라인 정의 파일 내 각 스텝에서 적절한 테스트 프레임워크를 실행하는 스크립트를 작성하여 구현한다. 예를 들어, Node.js 프로젝트라면 npm test 명령어를, Python 프로젝트라면 pytest를 실행하는 스텝을 구성할 수 있다. Bitbucket Pipelines는 각 스텝을 독립된 Docker 컨테이너에서 실행하므로, 테스트에 필요한 특정 런타임 환경을 쉽게 구성할 수 있다.
테스트 결과는 Bitbucket Cloud 인터페이스에서 직접 확인할 수 있으며, 실패한 테스트가 있을 경우 파이프라인 실행이 중단되고 관련 담당자에게 알림이 전달될 수 있다. 이는 버그를 조기에 발견하고 수정하는 데 기여한다. 또한, 병렬 실행 기능을 활용하여 여러 테스트 스위트를 동시에 실행함으로써 전체 피드백 루프 시간을 크게 단축시킬 수 있다.
테스트 자동화는 풀 리퀘스트 기반 개발 흐름과 깊이 연계되어 있다. 대부분의 팀은 master 또는 main 브랜치로의 머지를 허용하기 전에, 풀 리퀘스트에 대한 파이프라인에서 모든 테스트가 통과하도록 요구하는 브랜치 규칙을 설정한다. 이를 통해 결함이 있는 코드가 주요 개발 라인에 통합되는 것을 방지하고, 코드 리뷰 과정의 효율성을 높인다.
5.2. Docker 이미지 빌드 및 푸시
5.2. Docker 이미지 빌드 및 푸시
Bitbucket Pipelines를 사용하면 Docker 이미지를 자동으로 빌드하고 레지스트리에 푸시하는 CI/CD 파이프라인을 쉽게 구성할 수 있다. 이를 통해 애플리케이션의 배포 가능한 단위를 표준화하고, 컨테이너 기반 환경으로의 배포를 자동화하는 데 핵심적인 역할을 한다.
파이프라인 정의 파일인 bitbucket-pipelines.yml에서는 Docker 클라이언트가 사전 설치된 이미지를 사용하거나, 필요한 도구를 직접 설치하는 스텝을 정의한다. 일반적인 흐름은 소스 코드를 기반으로 docker build 명령어를 실행하여 이미지를 생성한 후, Docker Hub, Amazon ECR, Google Container Registry와 같은 외부 레지스트리나 Bitbucket 내부의 패키지 저장소에 docker push 명령어로 이미지를 업로드하는 것이다. 이 과정에서 인증을 위해 환경 변수에 레지스트리 접근 정보를 안전하게 저장하여 사용한다.
이 기능의 주요 사용 사례는 애플리케이션 코드가 변경될 때마다 최신 Docker 이미지를 생성하고 저장하여, 이후 쿠버네티스나 AWS ECS와 같은 오케스트레이션 플랫폼에서 즉시 배포할 수 있도록 준비하는 것이다. 또한, 다단계 빌드를 활용하여 최종 이미지의 크기를 최소화하거나, 특정 브랜치에 푸시될 때만 이미지를 빌드하는 등의 조건부 실행 로직을 적용할 수 있다.
5.3. 다양한 환경으로의 배포
5.3. 다양한 환경으로의 배포
Bitbucket Pipelines는 코드 변경 사항을 다양한 배포 환경으로 자동으로 전달하는 지속적 배포 워크플로우를 구축하는 데 사용된다. 이를 통해 개발 팀은 테스트를 통과한 코드를 스테이징 환경이나 프로덕션 환경 등 목표 환경에 신속하고 안정적으로 릴리스할 수 있다. 파이프라인 구성 파일에서 배포 관련 스텝을 정의하고, 배포 스크립트를 실행하거나 클라우드 서비스의 API를 호출하여 배포를 자동화한다.
주요 배포 대상으로는 AWS, Google Cloud Platform, Microsoft Azure와 같은 퍼블릭 클라우드 컴퓨팅 플랫폼, Heroku 같은 PaaS, 또는 자체 관리하는 서버나 쿠버네티스 클러스터가 있다. 예를 들어, Amazon S3 버킷에 정적 웹사이트를 배포하거나, Elastic Beanstalk에 애플리케이션을 업데이트하며, 도커 레지스트리에 빌드한 Docker 이미지를 푸시한 후 쿠버네티스에서 해당 이미지를 롤아웃하는 작업을 파이프라인에 연계할 수 있다.
배포는 일반적으로 특정 브랜치(예: main 또는 production)에 코드가 머지 되었을 때 트리거되도록 설정한다. 또한, 보안을 위해 환경 변수에 API 키나 비밀번호 같은 민감한 배포 인증 정보를 안전하게 저장하고, 파이프라인 실행 시에만 이를 참조하도록 구성한다. Bitbucket Pipelines의 배포 환경 기능을 사용하면 각 환경별로 변수를 따로 관리하고, 중요한 프로덕션 배포 전에 수동 승인 단계를 설정할 수도 있다.
이를 통해 팀은 소프트웨어 개발 수명주기의 마지막 단계를 자동화하여, 배포 프로세스의 일관성을 높이고 인적 오류를 줄이며, 더 빠른 출시 주기를 달성할 수 있다.
6. 장단점
6. 장단점
6.1. 장점
6.1. 장점
Bitbucket Pipelines의 주요 장점은 Atlassian의 Bitbucket 클라우드 서비스와 긴밀하게 통합되어 있다는 점이다. 이로 인해 별도의 CI/CD 서버를 구성하거나 관리할 필요 없이, 동일한 Atlassian 생태계 내에서 코드 저장소와 빌드 자동화를 원활하게 연동할 수 있다. 사용자는 리포지토리에 bitbucket-pipelines.yml 파일만 추가하면 즉시 파이프라인을 실행할 수 있어 초기 설정이 매우 간편하다.
또한, Docker 컨테이너 기반의 격리된 환경에서 각 빌드가 실행되므로, 일관된 빌드 환경을 보장하고 의존성 충돌 문제를 방지할 수 있다. 사용자는 공식 Docker 허브의 이미지나 사용자 정의 이미지를 자유롭게 선택하여 파이프라인 스텝에 적용할 수 있어 유연성이 높다.
비용 측면에서는 사용한 빌드 시간에 따라 과금되는 모델을 채택하고 있어, 소규모 팀이나 빌드 빈도가 낮은 프로젝트에서도 부담 없이 시작할 수 있다. 무료 계정에도 매월 일정량의 빌드 시간이 제공된다.
마지막으로, Bitbucket의 브랜치, 풀 리퀘스트, 배포 환경과 같은 기능들과의 깊은 통합은 개발 워크플로우를 단순화한다. 예를 들어, 특정 브랜치에 코드가 푸시되거나 풀 리퀘스트가 생성될 때 파이프라인을 자동으로 트리거하거나, 승인된 코드만 특정 환경에 배포하도록 구성하는 것이 용이하다.
6.2. 단점 및 제한 사항
6.2. 단점 및 제한 사항
Bitbucket Pipelines는 Atlassian의 Bitbucket 클라우드 서비스에 완전히 통합되어 편리하지만, 몇 가지 제한 사항과 단점을 가지고 있다. 가장 큰 제한 사항은 실행 시간과 동시 실행 수에 대한 월간 할당량이 존재한다는 점이다. 무료 요금제에서는 매월 50분의 실행 시간과 500MB의 캐시 저장 공간만 제공되며, 유료 요금제에서도 추가 시간 및 동시 실행 슬롯에 따라 비용이 발생한다. 이는 대규모 프로젝트나 빈번한 빌드가 필요한 팀에게는 비용 부담이 될 수 있다.
또 다른 단점은 지속적 통합 서비스가 Bitbucket 클라우드에만 종속되어 있다는 점이다. GitHub이나 GitLab 같은 다른 소스 코드 관리 도구를 사용하는 경우 Bitbucket Pipelines를 활용할 수 없다. 또한 파이프라인 정의는 오직 bitbucket-pipelines.yml 파일을 통해 이루어지며, 웹 인터페이스를 통한 시각적인 파이프라인 편집기는 제공되지 않는다. 이는 초보자에게는 진입 장벽이 될 수 있다.
기능적 측면에서도 몇 가지 제약이 있다. Docker 실행 환경은 리눅스 기반의 컨테이너로 제한되며, Windows나 macOS 환경을 필요로 하는 빌드에는 적합하지 않다. 또한 SSH를 이용한 빌드 에이전트 접속이나 사용자 정의 빌드 에이전트를 설치하는 기능을 지원하지 않아, 실행 환경을 완전히 통제하기 어렵다. 고성능 컴퓨팅 자원이 필요한 특수한 빌드 작업에는 한계가 있을 수 있다.
마지막으로, 고급 지속적 배포 전략을 구현하는 데 필요한 기능이 상대적으로 부족할 수 있다. 복잡한 승인 워크플로우나 정교한 롤백 메커니즘 등을 구성하려면 추가 스크립팅과 외부 도구 연동에 의존해야 하는 경우가 많다. 이는 젠킨스나 GitLab CI/CD 같은 다른 CI/CD 도구에 비해 유연성이 떨어질 수 있는 부분이다.
