본문 바로가기
Android

[Android] gradle를 활용한 firebase App distribution 배포 후 slack 알람 연동

by 박매트 2024. 11. 17.

* 이미 gradle을 활용한 firebase App distribution 은 개발되어있던 상태.

* 그러므로 앱이 배포되면, 따로 슬랙 메세지를 보냈어야 했다.

* 하지만, 배포가 되자마자 바로 슬랙 메세지를 보내는 봇을 만들자!

 

firebase App distribution 공식 문서

https://firebase.google.com/docs/app-distribution/android/distribute-gradle?hl=ko

 

Gradle을 사용하여 Android 앱 배포  |  Firebase App Distribution

의견 보내기 Gradle을 사용하여 Android 앱 배포 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. APK AAB App Distribution Gradle 플러그인을 사용하여 App Distribution을 Andr

firebase.google.com

 

 

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 알림 작업이 항상 실행되도록 보장한다.

실행 흐름

  1. 빌드빌드이름 작업 실행
    • 먼저 clean 작업과 app 모듈의 빌드 작업(빌드빌드이름, 빌드빌드업로드)을 실행한다.
    • 빌드 작업 완료 후 notifySlack 작업을 실행한다.
  2. notifySlack 작업 실행
    • 앱의 버전 정보, 릴리스 노트, Git 커밋 정보를 읽어와 Slack 메시지를 생성한다.
    • local.properties 파일에서 Webhook URL을 읽어와 메시지를 Slack으로 전송한다.