Github Actions

프로젝트의 Workflow를 쉽게 구성할 수 있도록 하는 Github의 기능.


목표

  • 테스트 자동화
  • 빌드 자동화
  • 원격 저장소(s3)에 Artifacts 파일 업로드
  • Slack Notification


Github Secrets

원격 레포지토리에 업로드 할 수 없는 소스 코드를 Github Actions에서 사용하기 위함.

  1. 안드로이드 빌드 패스워드 (KEY_PASSWORD, UPLOAD_PASSWORD)
  2. 안드로이드 릴리즈 키
  3. AWS 정보
  4. Slack Webhook Endpoint


테스트 자동화

jobs:
  install-and-test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - name: Install npm dependencies
        run: |
          yarn install && npx jetify          
      - name: Build typescript & run all tests
        run: |
          yarn build && yarn test --forceExit --detectOpenHandles
  • yarn, npm, npx 등의 패키지 관리 라이브러리는 기본적으로 설치되어 있음
  • Actions 환경에서 테스트 실행 후 종료되지 않는 이슈가 발생한다면 --forceExit --detectOpenHandles 옵션을 추가하여 실행할 것


빌드 자동화

  1. 의존성 설치
build-android:
  needs: [install-and-test]
  runs-on: ubuntu-latest
  steps:
    - uses: actions/checkout@v2
    - name: Install npm dependencies
      run: |
        yarn install && npx jetify
  • needs 에 본 작업 실행 전 필요한 작업을 작성함 (동기적으로 실행)


  1. Release Key 발급
- name: Generate Release Key
  run: |
    echo "$" | base64 -d > android/app/app-key.keystore
  • xx.keystore 파일은 깃허브에 업로드 하지 않기 때문에 파일을 base64로 전환한 후 Github Secrets로 등록하여 사용 ($)


  1. Build
- name: Build Android Release
  run: |
    cd android && ./gradlew assembleRelease -PAPP_STORE_PASSWORD='$' -PAPP_KEY_PASSWORD='$' && cd ..
  • 안드로이드 빌드 패스워드 2가지를 Github Secrets로 등록하여 사용


  1. Branch 이름 추출
- name: Extract branch name
  shell: bash
  run: echo "##[set-output name=branch;]$(echo ${GITHUB_REF#refs/heads/})"
  id: extract_branch
  • S3 업로드 시 파일 이름에 작업 브랜치 이름을 사용하기 위하여 ymlkey로 등록한 후 사용함


  1. S3 업로드
- name: Upload artifact to S3
  uses: shallwefootball/upload-s3-action@v1.1.2
  with:
    aws_key_id: $
    aws_secret_access_key: $
    aws_bucket: $
    source_dir: 'android/app/build/outputs/apk/release/'
    destination_dir: release-apk:$  
  • AWS 계정 정보(key_id, secret_access_key)와 bucket 정보를 입력해야 함


  1. Slack Notification
- name: Slack notification
  if: success()
  uses: rtCamp/action-slack-notify@master
  env:
    SLACK_CHANNEL: '@username'
    SLACK_COLOR: '#3278BD'
    SLACK_MESSAGE: https://s3.ap-northeast-2.amazonaws.com/{BUCKET_NAME}/{FILE_PATH}/{FILE_NAME}
    SLACK_TITLE: 'App Build 성공'
    SLACK_USERNAME: 'build-bot'
    SLACK_WEBHOOK: $
  • Slack Incomming webhook을 이용하여 슬랙에 메세지를 전송
  • Webhook Endpoint는 Github Secrets에 등록하여 사용함
  • SLACK_MESSAGE에는 업로드된 apk 파일을 다운로드 할 수 있는 public endpoint를 기입함