코딩

CI/CD 파이프라인 연동

Eastpark 2025. 1. 14. 22:56
728x90
반응형

1. CI/CD 개념 간단 정리

 

1.1 CI(Continuous Integration)

지속적인 통합을 의미한다.

새로운 코드를 저장소(Repository)에 푸시할 때마다 자동으로 빌드와 테스트를 실행해, 문제점을 조기에 발견하고 통합한다.

빌드 오류나 테스트 실패가 발생하면, 즉시 알림을 받아 해결할 수 있다.

 

1.2 CD(Continuous Delivery/Deployment)

지속적인 배포(Delivery/Deployment)로, CI 과정을 통과한 코드를 자동으로 배포 환경까지 전달하는 것.

안드로이드의 경우, Play Store 베타 트랙, 사내 배포, 원격 서버 등에 자동으로 APK 또는 AAB를 업로드하고 알림을 보낼 수 있다.

 

CI/CD가 잘 구축되어 있다면, 앱 품질을 일정 수준 이상으로 유지하면서도 개발 속도를 크게 높일 수 있다.


2. Jenkins로 빌드 자동화하기

 

2.1 Jenkins 기본 개념

오픈소스 CI 서버로서, 플러그인이 매우 풍부하고 커스텀하기 쉽다.

자체 서버(온프레미스)에 설치하고, 안드로이드 빌드를 위한 Gradle 환경을 구성한다.

 

2.2 기본 구성

1. Jenkins 설치 & 플러그인 추가

안드로이드 빌드를 위해서는 JDK, Android SDK, Gradle 등의 환경 변수가 올바르게 설정되어야 한다.

“Gradle Plugin”, “Git Plugin” 등 Jenkins 플러그인을 설치한다.

2. 프로젝트(Job) 생성

“Freestyle Project” 또는 “Pipeline” 종류를 선택한다.

Git 저장소를 연동해, 특정 브랜치에 변경이 있을 때마다 Jenkins가 빌드를 트리거한다.

3. Gradle 태스크 실행

Jenkins 내에서 ./gradlew assembleDebug 또는 ./gradlew assembleRelease 등을 실행하도록 설정한다.

빌드 결과(APK or AAB)를 아티팩트로 보관하거나, 별도 스토리지/Repo에 업로드할 수 있다.

 

2.3 Pipeline 스크립트 예시

pipeline {
    agent any
    
    stages {
        stage('Checkout') {
            steps {
                git branch: 'develop', url: 'https://github.com/username/repository.git'
            }
        }
        stage('Build') {
            steps {
                sh './gradlew clean assembleDebug'
            }
        }
        stage('Test') {
            steps {
                sh './gradlew test'
            }
        }
    }
    post {
        success {
            echo "Build Success!"
        }
        failure {
            echo "Build Failed!"
        }
    }
}

Pipeline 방식으로 구성하면, 여러 Stage(Checkout, Build, Test 등)를 순차적으로 자동 실행한다.

성공/실패 시 알림(이메일, Slack) 연동도 플러그인을 통해 손쉽게 구성할 수 있다.


3. GitHub Actions를 활용한 CI/CD

 

3.1 GitHub Actions 개요

GitHub 저장소에 Workflow 파일(.yml)을 추가해, Pull Request나 Push 이벤트마다 빌드·테스트 등을 실행할 수 있다.

GitHub 저장소만 있다면, 별도의 CI 서버 없이 바로 시작할 수 있다는 점이 장점이다.

 

3.2 예시 Workflow (android.yml)

name: Android CI

on:
  push:
    branches: [ "main" ]
  pull_request:
    branches: [ "main" ]

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
    - name: Check out code
      uses: actions/checkout@v3

    - name: Set up JDK 17
      uses: actions/setup-java@v3
      with:
        distribution: 'temurin'
        java-version: 17

    - name: Cache Gradle
      uses: actions/cache@v3
      with:
        path: ~/.gradle/caches
        key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }}
        restore-keys: ${{ runner.os }}-gradle-

    - name: Build with Gradle
      run: ./gradlew clean assembleDebug

    - name: Test
      run: ./gradlew test

