* 이미 gradle을 활용한 firebase App distribution 은 개발되어있던 상태.
* 그러므로 앱이 배포되면, 따로 슬랙 메세지를 보냈어야 했다.
* 하지만, 배포가 되자마자 바로 슬랙 메세지를 보내는 봇을 만들자!
firebase App distribution 공식 문서
https://firebase.google.com/docs/app-distribution/android/distribute-gradle?hl=ko
prject gradle.kts
tasks.register("notifySlack") {
doLast {
// App 프로젝트 설정 가져오기
val appProject = project(":app")
val android = appProject.extensions.findByName("android") as BaseAppModuleExtension
val versionName = android.defaultConfig.versionName
val versionCode = android.defaultConfig.versionCode
// 릴리스 노트 가져오기
val releaseNotes = file("app/releasenotes.txt").takeIf { it.exists() }?.readText()
?: "No release notes available."
// Git 커밋 정보 가져오기
fun getGitOutput(vararg command: String): String = ProcessBuilder(*command)
.directory(rootProject.rootDir)
.redirectErrorStream(true)
.start()
.inputStream
.bufferedReader()
.use { it.readText().trim() }
val lastCommitDescription = getGitOutput("git", "log", "-1", "--pretty=%B")
.lineSequence()
.drop(1)
.joinToString("\n")
.trim()
// 메시지 생성
val message = """
{
"attachments": [
{
"title": "앱 $versionName($versionCode) 업로드",
"text": "$releaseNotes",
"fields": [
{
"title": "References",
"value": "<${lastCommitDescription}|Confluence>",
"short": true
}
]
}
]
}
""".trimIndent()
// local.properties에서 Slack Webhook URL 가져오기
val slackWebhookUrl = file("local.properties")
.takeIf { it.exists() }
?.inputStream()
?.use { Properties().apply { load(it) } }
?.getProperty("slack_webhook_url")
?: error("SLACK_WEBHOOK_URL is not defined in local.properties")
// Slack에 메시지 전송
exec {
commandLine("curl", "-X", "POST", "-H", "Content-Type: application/json", "-d", message, slackWebhookUrl)
}
}
}
tasks.register("빌드빌드이름") {
dependsOn("clean", "app:빌드빌드이름", "app:빌드빌드업로드")
finalizedBy("notifySlack")
}
1. notifySlack 작업
notifySlack는 Slack에 빌드 알림을 보내는 작업이다.
주요 동작:
- 앱 프로젝트 정보 가져오기
- project(":app")를 통해 :app 모듈의 프로젝트 설정을 가져온다.
- android.defaultConfig.versionName 및 versionCode를 통해 앱의 버전 이름과 버전 코드를 가져온다.
- 릴리스 노트 읽기
- app/releasenotes.txt 파일에서 릴리스 노트를 읽어온다.
- 파일이 없을 경우 기본값으로 "No release notes available."을 설정한다.
- Git 마지막 커밋 정보 가져오기
- git log -1 --pretty=%B 명령을 실행하여 마지막 커밋 메시지를 가져온다.
- 커밋 메세지를 자료 링크로 설정해서 공유하도록 했다.
- 메시지에서 첫 번째 줄을 제외하고 나머지를 읽어온다.
- Slack에 보낼 메시지 생성
- Slack 메시지 페이로드(JSON 형식)를 생성한다.
- 메시지 제목은 앱 버전 정보(사용자앱 $versionName($versionCode) 업로드)로 설정한다.
- 릴리스 노트를 본문(text)으로 포함하고, 마지막 커밋 메시지를 References 필드에 연결한다.
- Slack Webhook URL 가져오기
- local.properties 파일에서 slack_webhook_url 값을 읽어온다.
- 값이 없을 경우 에러를 발생시킨다.
- Slack으로 메시지 전송
- curl 명령어를 사용하여 Slack Webhook에 JSON 메시지를 POST 요청으로 전송한다.
2. 빌드빌드이름 작업
빌드빌드이름는 빌드 프로세스를 실행하고, 완료 후 Slack 알림을 보내는 작업이다.
주요 동작:
- 작업 의존성 설정
- dependsOn으로 clean, app:빌드빌드이름, app:빌드빌드업로드 작업을 실행한다.
- 이 작업을 실행하면 지정된 작업들이 순차적으로 실행된다.
- 작업 완료 후 동작 설정
- finalizedBy("notifySlack")를 통해 작업이 성공하든 실패하든 상관없이 마지막으로 notifySlack 작업을 실행한다.
- 이를 통해 Slack 알림 작업이 항상 실행되도록 보장한다.
실행 흐름
- 빌드빌드이름 작업 실행
- 먼저 clean 작업과 app 모듈의 빌드 작업(빌드빌드이름, 빌드빌드업로드)을 실행한다.
- 빌드 작업 완료 후 notifySlack 작업을 실행한다.
- notifySlack 작업 실행
- 앱의 버전 정보, 릴리스 노트, Git 커밋 정보를 읽어와 Slack 메시지를 생성한다.
- local.properties 파일에서 Webhook URL을 읽어와 메시지를 Slack으로 전송한다.
'Android' 카테고리의 다른 글
[Android] 안드로이드 앱 비동기 처리 및 interceptor (1) | 2024.11.20 |
---|---|
[Android] FLAG_ACTIVITY_SINGLE_TOP 와 FLAG_ACTIVITY_CLEAR_TOP 차이점 (0) | 2024.11.19 |
[Android] Activity 스택 관리와 LocalBroadcastManager 활용하기 (0) | 2024.11.14 |
[Android] 강제 업데이트 & 수동 업데이트 ? (0) | 2024.11.13 |
[Kotlin] 제네릭 (0) | 2024.11.12 |