Notice
Recent Posts
Recent Comments
Link
«   2025/05   »
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
Archives
Today
Total
관리 메뉴

몽드로이드

[Android] 안드로이드 CI / CD 맛보기 본문

안드로이드

[Android] 안드로이드 CI / CD 맛보기

딤제 2024. 5. 9. 04:30

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. 실행결과