2021. 5. 6. 18:03ใ๐ฑAndroid/๐ฉ๐ป๐ป Android ๊ฐ๋ฐ ์ผ์ง
+) 2021.05.23
apk ์ถ์ถ ํ ์ค์น์ '์ ํ๋ฆฌ์ผ์ด์ ์ด ์ค์น๋์ง ์์์ต๋๋ค' ์ค๋ฅ๊ฐ ์์์ต๋๋ค.
'./gradlew assembleRelease' ๊ฐ ์๋ Debug apk๋ก './gradlew assembleDebug' github action ์ฝ๋๋ฅผ ์์ ํ๋ฉด ๋ฉ๋๋ค !
(./gradlew assembleDebug' ์ apk ๋ช ๋ ํ์ธ ํ ์์ ํด์ผํจ!)
Github CI/CD๋ฅผ ๊ฐ๋จํ๊ฒ ๋์์ฃผ๋ Github Action์ ์ด์ฉํ์ฌ apkํ์ผ์ slack์ผ๋ก ์ถ์ถํ๋ ๋ฐฉ๋ฒ์ ๋ํด ์ ์ด๋ณด๋๋ก ํ ๊ฒ์ : )
Github Action์ด๋?!
Automate, customize, and execute your software development workflows right in your repository with GitHub Actions. You can discover, create, and share actions to perform any job you'd like, including CI
๊นํ๋ธ ์์ฒด์์ ์ํ๋ ์์ ๋ค์ ์ง์ ํ๊ณ , ์ค์ ํ์ฌ ์์ workflow๋ฅผ ์๋์ผ๋ก ์คํ์ํค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค.
Github Action์ ํตํด CI/CD ์ํฌ ํ๋ก์ฐ๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค!
์ฌ๋ ์ฑ ๋ง๋ค๊ธฐ
Slack ์ฑ๋์ด ์๋ค๋ ์ ์ ํ์ ๋จผ์ ์ํฌ ํ๋ก์ฐ ๋ง๋ค๊ธฐ ์ ์ถ์ถํ apk๋ฅผ ์ฌ๋์ ๋ณด๋ด์ฃผ๋ ์ฌ๋ ์ฑ์ ๋ง๋ค์ด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
์๋ ํ์ด์ง์์ ์ฌ๋ ์ฑ์ ๋ง๋ค ์ ์์ต๋๋ค!
์๋ ํ์ด์ง ๋ค์ด๊ฐ Create New App์ ํด๋ฆญํด์ฃผ์ธ์!
์ํ๋ ์ฑ ์ด๋ฆ๊ณผ ์ฌ๋ ์ฑ๋์ ์ ํํด์ฃผ์ธ์!
์ฌ๋ ์ฑ ๊ถํ ์ค์ ๋ฐ Bot Token ๋ฐ๊ธ ๋ฐ๊ธฐ
apk ํ์ผ์ ์ฌ๋์ ๋ณด๋ด๋ ค๋ฉด write์ ๊ถํ์ด ํ์ํฉ๋๋ค!
Features -> OAuth&Permissions ํญ์ ๋ค์ด๊ฐ ์๋๋ก ์คํฌ๋กค ํ, Scopes ์์ Bot Token Scopes์ files:write ๊ถํ์ ์ถ๊ฐํด์ฃผ์ธ์!
์ ๋๋ก ์ถ๊ฐํ์๋ฉด ์๋ ์ฌ์ง๊ณผ ๊ฐ์ด ์ถ๊ฐ๊ฐ ๋ฉ๋๋ค!
๊ทธ ๋ค์ Bot์ Token์ ๋ฐ๊ธ ๋ฐ๊ธฐ ์ํด ๋ค์ ์๋ก ์คํฌ๋กคํ์ฌ Install to Workspace ๋ฅผ ๋๋ฌ ์ค๋๋ค : )
ํด๋ฆญ ํ๋ฉด ์๋์ ๊ฐ์ ์ฐฝ์ด ๋จ๋๋ฐ ์ด๋, ํ์ฉ์ ๋๋ฌ์ฃผ์ธ์!
ํ์ฉ์ ๋๋ฅด์๋ฉด Bot User OAuth Token์ด ์์ฑ ๋ฉ๋๋ค !!
์ด ๊ฐ์ github secrets ์ ๋ฑ๋ก์ด ํ์ํ ๊ฐ ์ค ํ๋ ์ ๋๋ค!
Webhooks Token ๋ฐ๊ธ ๋ฐ๊ธฐ
์ฌ๋์ ์์ฑํ app์ด ๋ฉ์ธ์ง๋ฅผ ๋ณด๋ด๋ ค๋ฉด Activate Incoming Webhooks๊ฐ ON ์ํ๊ฐ ๋์ด์ผํฉ๋๋ค.
Features -> IncomingWebhooks ํ์ด์ง๋ฅผ ๋๋ฅด๋ฉด ์ด๊ธฐ์๋ Off ์ํ๋ก ๋์ด ์์ต๋๋ค.
On์ผ๋ก ๋ฐ๊ฟ์ฃผ์ธ์!
On์ผ๋ก ๋ฐ๊พธ๊ฒ ๋๋ฉด ์๋จ์ ๊ฒฝ๊ณ ์ฐฝ์ด ๋จ๊ฒ ๋ฉ๋๋ค! ๊ฒฝ๊ณ ์ฐฝ์ reinstall your app์ ๋๋ฌ์ฃผ์ธ์!!
reinstall your app์ ๋๋ฅด๊ฒ ๋๋ฉด ์๋์ ์ฑ๋์ ์ถ๊ฐํ ์ ์์ต๋๋ค !
์ํ๋ ์ฑ๋์ ์ ํ ํ, ํ์ฉ์ ๋๋ฅด๊ณ ์ฌ๋ ํด๋น ์ฑ๋์ ๋ค์ด๊ฐ๋ณด๋ฉด, ์๋์ ๊ฐ์ด ์ฑ๋์ apk_deploy๊ฐ ์ถ๊ฐ ๋ ๊ฒ์ ์ ์ ์์ต๋๋ค!!
์คํฌ๋กค ํ๋ฉด, ์๋์ WebhookUrl ๊ฐ์ด ์์ต๋๋ค. ์ด ๊ฐ ๋ํ, github secrets์ ์ถ๊ฐํด์ผ๋ ๊ฐ์ ๋๋ค : )
์ฌ๋์ apk_deploy ์ฐ๊ฒฐํ๊ธฐ
์์์ ์ถ๊ฐ๋ ๋์์ง๋ง ์ฐ๊ฒฐ์ด ๋ ์ํ๋ ์๋๋๋ค. ๊ผญ! apk๋ฅผ ๋ณด๋ด๋ ์์ ์ ํ์๋ ค๋ฉด apk_deploy์ ์ฌ๋ ์ฐ๊ฒฐ์ด ํ์ํฉ๋๋ค.
์ด ์์ ์ ํ์ง ์๊ณ ๊ทธ๋ฅ ๋์ด๊ฐ์๋ฉด ๋ค์ github action ์ฝ๋์์ apk๋ฅผ ์ฌ๋์ ๋ณด๋ผ๋ channel not in ์๋ฌ๊ฐ ๋ฐ์ํฉ๋๋ค!!
์ฌ๋ ํด๋น ์ํฌ์คํ์ด์ค์ ๋ค์ด๊ฐ๋ฉด ์๋ ์ฑ ์ด๋ผ๋ ์นดํ ๊ณ ๋ฆฌ๊ฐ ์์ต๋๋ค.
์ฑ ์ถ๊ฐ๋ฅผ ๋๋ฌ ์ฃผ์ธ์ !!
์ฑ ์ถ๊ฐ๋ฅผ ๋๋ฅด์๋ฉด, ์ฑ์ ๊ฒ์ํ์ค ์ ์์ต๋๋ค. ์๊น ์์์ ๋ง๋ค์ด์ค ์ฑ ์ด๋ฆ์ธ apk_deploy๋ฅผ ๊ฒ์ํ์ฌ, ์ถ๊ฐํด์ฃผ์ธ์!
์๋์ ๊ฐ์ด ์ถ๊ฐ๋ ๊ฒ์ ์ ์ ์์ต๋๋ค : )
apk_deploy๋ฅผ ์ ํํ ๋ค ์ํ๋ ์ฌ๋ ์ฑ๋์ ์ถ๊ฐํด์ฃผ์ธ์!
์ถ๊ฐ ํ, ํด๋น ์ฑ๋์ ๋ค์ด๊ฐ๋ณด๋ฉด ์๋์ ๊ฐ์ ๋ฉ์ธ์ง๋ฅผ ๋ณผ ์ ์์ต๋๋ค.
์ฌ๋์ apk๋ฅผ ์ ๋ฌํ๋ app์ ์์ฑํ ์ฐ๊ฒฐํ๋ ๋ชจ๋ ๊ณผ์ ์ ๋๋ฌ์ต๋๋ค!!
์ด์ github action์ ๋ง๋ค์ด ๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค!!
Github Action Secret ๊ฐ ์ถ๊ฐํ๊ธฐ
Github Actions๋ฅผ ์ค์ ํ ๋ ํฌ์งํ ๋ฆฌ๋ก ์ด๋ํด์ฃผ์ธ์!
์ด๋ํ, Settings -> Secrets ์ New repository secret์ ์ถ๊ฐํ์ฌ ์ํ๋ ์ด๋ฆ์ผ๋ก ์์์ ์์ฑํ ๊ฐ์ ์ถ๊ฐํด์ฃผ์๋ฉด ๋ฉ๋๋ค !!
SLACK_CHANNEL_DEPOLY : ํด๋น ์ฑ๋ ๋ช ๋๋ ์ฑ๋ id ๊ฐ
์ ๋ ์์์ apk_deploy ์ฑ์ ์ฐ๊ฒฐํ ์ฑ๋๋ช ์ด apk ์ด๋ฏ๋ก apk๋ฅผ ๋ฃ์ด์ฃผ์์ต๋๋ค!
SLACK_READ_WRITE_TOKEN : ์์์ ๋ง๋ Bot์ ํ ํฐ ๊ฐ
SLACK_WEBHOOK_URL : ์์์ ๋ง๋ค์ด์ค WebHook Url ์ฃผ์ ๊ฐ
Github Action ์ฝ๋ ์์ฑํด์ฃผ๊ธฐ
์ด์ ์ง์ง ๋ง์ง๋ง ๋จ๊ณ์ธ Github actions๋ฅผ ๋ง๋ค์ด์ฃผ๋ฉด ๋์ ๋๋ค!
Actions -> New workflow๋ฅผ ํตํด github actions๋ฅผ ๋ง๋ค์ด apk ๋ฅผ ์ถ์ถํ๊ณ , slack์ ๋ณด๋ด๋ workflow๋ฅผ ์์ฑํด ๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
์๋์ ๊ฐ์ ํ ํ๋ฆฟ์ผ๋ก workflows ์ฝ๋๊ฐ ๋ฏธ๋ฆฌ ์์ฑ๋์ด ์์ต๋๋ค. ์ฝ๋๋ฅผ ์์ ํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
name : ํด๋น github action ์ด๋ฆ
on:
# Trigger the workflow on push or pull request,
# but only for the main branch
push:
branches:
- main
pull_request:
branches:
- main
push ๋๋ pull_request์ branch ๋ช ์ ์ถ๊ฐํ์ฌ ํด๋น branch๋ช ์์ push, pull_request๊ฐ ๋ฐ์ํ์ ๋ ์์ฑํ github action workflow๋ฅผ ์คํํ ์ ์๋๋ก ์ค์ ํ ์ ์์ต๋๋ค!
steps: ์ํ๋ ์์ (์์ฐจ์ ์ผ๋ก ์์ฑ)
- Java JDK ์ค์น
- name: Set up JDK 1.8
uses: actions/setup-java@v1
with:
java-version: 1.8
- ํ์ฌ ๋ ์ง ๊ตฌํ๊ธฐ
- name: Get current date
id: date
run: echo "::set-output name=date::$(date +'%Y-%m-%d')"
- Build ํ๊ธฐ
- name: Build APK
run: bash ./gradlew assembleRelease --stacktrace
- apk ํ์ผ slack์ ์ ๋ฌํ๊ธฐ
์๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํ์ฉํ์ฌ apk๋ฅผ ์ถ์ถํ๊ณ slack์ ๋ณด๋ด๋ ์์ ์ ์งํํ ๊ฒ์ ๋๋ค : )
- run: './gradlew assembleRelease'
- uses: MeilCli/slack-upload-file@v1
with:
slack_token: ${{ secrets.SLACK_READ_WRITE_TOKEN }}
channels: ${{ secrets.SLACK_CHANNEL_DEPLOY }}
file_path: 'app/build/outputs/apk/release/app-release-unsigned.apk'
file_name: 'app-release-unsigned.apk'
file_type: 'apk'
initial_comment: '${{ github.ref }} ํ
์คํธ ์ฑ ์ฌ๋ ๋ฐฐํฌ ์ฑ๊ณต'
slack_token : secretsํ์ผ๋ก ๋ง๋ค์ด์ค Bot Token๊ฐ ๋ฃ์ด์ฃผ๊ธฐ
channels : ์ฑ๋๋ช or ์ฑ๋ id๊ฐ
file_path : ๋น๋ํ ์์ฑ๋๋ apk ๊ฐ ๊ฒฝ๋ก
file_name : ํด๋น ํ์ผ ๋ช
file_type : apk
initial_comment : ์ํ๋ commet ๋ฉ์ธ์ง
file_path, file_name ์์๋ณด๊ธฐ
file_path์ file_name์ ํฐ๋ฏธ๋์ ๋ค์ด๊ฐ ํด๋น Android Project ํ์ผ ๋ช ์ผ๋ก ์ด๋ํ์ฌ
./gradlew assembleRelease๋ฅผ ์คํํ์ฌ ์๊ธฐ๋ app/build/outputs/apk/realease์ ๋ค์ด๊ฐ๋ณด๋ฉด ์ ์ ์์ต๋๋ค.
apk ๋ช ์ด ๋ค ๋ค๋ฅผ ์ ์๊ธฐ ๋๋ฌธ์ ๊ผญ ํ์ธํด์ฃผ์ธ์!!
- apk artifact ์ ๋ก๋ ํ๊ธฐ
- name: ํ
์คํธ์ฉ apk artifact ์
๋ก๋
uses: actions/upload-artifact@v2
with:
name: app-release-unsigned.apk
path: app/build/outputs/apk/release/app-release-unsigned.apk
- slack์ message ์ ์กํ๊ธฐ
- name: action-slack
uses: 8398a7/action-slack@v3.8.0
with:
status: ${{ job.status }}
author_name: ๋น๋ ์๋ฆผ
env:
SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }}
github actions ์ ์ฒด ์ฝ๋
# This workflow will build a Java project with Gradle
# For more information see: https://help.github.com/actions/language-and-framework-guides/building-and-testing-java-with-gradle
name: Android CD
on:
push:
branches: master
pull_request:
branches: master
jobs:
build:
runs-on: ubuntu-16.04
steps:
- uses: actions/checkout@v1
- name: Set up JDK 1.8
uses: actions/setup-java@v1
with:
java-version: 1.8
- name: Get current date
id: date
run: echo "::set-output name=date::$(date +'%Y-%m-%d')"
- name: Build APK
run: bash ./gradlew assembleRelease --stacktrace
- run: './gradlew assembleRelease'
- uses: MeilCli/slack-upload-file@v1
with:
slack_token: ${{ secrets.SLACK_READ_WRITE_TOKEN }}
channels: ${{ secrets.SLACK_CHANNEL_DEPLOY }}
file_path: 'app/build/outputs/apk/release/app-release-unsigned.apk'
file_name: 'app-release-unsigned.apk'
file_type: 'apk'
initial_comment: '${{ github.ref }} ํ
์คํธ ์ฑ ์ฌ๋ ๋ฐฐํฌ ์ฑ๊ณต'
- name: ํ
์คํธ์ฉ apk artifact ์
๋ก๋
uses: actions/upload-artifact@v2
with:
name: app-release-unsigned.apk
path: app/build/outputs/apk/release/app-release-unsigned.apk
์์ ๊ฐ์ด github actions ์ฝ๋๋ฅผ ์์ ํ์ฌ ์ถ๊ฐํด์ค๋ค, push๋ pull request๊ฐ ๋ฐ์ํ๋ฉด ์๋์ ๊ฐ์ด ํด๋น github actions workflow ์์ ์ ์งํํ๋ ๊ฒ์ ์ ์ ์์ต๋๋ค !!
์คํ ๋ค, ํด๋น github actions workflow๊ฐ ์ฑ๊ณตํ๋ฉด, ์๋์ ๊ฐ์ด ์ฌ๋์ apk๊ฐ ์๋ ๋ฐฐํฌ๋์ด ์ ๋ฌ๋์ด์ง๋๋ค !!!
Github actions์ ๋ํด ์์๋ณด์์ต๋๋ค.
์ ์ด์ฉํ๋ฉด ๋ค์ํ CI๋ workflows ์ ์ถ๊ฐํ ์ ์๋ ์์ฃผ ๊ฐ๋ ฅํ ์๋ํ ๋๊ตฌ์ธ ๊ฒ์ ์ ์ ์์ต๋๋ค !
๊ฐ๋จํ๊ฒ apk๋ฅผ ์๋ ๋ฐฐํฌ ํด๋ณด์ธ์ !! ์ฝ์ด์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค : )
์ฐธ๊ณ ์๋ฃ
'๐ฑAndroid > ๐ฉ๐ปโ๐ป Android ๊ฐ๋ฐ ์ผ์ง' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Android] ์นด์นด์คํก ๋ก๊ทธ์ธ ์ฐ๋ํ๊ธฐ (3) | 2021.05.27 |
---|---|
[Android/Kotlin] ๋ฉํฐ๋ทฐ ํ์ RecyclerView ๊ตฌํํ๊ธฐ (3) | 2021.01.24 |
[Android/Kotlin] RecyclerView Animation ํ์ฉํ๊ธฐ (0) | 2021.01.22 |