게임 엔진/Unity

Github Action으로 Unity 자동 빌드 제작해보기 (CI/CD) - 3편

데브준우 2024. 3. 23. 04:45

Github Action으로 Unity 자동 빌드 제작해보기 (CI/CD) - 1편

https://dev-junwoo.tistory.com/148

 

Github Action으로 Unity 자동 빌드 제작해보기 (CI/CD) - 1편

이번에는 유니티 빌드를 깃허브 액션으로 쉽게 자동화 하는 작업을 해보았다. 깃허브 액션 -> 자동빌드 -> 빌드 파일 Nas 업로드 -> Slack에 Nas로 업로드의 과정을 거친다. CI/CD CI(Continuous Integration) -

dev-junwoo.tistory.com

 

 

Github Action으로 Unity 자동 빌드 제작해보기 (CI/CD) - 2편

 

https://dev-junwoo.tistory.com/149

 

Github Action으로 Unity 자동 빌드 제작해보기 (CI/CD) - 2편

Github Action으로 Unity 자동 빌드 제작해보기 (CI/CD) - 1편 https://dev-junwoo.tistory.com/148 Github Action으로 Unity 자동 빌드 제작해보기 (CI/CD) - 1편 이번에는 유니티 빌드를 깃허브 액션으로 쉽게 자동화 하는

dev-junwoo.tistory.com

 

깃허브 액션으로 유니티 자동 빌드까지는 완료했다.

이제는 알림과 파일 업로드를 해보자.


 

Slack에 알림 보내기

앱 생성 및 연결

 

빌드를 하고나서 됐는지 계속 깃허브로 들어가서 확인을 할 필요는 없기 때문에, 슬랙으로 알림을 보내보려 한다.

나는 슬랙으로 하지만, 알림을 받는 방법은 무궁무진하니 편한걸로 하면 된다.

 

https://api.slack.com/apps

 

Slack API: Applications | Slack

Your Apps Don't see an app you're looking for? Sign in to another workspace.

api.slack.com

무료 버전으로 혼자 만들어도 상관없다. 

들어가서 앱을 만들어야 한다.

 

 

앱을 새로 만들어준다.

 

 

해당 앱으로 들어가서 Incoming Webhooks를 활성화해주고 아래 버튼을 클릭 해준다.

 

 

워크스페이스에 만들어둔 채널(빌드 알림을 띄울)을 선택해준다.

 

 

그러면 이런 URL이 하나 나오는데, 우리는 이것을 이용하면 된다. 

복사하자.

 

 

 

유니티 라이센스와 아이디,비번을 Secrets에 입력했듯이, 

해당 URL도 secrets에 등록하여 사용하면 된다.

 


깃허브 액션으로 슬랙에 메세지 보내기

 

깃허브 액션 마켓플레이스에서 슬랙을 검색하면 가장 별이 많이 달려있는 것을 사용했다.

https://github.com/marketplace/actions/action-slack

 

action-slack - GitHub Marketplace

You can notify slack of GitHub Actions

github.com

 

name: Notify Slack
on: workflow_dispatch

permissions: write-all

jobs:
  Notify_To_Slack:
    runs-on: ubuntu-latest
    steps:

     - name: Notify To Slack
       uses: 8398a7/action-slack@v3.16.2
       with:
          status: ${{ job.status }}
          fields: repo,message,commit,author,action,eventName,ref,workflow,job,took,pullRequest # selectable (default: repo,message)
       env:
        SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }} # required
       if: always() # Pick up events even if the job fails or is canceled.

 

 

 

위의 yml파일을 작성해서 워크플로우를 실행하니 저절로 이런 포맷이 맞춰져서 날아온다.

 


Nas에 업로드하기

 

Nas에 아무 설정도 안하고 업로드 하는것은 실패했다.

대신 Nas를 FTP로 사용하여 업로드 하는 방식은 성공했다.

 

Nas를 FTP로 사용하는법은 검색하면 정말 많이 나오고 설정도 어렵지 않다.

그리고 이과정을 AWS의 S3로 바꿔도 좋다.

 

https://github.com/marketplace/actions/ftp-file-upload

 

#WorkFlow 이름
name: 🛸 Build Android  

#WorkFlow 실행 이벤트
on:
  workflow_dispatch: #workflow_dispatch는 Github Action에서 눌렀을때 Event

#권한 설정
permissions: write-all

#전역 변수 설정
env: 
 FILE_NAME: 'Build_${{github.run_number}}'  #빌드 파일 이름 전역변수로 세팅

