본문 바로가기
AI,Notion,GitHub/GitHub

[GITHUB]Actiond을 통한 Android 자동화

by 디선 2025. 2. 23.

GitHub Action으로 자동화 할 것

  • CI/CD
  • 테스트 코드 자동화
  • keystore 관리
  • tag/release 버전 자동화

CI, 테스트코드, keystore, tag/release 버전 자동화

과정

  • keystore 파일을 GitHub Action으로 처리할 것이다

  • GitHub Repository Setting의 Secrets and variables의 Actions로 이동한다

  • 이곳에 keystore 정보들을 입력할 것이다

  • New repository secret에 store의 store password, key alias, key password를 만들어준다

  • keystore 파일도 base 64의 형식으로 secret에 넣어줄건데, 파일을 넣을 수 없기 떄문에 base64 -i key.jks -o keystore-b64.txt 를 터미널에 입력해서 텍스트 파일을 만든후 내용을 넣으면 된다

  • 그 후 Build Gradle에 이걸 이용하기 위한 코드를 넣을 것이다

    signingConfigs{  
      create("release") {  
          storeFile = file("release.keystore")  
          storePassword = System.getenv("STORE_PASSWORD")  
          keyAlias = System.getenv("KEY_ALIAS")  
          keyPassword = System.getenv("KEY_PASSWORD")
          }
      }
  • storePassword, keyAlias, keyPassword는 모두 secret에 이름과 동일시 해야한다

  • GitHub Repository 에서 Action 탭에서 Android 검색

  • Android CI를 Configure

  • 받아온android.yml을 수정하여 작성해준다.

      name: Android CI
    
      #GITHUB_TOKEN이 저장소 내 파일을 생성, 수정, 삭제할 수 있는 **쓰기** 권한을 부여받는다
      permissions:
        contents: write
    
      #master 브랜치에 대한 push와 pull_request 이벤트가 발생할 때 Workflow가 실행된다.
      on:
        push:
          branches: [ "master" ]
        pull_request:
          branches: [ "master" ]
    
      jobs:
        build:
          #ubuntu-latest환경에서 작업을 시작한다.
          runs-on: ubuntu-latest
    
          #저장소의 최신 코드를 가져온다.
          #Temurin 배포판의 JDK 17을 설치하여 안드로이드 빌드 환경을 구성한다.
          #cache: grdle 은 Gradle 빌드에 필요한 의존성, 캐시 파일, 그리고 기타 빌드 관련 데이터를 저장해 두는 역할
          steps:
          - name: 체크아웃 (Checkout)
            uses: actions/checkout@v4
            with:
              fetch-depth: 1
          - name: 셋업 JDK 17
            uses: actions/setup-java@v4
            with:
              java-version: '17'
              distribution: 'temurin'
              cache: gradle
    
          #GitHub Secrets에 저장된 base64 인코딩된 keystore 파일(KEYSTORE_B64)을 디코딩하여 release.keystore 파일로 app에 저장한다
          - name: 디코드 Keystore
            run: |
              echo "$KEYSTORE_BASE_64" | base64 --decode > app/release.keystore
            env:
              KEYSTORE_BASE_64: ${{ secrets.KEYSTORE_BASE_64 }}
    
          - name: Gradlew에 대한 실행 권한 부여
            run: chmod +x gradlew
    
          - name: 유닛테스트 실행
            run: ./gradlew test --parallel
    
          #env 섹션에선 secret에서 keystore의 정보를 읽어온다
          #이렇게 빌드된 bundle은 runner 내부에만 존재했다가 사라진다
          - name: app 빌드
            run: ./gradlew :app:bundleRelease --parallel
            env:
              STORE_PASSWORD: ${{ secrets.STORE_PASSWORD }}
              KEY_ALIAS: ${{ secrets.KEY_ALIAS }}
                  KEY_PASSWORD: ${{ secrets.KEY_PASSWORD }}
    
          - name: commit 메시지에서 버전 추출(제목에서 x.y.z 부분만)
            id: extract_version
            run: |
                subject=$(echo '${{ github.event.head_commit.message }}' | head -n 1)
                version=$(echo "$subject" | grep -E -o '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}')
                echo "version=$version" >> $GITHUB_OUTPUT
    
          #Release 노트를 작성해준다
          #github.event_name == 'push'는 push일때만 작동하겠다는 뜻이다
          #위에서 가져온 버전으로 Tag와 Release를 지정해주고 commit 메시지로 내용을 채운다
          - name: Release 노트 생성
            uses: actions/create-release@v1
            if: github.event_name == 'push'
            id: create_release
            env:
                  GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
            with:
              tag_name: ${{ steps.extract_version.outputs.version }}
              release_name: ${{ steps.extract_version.outputs.version }}
              body: ${{ github.event.head_commit.message }}
    
          #위에서 만들어진 aab파일을 release 노트에 첨부한다
          - name: Bundle 파일 릴리즈에 첨부
            if: github.event_name == 'push'
            uses: actions/upload-release-asset@v1
            env:
              GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
            with:
              upload_url: ${{ steps.create_release.outputs.upload_url }}
              asset_path: ./app/build/outputs/bundle/release/app-release.aab
              asset_name: app-release.aab
              asset_content_type: application/vnd.android.package-archive

CD 자동화

  • 추가예정
반응형

'AI,Notion,GitHub > GitHub' 카테고리의 다른 글

Library 배포용 Apache License 받기(Android Studio)  (0) 2025.02.18
Git-Flow  (0) 2025.02.04