1. pushpull_request 이벤트 발생 시 해당 Workflow가 동작한다.

2. JDK 버전을 지정해 안드로이드 빌드 환경을 준비한다.

3. actions/cache를 이용해 Gradle 캐시를 활성화하면 빌드 속도가 빨라진다.

4. 빌드 및 테스트 스크립트를 실행해, 실패 시 자동으로 PR에 댓글을 남기거나 알림을 보낼 수 있다.

 

3.3 Play Store에 자동 업로드

GitHub Actions에서, Play Publisher Action 등을 활용해 릴리스 채널이나 테스트 채널(Internal, Alpha, Beta)에 APK/AAB를 자동 업로드할 수 있다.

배포 후 Slack이나 이메일로 알림을 보내도록 설정하면, 완전 자동화 CI/CD 파이프라인이 완성된다.


4. Bitrise로 간편하게 빌드 자동화

 

4.1 Bitrise 개념

클라우드 기반 CI/CD 플랫폼으로, 안드로이드/ iOS/ 웹 등 다양한 스택을 지원한다.

GUI 중심으로 워크플로우를 설정할 수 있어, 코드를 직접 작성하지 않고도 빌드를 구성하기에 편리하다.

 

4.2 간단한 Workflow 예시

1. 프로젝트 연결: Bitrise에 GitHub/Bitbucket/GitLab 계정을 연동하고, 특정 저장소를 선택한다.

2. Workflow 편집: “Steps”를 GUI로 쌓아서 정의한다. 예: Git Clone → Gradle Runner → Unit Tests → Deploy to Slack.

3. Trigger Map: 원하는 브랜치나 PR 이벤트에 따라 빌드를 트리거할 수 있다.

 

4.3 장단점

장점: UI가 직관적이고, 각종 서드파티 스텝(Step)들이 이미 준비되어 있어 배포·알림 연동이 쉽다.

단점: 무료 플랜에서는 동시 빌드나 빌드 시간에 제한이 있을 수 있으며, 특정 기능(예: 사설 네트워크 연동)은 유료 플랜에서만 제공한다.


5. CI/CD 구축 시 고려 사항

 

1. 빌드 환경 통일

JDK, Gradle, Android SDK 버전을 명확히 지정해, 로컬 빌드와 CI 빌드 결과가 일치하도록 한다.

Gradle Wrapper를 사용해 프로젝트마다 버전을 고정한다.

 

2. 개인 정보 & 보안

Play Store 배포용 서비스 계정( JSON 키 파일 )이나 API Key, 서명 키스토어(KeyStore) 등을 안전하게 저장해야 한다.

GitHub Actions의 Secrets, Bitrise의 Secret Env Vars 기능 등을 활용해, 소스 코드에 민감 정보를 직접 올리지 않도록 한다.

 

3. 테스트 전략

단위(Unit) 테스트, UI(Espresso or Compose) 테스트, API 통합 테스트 등을 CI 파이프라인 내에서 자동화한다.

주기적으로 스모크 테스트를 실행하거나, 별도의 장치나 에뮬레이터에서 인스트루먼트 테스트를 돌려볼 수도 있다.

 

4. 알림 및 보고

빌드/테스트 결과를 Slack, 이메일, 이슈 트래커 등과 연결해 팀원들이 빠르게 피드백 받을 수 있도록 한다.

Jenkins의 경우 ‘Email Extension Plugin’, GitHub Actions의 경우 actions/notifications, Bitrise는 ‘Slack Step’ 등 플러그인이 준비되어 있다.


마무리

 

이번에는 CI/CD 파이프라인 연동에 대해 이야기를 나눴습니다.

1. Jenkins: 오픈소스 CI 서버로, 자유도가 높고 플러그인이 풍부하다.

2. GitHub Actions: GitHub 저장소와 밀접히 연동되며, .yml 파일로 CI를 손쉽게 구성한다.

3. Bitrise: 클라우드 기반 GUI 중심의 CI/CD 플랫폼으로, 안드로이드 빌드를 간편히 자동화한다.

728x90
반응형