#실행 할 Job 목록
jobs:
  build: 
    name: Unity Build
    runs-on: ubuntu-latest #job을 실행 시킬 환경(우분투)
    steps:

      # Check Out (레포지토리 가져오기)
      - name: check Out
        uses: actions/checkout@v4
        with:
          fetch-depth: 0
          lfs: true

      # Cache Library
      - name: Cache Library
        uses: actions/cache@v4.0.2
        with: 
          path: Library
          key: Library-${{ hashFiles('Assets/**', 'Packages/**', 'ProjectSettings/**') }}
          restore-keys: |
            Library-

      # Unity Build
      - name: Unity Build
        uses: game-ci/unity-builder@v4
        env:
          UNITY_LICENSE: ${{ secrets.UNITY_LICENSE }}
          UNITY_EMAIL: ${{ secrets.UNITY_EMAIL }}
          UNITY_PASSWORD: ${{ secrets.UNITY_PASSWORD }}
        with:
          targetPlatform: Android
          buildName: ${{ env.FILE_NAME }}

      # Upload To Nas
      - name: Upload BuildFile To Nas 
        if: success() 
        uses: tomasbkk/action-ftp-upload@v1.0
        with:
          user: ${{ secrets.NAS_ID }}
          password: ${{ secrets.NAS_PASSWORD }}
          host: ${{ secrets.NAS_HOST }}
          src: build/Android/${{ env.FILE_NAME }}.apk
          dest: web/${{ env.FILE_NAME }}.apk

 


총 코드

 

#WorkFlow 이름
name: 🛸 Build Android  

#WorkFlow 실행 이벤트
on:
  workflow_dispatch: #workflow_dispatch는 Github Action에서 눌렀을때 Event

#권한 설정
permissions: write-all

#전역 변수 설정
env: 
 FILE_NAME: 'Build_${{github.run_number}}'  #빌드 파일 이름 전역변수로 세팅

#실행 할 Job 목록
jobs:
  build: 
    name: Unity Build
    runs-on: ubuntu-latest #job을 실행 시킬 환경(우분투)
    steps:

      # Check Out (레포지토리 가져오기)
      - name: check Out
        uses: actions/checkout@v4
        with:
          fetch-depth: 0
          lfs: true

      # Cache Library
      - name: Cache Library
        uses: actions/cache@v4.0.2
        with: 
          path: Library
          key: Library-${{ hashFiles('Assets/**', 'Packages/**', 'ProjectSettings/**') }}
          restore-keys: |
            Library-

      # Unity Build
      - name: Unity Build
        uses: game-ci/unity-builder@v4
        env:
          UNITY_LICENSE: ${{ secrets.UNITY_LICENSE }}
          UNITY_EMAIL: ${{ secrets.UNITY_EMAIL }}
          UNITY_PASSWORD: ${{ secrets.UNITY_PASSWORD }}
        with:
          targetPlatform: Android
          buildName: ${{ env.FILE_NAME }}

      # Upload To Nas
      - name: Upload BuildFile To Nas 
        if: success() 
        uses: tomasbkk/action-ftp-upload@v1.0
        with:
          user: ${{ secrets.NAS_ID }}
          password: ${{ secrets.NAS_PASSWORD }}
          host: ${{ secrets.NAS_HOST }}
          src: build/Android/${{ env.FILE_NAME }}.apk
          dest: web/${{ env.FILE_NAME }}.apk

      #결과에 따라 다운로드 URL 설정
      - name: Set URL based on job status
        if: always()
        run: |
          if [ "${{ job.status }}" == "success" ]; then
            echo "URL=나스URL입력하는곳/${{env.FILE_NAME}}.apk" >> $GITHUB_ENV
            echo "URLTEXT=다운로드" >> $GITHUB_ENV
          else #실패 했을때 URL
            echo "URL=www.github.com" >> $GITHUB_ENV
            echo "URLTEXT=깃허브" >> $GITHUB_ENV
          fi
   
      - name: Notify To Slack
        if: always()
        uses: 8398a7/action-slack@v3.16.2
        with:
          status: custom
          fields: workflow,job,repo,author,took
          custom_payload: |
            {
              attachments: [{
                color: '${{ job.status }}' === 'success' ? 'good' : '${{ job.status }}' === 'failure' ? 'danger' : 'warning',
                text: `*빌드 결과*: ${{ job.status }}\n\n *Workflow*: ${process.env.AS_WORKFLOW}\n\n *Repository*: ${process.env.AS_REPO}\n\n*실행한 사람*: ${process.env.AS_AUTHOR}\n\n*실행 시간*: ${process.env.AS_TOOK}\n\n *빌드 파일*: <${{ env.URL }}|${{ env.URLTEXT }}>`,
                mrkdwn_in: ["text"],
              }]
            }
        env:
          SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }}

 

내가 원하는대로 커스텀하기위해 Slack Notify 부분이 좀 더러워진것도 있는데 아직 미숙해서가 큰것같다.

Slack쪽 페이로드를 설정하는 부분을 좀 더 깔끔하게 하는 방법이 있을것같다..

저부분은 입맛에 따라 바꿔도 상관없다.

 

 

실행 시간에 조금 문제가 있지만..

이렇게 쉽게(?) 자동화를 마무리 했다.