1+ pipeline {
2+ agent any;
3+
4+ environment {
5+ AWS_DEFAULT_REGION = ' ap-northeast-2'
6+ S3_BUCKET = ' monitory-wearable/android'
7+
8+ GRADLE_OPTS = " -Dorg.gradle.jvmargs=-Xmx4g"
9+ APK_PATH = " mobile/build/outputs/apk/debug/mobile-debug.apk"
10+
11+ GH_CHECK_NAME = " Wearable assembleDebug"
12+
13+ SLACK_CHANNEL = ' #ci-cd'
14+ SLACK_CRED_ID = ' slack-factoreal-token' // Slack App OAuth Token
15+ }
16+
17+ stages {
18+
19+ stage(' Checkout' ) {
20+ steps { checkout scm }
21+ }
22+
23+ /* google-services.json & PEM 파일 복원 */
24+ stage(' Inject secrets' ) {
25+ steps {
26+ withCredentials([
27+ string(credentialsId : ' google-services-json' , variable : ' GOOGLE_JSON' ),
28+ string(credentialsId : ' iot-certificate' , variable : ' IOT_CERT' ),
29+ string(credentialsId : ' iot-private-pem' , variable : ' IOT_PEM' ),
30+ string(credentialsId : ' amazon-root-ca1' , variable : ' AMAZON_ROOT_CA1' ),
31+ ]) {
32+ sh '''
33+ # 경로 준비
34+ mkdir -p mobile/src/main
35+ mkdir -p mobile/src/main/assets
36+
37+ # google-services.json
38+ echo "$GOOGLE_JSON" > mobile/google-services.json
39+ chmod 644 mobile/google-services.json
40+
41+ # PEMs
42+ echo "$IOT_CERT" > mobile/src/main/assets/c060311b74ab5d78e0c9918acc72ebeb07d4d48accfab78d7296dae0e3718872-certificate.pem.crt
43+ chmod 644 mobile/src/main/assets/*-certificate.pem.crt
44+
45+ echo "$IOT_PEM" > mobile/src/main/assets/c060311b74ab5d78e0c9918acc72ebeb07d4d48accfab78d7296dae0e3718872-private.pem.crt
46+ chmod 644 mobile/src/main/assets/*-private.pem.crt
47+
48+ echo "$AMAZON_ROOT_CA1" > mobile/src/main/assets/AmazonRootCA1.pem
49+ chmod 644 mobile/src/main/assets/AmazonRootCA1.pem
50+ '''
51+ }
52+ }
53+ }
54+
55+ stage(' Gradle assembleDebug' ) {
56+ when { not { changeRequest() } }
57+ steps {
58+ sh ' chmod +x ./gradlew'
59+ sh ' ./gradlew :mobile:assembleDebug --stacktrace --warn'
60+ }
61+ post {
62+ success {
63+ /* 상태 = SUCCESS */
64+ publishChecks name : env. GH_CHECK_NAME ,
65+ conclusion : ' SUCCESS' ,
66+ detailsURL : env. BUILD_URL
67+ }
68+ failure {
69+ /* 상태 = FAILURE + 로그 링크 */
70+ publishChecks name : env. GH_CHECK_NAME ,
71+ conclusion : ' FAILURE' ,
72+ detailsURL : " ${ env.BUILD_URL} console"
73+ slackSend channel : env. SLACK_CHANNEL ,
74+ tokenCredentialId : env. SLACK_CRED_ID ,
75+ color : ' #ff0000' ,
76+ message : """ :x: *Wearable assembleDebug 실패*
77+ 파이프라인: <${ env.BUILD_URL} |열기>
78+ 커밋: `${ env.GIT_COMMIT} ` – `${ env.COMMIT_MSG} `
79+ (<${ env.REPO_URL} /commit/${ env.GIT_COMMIT} |커밋 보기>)
80+ """
81+ }
82+ }
83+ }
84+
85+ stage(' Archive APK && Upload to S3' ) {
86+ when {
87+ allOf {
88+ anyOf {
89+ branch ' develop'
90+ branch ' main'
91+ }
92+ not { changeRequest() } // PR 빌드는 건너뜀
93+ }
94+ }
95+ steps {
96+ archiveArtifacts artifacts : " ${ APK_PATH} " , fingerprint : true
97+ withCredentials([[$class : ' AmazonWebServicesCredentialsBinding' ,
98+ credentialsId : ' jenkins-access' ]]) {
99+ sh '''
100+ aws s3 cp ${APK_PATH} s3://${S3_BUCKET}/
101+ '''
102+ }
103+ }
104+ post {
105+ success {
106+ slackSend channel : env. SLACK_CHANNEL ,
107+ tokenCredentialId : env. SLACK_CRED_ID ,
108+ color : ' #36a64f' ,
109+ message : """ :white_check_mark: *Wearable CI/CD 성공*
110+ 파이프라인: <${ env.BUILD_URL} |열기>
111+ 커밋: `${ env.GIT_COMMIT} ` – `${ env.COMMIT_MSG} `
112+ (<${ env.REPO_URL} /commit/${ env.GIT_COMMIT} |커밋 보기>)
113+ """
114+ }
115+ failure {
116+ slackSend channel : env. SLACK_CHANNEL ,
117+ tokenCredentialId : env. SLACK_CRED_ID ,
118+ color : ' #ff0000' ,
119+ message : """ :x: *Wearable CI/CD 실패*
120+ 파이프라인: <${ env.BUILD_URL} |열기>
121+ 커밋: `${ env.GIT_COMMIT} ` – `${ env.COMMIT_MSG} `
122+ (<${ env.REPO_URL} /commit/${ env.GIT_COMMIT} |커밋 보기>)
123+ """
124+ }
125+ }
126+ }
127+ }
128+ }
0 commit comments