본문 바로가기
Git, GitHub

GitHub Actions로 Flutter 앱 빌드하기

by 2Plus 2022. 4. 3.

Photo by Patrick Hendry on Unsplash

 

 이번에 서버와 CI/CD 목적으로 사용할 맥 미니를 한 대 들였다. 먼저 간단하게 GitHub Actions를 사용해서 Flutter 앱 프로젝트를 빌드하고 잘 빌드가 되는지 정도만 테스트를 해본 내용을 남긴다.

 

반응형

 

Self-hosted Runner

 먼저, GitHub에서 제공해주는 Actions Runner를 사용할 수도 있는데 무료 버전의 경우 사용량 제한도 있고 맥 미니를 들였으니 다양하게 활용해보기 위해서 맥 미니로 GitHub Actions를 실행할 것이다. 이를 위해 GitHub Repository에서 Self-hosted Runner를 등록해줘야 한다.

 

 GitHub Actions를 사용할 Repository에 들어가서 Settings - Actions - Runners로 들어간다. 예전에 사용했던 것과 이번에 등록한 Mac Mini가 이미 보이는데, 따로 설정한 적이 없다면 아무것도 없을 것이다. 위에 있는 “New self-hosted runner” 버튼을 클릭해서 새로 추가해주면 된다.

 

 새로 추가를 하면 이런 화면이 나온다. 굉장히 잘 되어 있고 터미널에서 입력할 커맨드도 순서대로 알려준다. config.sh 부분에서 커맨드를 통해 runner의 이름 등을 추가로 설정할 수 있는데, 내용에 따라 마음에 드는 대로 설정해주면 된다. 나머지는 여기에서 알려주는 순서대로 커맨드를 입력해가며 진행하면 된다.

cf. M1 맥의 경우 ./config.sh를 할 때 에러가 발생할 수도 있다. 이 때, 사용하는 터미널을 로제타로 실행해주고 config 후 다시 원래대로 실행해주면 정상적으로 동작한다.

 

 

GitHub Actions Workflow 설정

만들어준 Runner를 사용할 Workflow를 작성해주자. Repository에서 Actions에 들어가서 New workflow를 선택해주면 된다. yaml 파일을 통해 작성하는 방식이니 로컬에서 파일 작성 후 올려도 상관은 없지만, 이번에는 깃헙 사이트에서 작성을 했다. 로컬에서 새로 만드는 경우 Repository의 루트에서 .github/workflows경로에 yaml 파일을 작성해주면 된다.

 

 먼저 이런 식으로 작성을 해주었다. 맨 위의 name은 해당 workflow의 이름을 정해주면 된다. on에는 어떤 이벤트일 때, 어떤 브랜치일 때 해당 workflow가 실행될지를 작성해주면 된다.

 이번에 작성하는 내용은 push나 pull request시 모든 브랜치에서 항상 동작하도록 하였다. 현재 master와 release 브랜치만 사용하고 있다. 추후에 dev 브랜치를 추가하여 이때는 파이프라인이 돌지 않게 사용할 수도 있어서 명시적으로 두 가지 브랜치만 적어주었다. release는 추후에 deploy까지 동작하도록 다른 workflow를 추가할 계획이다.

 jobs에서 어떤 runner에서 어떤 것들을 할지 작성해주면 된다. 우선 아까 설정한 mac mini runner에서 실행되도록 runs-on 설정을 해주고 우선 checkout만 하도록 한다.

 

 그 다음에 안드로이드용 appbundle, iOS 앱을 빌드하는 것을 추가해준다. 그런데 이렇게 하면 안드로이드 빌드시 keystore가 없어서 에러가 발생한다. Android와 iOS 앱 모두 release용으로 빌드할 때 서명 키가 필요한데, 중요한 키이므로 GitHub에는 업로드하지 않는다. iOS의 경우는 맥 미니에 인증서 등이 세팅되어 있어서 빌드 자체는 문제가 없다. 하지만 추후에 deploy까지 할 경우에는 이와 관련된 추가 작업들을 진행해줘야 할 것 같다. 안드로이드의 경우는 로컬에서 사용하는 keystore와 정보들을 GitHub Secrets에 추가하여 사용하면 된다. 이 부분은 아래에서 설명한다.

 

반응형

 

GitHub Secrets 추가

 GitHub의 Repository에서 Settings - Security - Secrets - Actions 순서로 들어가준다. git 저장소에 노출된 상태로 저장되는 것이 아니지만, 환경 변수로 등록해두고 사용이 필요한 경우에 값들을 암호화된 상태로 저장해두고 사용할 수 있는 기능이다. 우측 위에 New repository secret을 선택하여 Key-Value 형태로 추가할 수 있다.

 상단의 ANDROID_KEYSTORE_BASE64의 경우는 jks 파일을 encoding하여 등록한 것이고, 나머지 값 4가지는 key.properties에 작성되어 있는 값들을 등록한 것이다.

 

 먼저 위와 같이 로컬의 key.properties에서 사용하고 있는 내용들을 Secret들로 등록해주면 된다.

 

 참고로, android-app의 build.gradle 파일에서 signing configs와 build types 부분이 위와 같이 사용되고 있어야 파일에서 읽어와 사용하게 된다.

 

 이번에는 jks keystore 파일을 업로드 하기 전에 encoding을 해주는 작업을 하면 된다. 터미널에서 위와 같은 커맨드를 사용하여 jks 파일을 base64 encoding 할 수 있다. 결과로 나온 텍스트 파일의 내용을 복사해서 GitHub Secret으로 업로드해주면 된다.

 

 

GitHub Secrets 사용

 이제 앞서 추가한 키 값들을 runner에서 빌드시 사용할 수 있도록 파일을 만들어주면 된다. ${{ secrets.KEY~ }}의 형태로 사용할 수 있다. 키 네 가지를 key.properties 파일에 작성해주도록 하면 된다.

 

 앞서 인코딩했던 jks 파일을 다시 디코딩하여 jks 파일로 만들어주면 끝이다. 위와 같이 해주면 된다.

 

 

Artifact 업로드

 Android appbundle의 경우는 빌드 후에 GitHub Artifact에 업로드까지 되도록 추가해보았다.

 

최종 결과

앞서 진행한 작업들의 최종 형태이다.

 

 각 스텝이 잘 성공한 것을 확인할 수 있다.

 

 Workflow의 결과 요약 화면에 안드로이드 appbundle도 잘 올라가 있는 것을 볼 수 있다.

 

 

추후 진행 계획

 추후에 좀 더 정리해서 unit test 체크와 lint 체크 등의 작업을 추가하고, release 빌드에서는 android와 iOS에 deploy까지 자동으로 처리되도록 진행할 계획이다.

반응형

'Git, GitHub' 카테고리의 다른 글

Git Commit Message Convention  (117) 2022.02.03
Git remote URL 변경 방법 (https, SSH 변경 포함)  (2) 2020.11.28

댓글