이제 안드로이드를 배포 해보자.
공식가이드: https://firebase.google.com/docs/app-distribution/android/distribute-fastlane?hl=ko
1. 안드로이드 프로젝트 이동
fastlane init 설치 도중 물어보는 패키지 명을 잘 적어준다.
2. 안드로이드 배포 플러그인 설치
fastlane add_plugin firebase_app_distribution2.1 안드로이드 버전 읽어오는 플러그인 설치
3. setup 한 것의 확인을 위해 테스트를 수행
fastlane test4. 나의 프로젝트 test 오류 수정
4.1 JDK 문제 프로젝트와 java_home이 안맞는 경우
프로젝트의 JDK를 11로 변경
JAVA_HOME을 11로 변경
4.2 productFlavors 문제
flavor를 사용함으로서, dev, stage, prod 을 사용하면 fastlane에서도 구분 해주어야 한다.
기존 : gradle(task: "test")
기존 : gradle(task: "test")
변경 : gradle(task: "test", flavor: "prod", build_type: "Debug")
//======
$ fastlane add_plugin versioning_android
//==
에러로그가 빌드기반은 java 1.8인데 소스 요구사항이 java 11 이라서 빌드가 안된다고 한다.
프로젝트 그래들 설정
classpath 'com.android.tools.build:gradle:4.2.2'
[14:37:47]: fastlane.tools finished successfully 🎉
//======
이제 빌드 버전의 apk를 슬랙에 올려보자.
. bot 만들고 token 얻기
https://api.slack.com/apps- 위의 주소로 접속
- Create New App 클릭
- App Name 입력 -> Development Slack Workspace 선택 -> Create App 클릭
- Your Apps 클릭 -> 방금 생성한 bot 클릭
- 퍼미션으로 이동
- 파일쓰기 권한과 챗 쓰기 권한을 준다.
스크롤을 내려 scopes 부분에 Add an OAuth Scope 버튼을 눌러 권한을 추가해준다.
[링크] https://api.slack.com/methods 에 가면 각 기능에 대한 설명과 필요 권한이 나와있다.
[링크] https://api.slack.com/methods/chat.postMessage 지금 구현하는 기능은 메시지 보내기 기능으로 필요한 권한은 chat::write 이다.
채널 - 통합 - 앱추가, 내가 만듯 봇 추가.
참고로, 채널에 파일을 올리려면 반드시 봇을 채널에 초대해야 한다!! 그렇지 않으면 계속해서not_in_channel에러가 뜨는데, 해결 방법을 몰라서 계속 헤매다가 스택오버플로우 글을 겨우 찾아서 해결했다..
----
개발 완료
이제 알파 버전을 만들어 보자.
빌드버전 라이브러리 사용
$ fastlane add_plugin versioning_android
//==
젠킨스 빌드시 문제 발생.
현재 안드로이드 프로젝트는 java11로 구성되어 있다.에러로그가 빌드기반은 java 1.8인데 소스 요구사항이 java 11 이라서 빌드가 안된다고 한다.
jenkins on rvm 이... 1.8 이다. (ruby runtime 1.8 2016년 이후로 업데이트가 없다.)
안드로이드 프로젝트를 1.8로 내린다.
classpath 'com.android.tools.build:gradle:4.2.2'
앱 그래들 설정
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
kotlinOptions {
jvmTarget = JavaVersion.VERSION_1_8.toString()
}
젠킨스 환경변수 추가.
ANDROID_SDK_ROOT
/Users/jaehwanchoo/Library/Android/sdk
//===
후기
젠킨스 버전 확인 및 업데이트를 해본다.
오픈소소 : https://github.com/jenkinsci/jenkins
2021-09-01 현재
What's new in 2.309 (2021-08-30) - https://www.jenkins.io/changelog/
1. 먼저 Jenkins LTS 테스트
젠킨스 서버 시작,종료$ brew services start jenkins-lts
$ brew services stop jenkins-lts
java 11 설치
$ brew tap AdoptOpenJDK/openjdk
$ brew install --cask adoptopenjdk11
설치 확인
/Library/Java/JavaVirtualMachines/adoptopenjdk-11.jdk
jenkins 환경설정 변경
$ vi /usr/local/opt/jenkins-lts/homebrew.mxcl.jenkins-lts.plist
$ vi /usr/local/opt/jenkins-lts/homebrew.mxcl.jenkins-lts.plist
경로를 openjdk11 로 변경....
ruby-runtime Failed to initialize. |
rvm Failed to load: Rvm (0.6) - Plugin is missing: ruby-runtime (0.12) |
역시 실행이 안된다...
jenkins를 사용하기 위해서는 일단... java 1.8로 개발 해야 한다.
자바 11 전환 이유 : https://okky.kr/article/784365
언젠간.. 젠킨스도 업데이트가 되겠지...
==
아래는 안드로이드 전체 명령어 이다.
# This file contains the fastlane.tools configuration
# You can find the documentation at https://docs.fastlane.tools
#
# For a list of all available actions, check out
#
# https://docs.fastlane.tools/actions
#
# For a list of all available plugins, check out
#
# https://docs.fastlane.tools/plugins/available-plugins
default_platform(:android)
platform :android do
before_all do
# 슬랙 URL
ENV["SLACK_URL"] = "https://hooks.slack.com/services/.........."
ENV["SLACK_BOT_TOKEN"] = "xoxb-1249569306961-2438086674627-xxxxxxxxxxxxxxxxxxxxx"
ENV["SLACK_BOT_CHANEL"] = "슬랙 배포 채널"
# 파이어베이스 토큰, 아이디 - (메일그룹 groups: "xx-tester" 필요)
ENV["FIREBASE_APP_TOKEN"] = "1//0evEiBIveLayrCgYIARAAGA4SNwF-xxxxxxxx-xxxx-xxx-xxxxxx"
ENV["FIREBASE_APP_ID"] = "1:11861251113:android:xxxxxxxxxxxxxxxxxxxxxx"
end
# 빌드 시작시간
build_date_time = "#{Time.new.strftime("%m-%d %H:%M")}"
######################### PUBLIC LANES #########################
desc "개발 버전은 슬랙으로 배포한다."
lane :dev do
# 시작 알림
slack_send(message: "#{build_date_time} 🤖AND 개발🤖 #{android_get_version_name}(#{android_get_version_code}) 빌드시작!", success: true)
# 빌드
gradle(task: "clean assemble", flavor: "prod", build_type: "Debug")
# 종료 파일 업로드
slack_upload()
end
desc "알파버전은 firebase_app_distribution 배포 한다."
lane :alph do |options|
# 버전 코드 증가
increment_version_code
# 깃 푸시
hk_push_to_git_remote(brench_name: options[:brench_name])
# 시작 알림
slack_send(message: "#{build_date_time} 👽And 알파👽 #{android_get_version_name}(#{android_get_version_code}) 빌드시작!!", success: true)
# 빌드 (signingConfigs 릴리즈에 필요한 정보는 설정 되어있다.)
gradle(task: "clean assemble", flavor: "prod", build_type: "Release")
# 테스트 서버 업로드
hk_firebase_app_distribution
# 종료 테스트 링크 제공
slack_button(message: "#{build_date_time} 👽And 알파👽 #{android_get_version_name}(#{android_get_version_code}) 빌드완료!!", success: true)
end
desc "운영 배포한다. 엔터프라이즈 버전이라 메일로 보낸다."
lane :prod do |options|
# 버전 네임 + 코드 증가
increment_version_name(bump_type: options[:bump_type])
# 깃 푸시
hk_push_to_git_remote_release(brench_name: options[:brench_name])
# 슬렉 시작 알림
slack_send(message: "#{build_date_time} 🎃 운영 🎃 And #{android_get_version_name}(#{android_get_version_code}) 빌드시작!!!", success: true)
# 빌드 signingConfigs 릴리즈에 필요한 정보는 설정 되어있다.
gradle(task: "clean assemble", flavor: "prod", build_type: "Release")
# 젠킨스에서 메일 전송을 위해 파일명 변경
sh "mv ../app/build/outputs/apk/prod/release/app-prod-release.apk ../app/build/xxxx_#{android_get_version_name}.apk"
# 종료 시작 알림
slack_send(message: "#{build_date_time} 🎃 운영 🎃 And #{android_get_version_name}(#{android_get_version_code}) 빌드완료!!! 잠시 기다리시면 메일이 도착 합니다.", success: true)
end
######################### PUBLIC LANES #########################
desc "슬랙봇을 이용해 슬랙 채널에 apk파일을 업로드 한다."
private_lane :slack_upload do |options|
# gradle 빌를 하면 sharedValues 값을 얻을 수 있다.
bot_token = ENV['SLACK_BOT_TOKEN']
bot_chanel = ENV['SLACK_BOT_CHANEL']
full_file_path = lane_context[SharedValues::GRADLE_APK_OUTPUT_PATH]
file_name = full_file_path.gsub(/\/.*\//,"")
sh "echo Uploading " + file_name + " to Slack"
sh "curl https://slack.com/api/files.upload -F token=\"" + bot_token + "\" -F channels=\"" + bot_chanel + "\" -F title=\"" + file_name + "\" -F filename=\"" + file_name + "\" -F file=@" + full_file_path
end
desc "친절한 슬렉씨, 다운로드 링크를 제공한다."
private_lane :slack_button do |options|
slack(
message: options[:message],
slack_url: ENV['SLACK_URL'],
attachment_properties: {
actions: [{
type: "button",
text: "android 알파 설치하기",
url: "https://appdistribution.firebase.google.com/testerapps"
}]
},
default_payloads: []
)
end
desc "웹 후킹을 사용해 슬렉에 메세지를 보낸다."
private_lane :slack_send do |options|
slack(
message: options[:message],
slack_url: ENV['SLACK_URL'],
default_payloads: [:git_branch, :last_git_commit_message]
)
end
# lane 수행이 실패하였을 경우 수행할 동작 설정
error do |lane, exception|
slack_send(
message: exception.message,
success: false
)
end
end
# 파이어베이스 배포
def hk_firebase_app_distribution
firebase_app_distribution(
app: ENV['FIREBASE_APP_ID'],
firebase_cli_token: ENV['FIREBASE_APP_TOKEN'],
groups: "xx-tester",
debug: true
)
end
# 깃 푸시
def hk_push_to_git_remote(brench_name: nil)
remoteBranch = brench_name
if brench_name == nil
remoteBranch = "develop"
end
sh "git commit -am \"build: auto increment version #{android_get_version_name} (#{android_get_version_code})\""
push_to_git_remote(
remote: "origin",
local_branch: "HEAD",
remote_branch: brench_name
)
end
# 깃 푸시
def hk_push_to_git_remote_release(brench_name: nil)
remoteBranch = brench_name
if brench_name == nil
remoteBranch = "develop"
end
sh "git commit -am \"build: auto increment version #{android_get_version_name} (#{android_get_version_code})\""
add_git_tag(tag: "release/" + versionNumber + "_" + buildNumber)
push_to_git_remote(
remote: "origin",
local_branch: "HEAD",
remote_branch: brench_name
)
end
# 버전 코드 증가
def increment_version_code
path = '../app/build.gradle'
re = /versionCode\s+(\d+)/
s = File.read(path)
versionCode = s[re, 1].to_i
s[re, 1] = (versionCode + 1).to_s
f = File.new(path, 'w')
f.write(s)
f.close
end
# 버전 이름, 코드 증가
def increment_version_name(bump_type: "patch")
path = '../app/build.gradle'
re = /versionName\s+("\d+.\d+.\d+")/
s = File.read(path)
versionName = s[re, 1].gsub!('"','').split('.')
major = versionName[0].to_i
minor = versionName[1].to_i
patch = versionName[2].to_i
if (bump_type == 'major')
major += 1
minor = 0
patch = 0
elsif (bump_type == 'minor')
minor += 1
patch = 0
elsif (bump_type == 'patch')
patch += 1
end
s[re, 1] = "\"#{major}.#{minor}.#{patch}\""
f = File.new(path, 'w')
f.write(s)
f.close
increment_version_code
end
참고1 : 링크
==

댓글
댓글 쓰기