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. push와 pull_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 플랫폼으로, 안드로이드 빌드를 간편히 자동화한다.
'코딩' 카테고리의 다른 글
[코루틴 (1)] 코루틴 탄생 배경과 기본 개념 (0) | 2025.01.15 |
---|---|
고급 스크립팅 & 커스텀 플러그인 (0) | 2025.01.15 |
Gradle 빌드 속도 & 성능 최적화 (0) | 2025.01.13 |
Build Variants & 멀티 모듈 구조 (0) | 2025.01.12 |
안드로이드 빌드 시스템과 Gradle 기초 (0) | 2025.01.10 |