일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- KMM
- 안드로이드
- Navigation
- CICD
- github Actions
- compose
- Android
- shared element
- IOS
- transition animation
- Hilt
- Today
- Total
몽드로이드
[Android] 안드로이드 CI / CD 맛보기 본문
1. CI / CD ?
CI : Continuous Integration (지속적 통합)
CD : Continuous Deployment (지속적 배포)
CI / CD 는 위와같은 의미를 가지고 있습니다.
개발부터 배포까지의 과정을 자동화 할 수 있습니다.
혼자 개발을 진행할 때는 크게 필요성을 느끼지 못했지만 프로젝트 규모가 커지고 함께하는 사람들이 많아지면
개발에만 집중할 수 있도록 CI / CD 자동화가 필요하다고 생각합니다.
따라서 Github Actions로 CI / CD를 경험해보겠습니다.
2. CI 구성
name: Android CI
on:
push:
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
빌드부터 테스트까지의 과정입니다.
on
on:
push:
branches: [ "master" ]
위의 코드는 "master" 브랜치에 push가 진행되면 작동하겠다는 의미입니다. push뿐만 아니라 pr에도 적용 가능합니다.
jobs
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
jobs는 실행시킬 작업을 의미하고 build는 실행시킬 작업의 이름입니다.
steps 아래의 작업을 순차적으로 진행하게 됩니다.
build,ktlint,unit test 정도의 작업을 진행했습니다.
3. CD
fail_Msg:
name: Fail Discord Msg
needs: [build]
if: always() && needs.build.result == 'failure'
runs-on: ubuntu-latest
steps:
- name: Discord Webhook Action
uses: tsickert/discord-webhook@v5.4.0
with:
webhook-url: ${{ secrets.DISCORD_SECRET }}
embed-title: "${{github.repository}}"
embed-description : "${{github.event.head_commit.message}} \n Test Fail"
embed-url : "https://github.com/DimJe/CICD-Test"
success_Msg:
name: Success Discord Msg
needs: [build]
if: needs.build.result == 'success'
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: Build Apk
run: bash ./gradlew assembleRelease --stacktrace
- uses: r0adkll/sign-android-release@v1
name: Sign app APK
# ID used to access action output
id: sign_app
with:
releaseDirectory: app/build/outputs/apk/release
signingKeyBase64: ${{ secrets.KEY_BASE64 }}
alias: ${{ secrets.KEY_ALIAS }}
keyStorePassword: ${{ secrets.KEYSTORE_PASSWORD }}
keyPassword: ${{ secrets.KEY_PASSWORD }}
env:
BUILD_TOOLS_VERSION: "34.0.0"
# Example use of `signedReleaseFile` output -- not needed
- name: Upload a Build Artifact
uses: actions/upload-artifact@v4
with:
name: Signed app bundle
path: ${{steps.sign_app.outputs.signedReleaseFile}}
- name: Discord Webhook Action
uses: tsickert/discord-webhook@v5.4.0
with:
webhook-url: ${{ secrets.DISCORD_SECRET }}
embed-title: "${{github.repository}}"
embed-description : "${{github.event.head_commit.message}}\nTest Success"
embed-url : "https://github.com/DimJe/CICD-Test"
filename: ${{steps.sign_app.outputs.signedReleaseFile}}
create_pr:
name: Create Pull Request
needs: [success_Msg]
if: needs.success_Msg.result == 'success'
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Create PR
uses: thomaseizinger/create-pull-request@master
with:
github_token: ${{ secrets.TOKEN }}
head: ${{ github.ref }}
base: release
title: "${{github.event.head_commit.message}}"
CD 부분 구성입니다.
빌드부터 테스트가 성공했다면 디스코드로 메시지와 signed apk 파일을 전송하고 release 브랜치로 pr을 날리도록 구성했습니다. 대부분 slack 메시지를 보내는 것으로 알고 있지만 혼자서 경험해보는 것이기에 디스코드 webhook을 통해 메시지를 전달해보겠습니다.
fail_Msg:
name: Fail Discord Msg
needs: [build]
if: always() && needs.build.result == 'failure'
success_Msg:
name: Success Discord Msg
needs: [build]
if: needs.build.result == 'success'
runs-on: ubuntu-latest
위의 코드를 보면 ci 부분 코드와는 다른 부분이 있습니다.
위의 코드로 설명하자면 build 작업이 끝나야 실행되며 build 작업의 성공 실패에 따라 다른 작업이 실행됩니다.
빌드 및 테스트 과정에서 실패했다면 실패 메시지를 성공했다면 성공 메시지와 함께 배포용 apk 파일을 디스코드 메시지로 전송하게 됩니다.
그 후 release 브랜치로 pr을 날리면서 cd 과정이 끝나게 됩니다.
4. 실행결과