평소에도 CI/CD를 쓰긴하지만 이미 구축된 파이프라인을 사용하기 때문에
직접 깃허브 액션을 통해 구축해보고 싶었습니다.
저희가 배포를 할때 어떤 프로세스를 거치는지 확인해보면
빌드 > 테스트 > 배포
이렇게 3단계를 거치게 됩니다.
그건 당연한거 아닌가요? 라고 생각하실 수 있습니다.
만약 배포하는데 시간이 많이 소요 되지않는다면 수동으로 해도 되지만
배포를 자주 해야하거나 배포 프로세스가 복잡해서 시간이 걸리는 경우
개발자가 일일히 하다가 실수라도 나면 머리 아프겠죠?
CI/CD를 통해서 빌드부터 테스트, 배포까지의 과정을 자동화 해둔다면
개발자는 개발에만 신경쓰면되고 배포 할땐 미리 구축해둔 CI/CD 파이프라인을 통해서
결과물을 받아서 배포할 수 있게 됩니다.
CI는 빌드 및 테스트 를 자동화
CD는 배포를 자동화
먼저 CI/CD를 구축하고 싶은 레포지터리에 들어가서 메뉴를 보시면 Actions 란 탭이 있습니다.
들어가보시면
이런 화면이 나오는데 안드로이드는 어딨는거지??
Continuous integration 에서 view all을 누르면
Android CI Configure를 눌러줍시다!
그러면 해당 코드가 나올텐데
해당 코드의 형식은 YAML 입니다.
Flutter를 해보셨으면 익숙한 형식이지만
대부분은 익숙하지 않을 겁니다.
이참에 익숙해져봅시다!
on:
push:
branches: [ "master" ]
pull_request:
branches: [ "master" ]
해당 코드는 master에 push 또는 PR 이벤트가 발생하면 CI/CD를 실행하도록
지정해줍니다.
jobs:
build:
Jobs는 실행할 작업을 정의합니다.
runs-on: ubuntu-latest
빌드 작업이 실행될 환경을 정의합니다. 여기서는 최신 버전의 Ubuntu 환경(Default)을 지정해줍니다.
steps:
- uses: actions/checkout@v3
- name: set up JDK 11
uses: actions/setup-java@v3
with:
java-version: '11'
distribution: 'temurin'
cache: gradle
- name: Grant execute permission for gradlew
run: chmod +x gradlew
- name: Build with Gradle
run: ./gradlew build
작업이 실행될 순서를 정의합니다.
여기에서 실행하고 싶은 작업들을 나열해줍니다.
- name: hello world
run: echo "Hello World!!"
아주 간단하게 하고 싶은 작업을 만들어 줬습니다.
뭐든 처음할땐 Hello World가 기본이죠?
해당 작업을 추가해준후
Commit changes...를 눌러줍시다.
커밋을 해주고 Actions 탭에 보시면 우리가 만든 CI/CD가 돌아가고 있는 것을
확인 할 수 있습니다.
(사진은 위의 코드와 다른 CI 입니다.)
저는 자바 17을 사용하기 때문에 자바 17로 설정해줬습니다.
아마 여러분도 헬로월드 정도는 아주 잘 찍힐겁니다.
시나리오에 따라 CI/CD를 구축해보겠습니다.
CI
1. 배포할땐 master 브랜치를 통해 배포 할거니까 master에 대해서만 이벤트를 받을래!
2. CI/CD는 우분투 최신환경에서 돌려야지
3. 자바 버전은 17을 쓸래
4. 빌드전에 클린을 먼저 하고싶어
5. 코드가 공식 컨벤션에 틀린게 없는지 검사하고 싶어
6. 작성된 Unit Test를 실행해서 검사하고 싶어
7. 작성된 Android Test를 실행해서 검사하고 싶어
CD
1. 전체 빌드하는건 너무 오래걸리니까 적당히 apk만 뽑고싶어
2. debug apk를 업로드해서 다운받고싶어
3. release apk를 업로드해서 다운받고싶어
해당 시나리오를 코드로 나타냈습니다.
name: Android CI
on:
push:
branches: [ "master" ]
pull_request:
branches: [ "master" ]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: set up JDK 17
uses: actions/setup-java@v3
with:
java-version: '17'
distribution: 'temurin'
cache: gradle
- name: Grant execute permission for gradlew
run: chmod +x gradlew
- name: Clean Bulid
run: ./gradlew clean
- name: Run ktlint
run: ./gradlew ktlintCheck
- name: Run Unit Test
run: ./gradlew test
- name: Run Android Test
uses: reactivecircus/android-emulator-runner@v2
with:
api-level: 24
target: default
arch: x86
profile: Nexus 6
script: ./gradlew connectedCheck --stacktrace
run: ./gradlew connectedAndroidTest
- name: Assemble
run: ./gradlew assemble
- name: Upload Debug APK
uses: actions/upload-artifact@v3
with:
name: debug
path: ./app/build/outputs/apk/debug/app-debug.apk
- name: Upload Release APK
uses: actions/upload-artifact@v3
with:
name: release
path: ./app/build/outputs/apk/release/app-release-unsigned.apk
사실 위 코드를 보면 그냥 step 뒤에 작업을 하나하나 추가해준게 끝이죠?
- name: task name
run: ./gradlew some command name
성공적으로 잘 빌드되었네요
빌드의 결과물인 apk도 잘 다운되네요
자주하는 단순 프로세스를 자동화 해두면
귀찮은 일이 줄어드니 개발에 집중 할 수 있게 됩니다.
경량화된 CI/CD인 Github Actions 같이 맛보시죠 ^^
기본적으로 CI/CD는 입문이 조금 어렵고 기본적으로 배포를 고려한
프로세스이니 아직 학생이시거나 안드로이드 초보다 싶으면
일단 CI/CD는 보류 해두시고 어느정도 가닥이 잡히고 배포를 편하게
하고 싶을 때 시작하는 것을 추천드립니다.
감사합니다.
Android ci yml에서 cd도 같이 하시는건가요?