{"id":506926,"date":"2024-09-02T07:44:58","date_gmt":"2024-09-02T06:44:58","guid":{"rendered":"https:\/\/blog.jetbrains.com\/?post_type=teamcity&#038;p=506926"},"modified":"2024-10-15T20:08:09","modified_gmt":"2024-10-15T19:08:09","slug":"cicd-for-android","status":"publish","type":"teamcity","link":"https:\/\/blog.jetbrains.com\/ko\/teamcity\/2024\/09\/cicd-for-android\/","title":{"rendered":"Android \ud504\ub85c\uc81d\ud2b8\uc6a9 CI\/CD \ud30c\uc774\ud504\ub77c\uc778\uc744 \uad6c\ucd95\ud558\ub294 \ubc29\ubc95"},"content":{"rendered":"<p><em>draft.dev\uc758 Kumar Harsh\uc758 \uac1d\uc6d0 \uc791\uc131 \uae00\uc785\ub2c8\ub2e4.<\/em><\/p>\n<p>\ub9b4\ub9ac\uc2a4\uac00 \uc7a6\uc740 Android \uc571\uc744 \ucd9c\uc2dc\ud55c \ubd84\uc774\ub77c\uba74 \uc798 \uc815\uc758\ub41c \ube4c\ub4dc, \ud14c\uc2a4\ud2b8, \ubc30\ud3ec \uc6cc\ud06c\ud50c\ub85c\uac00 \uc5bc\ub9c8\ub098 \uc911\uc694\ud55c\uc9c0 \uc774\ubbf8 \uc54c\uace0 \uacc4\uc2e4 \uac81\ub2c8\ub2e4. \ubcf5\uc6d0\ub825\uc774 \ub192\uc740 \uc790\ub3d9\ud654\ub41c DevOps \uc6cc\ud06c\ud50c\ub85c\uac00 \uc5c6\ub2e4\uba74 \ub9b4\ub9ac\uc2a4\uc758 \ube60\ub978 \uc18d\ub3c4\ub97c \uc720\uc9c0\ud558\uae30\uac00 \uc5b4\ub835\uc2b5\ub2c8\ub2e4. \uc9c0\uc18d\uc801 \ud1b5\ud569 \ubc0f \uc9c0\uc18d\uc801 \ubc30\ud3ec(CI\/CD)\ub97c \ud1b5\ud574 \uc774\ub7f0 \uacfc\uc815\uc744 \uc790\ub3d9\ud654\ud55c\ub2e4\uba74 \uc5c5\ubb34\ub97c \ub354 \uc27d\uac8c \ucc98\ub9ac\ud558\uace0, \ubc84\uadf8\ub97c \ub354 \ube60\ub974\uac8c \ud0d0\uc9c0\ud558\uc5ec \ub354 \ube60\ub974\uac8c \ub9b4\ub9ac\uc2a4\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<p><a href=\"https:\/\/www.jetbrains.com\/ko-kr\/teamcity\/\" target=\"_blank\" rel=\"noopener\">JetBrains TeamCity<\/a>\ub294 \uac15\ub825\ud55c \ud30c\uc774\ud504\ub77c\uc778\uc744 \ub9cc\ub4e4\uc5b4\uc8fc\ub294 CI\/CD \ud50c\ub7ab\ud3fc\uc785\ub2c8\ub2e4. \uc778\uae30 \uc788\ub294 Android \uac1c\ubc1c \ub3c4\uad6c\uc640 \uc6d0\ud65c\ud558\uac8c \ud1b5\ud569\ub418\uba70, \ube4c\ub4dc \ubc0f \ud14c\uc2a4\ud2b8 \ub2e8\uacc4\ub97c \uad6c\uc131\ud560 \ub54c \uc0ac\uc6a9\uc790 \uce5c\ud654\uc801\uc778 \uc778\ud130\ud398\uc774\uc2a4\ub97c \uc81c\uacf5\ud569\ub2c8\ub2e4.<\/p>\n<p>\uc774 \uae00\uc5d0\uc11c\ub294 JetBrains TeamCity\ub97c \uc0ac\uc6a9\ud558\uc5ec Android \ud504\ub85c\uc81d\ud2b8\uc6a9 CI\/CD \ud30c\uc774\ud504\ub77c\uc778\uc744 \uc124\uc815\ud558\ub294 \ubc29\ubc95\uc744 \ubcf4\uc5ec \ub4dc\ub9bd\ub2c8\ub2e4. \uc5ec\ub7ec\ubd84\uc740 Android CI\/CD \ud30c\uc774\ud504\ub77c\uc778\uc758 \ud575\uc2ec \uad6c\uc131 \uc694\uc18c\ub97c \uc0b4\ud3b4\ubcf4\uace0 TeamCity\ub85c \uba87 \uac00\uc9c0 \uc0d8\ud50c \ud30c\uc774\ud504\ub77c\uc778\uc744 \uad6c\uc131\ud558\ub294 \ubc29\ubc95\uc744 \uc790\uc138\ud788 \uc54c\uc544\ubcf4\uc2e4 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<h2 class=\"wp-block-heading\">Android CI\/CD \ud30c\uc774\ud504\ub77c\uc778\uc758 \uc774\ud574<\/h2>\n<p>Android \uac1c\ubc1c\uc744 \uc704\ud55c \ud6a8\uacfc\uc801\uc778 CI\/CD \ud30c\uc774\ud504\ub77c\uc778\uc740 \ud45c\uc900 DevOps \ud30c\uc774\ud504\ub77c\uc778\uc5d0 \uc788\ub294 \ubaa8\ub4e0 \ub2e8\uacc4\ub97c \ud3ec\ud568\ud558\uba70, \uc774\ub97c \uc544\ud2f0\ud329\ud2b8 \uc11c\uba85 \ubc0f Google Play Store \ub0b4\ubd80 \ud2b8\ub799\uc73c\ub85c\uc758 \uc790\ub3d9 \ubc30\ud3ec\uc640 \uac19\uc740 \ucd94\uac00 \ud504\ub85c\uc138\uc2a4\ub85c \uac15\ud654\ud569\ub2c8\ub2e4. \uc544\ub798\ub294 \uc77c\ubc18\uc801\uc778 Android CI\/CD \ud30c\uc774\ud504\ub77c\uc778\uc5d0 \ud3ec\ud568\ub418\ub294 \ubaa8\ub4e0 \ub2e8\uacc4\uc785\ub2c8\ub2e4.<\/p>\n<p>1. <strong>\ucf54\ub4dc \uccb4\ud06c\uc544\uc6c3 \ubc0f \ubc84\uc804 \uad00\ub9ac \ud1b5\ud569: <\/strong>\ud30c\uc774\ud504\ub77c\uc778\uc740 Git\uacfc \uac19\uc740 \ubc84\uc804 \uad00\ub9ac \uc2dc\uc2a4\ud15c(VCS)\uc5d0\uc11c \ucd5c\uc2e0 \ucf54\ub4dc\ub97c \uac00\uc838\uc624\ub294 \uac83\uc5d0\uc11c \uc2dc\uc791\ud569\ub2c8\ub2e4. TeamCity\ub97c \uc0ac\uc6a9 \uc911\uc774\ub77c\uba74 \uc778\uae30 <a href=\"https:\/\/www.jetbrains.com\/ko-kr\/teamcity\/integrations\/version-control\/\" target=\"_blank\" rel=\"noopener\">\ubc84\uc804 \uad00\ub9ac \ub3c4\uad6c<\/a>\uc640\uc758 \ud1b5\ud569 \uae30\ub2a5\uacfc \ucf54\ub4dc \ucee4\ubc0b \ubc0f \ubcd1\ud569 \uc2dc \ud30c\uc774\ud504\ub77c\uc778\uc774 \uc790\ub3d9\uc73c\ub85c \ud2b8\ub9ac\uac70\ub418\ub294 \uae30\ub2a5\uc744 \ud65c\uc6a9\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<p>2. <strong>Gradle\ub85c \ube4c\ub4dc \uc790\ub3d9\ud654: <\/strong>Android \ud504\ub85c\uc81d\ud2b8\uc5d0 \uc0ac\uc6a9\ub418\ub294 \ud45c\uc900 \ube4c\ub4dc \ub3c4\uad6c\uc778 Gradle\uc740 \uc774 \ub2e8\uacc4\uc758 \ud575\uc2ec\uc785\ub2c8\ub2e4. TeamCity\ub294 <a href=\"https:\/\/www.jetbrains.com\/help\/teamcity\/gradle.html\" target=\"_blank\" rel=\"noopener\">Gradle \uba85\ub839\uc5b4<\/a>\ub97c \uc2e4\ud589\ud558\uc5ec \uc0ac\uc6a9\uc790\uc758 \ucf54\ub4dc\ub97c \ucef4\ud30c\uc77c\ub9c1\ud558\uace0, \ub9ac\uc18c\uc2a4\ub97c \ubaa8\uc73c\uace0, \ube4c\ub4dc \uc544\ud2f0\ud329\ud2b8\ub97c \uc0dd\uc131\ud569\ub2c8\ub2e4. TeamCity\uc758 \ube4c\ub4dc \ub7ec\ub108\ub294 \ub2e4\uc591\ud55c Gradle \ubc84\uc804\uacfc \ud638\ud658\ub418\uba70 \ube4c\ub4dc \uad6c\uc131\uc744 \uc704\ud574 \uc0ac\uc6a9\uc790\uac00 \uc124\uc815\ud560 \uc218 \uc788\ub294 \ud658\uacbd\uc744 \uc81c\uacf5\ud569\ub2c8\ub2e4.<\/p>\n<p>3. <strong>\uc5ec\ub7ec Android \ubc84\uc804\/\ud50c\ub7ab\ud3fc\uc5d0 \ub300\ud55c \uc720\ub2db \ud14c\uc2a4\ud2b8 \ubc0f \ud1b5\ud569 \ud14c\uc2a4\ud2b8:<\/strong> \ub2e4\uc74c \ub2e8\uacc4\ub294 \uac1c\ubcc4 \ucf54\ub4dc \ubaa8\ub4c8\uc744 \uac80\uc99d\ud558\ub294 \uc720\ub2db \ud14c\uc2a4\ud2b8 \uc2e4\ud589\uacfc \uc11c\ub85c \ub2e4\ub978 \uad6c\uc131 \uc694\uc18c\uac00 \uc5b4\ub5bb\uac8c \uc0c1\ud638 \uc791\uc6a9\ud558\ub294\uc9c0 \ud655\uc778\ud558\ub294 \ud1b5\ud569 \ud14c\uc2a4\ud2b8(UI \ud14c\uc2a4\ud2b8 \ud3ec\ud568) \uc2e4\ud589\uc785\ub2c8\ub2e4. TeamCity\uc5d0\uc11c\ub294 \ub2e4\uc218\uc758 \ud14c\uc2a4\ud2b8 \ub7ec\ub108\uc640 \ud504\ub808\uc784\uc6cc\ud06c(\uc608: JUnit, Espresso)\ub97c \uad6c\uc131\ud558\uace0 \uc5d0\ubbac\ub808\uc774\ud130\ub098 \uae30\uae30 \ub7a9\uc744 \ud65c\uc6a9\ud558\uc5ec \ub2e4\uc591\ud55c Android \ubc84\uc804\uacfc \ud50c\ub7ab\ud3fc\uc744 \ub300\uc0c1\uc73c\ub85c \ud14c\uc2a4\ud2b8\ub97c \uc2e4\ud589\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<p>4. <strong>\uc815\uc801 \ucf54\ub4dc \ubd84\uc11d(JetBrains Qodana \ud65c\uc6a9) \ubc0f \ucf54\ub4dc \ucee4\ubc84\ub9ac\uc9c0 \ubcf4\uace0:<\/strong> \uc815\uc801 <a href=\"https:\/\/www.jetbrains.com\/ko-kr\/teamcity\/features\/code-quality-tracking\/\" target=\"_blank\" rel=\"noopener\">\ucf54\ub4dc \ubd84\uc11d<\/a>\uc73c\ub85c \uc7a0\uc7ac\uc801\uc778 \ubc84\uadf8, \ubcf4\uc548 \ucde8\uc57d\uc810 \ubc0f \ucf54\ub4dc \uc2a4\ud0c0\uc77c \uc77c\uad00\uc131 \ubb38\uc81c\ub97c \ucd08\uae30\uc5d0 \uc2dd\ubcc4\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. TeamCity\ub294 \ucf54\ub4dc \uc2a4\uba5c \ud0d0\uc9c0, \ubcf5\uc7a1\ud55c \ucf54\ub4dc \ubd84\uc11d \ubc0f \ub2e4\uc591\ud55c \ud504\ub85c\uadf8\ub798\ubc0d \uc5b8\uc5b4\uc640\uc758 \ud1b5\ud569\uc744 \uc9c0\uc6d0\ud558\ub294 \uc815\uc801 \ucf54\ub4dc \ubd84\uc11d \ub3c4\uad6c\uc778 <a href=\"https:\/\/www.jetbrains.com\/ko-kr\/qodana\/\" target=\"_blank\" rel=\"noopener\">JetBrains Qodana<\/a>\uc640 \ud1b5\ud569\ub418\uc5b4 \uc788\uc73c\ubbc0\ub85c \uad11\ubc94\uc704\ud55c \ucf54\ub4dc \ud488\uc9c8 \uac80\uc0ac\ub97c \uc218\ud589\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \ub610\ud55c, TeamCity\uc5d0\uc11c\ub294 \uc0ac\uc6a9\uc790 \ucf54\ub4dc \uc911\uc5d0 \uc5b4\ub5a4 \ubd80\ubd84\uc774 \uc720\ub2db \ud14c\uc2a4\ud2b8\ub85c \uac80\uc0ac\ub418\ub294\uc9c0 \ubcf4\uc5ec\uc8fc\ub294 \ucf54\ub4dc \ucee4\ubc84\ub9ac\uc9c0 \ubcf4\uace0\uc11c\ub3c4 \uc0dd\uc131\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc774 \ubcf4\uace0\uc11c\ub294 \uac1c\ubc1c\uc790\uac00 \ud14c\uc2a4\ud2b8\uc5d0 \ud3ec\ud568\ub418\uc9c0 \uc54a\ub294 \ubd80\ubd84\uc744 \uc9d1\uc911\ud574\uc11c \uc0b4\ud3b4\ubcfc \uc218 \uc788\ub3c4\ub85d \ub3c4\uc640\uc90d\ub2c8\ub2e4.<\/p>\n<p>5. <strong>\uc544\ud2f0\ud329\ud2b8 \uc0dd\uc131 \ubc0f \uc11c\uba85(APK \ubc0f AAB):<\/strong> \ube4c\ub4dc\uc640 \ud14c\uc2a4\ud2b8\uac00 \uc131\uacf5\ud55c \ub2e4\uc74c\uc758 \ub2e8\uacc4\ub294 \ubc30\ud3ec \uac00\ub2a5\ud55c \uc544\ud2f0\ud329\ud2b8\ub97c \uc0dd\uc131\ud558\ub294 \uac83\uc785\ub2c8\ub2e4. Android \uc571\uc758 \uacbd\uc6b0 \ubcf4\ud1b5 \uc774 \ub2e8\uacc4\uc5d0\uc11c \uc11c\uba85\ub41c Android Package Kit(APK) \ub610\ub294 Android App Bundle(AAB)\uc744 \uc0dd\uc131\ud569\ub2c8\ub2e4. TeamCity\ub294 \ube4c\ub4dc \ub2e8\uacc4\ub97c \uc0ac\uc6a9\ud558\uc5ec \uc11c\uba85 \ud504\ub85c\uc138\uc2a4\ub97c \ud30c\uc774\ud504\ub77c\uc778 \ub0b4\uc5d0\uc11c \uc790\ub3d9\ud654\ud569\ub2c8\ub2e4.<\/p>\n<p>6. <strong>\ub0b4\ubd80 \ud14c\uc2a4\ud2b8 \ubc0f \ud504\ub85c\ub355\uc158 \ud658\uacbd\uc73c\ub85c \ubc30\ud3ec(Google Play, \ubca0\ud0c0 \ucc44\ub110):<\/strong> CI\/CD \ud30c\uc774\ud504\ub77c\uc778\uc740 \ub2e4\uc591\ud55c \ud658\uacbd\uc73c\ub85c \uc571\uc744 \ubc30\ud3ec\ud558\ub294 \uacfc\uc815\uc744 \uc790\ub3d9\ud654\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. TeamCity\uc5d0\uc11c\ub294 \ub0b4\ubd80 \ud14c\uc2a4\ud2b8 \ud50c\ub7ab\ud3fc\uc73c\ub85c \ubc30\ud3ec\ud558\uac70\ub098 Google Play\uc758 \ud504\ub85c\ub355\uc158 \ucc44\ub110\ub85c \ubc14\ub85c \ubc30\ud3ec\ud558\ub3c4\ub85d \uad6c\uc131\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<p>7. <strong>\uc9c0\uc18d\uc801\uc778 \ubaa8\ub2c8\ud130\ub9c1\uacfc \ud53c\ub4dc\ubc31 \ub8e8\ud504: <\/strong>\uac15\ub825\ud55c CI\/CD \ud30c\uc774\ud504\ub77c\uc778\uc740 \ubc30\ud3ec\uc5d0\uc11c \ub05d\ub098\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4. TeamCity\ub294 \ubaa8\ub2c8\ud130\ub9c1 \ub3c4\uad6c\uc640\ub3c4 \ud1b5\ud569\ub418\uc5b4 \uc788\uc73c\ubbc0\ub85c \uc571 \uc131\ub2a5\uc744 \ucd94\uc801\ud558\uace0, \ucda9\ub3cc\uc744 \uc2dd\ubcc4\ud558\uace0, \uc0ac\uc6a9\uc790\uc758 \ud53c\ub4dc\ubc31\uc744 \uc218\uc9d1\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc774\ub7ec\ud55c \ud53c\ub4dc\ubc31 \ub8e8\ud504\ub97c \ud1b5\ud574 \uac1c\ubc1c\uc790\ub294 \ubb38\uc81c\uc5d0 \ube60\ub974\uac8c \ub300\uc751\ud558\uace0 \uc9c0\uc18d\uc801\uc73c\ub85c \uc571\uc758 \ud488\uc9c8\uc744 \uac1c\uc120\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<h2 class=\"wp-block-heading\">TeamCity\ub85c CI\/CD \ud30c\uc774\ud504\ub77c\uc778 \uad6c\ucd95<\/h2>\n<p>\uc77c\ubc18\uc801\uc778 CI\/CD \ud30c\uc774\ud504\ub77c\uc778 \uad6c\uc870\ub97c \uc0b4\ud3b4\ubcf4\uc558\uc73c\ub2c8 \uc774\uc81c TeamCity\ub85c \ud30c\uc774\ud504\ub77c\uc778\uc744 \uad6c\ucd95\ud558\ub294 \ubc29\ubc95\uc744 \uc54c\uc544\ubcf4\uaca0\uc2b5\ub2c8\ub2e4. \uc544\ub798\uc758 \uc139\uc158\uc5d0\uc11c\ub294 TeamCity\ub97c \uc124\uc815\ud558\uace0, \uc0ac\uc6a9\uc790\uc758 Android \ud504\ub85c\uc81d\ud2b8\uc5d0 \ub9de\ub294 \ube4c\ub4dc \uad6c\uc131\uc744 \uc0dd\uc131\ud558\uace0, \uc790\ub3d9\ud654 \ud14c\uc2a4\ud305\uacfc \ud1b5\ud569\ud55c \ub2e4\uc74c \ub9c8\uc9c0\ub9c9\uc73c\ub85c \uc571\uc744 \ud328\ud0a4\uc9c0\ud654\ud558\uace0 \ubc30\ud3ec\ud558\ub294 \ubc29\ubc95\uc744 \uc548\ub0b4\ud569\ub2c8\ub2e4.<\/p>\n<p>\uac04\ub2e8\ud55c \uc124\uba85\uc744 \uc704\ud574 \uc774\ubc88 \ud29c\ud1a0\ub9ac\uc5bc\uc5d0\uc11c\ub294 14\uc77c \ubb34\ub8cc \ud3c9\uac00\ud310\uc73c\ub85c \uc81c\uacf5\ub418\ub294 <a href=\"https:\/\/www.jetbrains.com\/ko-kr\/teamcity\/cloud\/\" target=\"_blank\" rel=\"noopener\">TeamCity\uc758 \ud074\ub77c\uc6b0\ub4dc \ud638\uc2a4\ud305 \ubc84\uc804<\/a>\uc744 \uc0ac\uc6a9\ud569\ub2c8\ub2e4. GitHub, GitLab, Bitbucket \ub610\ub294 Google \uacc4\uc815\uc744 \uc0ac\uc6a9\ud558\uac70\ub098 \uae30\uc874\uc758 \ubc29\uc2dd\ub300\ub85c \uc774\uba54\uc77c \uc8fc\uc18c\uc640 \ube44\ubc00\ubc88\ud638\ub97c \uc870\ud569\ud574\uc11c \uac00\uc785\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \ub2e4\uc74c \ub2e8\uacc4\ub85c \ub118\uc5b4\uac00\uae30 \uc804\uc5d0 <a href=\"https:\/\/www.jetbrains.com\/ko-kr\/teamcity\/signup\/\" target=\"_blank\" rel=\"noopener\">\ud3c9\uac00\ud310<\/a> \ub610\ub294 \uad6c\ub3c5\uc744 \ud65c\uc131\ud654\ud574 \uc8fc\uc138\uc694.<\/p>\n<p>\ud558\uc9c0\ub9cc \uc774\ubc88 \ud29c\ud1a0\ub9ac\uc5bc\uc5d0\uc11c TeamCity Cloud\ub97c <a href=\"https:\/\/www.jetbrains.com\/help\/teamcity\/cloud\/teamcity-cloud-subscription-and-licensing.html#Cloud+Licensing+Terminology:~:text=agents%20by%20default.-,Self%2Dhosted%20build%20agent,-A%20build%20agent\" target=\"_blank\" rel=\"noopener\">\uc790\uccb4 \ud638\uc2a4\ud305 \ube4c\ub4dc \uc5d0\uc774\uc804\ud2b8<\/a>\ub098 <a href=\"https:\/\/www.jetbrains.com\/help\/teamcity\/teamcity-documentation.html\" target=\"_blank\" rel=\"noopener\">TeamCity On-Premises<\/a>\uc640 \ud568\uaed8 \uc0ac\uc6a9\ud560 \uc218\ub3c4 \uc788\uc2b5\ub2c8\ub2e4. \uc790\uccb4 \ud638\uc2a4\ud305 \ube4c\ub4dc \uc5d0\uc774\uc804\ud2b8\ub098 TeamCity On-Premises\ub97c \uc0ac\uc6a9\ud560 \ub54c\ub294 Android SDK\ub97c \uc0ac\uc6a9\uc790\uc758 \uc5d0\uc774\uc804\ud2b8\uc5d0 \ubcc4\ub3c4\ub85c \uc124\uce58\ud574\uc57c \ud55c\ub2e4\ub294 \uc810\uc5d0 \uc720\uc758\ud558\uc138\uc694.<\/p>\n<h3 class=\"wp-block-heading\">TeamCity \uc124\uc815<\/h3>\n<p>TeamCity Cloud \uc778\uc2a4\ud134\uc2a4\uc5d0 \uc561\uc138\uc2a4\ud55c \ud6c4 \ucd08\uae30 \ud654\uba74\uc740 \uc544\ub798\uc640 \uac19\uc2b5\ub2c8\ub2e4.<\/p>\n<figure class=\"wp-block-image size-full is-resized\"><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-489342\" style=\"aspect-ratio: 1.7431192660550459; width: 840px; height: auto;\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2024\/07\/1-TeamCity-Cloud-dashboard.png\" alt=\"\" width=\"3420\" height=\"1962\" \/><figcaption class=\"wp-element-caption\"><em>TeamCity Cloud \ub300\uc2dc\ubcf4\ub4dc<\/em><\/figcaption><\/figure>\n<p>Android \ud504\ub85c\uc81d\ud2b8\ub97c \uc2dc\uc791\ud558\ub824\uba74 \ud398\uc774\uc9c0 \uc911\uac04\uc5d0 \uc788\ub294 <em>Create project(\ud504\ub85c\uc81d\ud2b8 \ub9cc\ub4e4\uae30)<\/em>\ub97c \ud074\ub9ad\ud558\uc138\uc694. \uadf8\ub7ec\uba74 \ud504\ub85c\uc81d\ud2b8\uc758 \uc18c\uc2a4 \ucf54\ub4dc\uac00 \uc788\ub294 \ub9c1\ud06c\ub97c \uc785\ub825\ud558\ub77c\ub294 \uc694\uccad\uc744 \ubc1b\uac8c \ub429\ub2c8\ub2e4. Git \ud638\uc2a4\ud2b8 \uc81c\uacf5\uc790(\uc608: GitHub \ub610\ub294 Bitbucket Cloud)\ub97c \uc0ac\uc6a9\ud558\uc5ec \uac00\uc785\ud55c \uacbd\uc6b0 \ud574\ub2f9 \uc139\uc158\uc744 \ud655\uc778\ud558\uc5ec \uc774\uc5d0 \ub9de\ub294 \ud504\ub85c\uc81d\ud2b8 \uc0dd\uc131 \uacfc\uc815\uc744 \ub530\ub77c \uc8fc\uc138\uc694.<\/p>\n<p>\uc800\uc7a5\uc18c URL\uc744 \uac16\uace0 \uc788\ub294 \uacbd\uc6b0\uc5d0\ub294 <em>From a repository URL(\uc800\uc7a5\uc18c URL\ub85c\ubd80\ud130)<\/em> \ud0ed\uc5d0\uc11c URL\uc744 \ubc14\ub85c \uc0ac\uc6a9\ud558\uba74 \ub429\ub2c8\ub2e4. TeamCity\ub294 \uc790\ub3d9\uc73c\ub85c Git \ud638\uc2a4\ud2b8 \uc81c\uacf5\uc790\ub97c \ud0d0\uc9c0\ud558\uc5ec \ud504\ub85c\uc81d\ud2b8\ub97c \uac00\uc838\uc635\ub2c8\ub2e4.<\/p>\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-489367\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2024\/07\/2-Create-Project-page.png\" alt=\"\" width=\"3420\" height=\"1962\" \/><\/p>\n<figcaption class=\"wp-element-caption\"><em>\ud504\ub85c\uc81d\ud2b8 \ub9cc\ub4e4\uae30 \ud398\uc774\uc9c0<\/em><\/figcaption>\n<\/figure>\n<p>Android \ud504\ub85c\uc81d\ud2b8\uac00 \uc5c6\ub294 \uacbd\uc6b0\uc5d0\ub294 \ub2e4\uc74c\uc758 \uc800\uc7a5\uc18c\ub97c \uc0ac\uc6a9\ud558\uc5ec \ud29c\ud1a0\ub9ac\uc5bc\uc744 \uc9c4\ud589\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<pre class=\"EnlighterJSRAW\">bash\nhttps:\/\/github.com\/krharsh17\/android-app-teamcity<\/pre>\n<p>\uc561\uc138\uc2a4\ud558\ub824\ub294 \uc800\uc7a5\uc18c\uac00 \ube44\uacf5\uac1c\uc774\uac70\ub098 \uc0ac\uc6a9\uc790 \uc774\ub984 \ubc0f \ube44\ubc00\ubc88\ud638 \uc870\ud569\uc73c\ub85c \ubcf4\ud638\ub41c \uacbd\uc6b0 TeamCity\uac00 \uc561\uc138\uc2a4\ud560 \uc218 \uc788\ub3c4\ub85d \uc774 \ub2e8\uacc4\uc5d0\uc11c \ud574\ub2f9 \uc815\ubcf4\ub97c \uc785\ub825\ud558\uc138\uc694. \uc800\uc7a5\uc18c URL(\ud544\uc694\ud55c \uacbd\uc6b0 \uc0c1\uc138 \uc815\ubcf4 \ud3ec\ud568)\uc744 \uc785\ub825\ud55c \ud6c4 <em>Proceed(\uacc4\uc18d\ud558\uae30)<\/em>\ub97c \ud074\ub9ad\ud558\uc138\uc694.<\/p>\n<p>\ub2e4\uc74c \ud398\uc774\uc9c0\uc5d0\uc11c\ub294 TeamCity Cloud\uac00 VCS \uc800\uc7a5\uc18c\uc640\uc758 \uc5f0\uacb0\uc744 \uac80\uc99d\ud569\ub2c8\ub2e4. \uc5f0\uacb0\uc5d0 \uc131\uacf5\ud558\uba74 TeamCity\uac00 \ud504\ub85c\uc81d\ud2b8 \uc774\ub984, \ub514\ud3f4\ud2b8 \ube0c\ub79c\uce58 \ub4f1\uacfc \uac19\uc740 \ud504\ub85c\uc81d\ud2b8\uc640 \uad00\ub828\ub41c \uc77c\ubd80 \uba54\ud0c0\ub370\uc774\ud130\ub97c \uac00\uc838\uc635\ub2c8\ub2e4. \uc774\ub7ec\ud55c \uac12\uc740 TeamCity \ud504\ub85c\uc81d\ud2b8\uc5d0 \uc800\uc7a5\ub418\uae30 \uc804\uc5d0 \uc218\uc815\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-489378\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2024\/07\/3-Connection-verified-when-creating-project.png\" alt=\"\" width=\"3420\" height=\"1962\" \/><\/p>\n<figcaption class=\"wp-element-caption\"><em>\ud504\ub85c\uc81d\ud2b8 \uc0dd\uc131 \uc2dc \uc5f0\uacb0 \uac80\uc99d<\/em><\/figcaption>\n<\/figure>\n<p>\uc774 \ud398\uc774\uc9c0\uc758 \uc815\ubcf4\uac00 \uc815\ud655\ud558\uac8c \uc785\ub825\ub418\uc5c8\ub2e4\uba74 <em>Proceed(\uacc4\uc18d\ud558\uae30)<\/em> \ubc84\ud2bc\uc744 \ud074\ub9ad\ud558\uc138\uc694. TeamCity\uac00 \uc800\uc7a5\uc18c\uc5d0\uc11c \uc774\uc6a9 \uac00\ub2a5\ud55c \uad6c\uc131 \ud30c\uc77c\uc744 \uae30\ubc18\uc73c\ub85c \uc800\uc7a5\uc18c\uc5d0 \uc801\uc6a9\ud560 \uc218 \uc788\ub294 \ube4c\ub4dc \ub2e8\uacc4\ub97c \uc790\ub3d9\uc73c\ub85c \ud0d0\uc9c0\ud569\ub2c8\ub2e4. \uc774 \uc800\uc7a5\uc18c\uc5d0\ub294 Gradle \uae30\ubc18\uc758 \uad6c\uc131 \ud30c\uc77c\uc774 \uc788\uae30 \ub54c\ubb38\uc5d0 \uc0ac\uc6a9\uc790\uac00 \uc800\uc7a5\uc18c\uc5d0\uc11c \uc571\uc744 \ube4c\ub4dc\ud560 \ub54c \uc0ac\uc6a9\ud560 \uc218 \uc788\ub294 Gradle \uc791\uc5c5 \ubaa8\uc74c\uc744 TeamCity\uac00 \uc790\ub3d9\uc73c\ub85c \uc81c\uc548\ud569\ub2c8\ub2e4(\uc774 \uacbd\uc6b0 <code>clean<\/code> \ubc0f <code>build<\/code>).<\/p>\n<p><em>Gradle<\/em> \ube4c\ub4dc \ub2e8\uacc4 \uc606\uc758 \ud655\uc778\ub780\uc744 \uc120\ud0dd\ud55c \ub2e4\uc74c <em>Use selected(\uc120\ud0dd \ud56d\ubaa9 \uc0ac\uc6a9)<\/em>\ub97c \ud074\ub9ad\ud558\uc138\uc694.<\/p>\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-489389\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2024\/07\/4-Selecting-auto-suggested-build-steps.png\" alt=\"\" width=\"3420\" height=\"1962\" \/><\/p>\n<figcaption class=\"wp-element-caption\"><em>\uc790\ub3d9\uc73c\ub85c \uc81c\uc548\ub41c \ube4c\ub4dc \ub2e8\uacc4 \uc120\ud0dd<\/em><\/figcaption>\n<\/figure>\n<p>\uc644\ub8cc\ub418\uba74 \uc791\uc740 \ubc30\ub108\uac00 \ub098\ud0c0\ub098 \ud504\ub85c\uc81d\ud2b8\uc758 \uccab \ube4c\ub4dc\ub97c \uc2e4\ud589\ud560 \uc218 \uc788\ub2e4\uace0 \uc54c\ub824\uc90d\ub2c8\ub2e4. \uc624\ub978\ucabd \uc0c1\ub2e8\uc5d0\uc11c <em>Run(\uc2e4\ud589)<\/em>\uc744 \ud074\ub9ad\ud558\uc5ec \uccab \ube4c\ub4dc\ub97c \uc2dc\uc791\ud558\uc138\uc694.<\/p>\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-489400\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2024\/07\/5-Starting-your-first-build.png\" alt=\"\" width=\"3420\" height=\"1962\" \/><\/p>\n<figcaption class=\"wp-element-caption\"><em>\uccab \ube4c\ub4dc \uc2dc\uc791<\/em><\/figcaption>\n<\/figure>\n<p>\ubc84\ud2bc\uc744 \ud074\ub9ad\ud558\uba74 \ube4c\ub4dc\uac00 \ub300\uae30\uc5f4\uc5d0 \ub193\uc774\uba70 \ube4c\ub4dc \uc5d0\uc774\uc804\ud2b8\ub97c \uc0ac\uc6a9\ud560 \uc218 \uc788\uc744 \ub54c\uae4c\uc9c0 \ub300\uae30\ud558\uac8c \ub429\ub2c8\ub2e4. \uc0c1\ub2e8 \ud0d0\uc0c9 \ud328\ub110\uc5d0\uc11c <em>Projects(\ud504\ub85c\uc81d\ud2b8)<\/em>\ub97c \ud074\ub9ad\ud574\uc11c \uc2e4\ud589 \uc911\uc778 \ube4c\ub4dc\ub97c \uc120\ud0dd\ud558\uba74 \ud504\ub85c\ud37c\ud2f0\uc640 \uc0c1\ud0dc\ub97c \ud655\uc778\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-489412\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2024\/07\/6-Running-build-details.png\" alt=\"\" width=\"3420\" height=\"1962\" \/><\/p>\n<figcaption class=\"wp-element-caption\"><em>\uc2e4\ud589 \uc911\uc778 \ube4c\ub4dc\uc758 \uc0c1\uc138 \uc815\ubcf4<\/em><\/figcaption>\n<\/figure>\n<p>\ube4c\ub4dc\ub294 \uc57d 5~6\ubd84 \uc774\ub0b4\uc5d0 \uc644\ub8cc\ub429\ub2c8\ub2e4. \ucd95\ud558\ud569\ub2c8\ub2e4! TeamCity\uc5d0\uc11c \uccab Android CI\/CD \ud30c\uc774\ud504\ub77c\uc778\uc744 \uc124\uc815\ud558\uc168\uc2b5\ub2c8\ub2e4. \ub610\ud55c, \uc774 \ud30c\uc774\ud504\ub77c\uc778\uc744 \uc124\uc815\ud558\uae30 \uc704\ud574 VCS \uc800\uc7a5\uc18c URL\uc744 \uc0ac\uc6a9\ud558\uc600\uae30 \ub54c\ubb38\uc5d0 \uc790\ub3d9\uc73c\ub85c \uc800\uc7a5\uc18c URL\uc744 \uc77c\uc815\ud55c \uac04\uaca9\ub9c8\ub2e4 \ud655\uc778\ud558\uc5ec \uc800\uc7a5\uc18c\uc5d0 \uc0c8\ub85c\uc6b4 \ubcc0\uacbd \uc0ac\ud56d\uc774 \ud478\uc2dc\ub418\uc5c8\ub294\uc9c0 \ud655\uc778\ud558\ub3c4\ub85d \uad6c\uc131\ub418\uc5c8\uc2b5\ub2c8\ub2e4. \uc0c8\ub85c\uc6b4 \ubcc0\uacbd \uc0ac\ud56d\uc774 \ubc1c\uacac\ub418\uba74 \ud30c\uc774\ud504\ub77c\uc778\uc774 \uc790\ub3d9\uc73c\ub85c \ucd5c\uc2e0 \ucee4\ubc0b\uc744 \uac00\uc838\uc624\uace0 \ube4c\ub4dc\ub97c \ub2e4\uc2dc \uc2e4\ud589\ud569\ub2c8\ub2e4.<\/p>\n<p>\ud50c\ub7ab\ud3fc\uc5d0 \ub9de\ub294 \uc6f9\ud6c5\uc744 \uc124\uc815\ud574\uc11c \ub354\uc6b1 \uac1c\uc120\ud560 \uc218\ub3c4 \uc788\uc2b5\ub2c8\ub2e4. \uc608\ub97c \ub4e4\uc5b4 \ubc29\uae08 \uc124\uc815\ud55c \uc800\uc7a5\uc18c\ub294 GitHub\uc5d0 \ud638\uc2a4\ud305\ub418\uc5b4 \uc788\uc2b5\ub2c8\ub2e4. TeamCity\uc5d0\uc11c\ub294 \ud3b8\ub9ac\ud558\uac8c GitHub \uc6f9\ud6c5\uc744 \uc124\uce58\ud558\uc5ec \uc800\uc7a5\uc18c\uc5d0 \ud2b9\uc815 \ud65c\ub3d9\uc774 \uc788\uc744 \ub54c\ub9c8\ub2e4 GitHub\uac00 \uc790\ub3d9\uc73c\ub85c TeamCity\uc5d0 \uc54c\ub9bc\uc744 \ubcf4\ub0b4\uac8c \ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-489423\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2024\/07\/7-Installing-GitHub-webhook.png\" alt=\"\" width=\"3420\" height=\"1962\" \/><\/p>\n<figcaption class=\"wp-element-caption\"><em>GitHub \uc6f9\ud6c5 \uc124\uce58<\/em><\/figcaption>\n<\/figure>\n<p>\uc6d0\ud558\ub294 \uacbd\uc6b0 \uc704\uc758 \uc791\uc5c5\uc744 \uc218\ud589\ud574\ub3c4 \ub429\ub2c8\ub2e4. \uadf8\ub7ec\ub098 \uc774\ubc88 \ud29c\ud1a0\ub9ac\uc5bc\uc5d0\uc11c\ub294 \ud544\uc218\uac00 \uc544\ub2d9\ub2c8\ub2e4.<\/p>\n<h3 class=\"wp-block-heading\">\ube4c\ub4dc \uc544\ud2f0\ud329\ud2b8 \uad6c\uc131<\/h3>\n<p>\uc124\uc815\ub41c \uc800\uc7a5\uc18c\uc5d0\ub294 \ub450 \uac00\uc9c0 \uc635\uc158\uc774 \uc788\uc2b5\ub2c8\ub2e4(<code>Free<\/code> \ubc0f <code>Paid<\/code>). \ub450 \uc635\uc158\uc5d0\ub294 \ub450 \uac00\uc9c0 \ube4c\ub4dc \ubcc0\ud615\uc774 \uc788\uc2b5\ub2c8\ub2e4(<code>debug<\/code> \ubc0f <code>release<\/code>). \uc774\ub294 <code>build<\/code> \uc791\uc5c5\uc758 \uacb0\uacfc\uc5d0 \uac01 \ubc84\uc804\uacfc \ubcc0\ud615\uc758 \uac00\ub2a5\ud55c \uc870\ud569\uc5d0 \ub530\ub77c \ub124 \uac00\uc9c0 \ubc14\uc774\ub108\ub9ac \ud30c\uc77c\uc774 \ud3ec\ud568\ub41c\ub2e4\ub294 \uc758\ubbf8\uc785\ub2c8\ub2e4. \ud30c\uc774\ud504\ub77c\uc778 \uc2e4\ud589\uc774 \uc644\ub8cc\ub41c \ud6c4\uc5d0 \uc774\ub7ec\ud55c \uc544\ud2f0\ud329\ud2b8\ub97c \ucd94\ucd9c\ud558\uace0 \uc561\uc138\uc2a4 \uac00\ub2a5\ud558\ub3c4\ub85d \ud30c\uc774\ud504\ub77c\uc778\uc744 \uad6c\uc131\ud574 \ubcf4\uaca0\uc2b5\ub2c8\ub2e4.<\/p>\n<p>\uc774\ub97c \uc704\ud574 \uc0c1\ub2e8 \ud0d0\uc0c9 \ud328\ub110\uc5d0\uc11c <em>Projects(\ud504\ub85c\uc81d\ud2b8)<\/em>\ub97c \ud074\ub9ad\ud558\uace0 <em>Android App Teamcity(Android \uc571 Teamcity)<\/em> \ud558\ub2e8\uc758 <em>Build(\ube4c\ub4dc)<\/em>\ub97c \ud074\ub9ad\ud558\uc5ec \uc81c\ubaa9\uc774 <em>Build<\/em>\uc778 \ube4c\ub4dc \uad6c\uc131 \uc0c1\uc138 \ud398\uc774\uc9c0\ub97c \uc5ec\uc138\uc694.<\/p>\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-489434\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2024\/07\/8-Navigating-to-build-configuration-page.png\" alt=\"\" width=\"3420\" height=\"1962\" \/><\/p>\n<figcaption class=\"wp-element-caption\"><em>\ube4c\ub4dc \uad6c\uc131 \ud398\uc774\uc9c0\ub85c \uc774\ub3d9<\/em><\/figcaption>\n<\/figure>\n<p>\uc5ec\uae30\uc5d0\uc11c \ud654\uba74\uc758 \uc624\ub978\ucabd \uc0c1\ub2e8 \ubaa8\uc11c\ub9ac\uc5d0 \uc788\ub294 <em>Edit configuration(\uad6c\uc131 \ud3b8\uc9d1)<\/em> \ubc84\ud2bc\uc744 \ud074\ub9ad\ud558\uc138\uc694.<\/p>\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-489447\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2024\/07\/9-Editing-your-build-configuration.png\" alt=\"\" width=\"3420\" height=\"1962\" \/><\/p>\n<figcaption class=\"wp-element-caption\"><em>\ube4c\ub4dc \uad6c\uc131 \ud3b8\uc9d1<\/em><\/figcaption>\n<\/figure>\n<p>\uc5ec\uae30\uc5d0\uc11c \ube4c\ub4dc \uad6c\uc131\uc758 \uc77c\ubc18\uc801\uc778 \uc124\uc815\uc744 \ubcc0\uacbd\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \ubaa9\ub85d\uc758 \ud558\ub2e8\uc5d0 <em>Artifact paths(\uc544\ud2f0\ud329\ud2b8 \uacbd\ub85c)<\/em>\ub77c\ub294 \ud544\ub4dc\uac00 \uc788\uc2b5\ub2c8\ub2e4. \ube4c\ub4dc \uc2e4\ud589\uc774 \uc644\ub8cc\ub41c \ud6c4\uc5d0 \ucd94\ucd9c\ud558\uace0 \uc720\uc9c0\ud558\uace0\uc790 \ud558\ub294 \uc544\ud2f0\ud329\ud2b8\uc758 \uacbd\ub85c\ub97c \uc774\uacf3\uc5d0 \uc815\uc758\ud574\uc57c \ud569\ub2c8\ub2e4.<\/p>\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-489610\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2024\/07\/11-Setting-artifact-paths.png\" alt=\"\" width=\"3420\" height=\"1962\" \/><\/p>\n<figcaption class=\"wp-element-caption\"><em>\uc544\ud2f0\ud329\ud2b8 \uacbd\ub85c \uc124\uc815<\/em><\/figcaption>\n<\/figure>\n<p>Gradle <code>build<\/code> \uc791\uc5c5\uc744 \uc2e4\ud589\ud560 \ub54c Gradle\uc774 \uc0dd\uc131\ud558\ub294 \uc544\ud2f0\ud329\ud2b8\ub294 <code>app\/build\/outputs\/apk<\/code>\uc5d0 \uc800\uc7a5\ub429\ub2c8\ub2e4. \ub530\ub77c\uc11c \ub2e4\uc74c\uc744 <em>Artifact paths<\/em>(\uc544\ud2f0\ud329\ud2b8 \uacbd\ub85c) \uc544\ub798\uc5d0 \uc785\ub825\ud558\uc138\uc694.<\/p>\n<pre class=\"EnlighterJSRAW\">app\/build\/outputs\/apk\/*\/*\/* =&gt; output<\/pre>\n<p>\ube4c\ub4dc \ud6c4\uc5d0 \uc0dd\uc131\ub418\ub294 APK \ubc14\uc774\ub108\ub9ac\uc758 \uc644\uc804\ud55c \uacbd\ub85c\ub294 <code>app\/build\/outputs\/apk\/\/\/app---unsigned.apk<\/code>\uc640 \uac19\uc73c\ubbc0\ub85c <code>app\/build\/outputs\/apk<\/code> \ub4a4\uc5d0 <code>\/*\/*\/*<\/code>\ub97c \ucd94\uac00\ud569\ub2c8\ub2e4.<\/p>\n<p><code><\/code>, <code><\/code> \ubc0f \ubc14\uc774\ub108\ub9ac \ud30c\uc77c \uc774\ub984\uc758 \uac00\ub2a5\ud55c \uac12\uc744 \ubaa8\ub450 \ubc18\uc601\ud558\uae30 \uc704\ud574 \uc640\uc77c\ub4dc\uce74\ub4dc <code>*<\/code>\ub97c \uc0ac\uc6a9\ud558\uc600\uc2b5\ub2c8\ub2e4.<\/p>\n<p><code>=&gt;<\/code> \uc774\ub294 Ant \uc2a4\ud0c0\uc77c \uacbd\ub85c\uc758 \uae30\ub2a5\uc774\uba70 \ucd9c\ub825 \ubc0f \uc785\ub825 \ub514\ub809\ud130\ub9ac\ub97c \uad6c\ubd84\ud560 \ub54c \uc0ac\uc6a9\ub429\ub2c8\ub2e4. <code>output<\/code>\uc740 \ucd5c\uc885 \ubc14\uc774\ub108\ub9ac\uac00 \uc800\uc7a5\ub420 \ud3f4\ub354\uc758 \uc774\ub984\uc785\ub2c8\ub2e4.<\/p>\n<p>\uc774\ub97c \ucd94\uac00\ud55c \ub2e4\uc74c \ud398\uc774\uc9c0\uc758 \ud558\ub2e8\uc5d0\uc11c <em>Save(\uc800\uc7a5)<\/em> \ubc84\ud2bc\uc744 \ud074\ub9ad\ud558\uc138\uc694. \ubcc0\uacbd \uc0ac\ud56d\uc774 \uc800\uc7a5\ub418\uc5c8\ub2e4\ub294 \ub178\ub780\uc0c9 \ubc30\ub108\uac00 \ud45c\uc2dc\ub429\ub2c8\ub2e4.<\/p>\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-489624\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2024\/07\/12-Saving-changes-made-to-build-configuration.png\" alt=\"\" width=\"3420\" height=\"1962\" \/><\/p>\n<figcaption class=\"wp-element-caption\"><em>\ube4c\ub4dc \uad6c\uc131\uc758 \ubcc0\uacbd \uc0ac\ud56d \uc800\uc7a5<\/em><\/figcaption>\n<\/figure>\n<p>\uc774\uc81c \ud398\uc774\uc9c0\uc758 \uc624\ub978\ucabd \uc0c1\ub2e8\uc5d0\uc11c <em>Run(\uc2e4\ud589)<\/em> \ubc84\ud2bc\uc744 \ub204\ub974\uace0 \ud30c\uc774\ud504\ub77c\uc778\uc744 \ub2e4\uc2dc \uc2e4\ud589\ud558\uc5ec \ube4c\ub4dc\uac00 \uc644\ub8cc\ub41c \ud6c4 \uc0dd\uc131\ub41c \uc544\ud2f0\ud329\ud2b8\ub97c \ubcfc \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-489635\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2024\/07\/13-Viewing-the-generated-artifacts.png\" alt=\"\" width=\"3420\" height=\"1962\" \/><\/p>\n<figcaption class=\"wp-element-caption\"><em>\uc0dd\uc131\ub41c \uc544\ud2f0\ud329\ud2b8 \ud655\uc778<\/em><\/figcaption>\n<\/figure>\n<p>\uc800\uc7a5\uc18c\uc758 \uba54\uc778 \ube0c\ub79c\uce58\uc5d0 \ucee4\ubc0b\uc774 \ud478\uc2dc\ub420 \ub54c\ub9c8\ub2e4 \ud2b8\ub9ac\uac70\ub418\ub294 \ud30c\uc774\ud504\ub77c\uc778\uc774 \uc774\uc81c \uc124\uc815\ub418\uc5c8\uc2b5\ub2c8\ub2e4. \uc774 \ud30c\uc774\ud504\ub77c\uc778\uc740 \ud504\ub85c\uc81d\ud2b8\uc5d0\uc11c \uac00\ub2a5\ud55c \ubaa8\ub4e0 \uc635\uc158 \ubc0f \ubcc0\ud615 \uc870\ud569\uc5d0 \ub300\ud574 \uc11c\uba85\ub418\uc9c0 \uc54a\uc740 \ube4c\ub4dc \uc544\ud2f0\ud329\ud2b8\ub97c \uc0dd\uc131\ud558\uace0, \uc720\ub2db \ud14c\uc2a4\ud2b8\ub97c \uc2e4\ud589\ud558\uba70, \ube4c\ub4dc \uc544\ud2f0\ud329\ud2b8\ub97c \uc77d\uc744 \uc218 \uc788\ub3c4\ub85d \uc124\uc815\ud569\ub2c8\ub2e4.<\/p>\n<p>\ub2e4\uc74c\uc73c\ub85c\ub294 \ud14c\uc2a4\ud2b8\ub97c \uc0ac\uc6a9\uc790\ud654\ud558\ub294 \ubc29\ubc95\uc744 \uc54c\uc544\ubcf4\uaca0\uc2b5\ub2c8\ub2e4.<\/p>\n<h3 class=\"wp-block-heading\">\ud14c\uc2a4\ud2b8 \uc0ac\uc6a9\uc790\ud654<\/h3>\n<p>\uc55e\uc11c \uc5b8\uae09\ub41c \uac83\uacfc \uac19\uc774 <code>build<\/code> Gradle \uc791\uc5c5\uc740 \uc0dd\uc131\ub41c \ubaa8\ub4e0 \ube4c\ub4dc \uc544\ud2f0\ud329\ud2b8\uc5d0 \ub300\ud574 \uc720\ub2db \ud14c\uc2a4\ud2b8\ub97c \uc2e4\ud589\ud569\ub2c8\ub2e4. \uadf8\ub7ec\ub098 \uc571\uc5d0 \uc788\ub294 \uc77c\ubd80 \ubcc0\ud615\uc5d0 \ub300\ud574\uc11c\ub9cc \ud14c\uc2a4\ud2b8\ub97c \uc2e4\ud589\ud558\uace0 \uc2f6\uc740 \uc0c1\ud669\uc774 \uc788\uc744 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc774\ub7ec\ud55c \uacbd\uc6b0\uc5d0\ub294 <code>clean build<\/code> \uc791\uc5c5\uc744 \uc0ac\uc6a9\uc790\uc758 \uc0ac\uc6a9 \uc0ac\ub840\uc5d0 \ub9de\ub294 \uc801\uc808\ud55c \uc791\uc5c5\uc73c\ub85c \ub300\uccb4\ud574\uc57c \ud569\ub2c8\ub2e4.<\/p>\n<p>\uc608\ub97c \ub4e4\uc5b4 \ubb34\ub8cc \ubc84\uc804 \uc571\uc758 \ub9b4\ub9ac\uc2a4 \ubcc0\ud615\uc5d0 \ub300\ud574 \uc11c\uba85\ub418\uc9c0 \uc54a\uc740 APK\ub97c \uc0dd\uc131\ud558\uace0 \uc720\ub2db \ud14c\uc2a4\ud2b8\ub97c \uc2e4\ud589\ud558\ub824\ub294 \uacbd\uc6b0 <code>clean build<\/code>\ub97c <code>assembleFreeRelease testFreeReleaseUnitTest<\/code>\ub85c \ub300\uccb4\ud574\uc57c \ud569\ub2c8\ub2e4. \uadf8\ub807\uac8c \ud558\ub824\uba74 \uc0c1\ub2e8 \ud0d0\uc0c9 \ud328\ub110\uc5d0\uc11c <em>Projects(\ud504\ub85c\uc81d\ud2b8)<\/em>\ub97c \ud074\ub9ad\ud55c \ub2e4\uc74c <em>Android App Teamcity(Android \uc571 Teamcity)<\/em> \uc544\ub798\uc758 <em>Build(\ube4c\ub4dc)<\/em>\ub97c \ud074\ub9ad\ud558\uc138\uc694. \uc774\uc804 \ub2e8\uacc4\uc640 \ub9c8\ucc2c\uac00\uc9c0\ub85c \ub2e4\uc74c \ud398\uc774\uc9c0\uc758 \uc624\ub978\ucabd \uc0c1\ub2e8\uc5d0\uc11c <em>Edit configuration(\uad6c\uc131 \ud3b8\uc9d1)<\/em> \ubc84\ud2bc\uc744 \ud074\ub9ad\ud558\uc138\uc694.<\/p>\n<p>\uc774\uc804\uc5d0 \uc544\ud2f0\ud329\ud2b8 \uacbd\ub85c\ub97c \uad6c\uc131\ud560 \ub54c \uc561\uc138\uc2a4\ud588\ub358 \ube4c\ub4dc \uad6c\uc131\uc758 <em>General Settings(\uc77c\ubc18 \uc124\uc815)<\/em> \ud398\uc774\uc9c0\ub85c \uc774\ub3d9\ud569\ub2c8\ub2e4. \uc67c\ucabd \ud0d0\uc0c9 \ud328\ub110\uc5d0\uc11c <em>Build Step: Gradle(\ube4c\ub4dc \ub2e8\uacc4: Gradle)<\/em>\uc744 \ud074\ub9ad\ud558\uc138\uc694.<\/p>\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-489648\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2024\/07\/14-Navigating-to-build-settings.png\" alt=\"\" width=\"3420\" height=\"1962\" \/><\/p>\n<figcaption class=\"wp-element-caption\"><em>\ube4c\ub4dc \uc124\uc815\uc73c\ub85c \uc774\ub3d9<\/em><\/figcaption>\n<\/figure>\n<p>\uadf8\ub7ec\uba74 <em>Build Steps(\ube4c\ub4dc \ub2e8\uacc4)<\/em> \ud398\uc774\uc9c0\uac00 \uc5f4\ub9ac\uba70, \uc5ec\uae30\uc11c \uc774 \ube4c\ub4dc \uad6c\uc131\uc758 \ube4c\ub4dc \ub2e8\uacc4\ub97c \uc218\uc815\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uccab \ube4c\ub4dc \ub2e8\uacc4(\uc81c\ubaa9: <em>Gradle<\/em>)\uc758 \uc624\ub978\ucabd\uc5d0 \uc788\ub294 <em>Edit(\ud3b8\uc9d1)<\/em>\uc744 \ud074\ub9ad\ud558\uc138\uc694.<\/p>\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-489659\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2024\/07\/15-Editing-Gradle-build-step.png\" alt=\"\" width=\"3420\" height=\"1962\" \/><\/p>\n<figcaption class=\"wp-element-caption\"><em>Gradle \ube4c\ub4dc \ub2e8\uacc4 \ud3b8\uc9d1<\/em><\/figcaption>\n<\/figure>\n<p>\uc774\uc81c <em>Gradle tasks(Gradle \uc791\uc5c5)<\/em> \ud544\ub4dc\ub97c \uc5c5\ub370\uc774\ud2b8\ud558\uc5ec \uc774 \ube4c\ub4dc\uc758 \uc77c\ud658\uc73c\ub85c \uc2e4\ud589\ub420 \uc791\uc5c5\uc744 \ubcc0\uacbd\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. <code>clean build<\/code>\ub97c <code>assembleFreeRelease testFreeReleaseUnitTest<\/code>\ub85c \ubc14\uafb8\uc138\uc694.<\/p>\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-489670\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2024\/07\/16-Updating-Gradle-tasks.png\" alt=\"\" width=\"3420\" height=\"1962\" \/><\/p>\n<figcaption class=\"wp-element-caption\"><em>Gradle \uc791\uc5c5 \uc5c5\ub370\uc774\ud2b8<\/em><\/figcaption>\n<\/figure>\n<p>\uc774\uc81c \ud558\ub2e8\uc5d0\uc11c <em>Save(\uc800\uc7a5)<\/em>\ub97c \ub204\ub974\uc138\uc694. \ubcc0\uacbd \uc0ac\ud56d\uc774 \uc800\uc7a5\ub418\uba74 \uc624\ub978\ucabd \uc0c1\ub2e8\uc5d0\uc11c <em>Run(\uc2e4\ud589)<\/em> \ubc84\ud2bc\uc744 \ud074\ub9ad\ud558\uc138\uc694. \uc774 \ube4c\ub4dc \uad6c\uc131\uc774 \ucd94\uac00\ub85c \uc2e4\ud589\ub429\ub2c8\ub2e4.<\/p>\n<p>\ube4c\ub4dc \uc2e4\ud589\uc774 \uc644\ub8cc\ub418\uba74 \ube4c\ub4dc \uc2e4\ud589 \uc0c1\uc138 \uc815\ubcf4 \ud398\uc774\uc9c0\uc758 <em>Tests(\ud14c\uc2a4\ud2b8)<\/em> \ud0ed\uc5d0\uc11c TeamCity\uac00 \uc0dd\uc131\ud55c \ubcf4\uace0\uc11c\ub97c \ubcfc \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-489681\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2024\/07\/17-Viewing-test-results.png\" alt=\"\" width=\"3420\" height=\"1962\" \/><\/p>\n<figcaption class=\"wp-element-caption\"><em>\ud14c\uc2a4\ud2b8 \uacb0\uacfc \ud655\uc778<\/em><\/figcaption>\n<\/figure>\n<p>\uc720\ub2db \ud14c\uc2a4\ud2b8\ub9c8\ub2e4 \uc2e4\ud589\ud558\ub294 \ub370 \uac78\ub9b0 \uc2dc\uac04\uacfc \ud14c\uc2a4\ud2b8 \uc644\ub8cc \ud6c4 \ub0a8\uc740 \uc2a4\ud0dd \ucd94\uc801\uc744 \ud655\uc778\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \ub610\ud55c, \ud14c\uc2a4\ud2b8\uc758 \uc624\ub978\ucabd \ub05d\uc5d0 \uc788\ub294 \uc810 \uc138 \uac1c\ub97c \ud074\ub9ad\ud55c \ub2e4\uc74c <em>Show test history(\ud14c\uc2a4\ud2b8 \uae30\ub85d \ud45c\uc2dc)<\/em>\ub97c \uc120\ud0dd\ud558\uba74 \ud604\uc7ac\uc758 \ud14c\uc2a4\ud2b8 \uc2e4\ud589\uacfc \uc774\uc804 \uc2e4\ud589\uc758 \uc131\ub2a5 \ucc28\uc774\ub97c \ube44\uad50\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-489692\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2024\/07\/18-Comparing-test-run-history.png\" alt=\"\" width=\"3420\" height=\"1962\" \/><\/p>\n<figcaption class=\"wp-element-caption\"><em>\ud14c\uc2a4\ud2b8 \uc2e4\ud589 \uae30\ub85d \ube44\uad50<\/em><\/figcaption>\n<\/figure>\n<p>\ud14c\uc2a4\ud2b8 \uc870\uc0ac\ub97c \ud300\uc6d0\uc5d0\uac8c \ud560\ub2f9\ud558\uace0 \uc870\uc0ac \uae30\ub85d\uc744 TeamCity \ub0b4\uc5d0\uc11c \ucd94\uc801\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc6d0\ud558\ub294 \uacbd\uc6b0 \ud14c\uc2a4\ud2b8 \uac1c\uc694 \ud398\uc774\uc9c0\uc5d0\uc11c <em>Download(\ub2e4\uc6b4\ub85c\ub4dc)<\/em> \ub9c1\ud06c\ub97c \ud074\ub9ad\ud558\uc5ec \ud14c\uc2a4\ud2b8 \uacb0\uacfc\ub97c \ub2e4\uc6b4\ub85c\ub4dc\ud560 \uc218\ub3c4 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<p>\uc774 \uc800\uc7a5\uc18c\ub294 \ud14c\uc2a4\ud2b8 \uac1c\uc218\uac00 \uc801\uae30 \ub54c\ubb38\uc5d0 \ube4c\ub4dc \uc2e4\ud589\uc774 \uc218 \ubd84 \ub9cc\uc5d0 \uc644\ub8cc\ub418\uc5c8\uc2b5\ub2c8\ub2e4. \uadf8\ub7ec\ub098 \uc2e4\uc81c \ud504\ub85c\uc81d\ud2b8\uc5d0\uc11c\ub294 \uc218\ucc9c \uac1c\uae4c\uc9c0\ub294 \uc544\ub2c8\ub354\ub77c\ub3c4 \uc218\ubc31 \uac1c\uc758 \uc720\ub2db \ud14c\uc2a4\ud2b8\uac00 \uc788\uc2b5\ub2c8\ub2e4. \uadf8\ub7ec\ud55c \uc0c1\ud669\uc5d0\uc11c \ub3d9\uc77c\ud55c \ub7ec\ub108 \uc5d0\uc774\uc804\ud2b8\ub85c \ubaa8\ub4e0 \ud14c\uc2a4\ud2b8\ub97c \uc21c\ucc28\uc801\uc73c\ub85c \uc2e4\ud589\ud558\uba74 \ub9ce\uc740 \uc2dc\uac04\uc774 \uc18c\uc694\ub429\ub2c8\ub2e4. \uc774 \ubb38\uc81c\ub294 TeamCity\uc758 <a href=\"https:\/\/www.jetbrains.com\/help\/teamcity\/cloud\/2024.03\/parallel-tests.html?parallel-tests\" target=\"_blank\" rel=\"noopener\">\ubcd1\ub82c \ud14c\uc2a4\ud2b8<\/a> \ube4c\ub4dc \uae30\ub2a5\uc744 \uc0ac\uc6a9\ud558\uba74 \ud574\uacb0\ub429\ub2c8\ub2e4.<\/p>\n<p>TeamCity\ub294 \ud14c\uc2a4\ud2b8 \uc2e4\ud589\uc744 \ub098\ub204\uc5b4 \ub2e4\uc218\uc758 \ube4c\ub4dc \uc5d0\uc774\uc804\ud2b8\uc5d0 \ud560\ub2f9\ud558\uc5ec \ubcd1\ub82c\ud654\ud560 \uc218 \uc788\uae30 \ub54c\ubb38\uc5d0 \ud14c\uc2a4\ud2b8\ub97c \ubaa8\ub450 \uc2e4\ud589\ud558\ub294 \ub370 \uac78\ub9ac\ub294 \uc2dc\uac04\uc744 \ucd5c\uc18c\ud654\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc774\ub97c \uc124\uc815\ud558\uae30 \uc704\ud574 \ube4c\ub4dc \uc2e4\ud589 \uc0c1\uc138 \uc815\ubcf4 \ud398\uc774\uc9c0\uc5d0\uc11c <em>Edit configuration(\uad6c\uc131 \ud3b8\uc9d1)<\/em> \ubc84\ud2bc\uc744 \ud074\ub9ad\ud55c \ub2e4\uc74c \uc67c\ucabd \ud0d0\uc0c9 \ud328\ub110\uc5d0\uc11c <em>Build Features(\ube4c\ub4dc \uae30\ub2a5)<\/em>\ub97c \ud074\ub9ad\ud558\uc138\uc694.<\/p>\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-489703\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2024\/07\/19-Navigating-to-the-Build-Features-page.png\" alt=\"\" width=\"3420\" height=\"1962\" \/><\/p>\n<figcaption class=\"wp-element-caption\"><em>\ube4c\ub4dc \uae30\ub2a5 \ud398\uc774\uc9c0\ub85c \uc774\ub3d9<\/em><\/figcaption>\n<\/figure>\n<p><em>Build Features<\/em> \ud398\uc774\uc9c0\uc5d0\uc11c <em>+ Add build feature(\ube4c\ub4dc \uae30\ub2a5 \ucd94\uac00)<\/em> \ubc84\ud2bc\uc744 \ud074\ub9ad\ud558\uc138\uc694. \ub300\ud654\uc0c1\uc790\uac00 \uc5f4\ub9ac\uba74 \ub4dc\ub86d\ub2e4\uc6b4 \uba54\ub274\uc5d0\uc11c <em>Parallel tests(\ubcd1\ub82c \ud14c\uc2a4\ud2b8)<\/em>\ub97c \uc120\ud0dd\ud558\uc138\uc694.<\/p>\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-489715\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2024\/07\/20-Searching-for-parallel-tests.png\" alt=\"\" width=\"3420\" height=\"1962\" \/><\/p>\n<figcaption class=\"wp-element-caption\"><em>\ubcd1\ub82c \ud14c\uc2a4\ud2b8 \uac80\uc0c9<\/em><\/figcaption>\n<\/figure>\n<p>\ubcd1\ub82c\ub85c \ud14c\uc2a4\ud2b8\ub97c \uc2e4\ud589\ud560 \ub54c \uc0ac\uc6a9\ud560 \ucd5c\ub300 \ubc30\uce58 \uac1c\uc218\ub97c \uc785\ub825\ud574\uc57c \ud569\ub2c8\ub2e4. \ubcd1\ub82c\ud654\uc758 \uc774\uc810\uc744 \ucd5c\ub300\ud55c \ud65c\uc6a9\ud558\ub824\uba74 4\uc5d0\uc11c 8 \uc0ac\uc774\uc758 \uac12\uc744 \uc785\ub825\ud558\uc138\uc694.<\/p>\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-489728\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2024\/07\/21-Setting-up-parallel-build-batches.png\" alt=\"\" width=\"3420\" height=\"1962\" \/><\/p>\n<figcaption class=\"wp-element-caption\"><em>\ubcd1\ub82c \ube4c\ub4dc \ubc30\uce58 \uc124\uc815<\/em><\/figcaption>\n<\/figure>\n<p>\uc644\ub8cc\ud55c \ud6c4 <em>Save(\uc800\uc7a5)<\/em> \ubc84\ud2bc\uc744 \ud074\ub9ad\ud558\uc138\uc694. \uc774\uc81c \ud14c\uc2a4\ud2b8 \uc0ac\ub840\uac00 \ud48d\ubd80\ud55c \uc800\uc7a5\uc18c\uc758 \ud14c\uc2a4\ud2b8\ub97c \uc2e4\ud589\ud558\uc5ec \uc131\ub2a5 \ucc28\uc774\ub97c \uc9c1\uc811 \ud655\uc778\ud574 \ubcfc \uc218 \uc788\uc2b5\ub2c8\ub2e4!<\/p>\n<h3 class=\"wp-block-heading\">\ub2e4\uc218\uc758 \ube4c\ub4dc \uad00\ub9ac<\/h3>\n<p>\uc571\uc5d0 \uc5ec\ub7ec \uc124\uc815\uacfc \ubcc0\ud615\uc774 \uc788\uae30 \ub54c\ubb38\uc5d0 TeamCity\uc758 \ub9e4\ud2b8\ub9ad\uc2a4 \ube4c\ub4dc\ub97c \ud65c\uc6a9\ud558\uc5ec \uac01 \uc124\uc815 \ubc0f \ubcc0\ud615 \uc870\ud569\uc744 \ubcc4\ub3c4\uc758 \uc2e4\ud589 \uc778\uc2a4\ud134\uc2a4\ub85c \ub098\ub220\uc11c \ube4c\ub4dc \ud30c\uc774\ud504\ub77c\uc778\uc758 \uc18d\ub3c4\ub97c \ub192\uc774\ub294 \uac8c \uc88b\uc2b5\ub2c8\ub2e4. \ub610\ud55c, \ubaa8\ub4e0 \uc870\ud569\uc744 \ube4c\ub4dc\ud558\uac70\ub098 \ud558\ub098\uc758 \uc870\ud569\ub9cc \ube4c\ub4dc\ud558\ub294 \uac83\uc774 \uc544\ub2cc, \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc758 \ud2b9\uc815 \uc870\ud569\uc744 \ube4c\ub4dc\ud560 \uc218\ub3c4 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<p>\uc774\ub97c \uc704\ud574\uc11c\ub294 \uc0c8\ub85c\uc6b4 \ube4c\ub4dc \uad6c\uc131\uc744 \uc0dd\uc131\ud574\uc57c \ud569\ub2c8\ub2e4. \uc0c1\ub2e8 \ud0d0\uc0c9 \ud328\ub110\uc5d0\uc11c <em>Projects(\ud504\ub85c\uc81d\ud2b8)<\/em>\ub97c \ud074\ub9ad\ud55c \ub2e4\uc74c <em>Android App Teamcity(Android \uc571 Teamcity)<\/em>\ub97c \ud074\ub9ad\ud558\uc138\uc694. \ud504\ub85c\uc81d\ud2b8 \uc0c1\uc138 \uc815\ubcf4 \ud398\uc774\uc9c0\uc758 \uc624\ub978\ucabd \uc0c1\ub2e8 \ubaa8\uc11c\ub9ac\uc5d0\uc11c <em>Edit project\u2026(\ud504\ub85c\uc81d\ud2b8 \ud3b8\uc9d1\u2026)<\/em>\ub97c \ud074\ub9ad\ud558\uc138\uc694.<\/p>\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-489739\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2024\/07\/22-Navigating-to-project-configuration.png\" alt=\"\" width=\"3420\" height=\"1962\" \/><\/p>\n<figcaption class=\"wp-element-caption\"><em>\ud504\ub85c\uc81d\ud2b8 \uad6c\uc131\uc73c\ub85c \uc774\ub3d9<\/em><\/figcaption>\n<\/figure>\n<p><em>General Settings(\uc77c\ubc18 \uc124\uc815)<\/em> \ud398\uc774\uc9c0\uc758 <em>Build Configurations(\ube4c\ub4dc \uad6c\uc131)<\/em> \uc139\uc158\uc5d0\uc11c <em>+ Create build configuration(\ube4c\ub4dc \uad6c\uc131 \ub9cc\ub4e4\uae30)<\/em> \ubc84\ud2bc\uc744 \ud074\ub9ad\ud558\uc138\uc694.<\/p>\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-489750\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2024\/07\/23-Creating-a-new-build-configuration.png\" alt=\"\" width=\"3420\" height=\"1962\" \/><\/p>\n<figcaption class=\"wp-element-caption\"><em>\uc0c8 \ube4c\ub4dc \uad6c\uc131 \ub9cc\ub4e4\uae30<\/em><\/figcaption>\n<\/figure>\n<p>\uadf8\ub7ec\uba74 <em>Create Build Configuration<\/em> \ub9c8\ubc95\uc0ac\uac00 \uc5f4\ub9bd\ub2c8\ub2e4. <em>Repository URL(\uc800\uc7a5\uc18c URL)<\/em> \ud544\ub4dc\uc5d0 \uc774\uc804\uacfc \uac19\uc740 \uc800\uc7a5\uc18c URL(<code>https:\/\/github.com\/krharsh17\/android-app-teamcity<\/code>)\uc744 \uc785\ub825\ud558\uace0 <em>Proceed(\uacc4\uc18d\ud558\uae30)<\/em>\ub97c \ud074\ub9ad\ud558\uc138\uc694.<\/p>\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-489761\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2024\/07\/24-Entering-repository-URL.png\" alt=\"\" width=\"3420\" height=\"1962\" \/><\/p>\n<figcaption class=\"wp-element-caption\"><em>\uc800\uc7a5\uc18c URL \uc785\ub825<\/em><\/figcaption>\n<\/figure>\n<p><em>Matrix Builds(\ub9e4\ud2b8\ub9ad\uc2a4 \ube4c\ub4dc)<\/em> \uc606\uc758 \ud398\uc774\uc9c0\uc5d0\uc11c <em>Build configuration name(\ube4c\ub4dc \uad6c\uc131 \uc774\ub984)<\/em>\uc744 \uc124\uc815\ud558\uace0 \ub2e4\ub978 \ud544\ub4dc\ub294 \ubaa8\ub450 \ub514\ud3f4\ud2b8 \uac12\uc73c\ub85c \ub450\uc138\uc694. \uadf8\ub7f0 \ub2e4\uc74c <em>Proceed(\uacc4\uc18d\ud558\uae30)<\/em> \ubc84\ud2bc\uc744 \ud074\ub9ad\ud558\uc138\uc694.<\/p>\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-489772\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2024\/07\/25-Setting-build-configuration-details.png\" alt=\"\" width=\"3420\" height=\"1962\" \/><\/p>\n<figcaption class=\"wp-element-caption\"><em>\ube4c\ub4dc \uad6c\uc131 \uc0c1\uc138 \uc815\ubcf4 \uc124\uc815<\/em><\/figcaption>\n<\/figure>\n<p>\uc720\uc0ac\ud55c VCS \ub8e8\ud2b8\uac00 \ubc1c\uacac\ub418\uc5c8\ub2e4\uace0 TeamCity\uac00 \uc54c\ub824\uc90d\ub2c8\ub2e4. \ub300\ud654\uc0c1\uc790\uc5d0\uc11c <em>Use this(\uc774 \ud56d\ubaa9 \uc0ac\uc6a9)<\/em> \ubc84\ud2bc\uc744 \ud074\ub9ad\ud558\uc138\uc694.<\/p>\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-489784\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2024\/07\/26-Choosing-an-existing-VCS-root.png\" alt=\"\" width=\"3420\" height=\"1962\" \/><\/p>\n<figcaption class=\"wp-element-caption\"><em>\uae30\uc874\uc758 VCS \ub8e8\ud2b8 \uc120\ud0dd<\/em><\/figcaption>\n<\/figure>\n<p>\uc774\ub7ec\uba74 TeamCity\uac00 \ub450 \ube4c\ub4dc \uad6c\uc131\uc5d0 \ub300\ud574 VCS URL\uc744 \ud55c \ubc88\ub9cc \ud3f4\ub9c1\ud558\uae30 \ub54c\ubb38\uc5d0 \ucd94\uac00\uc801\uc778 \uc131\ub2a5 \uc624\ubc84\ud5e4\ub4dc\ub97c \ud53c\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<p>\ube4c\ub4dc \uad6c\uc131\uc774 \uc644\ub8cc\ub418\uba74 \ube4c\ub4dc \uad6c\uc131\uc774 \uc0dd\uc131\ub418\uc5c8\ub2e4\ub294 \uc54c\ub9bc\uc744 \ubc1b\uac8c \ub429\ub2c8\ub2e4.<\/p>\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-489795\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2024\/07\/27-New-build-configuration-created.png\" alt=\"\" width=\"3420\" height=\"1962\" \/><\/p>\n<figcaption class=\"wp-element-caption\"><em>\uc0c8 \ube4c\ub4dc \uc0dd\uc131 \uc644\ub8cc<\/em><\/figcaption>\n<\/figure>\n<p>\uc774\ubc88\uc5d0\ub294 <code>clean build<\/code> Gradle \uc791\uc5c5\uc744 \uc124\uc815\ud560 \ud544\uc694\uac00 \uc5c6\uc73c\ubbc0\ub85c \uc774 \ud398\uc774\uc9c0\uc5d0\uc11c\ub294 \uc5b4\ub5a4 \ud655\uc778\ub780\ub3c4 \uc120\ud0dd\ud558\uc9c0 \ub9c8\uc138\uc694. \ub300\uc2e0 \ud14c\uc774\ube14 \uc704\uc5d0 \uc788\ub294 <em>configure build steps manually(\uc218\ub3d9\uc73c\ub85c \ube4c\ub4dc \ub2e8\uacc4 \uad6c\uc131)<\/em> \ub9c1\ud06c\ub97c \ud074\ub9ad\ud558\uc138\uc694.<\/p>\n<p>\uadf8\ub7ec\uba74 <em>New Build Step(\uc0c8 \ube4c\ub4dc \ub2e8\uacc4)<\/em> \ud398\uc774\uc9c0\ub85c \uc774\ub3d9\ub418\uba70 \uc774\uacf3\uc5d0\uc11c \ube4c\ub4dc \ub2e8\uacc4\uc5d0 \uc0ac\uc6a9\ud560 \uc120\ud638\ud558\ub294 \ub7ec\ub108\ub97c \uc120\ud0dd\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-489806\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2024\/07\/28-Selecting-a-build-runner.png\" alt=\"\" width=\"3420\" height=\"1962\" \/><\/p>\n<figcaption class=\"wp-element-caption\"><em>\ube4c\ub4dc \ub7ec\ub108 \uc120\ud0dd<\/em><\/figcaption>\n<\/figure>\n<p>\ubaa9\ub85d\uc5d0\uc11c <em>Gradle<\/em>\uc744 \uc120\ud0dd\ud558\uc138\uc694. \ub2e4\uc74c \ud398\uc774\uc9c0\uac00 \uc5f4\ub9ac\uba74 <em>Gradle tasks(Gradle \uc791\uc5c5)<\/em> \ud544\ub4dc\uc5d0 <code>clean test%env.FLAVOR%%env.VARIANT%<\/code>\ub97c \uc785\ub825\ud558\uc138\uc694.<\/p>\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-489817\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2024\/07\/29-Entering-a-Gradle-task.png\" alt=\"\" width=\"3420\" height=\"1962\" \/><\/p>\n<figcaption class=\"wp-element-caption\"><em>Gradle \uc791\uc5c5 \uc785\ub825<\/em><\/figcaption>\n<\/figure>\n<p>\uc774\ub807\uac8c \ud558\uba74 \ub7ec\ub108\uac00 \uba3c\uc800 \ube4c\ub4dc \ud3f4\ub354\ub97c \ube44\uc6b4 \ub2e4\uc74c \ud658\uacbd \ubcc0\uc218\uc5d0 \uc785\ub825\ub41c \uc124\uc815\uacfc \ubcc0\ud615\uc5d0 \ub300\ud574 \ud14c\uc2a4\ud2b8 \uc791\uc5c5\uc744 \uc2e4\ud589\ud569\ub2c8\ub2e4. \uc608\ub97c \ub4e4\uc5b4 \ubb34\ub8cc \uc571\uc758 \ub9b4\ub9ac\uc2a4 \ubcc0\ud615\uc758 \uacbd\uc6b0 \uc791\uc5c5\uc758 \uc774\ub984\uc774 <em>clean testFreeRelease<\/em>\ub85c \uc9c0\uc815\ub429\ub2c8\ub2e4.<\/p>\n<p>\uc544\ub798\ub85c \uc2a4\ud06c\ub864\ud55c \ub2e4\uc74c <em>Save(\uc800\uc7a5)<\/em> \ubc84\ud2bc\uc744 \ud074\ub9ad\ud558\uc138\uc694. \uadf8\ub7ec\uba74 <em>Build Steps(\ube4c\ub4dc \ub2e8\uacc4)<\/em> \ud398\uc774\uc9c0\ub85c \uc774\ub3d9\ub429\ub2c8\ub2e4.<\/p>\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-489828\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2024\/07\/30-New-build-step-added.png\" alt=\"\" width=\"3420\" height=\"1962\" \/><\/p>\n<figcaption class=\"wp-element-caption\"><em>\uc0c8\ub85c\uc6b4 \ube4c\ub4dc \ub2e8\uacc4 \ucd94\uac00<\/em><\/figcaption>\n<\/figure>\n<p><em> + Add build step(\ube4c\ub4dc \ub2e8\uacc4 \ucd94\uac00)<\/em> \ubc84\ud2bc\uc744 \ud074\ub9ad\ud55c \ub2e4\uc74c <code>assemble%env.FLAVOR%%env.VARIANT%<\/code> \uc791\uc5c5\uc744 \ud3ec\ud568\ud55c Gradle \ube4c\ub4dc \ub2e8\uacc4\ub97c \ucd94\uac00\ud558\uc138\uc694. \uc774 \ub2e8\uacc4\ub294 \uc571\uc758 \uc635\uc158 \ubc0f \ubcc0\ud615\uc5d0 \ub530\ub77c \ube4c\ub4dc \uc544\ud2f0\ud329\ud2b8\ub97c \uc0dd\uc131\ud569\ub2c8\ub2e4.<\/p>\n<p>\uc644\ub8cc\ud55c \ud6c4 <em>Build Steps(\ube4c\ub4dc \ub2e8\uacc4)<\/em> \ud398\uc774\uc9c0\uc5d0\ub294 \uc0dd\uc131\ud55c \ub450 \uac1c\uc758 Gradle \uae30\ubc18 \ube4c\ub4dc \ub2e8\uacc4\uc640 \ub354\ubd88\uc5b4 \ube4c\ub4dc \ub2e8\uacc4\uc758 \uc77c\ubd80\ub85c \uc2e4\ud589\ub418\ub294 Gradle \uc791\uc5c5\uc758 \ube60\ub978 \uc694\uc57d\uc774 \ubaa9\ub85d\uc73c\ub85c \ud45c\uc2dc\ub429\ub2c8\ub2e4.<\/p>\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-489839\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2024\/07\/31-Build-steps-updated.png\" alt=\"\" width=\"3420\" height=\"1962\" \/><\/p>\n<figcaption class=\"wp-element-caption\"><em>\uc5c5\ub370\uc774\ud2b8\ub41c \ube4c\ub4dc \ub2e8\uacc4<\/em><\/figcaption>\n<\/figure>\n<p>\uc774\uc81c\ub294 \uc0ac\uc6a9\ud55c \ub450 \ud658\uacbd \ubcc0\uc218\uc758 \uac12\uc744 \uc815\uc758\ud558\uace0 \uc544\ud2f0\ud329\ud2b8 \uacbd\ub85c\ub97c \uad6c\uc131\ud558\ub294 \ub4f1 \ub450 \uac00\uc9c0 \uc808\ucc28\ub97c \ub354 \uc218\ud589\ud574\uc57c \ud569\ub2c8\ub2e4.<\/p>\n<p>\ube4c\ub4dc \uad6c\uc131\uc758 \uc544\ud2f0\ud329\ud2b8 \uacbd\ub85c\ub97c \uc124\uc815\ud558\ub294 \ubc29\ubc95\uc740 \uc774\ubbf8 \uc54c\uace0 \uacc4\uc2e4\uac81\ub2c8\ub2e4. \uc774 \ube4c\ub4dc \uad6c\uc131\uc5d0\uc11c\ub294 <em>Artifact paths(\uc544\ud2f0\ud329\ud2b8 \uacbd\ub85c)<\/em> \ud544\ub4dc\uc758 \uac12\uc744 \uc774\uc804\uacfc \ub9c8\ucc2c\uac00\uc9c0\ub85c <code>app\/build\/outputs\/apk\/*\/*\/* =&gt; output<\/code>\uc73c\ub85c \uc124\uc815\ud558\uc138\uc694.<\/p>\n<p>\uc635\uc158 \ubc0f \ubcc0\ud615 \ud544\ub4dc\uc758 \ub9e4\ud2b8\ub9ad\uc2a4 \uac12\uc744 \uc124\uc815\ud558\ub824\uba74 \uc67c\ucabd \ud0d0\uc0c9 \ud328\ub110\uc5d0\uc11c <em>Build Features(\ube4c\ub4dc \uae30\ub2a5)<\/em>\ub97c \ud074\ub9ad\ud558\uc138\uc694. <em>Build Features<\/em> \ud398\uc774\uc9c0\uc5d0\uc11c <em>+ Add build feature(\ube4c\ub4dc \uae30\ub2a5 \ucd94\uac00)<\/em> \ubc84\ud2bc\uc744 \ud074\ub9ad\ud55c \ub2e4\uc74c \ub300\ud654\uc0c1\uc790\uc758 \ub4dc\ub86d\ub2e4\uc6b4 \uba54\ub274\uc5d0\uc11c <em>Matrix Build(\ub9e4\ud2b8\ub9ad\uc2a4 \ube4c\ub4dc)<\/em>\ub97c \uac80\uc0c9\ud558\uc138\uc694.<\/p>\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-489850\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2024\/07\/32-Searching-for-Matrix-Build-on-the-Build-Features-page.png\" alt=\"\" width=\"3420\" height=\"1962\" \/><\/p>\n<figcaption class=\"wp-element-caption\"><em>Build Features \ud398\uc774\uc9c0\uc5d0\uc11c Matrix Build \uac80\uc0c9<\/em><\/figcaption>\n<\/figure>\n<p>\ub4dc\ub86d\ub2e4\uc6b4 \ubaa9\ub85d\uc5d0\uc11c <em>Matrix Build<\/em> \uc635\uc158\uc744 \uc120\ud0dd\ud558\uba74 \ub9e4\ud2b8\ub9ad\uc2a4 \ube4c\ub4dc\uc758 \ub9e4\uac1c\ubcc0\uc218\uc640 \uac12\uc744 \uc785\ub825\ud558\ub3c4\ub85d \uc694\uccad\ubc1b\uac8c \ub429\ub2c8\ub2e4. \ub9e4\uac1c\ubcc0\uc218\uc758 \uc774\ub984\uc5d0\ub294 <code>env.FLAVOR<\/code>\ub97c, \uac12\uc5d0\ub294 <code>Free<\/code>\ub97c \uc785\ub825\ud569\ub2c8\ub2e4. <code>env.VARIANT<\/code>\ub77c\ub294 \ub2e4\ub978 \ub9e4\uac1c\ubcc0\uc218\ub97c \ucd94\uac00\ud558\uace0 \ub450 \uac1c\uc758 \uac12\uc73c\ub85c <code>Release<\/code> \ubc0f <code>Debug<\/code>\ub97c \ucd94\uac00\ud569\ub2c8\ub2e4.<\/p>\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-489861\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2024\/07\/33-Configuring-matrix-build.png\" alt=\"\" width=\"3420\" height=\"1962\" \/><\/p>\n<figcaption class=\"wp-element-caption\"><em>\ub9e4\ud2b8\ub9ad\uc2a4 \ube4c\ub4dc \uad6c\uc131<\/em><\/figcaption>\n<\/figure>\n<p>\uc774\uc81c <em>Save(\uc800\uc7a5)<\/em> \ubc84\ud2bc\uc744 \ud074\ub9ad\ud558\uc138\uc694. \uc774\ub85c\uc368 \ud30c\uc774\ud504\ub77c\uc778\uc5d0 \ub9e4\ud2b8\ub9ad\uc2a4 \ube4c\ub4dc\uac00 \uc124\uc815\ub418\uc5c8\uc2b5\ub2c8\ub2e4. \ud398\uc774\uc9c0\uc758 \uc624\ub978\ucabd \uc0c1\ub2e8 \ubaa8\uc11c\ub9ac\uc5d0\uc11c <em>Run(\uc2e4\ud589)<\/em> \ubc84\ud2bc\uc744 \ud074\ub9ad\ud558\uc5ec \ud14c\uc2a4\ud2b8\ud574 \ubcfc \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<p>\uc774\uc81c \uac01 \uc2e4\ud589\uc758 \uacb0\uacfc\ub97c \ubcc4\ub3c4\uc758 \ube4c\ub4dc \uc544\ud2f0\ud329\ud2b8 \ubc0f \ud14c\uc2a4\ud2b8 \uacb0\uacfc\uc640 \ud568\uaed8 \ubcfc \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-489872\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2024\/07\/34-Matrix-build-results.png\" alt=\"\" width=\"3420\" height=\"1962\" \/><\/p>\n<figcaption class=\"wp-element-caption\"><em>\ub9e4\ud2b8\ub9ad\uc2a4 \ube4c\ub4dc \uacb0\uacfc<\/em><\/figcaption>\n<\/figure>\n<p><em>Dependencies(\uc885\uc18d\uc131)<\/em> \ud0ed\uc744 \ud074\ub9ad\ud558\uc5ec \uac01 \uc2e4\ud589\uc758 \ube4c\ub4dc \uc2e4\ud589 \uc0c1\uc138 \uc815\ubcf4\ub97c \ud655\uc778\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-489883\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2024\/07\/35-Viewing-individual-build-run-details.png\" alt=\"\" width=\"3420\" height=\"1962\" \/><\/p>\n<figcaption class=\"wp-element-caption\"><em>\uac01 \ube4c\ub4dc \uc2e4\ud589\uc758 \uc0c1\uc138 \uc815\ubcf4 \ud655\uc778<\/em><\/figcaption>\n<\/figure>\n<p>\uc774\uc804\uc5d0 \ubcf4\uc558\ub358 \uac83\ucc98\ub7fc \uac01 \ud56d\ubaa9\uc744 \ub3c5\ub9bd\uc801\uc774\uba70 \uc644\uc804\ud55c \ube4c\ub4dc \uc2e4\ud589\uc73c\ub85c \uac04\uc8fc\ud558\uace0 \ud0d0\uc0c9\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<h3 class=\"wp-block-heading\">\ud328\ud0a4\uc9c0 \uc81c\uc791 \ubc0f \ubc30\ud3ec<\/h3>\n<p>Android CI\/CD \ud30c\uc774\ud504\ub77c\uc778\uc5d0\uc11c \uc911\uc694\ud55c \uc694\uc18c \uc911 \ud558\ub098\ub294 \ub9b4\ub9ac\uc2a4 \ubc14\uc774\ub108\ub9ac\uac00 \uc0ac\uc6a9\uc790\uc5d0\uac8c \uac8c\uc2dc\ub420 \uc218 \uc788\ub3c4\ub85d Google Play\ub85c \ud478\uc2dc\ud558\ub294 \uac83\uc785\ub2c8\ub2e4. TeamCity\uc640 <a href=\"https:\/\/github.com\/Triple-T\/gradle-play-publisher\" target=\"_blank\" rel=\"noopener\">Gradle Play Publisher<\/a>(GPP)\ub97c \uc0ac\uc6a9\ud558\uc5ec \uc774 \uacfc\uc815\ub3c4 \uc790\ub3d9\ud654\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<p>\uc774 \ud504\ub85c\uc138\uc2a4\ub97c \uc2dc\uc791\ud558\uae30 \uc804\uc5d0 \uba87 \uac00\uc9c0 \uc804\uc81c \uc870\uac74\uc774 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<p>1. Android \ud504\ub85c\uc81d\ud2b8\uc758 \uccab \ubc88\uc9f8 APK\/AAB\ub97c Google Play Console\ub85c <a href=\"https:\/\/github.com\/Triple-T\/gradle-play-publisher?tab=readme-ov-file#initial-play-store-upload\" target=\"_blank\" rel=\"noopener\">\uc218\ub3d9\uc73c\ub85c \uc5c5\ub85c\ub4dc<\/a>\ud588\ub294\uc9c0 \ud655\uc778\ud558\uc138\uc694.<\/p>\n<p>2. <a href=\"https:\/\/developer.android.com\/studio\/publish\/app-signing#gradle-sign\" target=\"_blank\" rel=\"noopener\">\uc720\ud6a8\ud55c \uc11c\uba85 \uad6c\uc131<\/a>\uc774 \uc788\uc5b4\uc57c \ud569\ub2c8\ub2e4.<\/p>\n<p>3. Google Cloud Platform \uc11c\ube44\uc2a4 \uacc4\uc815\uc744 \uc0dd\uc131\ud574\uc57c Google Play \uac1c\ubc1c\uc790 API\ub97c \uc0ac\uc6a9\ud558\uc5ec JSON \uc790\uaca9 \uc99d\uba85 \ud30c\uc77c\uc744 \ubc1b\uc544\uc62c \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc774\ub97c \uc704\ud574 \ub2e4\uc74c \ub2e8\uacc4\ub85c \ub118\uc5b4\uac00\uae30 \uc804\uc5d0 <a href=\"https:\/\/github.com\/Triple-T\/gradle-play-publisher?tab=readme-ov-file#service-account\" target=\"_blank\" rel=\"noopener\">\uc774 \ub2e8\uacc4<\/a>\ub97c \ub530\ub77c\uc8fc\uc138\uc694.<\/p>\n<p>\uc704\uc758 \ub9c1\ud06c\uc5d0 \uc124\uba85\ub41c \ub2e8\uacc4\ub97c \uc644\ub8cc\ud55c \ud6c4 Android \ud504\ub85c\uc81d\ud2b8\uc5d0 GPP\ub97c \uc124\uce58\ud558\uace0 \uad6c\uc131\ud574\uc57c \ud569\ub2c8\ub2e4. \uc774\ub97c \uc704\ud574 \uc571 \uc218\uc900\uc758 <code>build.gradle.kts<\/code> \ud30c\uc77c\uc5d0 \uc788\ub294 \ud50c\ub7ec\uadf8\uc778 \ube14\ub85d\uc5d0 \ub2e4\uc74c\uc758 \ucf54\ub4dc\ub97c \ucd94\uac00\ud558\uc138\uc694.<\/p>\n<pre class=\"EnlighterJSRAW\">kt\nid(\"com.github.triplet.play\") version \"3.9.1\"<\/pre>\n<p>\uadf8\ub7f0 \ub2e4\uc74c \uc774 \ud30c\uc77c\uc758 \ub8e8\ud2b8 \uc218\uc900\uc5d0 \ub2e4\uc74c\uc758 \ucf58\ud150\uce20\ub97c \ud3ec\ud568\ud55c <code>play {}<\/code> \ube14\ub85d\uc744 \uc0c8\ub85c \ucd94\uac00\ud558\uc138\uc694.<\/p>\n<pre class=\"EnlighterJSRAW\">kt\nplay {\n    serviceAccountCredentials.set(file(\"play_config.json\"))\n    track.set(\"internal\")\n    releaseStatus.set(ReleaseStatus.DRAFT)\n    defaultToAppBundles.set(true)\n}<\/pre>\n<p>\uc774\ub294 GPP\ub97c \uad6c\uc131\ud558\uc5ec \uc774\ub984\uc774 <code>play_config.json<\/code>\uc778 \ud30c\uc77c\uc758 \uc11c\ube44\uc2a4 \uacc4\uc815 \uc790\uaca9 \uc99d\uba85\uc744 \uc0ac\uc6a9\ud558\uace0, \ud2b8\ub799\uc744 <code>internal<\/code>\ub85c \uc124\uc815\ud558\uace0 \ubc14\uc774\ub108\ub9ac\ub97c Play Console\ub85c \ud478\uc2dc\ud560 \ub54c \uc0c1\ud0dc\ub97c <code>DRAFT<\/code>\ub85c \ub9b4\ub9ac\uc2a4\ud558\uba70, \uae30\ubcf8\uc801\uc73c\ub85c APK \ub300\uc2e0\uc5d0 \uc571 \ubc88\ub4e4\uc744 \uc0ac\uc6a9\ud569\ub2c8\ub2e4.<\/p>\n<p>\uc774\ub85c\uc368 Android \ud504\ub85c\uc81d\ud2b8\uc5d0 \ud544\uc694\ud55c \uad6c\uc131 \uacfc\uc815\uc774 \uc644\ub8cc\ub418\uc5c8\uc2b5\ub2c8\ub2e4. \uc9c4\ud589\ud558\uae30 \uc804\uc5d0 \uc774\ub7ec\ud55c \ubcc0\uacbd \uc0ac\ud56d\uc744 GitHub \uc800\uc7a5\uc18c\ub85c \ucee4\ubc0b\ud558\uace0 \ud478\uc2dc\ud558\uc138\uc694.<\/p>\n<p>\uc774\uc81c TeamCity\uc5d0\uc11c Google Play\ub85c \ubc14\uc774\ub108\ub9ac\ub97c \ud478\uc2dc\ud558\uae30 \uc704\ud574 \uc0c8\ub85c\uc6b4 \ube4c\ub4dc \uad6c\uc131\uc744 \uc0dd\uc131\ud574\uc57c \ud569\ub2c8\ub2e4. \uc0c8\ub85c\uc6b4 \ube4c\ub4dc \uad6c\uc131\uc744 \uc0dd\uc131\ud558\uae30 \uc804\uc5d0 \uac19\uc740 \ub2e8\uacc4\ub97c \uc218\ud589\ud574 \uc8fc\uc138\uc694. <em>Gradle<\/em>\uc744 \ub7ec\ub108\ub85c \uc0ac\uc6a9\ud558\uace0 <code>bundleFreeRelease<\/code>\ub97c \uc2e4\ud589\ud560 Gradle \uc791\uc5c5\uc73c\ub85c \uc0ac\uc6a9\ud558\ub3c4\ub85d \uccab \ubc88\uc9f8 \ube4c\ub4dc \ub2e8\uacc4\ub97c \uc124\uc815\ud558\uc138\uc694.<\/p>\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-489905\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2024\/07\/36-Build-steps.png\" alt=\"\" width=\"3420\" height=\"1962\" \/><\/p>\n<figcaption class=\"wp-element-caption\"><em>\ube4c\ub4dc \ub2e8\uacc4<\/em><\/figcaption>\n<\/figure>\n<p>\uc774 \ube4c\ub4dc \uad6c\uc131\uc5d0 \ub2e8\uacc4\ub97c \ud558\ub098 \ucd94\uac00\ud558\uc5ec, \uc774\ubc88\uc5d0\ub294 \ube4c\ub4dc \ub7ec\ub108\ub85c <em>Command Line(\uba85\ub839\uc904)<\/em>\uc744 \uc120\ud0dd\ud558\uc138\uc694.<\/p>\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-489916\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2024\/07\/37-Configuring-a-new-command-line-build-step.png\" alt=\"\" width=\"3420\" height=\"1962\" \/><\/p>\n<figcaption class=\"wp-element-caption\"><em>\uba85\ub839\uc904 \ube4c\ub4dc \ub2e8\uacc4 \uad6c\uc131<\/em><\/figcaption>\n<\/figure>\n<p>\uba85\ub839\uc904 \ub7ec\ub108\ub97c \uc704\ud55c \uc0c8\ub85c\uc6b4 \ube4c\ub4dc \ub2e8\uacc4 \ud398\uc774\uc9c0\uac00 \uc5f4\ub9bd\ub2c8\ub2e4. \uc571 \ubc88\ub4e4\uc744 \uc11c\uba85\ud558\uace0 Google Play\ub85c \uac8c\uc2dc\ud558\ub294 \ub9de\ucda4\ud615 \uc2a4\ud06c\ub9bd\ud2b8\ub97c \uc785\ub825\ud574\uc57c \ud569\ub2c8\ub2e4. <em>Custom script(\ub9de\ucda4\ud615 \uc2a4\ud06c\ub9bd\ud2b8)<\/em> \ud544\ub4dc\uc5d0 \ub2e4\uc74c\uc758 \ucf54\ub4dc\ub97c \uc785\ub825\ud558\uc138\uc694.<\/p>\n<pre class=\"EnlighterJSRAW\"># Create the keystore file from the environment variables\necho %env.ANDROID_KEYSTORE_FILE% &gt; keystore.jks.b64\nbase64 -d -i keystore.jks.b64 &gt; app\/keystore.jks\n\n# Sign the AAB using the keystore and credentials retrieved from the environment variables\njarsigner \n-keystore app\/keystore.jks \n-storepass %env.KEYSTORE_STORE_PASSWORD% \n-keypass %env.KEYSTORE_KEY_PASSWORD% \n-signedjar release.aab \napp\/build\/outputs\/bundle\/freeRelease\/app-free-release.aab \n%env.KEYSTORE_KEY_ALIAS%\n\n# Create the GCP service account credentials file from the environment variables\necho %env.PLAY_CONFIG_JSON% &gt; play_config.json.b64\nbase64 -d -i play_config.json.b64 &gt; app\/play_config.json\n\n# Use GPP to publish the app bundle\n.\/gradlew publishFreeBundle --artifact-dir release.aab<\/pre>\n<p>\ud574\ub2f9 \ucf54\ub4dc\uc5d0\ub294 \uac01 \uc904\uc744 \uc124\uba85\ud558\ub294 \uc778\ub77c\uc778 \uc8fc\uc11d\uc774 \ud3ec\ud568\ub418\uc5b4 \uc788\uc2b5\ub2c8\ub2e4. \uc644\ub8cc\ud55c \ud6c4\uc5d0 \ud398\uc774\uc9c0\uc758 \ud558\ub2e8\uc5d0\uc11c <em>Save(\uc800\uc7a5)<\/em> \ubc84\ud2bc\uc744 \ud074\ub9ad\ud558\uc138\uc694.<\/p>\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-489927\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2024\/07\/38-Configuring-your-command-line-script.png\" alt=\"\" width=\"3420\" height=\"1962\" \/><\/p>\n<figcaption class=\"wp-element-caption\"><em>\uba85\ub839\uc904 \uc2a4\ud06c\ub9bd\ud2b8 \uad6c\uc131<\/em><\/figcaption>\n<\/figure>\n<p>\ub610\ud55c, \ub2e4\uc74c\uc758 \ud658\uacbd \ubcc0\uc218\ub97c \uc815\uc758\ud558\uc5ec \uc571\uc744 \uc11c\uba85\ud558\uace0 \uac8c\uc2dc\ud560 \ub54c \uc0ac\uc6a9\ud560 \uc801\uc808\ud55c \uc790\uaca9 \uc99d\uba85\uc744 \uc2a4\ud06c\ub9bd\ud2b8\uc5d0 \uc785\ub825\ud574\uc57c \ud569\ub2c8\ub2e4.<\/p>\n<pre class=\"EnlighterJSRAW\">bash\nANDROID_KEYSTORE_FILE\nKEYSTORE_KEY_ALIAS\nKEYSTORE_KEY_PASSWORD\nKEYSTORE_STORE_PASSWORD\nPLAY_CONFIG_JSON<\/pre>\n<p>\uc67c\ucabd \ud0d0\uc0c9 \ud328\ub110\uc5d0\uc11c <em>Parameters(\ub9e4\uac1c\ubcc0\uc218)<\/em>\ub97c \ud074\ub9ad\ud558\uc5ec \ud658\uacbd \ubcc0\uc218\ub97c \uc815\uc758\ud560 \uc218 \uc788\ub294 \ud398\uc774\uc9c0\ub85c \uc774\ub3d9\ud558\uc138\uc694. TeamCity\uac00 \uc774\ubbf8 \uc774 \ud398\uc774\uc9c0\uc758 \ud544\uc218 \ubcc0\uc218 \ubaa9\ub85d\uc744 \ucc44\uc6cc\ub193\uc740 \uac83\uc744 \ud655\uc778\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-489940\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2024\/07\/39-Viewing-newly-recognized-environment-variables.png\" alt=\"\" width=\"3420\" height=\"1962\" \/><\/p>\n<figcaption class=\"wp-element-caption\"><em>\uc0c8\ub85c \uc778\uc2dd\ub41c \ud658\uacbd \ubcc0\uc218 \ud45c\uc2dc<\/em><\/figcaption>\n<\/figure>\n<p><code>KEYSTORE_KEY_ALIAS<\/code>, <code>KEYSTORE_KEY_PASSWORD<\/code> \ubc0f <code>KEYSTORE_STORE_PASSWORD<\/code>\uc758 \uacbd\uc6b0 <em>Edit(\ud3b8\uc9d1)<\/em>\uc744 \ud074\ub9ad\ud558\uace0 \ud45c\uc2dc\ub418\ub294 \ub300\ud654\uc0c1\uc790\uc5d0\uc11c \uac12\uc744 \uc785\ub825\ud558\uc138\uc694.<\/p>\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-489951\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2024\/07\/40-Configuring-environment-variables.png\" alt=\"\" width=\"3420\" height=\"1962\" \/><\/p>\n<figcaption class=\"wp-element-caption\"><em>\ud658\uacbd \ubcc0\uc218 \uad6c\uc131<\/em><\/figcaption>\n<\/figure>\n<p><code>ANDROID_KEYSTORE_FILE<\/code>\uacfc <code>PLAY_CONFIG_JSON<\/code>\uc758 \uacbd\uc6b0 \uba3c\uc800 \ud30c\uc77c\uc744 <a href=\"https:\/\/superuser.com\/questions\/120796\/how-to-encode-base64-via-command-line-in-macos-os-x\" target=\"_blank\" rel=\"noopener\">openssl<\/a>\uacfc \uac19\uc740 \ub3c4\uad6c\ub97c \uc0ac\uc6a9\ud558\uc5ec Base64\ub85c \ubcc0\ud658\ud574\uc57c \ud558\uba70, Base64\ub85c \uc778\ucf54\ub529\ub41c \ub0b4\uc6a9\uc744 \uac01 \ubcc0\uc218\uc758 \uac12 \ud544\ub4dc\uc5d0 \ubd99\uc5ec\ub123\uc73c\uc138\uc694.<\/p>\n<p>\uc774\ub97c \ud1b5\ud574 \uc0ac\uc6a9\uc790\uc758 \uc560\ud50c\ub9ac\ucf00\uc774\uc158 \uc911 \ubb34\ub8cc \ubc84\uc804\uc758 \uc11c\uba85\ub41c \ub9b4\ub9ac\uc2a4\ub97c \ube4c\ub4dc\ud558\uace0 \uac8c\uc2dc\ud558\ub3c4\ub85d \ud30c\uc774\ud504\ub77c\uc778\uc774 \uc124\uc815\ub429\ub2c8\ub2e4. \ud398\uc774\uc9c0\uc758 \uc624\ub978\ucabd \uc0c1\ub2e8\uc5d0 \uc788\ub294 <em>Run(\uc2e4\ud589)<\/em> \ubc84\ud2bc\uc744 \ud074\ub9ad\ud574\uc11c \uc2e4\ud589\ud558\uba74 \uc2e4\uc81c\ub85c \ub3d9\uc791\ud558\ub294 \uac83\uc744 \ud655\uc778\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<p>\uc131\uacf5\uc801\uc73c\ub85c \uc2e4\ud589\ub418\uba74 \ub85c\uadf8\uc5d0\uc11c <code>BUILD SUCCESSFUL<\/code> \uba54\uc2dc\uc9c0\ub97c \ud655\uc778\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-489962\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2024\/07\/41-Successful-build-result-logs.png\" alt=\"\" width=\"3420\" height=\"1962\" \/><\/p>\n<figcaption class=\"wp-element-caption\"><em>\uc131\uacf5\ud55c \ube4c\ub4dc\uc758 \uacb0\uacfc \ub85c\uadf8<\/em><\/figcaption>\n<\/figure>\n<p>\uc571\uc758 \ucd5c\uc2e0 \ub9b4\ub9ac\uc2a4\ub97c Google Play Console\uc758 \ub0b4\ubd80 \ud2b8\ub799\uc5d0\uc11c \ubcfc \uc218 \uc788\uc73c\uba70, \uc0ac\uc6a9\uc790\uac00 \ud3b8\uc9d1 \ubc0f \ud64d\ubcf4\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-489973\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2024\/07\/42-Play-Console-internal-testing-page.png\" alt=\"\" width=\"3420\" height=\"1962\" \/><\/p>\n<figcaption class=\"wp-element-caption\"><em>Play Console \ub0b4\ubd80 \ud14c\uc2a4\ud2b8 \ud398\uc774\uc9c0<\/em><\/figcaption>\n<\/figure>\n<p>\uc0c8\ub85c\uc6b4 \ub9b4\ub9ac\uc2a4\ub3c4 \uc774\uc804 \ub9b4\ub9ac\uc2a4\uc640 \uac19\uc740 \uac1c\ubc1c\uc790\uc6a9 \uc774\ub984(&#8220;2.0&#8221;)\uc744 \uc0ac\uc6a9\ud558\ub294 \uac83\uc744 \ud655\uc778\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc774\ub294 GPP\uc758 \uad6c\uc131\uc5d0 \uc774\ub984\uc774 \uc9c0\uc815\ub418\uc9c0 \uc54a\uc558\uae30 \ub54c\ubb38\uc785\ub2c8\ub2e4. \uc774\ub984\uc744 \uc0ac\uc6a9\uc790\uac00 \uc9c0\uc815\ud558\ub294 \ubc29\ubc95\uc744 \uc54c\uc544\ubcf4\ub824\uba74 <a href=\"https:\/\/github.com\/Triple-T\/gradle-play-publisher?tab=readme-ov-file#uploading-developer-facing-release-names\" target=\"_blank\" rel=\"noopener\">GPP \ubb38\uc11c<\/a>\ub97c \ucc38\uc870\ud558\uc138\uc694.<\/p>\n<h2 class=\"wp-block-heading\">\ubaa8\ubc94 \uc0ac\ub840\uc640 \ud301<\/h2>\n<p>\uc774\uc81c TeamCity\uc744 \uc0ac\uc6a9\ud558\uc5ec \ub098\ub9cc\uc758 Android \ud30c\uc774\ud504\ub77c\uc778\uc744 \uc124\uc815\ud560 \uc218 \uc788\uac8c \ub418\uc5c8\uc73c\ub2c8 \ud30c\uc774\ud504\ub77c\uc778\uc758 \ud6a8\uc728\uc131\uacfc \uc18d\ub3c4\ub97c \ub192\uc774\uae30 \uc704\ud574 \uace0\ub824\ud560 \ub9cc\ud55c \uc8fc\uc694 \ubaa8\ubc94 \uc0ac\ub840\ub97c \uc18c\uac1c\ud574 \ub4dc\ub9ac\uaca0\uc2b5\ub2c8\ub2e4.<\/p>\n<p>1. <strong>\ubc84\uc804 \uad00\ub9ac \ubc0f \ubc84\uc804 \uad00\ub9ac \ubaa8\ubc94 \uc0ac\ub840: <\/strong>\ud6a8\uc728\uc801\uc778 CI\/CD \ud30c\uc774\ud504\ub77c\uc778\uc5d0\ub294 Git\uacfc \uac19\uc740 \uac15\ub825\ud55c \ubc84\uc804 \uad00\ub9ac \uc2dc\uc2a4\ud15c(VCS)\uc774 \ud544\uc694\ud569\ub2c8\ub2e4. \ud300\uc774 \uba85\ud655\ud55c \ubc84\uc804 \uad00\ub9ac \ubaa8\ubc94 \uc0ac\ub840\ub97c \ub530\ub974\uace0 \uc77c\uad00\uc801\uc778 \ube0c\ub79c\uce58 \uc804\ub7b5(\uc608: \ud53c\ucc98 \ube0c\ub79c\uce58)\uc744 \uad6c\ud604\ud558\ub294\uc9c0 \ud655\uc778\ud558\uc138\uc694. \uc608\ub97c \ub4e4\uc5b4 WIP \ucf54\ub4dc\uc5d0 \ubd88\ud544\uc694\ud55c \ub2e8\uacc4\uac00 \uc2e4\ud589\ub418\uc9c0 \uc54a\ub3c4\ub85d \ud558\uae30 \uc704\ud574 \uac01 \ube0c\ub79c\uce58\ub9c8\ub2e4 \ub9de\ucda4\ud615 \ud30c\uc774\ud504\ub77c\uc778\uc744 \uac1c\ubc1c\ud558\uc138\uc694.<\/p>\n<p>2. <strong>\uba85\ud655\ud55c \ud1b5\uacfc\/\uc2e4\ud328 \uae30\uc900 \ubc0f \uc784\uacd7\uac12:<\/strong> \ube4c\ub4dc \ubc0f \ud14c\uc2a4\ud2b8 \uc2e4\ud589 \uc131\uacf5 \uae30\uc900\uc744 \uba85\ud655\ud558\uac8c \uc815\uc758\ud558\uc138\uc694. \uc5ec\uae30\uc5d0\ub294 \uc720\ub2db \ud14c\uc2a4\ud2b8 \ucee4\ubc84\ub9ac\uc9c0\uc758 \uc784\uacd7\uac12\uc744 \uc124\uc815\ud558\uac70\ub098 \ub2e4\ub978 \ucf54\ub4dc \uac80\uc0ac\uc5d0\uc11c \uadf8\ub9b0 \ub77c\uc774\ud2b8\ub97c \ubc1b\ub3c4\ub85d \ud558\ub294 \ub4f1\uc758 \uc870\uce58\uac00 \ud3ec\ud568\ub429\ub2c8\ub2e4. \ud30c\uc774\ud504\ub77c\uc778\uc758 \uac01 \ub2e8\uacc4\uc5d0 \ud1b5\uacfc\/\uc2e4\ud328 \uae30\uc900\uc744 \uc801\uc6a9\ud558\ub3c4\ub85d TeamCity\uc744 \uad6c\uc131\ud558\uc5ec \uc548\uc815\uc801\uc778 \ube4c\ub4dc\ub97c \ub9cc\ub4e4\uace0 \uac1c\ubc1c\uc790\ub4e4\uc774 \ub354 \ub098\uc740 \ud488\uc9c8\uc758 \ucf54\ub4dc\ub97c \uc791\uc131\ud558\ub3c4\ub85d \uc7a5\ub824\ud558\uc138\uc694.<\/p>\n<p>3. <strong>TeamCity\uc758 \uc54c\ub9bc \ubc0f \uacbd\uace0 \ud65c\uc6a9:<\/strong> TeamCity\uc5d0\ub294 \uc6f9 \ube0c\ub77c\uc6b0\uc800, \uc774\uba54\uc77c, Slack \ubc0f IDE\uc5d0\uc11c \ubc1c\uc0dd\ud558\ub294 \ud30c\uc774\ud504\ub77c\uc778 \uc774\ubca4\ud2b8\uc5d0 \uad00\ud574\uc11c \uc0ac\uc6a9\uc790\uc5d0\uac8c \uc54c\ub824\uc8fc\ub294 \uc0c1\uc138\ud55c <a href=\"https:\/\/www.jetbrains.com\/help\/teamcity\/configuring-notifications.html\" target=\"_blank\" rel=\"noopener\">\uc54c\ub9bc \uc2dc\uc2a4\ud15c<\/a>\uc774 \uc788\uc2b5\ub2c8\ub2e4. \ube4c\ub4dc \uc2e4\ud328\uc640 \uc911\uc694\ud55c \ud14c\uc2a4\ud2b8 \uc2e4\ud328\uc5d0 \ub300\ud55c \uacbd\uace0\ub97c \uc124\uc815\ud558\uc5ec \uac1c\ubc1c \ud300\uc774 \ud56d\uc0c1 \uc0c1\ud669\uc744 \uc778\uc2dd\ud558\uace0 \ube60\ub974\uac8c \ubb38\uc81c\ub97c \ud574\uacb0\ud560 \uc218 \uc788\ub3c4\ub85d \ud558\uc138\uc694.<\/p>\n<p>4. <strong>\uacf5\ub3d9 \uc791\uc5c5 \ubc0f \ud53c\ub4dc\ubc31 \ub8e8\ud504:<\/strong> \ud6a8\uc728\uc801\uc778 CI\/CD \ud30c\uc774\ud504\ub77c\uc778\uc740 \uac1c\ubc1c \ud300 \ub0b4\uc758 \uacf5\ub3d9 \uc791\uc5c5\uc744 \uac15\ud654\ud569\ub2c8\ub2e4. \uac1c\ubc1c\uc790\ub4e4\uc774 \uc804\uccb4 \ube4c\ub4dc \ubc0f \ud14c\uc2a4\ud2b8 \ud504\ub85c\uc138\uc2a4\ub97c \uba85\ud655\ud558\uac8c \uc774\ud574\ud560 \uc218 \uc788\ub3c4\ub85d TeamCity \ub0b4\uc758 \ud30c\uc774\ud504\ub77c\uc778 \uc2dc\uac01\ud654 \uae30\ub2a5\uc744 \uc0ac\uc6a9\ud558\uc138\uc694. \ub610\ud55c, <a href=\"https:\/\/www.jetbrains.com\/help\/teamcity\/investigating-and-muting-build-failures.html\" target=\"_blank\" rel=\"noopener\">\ud14c\uc2a4\ud2b8 \ubc0f \ube4c\ub4dc \uc870\uc0ac<\/a>\ub97c \uc0ac\uc6a9\ud558\uc5ec TeamCity \ub0b4\uc5d0\uc11c \ubc14\ub85c \ube4c\ub4dc \ub610\ub294 \ud14c\uc2a4\ud2b8\uc758 \uc2e4\ud328 \uc6d0\uc778\uc5d0 \ub300\ud55c \uc870\uc0ac\ub97c \ud560\ub2f9\ud558\uace0 \ud611\uc5c5\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uadf8\ub9ac\uace0 \ud300\uc6d0\uc774 \ube4c\ub4dc \uc2e4\ud328\uc640 \ucf54\ub4dc \ucee4\ubc84\ub9ac\uc9c0 \ubcf4\uace0\uc11c\ub97c \uac80\ud1a0\ud558\uc5ec \uac1c\uc120 \uc601\uc5ed\uc744 \ud30c\uc545\ud558\ub3c4\ub85d \uc7a5\ub824\ud558\uc138\uc694. \uc774\ub97c \ud1b5\ud574 \ucf54\ub4dc \ud488\uc9c8 \ucd94\uad6c\ud558\uace0 \uc9c0\uc18d\uc801\uc73c\ub85c \uac1c\uc120\ud558\ub294 \ubb38\ud654\ub97c \ub9cc\ub4e4 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<p>5. <strong>\ubcf4\uc548 \uc870\uce58(\ucf54\ub4dc \uc11c\uba85 \ubc0f \uc561\uc138\uc2a4 \uc81c\uc5b4):<\/strong> TeamCity \uc778\uc2a4\ud134\uc2a4\ub97c \uad6c\uc131\ud560 \ub54c \uc801\uc808\ud558\uac8c \uc561\uc138\uc2a4\ub97c \uc81c\uc5b4\ud558\uc5ec \uc11c\uba85 \ud0a4\uc640 \uac19\uc740 \ubbfc\uac10\ud55c \uc815\ubcf4\uc5d0 \ub300\ud55c \uc561\uc138\uc2a4\ub294 \ud574\ub2f9 \uc815\ubcf4\uc5d0 \uc561\uc138\uc2a4\ud574\uc57c \ud558\ub294 \uc0ac\uc6a9\uc790\ub9cc \uac00\ub2a5\ud558\ub3c4\ub85d \uc81c\ud55c\ud558\uc138\uc694. HashiCorp Vault\uc640 \uac19\uc740 \ub3c4\uad6c\ub97c \uc0ac\uc6a9\ud558\uc5ec \ube4c\ub4dc\uc5d0 \uc0ac\uc6a9\ud560 \uc218 \uc788\ub294 \ubaa8\ub4e0 \uc911\uc694\ud55c \uc790\uaca9 \uc99d\uba85\uc744 \uad00\ub9ac\ud558\uace0 \ub85c\ud14c\uc774\uc158\uc744 \uc2e4\uc2dc\ud558\ub294 \uac83\ub3c4 \uace0\ub824\ud574\uc57c \ud569\ub2c8\ub2e4. TeamCity\uc758 \uc8fc\uc694 \ubcf4\uc548 \ucd94\ucc9c \uc0ac\ud56d\uc740 <a href=\"https:\/\/www.jetbrains.com\/help\/teamcity\/cloud\/security-notes.html)\" target=\"_blank\" rel=\"noopener\">\uc5ec\uae30<\/a>\uc5d0\uc11c \ud655\uc778\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<h2 class=\"wp-block-heading\">\uacb0\ub860<\/h2>\n<p>\uc774 \uae00\uc5d0\uc11c \uc5ec\ub7ec\ubd84\uc740 <a href=\"https:\/\/www.jetbrains.com\/ko-kr\/teamcity\/\" target=\"_blank\" rel=\"noopener\">JetBrains TeamCity<\/a>\ub97c \uc0ac\uc6a9\ud558\ub294 Android \uac1c\ubc1c \ud504\ub85c\uc81d\ud2b8\uc5d0\uc11c \uc0c1\uc138\ud55c CI\/CD \ud30c\uc774\ud504\ub77c\uc778\uc744 \ub9cc\ub4e4\uace0 \uad00\ub9ac\ud558\ub294 \ubc29\ubc95\uc744 \uc54c\uc544\ubcf4\uc558\uc2b5\ub2c8\ub2e4. \ucf54\ub4dc \uccb4\ud06c\uc544\uc6c3\uacfc \ubc84\uc804 \uad00\ub9ac \ud1b5\ud569\uc5d0\uc11c\ubd80\ud130 \uc11c\uba85, \ubc30\ud3ec \ubc0f \ubaa8\ub2c8\ud130\ub9c1\uc5d0 \uc774\ub974\ub294 Android CI\/CD \ud30c\uc774\ud504\ub77c\uc778\uc758 \uc8fc\uc694 \ub2e8\uacc4\ub97c \uc0b4\ud3b4\ubcf4\uc558\uc2b5\ub2c8\ub2e4. \ub610\ud55c TeamCity\uac00 \uac01 \ub2e8\uacc4\ub97c \uc9c0\uc6d0\ud558\uace0 \uac1c\ubc1c \uc6cc\ud06c\ud50c\ub85c\ub97c \uac04\uc18c\ud654\ud558\ub294 \ubc29\ubc95\uc744 \uc54c\uc544\ubcf4\uc558\uc2b5\ub2c8\ub2e4. \ub9c8\uc9c0\ub9c9\uc5d0\ub294 \ud30c\uc774\ud504\ub77c\uc778 \uc6b4\uc601 \ud6a8\uc728\uc131\uc744 \ubcf4\uc7a5\ud558\ub294 \uc8fc\uc694 \ubaa8\ubc94 \uc0ac\ub840\ub3c4 \ubc30\uc6e0\uc2b5\ub2c8\ub2e4.<\/p>\n<p>TeamCity\ub85c Android \ud30c\uc774\ud504\ub77c\uc778\uc744 \uc124\uc815\ud558\uba74 \uc6cc\ud06c\ud50c\ub85c\uc758 \ud6a8\uc728\uc131\uc744 \ud06c\uac8c \ub192\uc77c \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc774\ub97c \ud1b5\ud574 \ub9b4\ub9ac\uc2a4 \uc8fc\uae30\ub97c \ub2e8\ucd95\ud558\uace0, \ubc84\uadf8\ub294 \uc904\uc774\uace0, \uad81\uadf9\uc801\uc73c\ub85c \uace0\ud488\uc9c8\uc758 Android \uc571\uc744 \ub354 \ud6a8\uc728\uc801\uc73c\ub85c \ubc30\ud3ec\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc9c0\uae08 \uac1c\ubc1c \ud504\ub85c\uc138\uc2a4\ub97c \ub354 \uac04\uc18c\ud654\ud558\uae30 \uc704\ud55c \uccab \uac78\uc74c\uc744 \ub0b4\ub51b\uace0 CI\/CD \ud30c\uc774\ud504\ub77c\uc778\uc744 \uc9c1\uc811 \ub9cc\ub4e4\uc5b4 \ubcf4\uc138\uc694!<\/p>\n<p><em>\uac8c\uc2dc\ubb3c \uc6d0\ubb38 \uc791\uc131\uc790<\/em><\/p>\n\n    <div class=\"about-author \">\n        <div class=\"about-author__box\">\n            <div class=\"row\">\n                <div class=\"about-author__box-img\">\n                    <img decoding=\"async\" src=\"https:\/\/secure.gravatar.com\/avatar\/?s=200&#038;r=g\" width=\"200\" height=\"200\" alt=\"\" loading=\"lazy\"  class=\"avatar avatar-200 wp-user-avatar wp-user-avatar-200 photo avatar-default\">\n                <\/div>\n                <div class=\"about-author__box-text\">\n                                                        <\/div>\n            <\/div>\n        <\/div>\n    <\/div>\n","protected":false},"author":964,"featured_media":506939,"comment_status":"closed","ping_status":"closed","template":"","categories":[1401,6924],"tags":[84,76],"cross-post-tag":[6687],"acf":[],"_links":{"self":[{"href":"https:\/\/blog.jetbrains.com\/ko\/wp-json\/wp\/v2\/teamcity\/506926"}],"collection":[{"href":"https:\/\/blog.jetbrains.com\/ko\/wp-json\/wp\/v2\/teamcity"}],"about":[{"href":"https:\/\/blog.jetbrains.com\/ko\/wp-json\/wp\/v2\/types\/teamcity"}],"author":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/ko\/wp-json\/wp\/v2\/users\/964"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/ko\/wp-json\/wp\/v2\/comments?post=506926"}],"version-history":[{"count":8,"href":"https:\/\/blog.jetbrains.com\/ko\/wp-json\/wp\/v2\/teamcity\/506926\/revisions"}],"predecessor-version":[{"id":518437,"href":"https:\/\/blog.jetbrains.com\/ko\/wp-json\/wp\/v2\/teamcity\/506926\/revisions\/518437"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/ko\/wp-json\/wp\/v2\/media\/506939"}],"wp:attachment":[{"href":"https:\/\/blog.jetbrains.com\/ko\/wp-json\/wp\/v2\/media?parent=506926"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/ko\/wp-json\/wp\/v2\/categories?post=506926"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/ko\/wp-json\/wp\/v2\/tags?post=506926"},{"taxonomy":"cross-post-tag","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/ko\/wp-json\/wp\/v2\/cross-post-tag?post=506926"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}