Use fastlane for iOS builds.
Signed-off-by: Igor Mandrigin <i@mandrigin.ru>
This commit is contained in:
parent
27f0e53bc1
commit
8f13d97b43
|
@ -24,7 +24,7 @@ def installJSDeps() {
|
|||
}
|
||||
|
||||
timeout(90) {
|
||||
node ('macos_pr') {
|
||||
node ('fastlane') {
|
||||
def apkUrl = ''
|
||||
def ipaUrl = ''
|
||||
def testPassed = true
|
||||
|
@ -87,20 +87,22 @@ timeout(90) {
|
|||
|
||||
// iOS
|
||||
stage('Build (iOS)') {
|
||||
withCredentials([string(
|
||||
credentialsId: "slave-pass-${env.NODE_NAME}",
|
||||
variable: 'password'
|
||||
)]) {
|
||||
env.RCT_NO_LAUNCH_PACKAGER = true
|
||||
sh "security unlock-keychain -p ${password} login.keychain"
|
||||
sh 'xcodebuild -workspace ios/StatusIm.xcworkspace -scheme StatusIm -configuration release -archivePath status clean archive'
|
||||
sh 'xcodebuild -exportArchive -exportPath status -archivePath status.xcarchive -exportOptionsPlist ios/archive-develop.plist'
|
||||
withCredentials([
|
||||
string(
|
||||
credentialsId: "slave-pass-${env.NODE_NAME}",
|
||||
variable: 'password'
|
||||
),
|
||||
string(
|
||||
credentialsId: 'fastlane-match-password',
|
||||
variable:'KEYCHAIN_PASSWORD'
|
||||
)]) {
|
||||
sh 'fastlane ios adhoc'
|
||||
}
|
||||
}
|
||||
|
||||
stage('Deploy (iOS)') {
|
||||
withCredentials([string(credentialsId: 'diawi-token', variable: 'token')]) {
|
||||
def job = sh(returnStdout: true, script: 'curl https://upload.diawi.com/ -F token='+token+' -F file=@status/StatusIm.ipa -F find_by_udid=0 -F wall_of_apps=0 | jq -r ".job"').trim()
|
||||
def job = sh(returnStdout: true, script: 'curl https://upload.diawi.com/ -F token='+token+' -F file=@status-adhoc/StatusIm.ipa -F find_by_udid=0 -F wall_of_apps=0 | jq -r ".job"').trim()
|
||||
def hash = 'null'
|
||||
for (int r = 0; r < 6 && hash == 'null'; r++) {
|
||||
sh 'sleep 10'
|
||||
|
|
|
@ -5,7 +5,7 @@ env.FASTLANE_DISABLE_COLORS=1
|
|||
env.REALM_DISABLE_ANALYTICS=1
|
||||
|
||||
timeout(90) {
|
||||
node ('macos'){
|
||||
node ('fastlane'){
|
||||
|
||||
stage('Git & Dependencies'){
|
||||
|
||||
|
|
|
@ -1,130 +0,0 @@
|
|||
// We need nightly builds for users who want to test apps, diawi removes old builds and limits downloads, hence the need for Artifactory.
|
||||
// To see env: echo sh(returnStdout: true, script: 'env')
|
||||
|
||||
env.LANG="en_US.UTF-8"
|
||||
env.LANGUAGE="en_US.UTF-8"
|
||||
env.LC_ALL="en_US.UTF-8"
|
||||
env.FASTLANE_DISABLE_COLORS=1
|
||||
env.REALM_DISABLE_ANALYTICS=1
|
||||
|
||||
def installJSDeps() {
|
||||
def attempt = 1
|
||||
def maxAttempts = 10
|
||||
def installed = false
|
||||
while (!installed && attempt <= maxAttempts) {
|
||||
println "#${attempt} attempt to install npm deps"
|
||||
sh 'scripts/prepare-for-platform.sh mobile'
|
||||
sh 'npm install'
|
||||
installed = fileExists('node_modules/web3/index.js')
|
||||
attemp = attempt + 1
|
||||
}
|
||||
}
|
||||
|
||||
timeout(90) {
|
||||
node ('macos'){
|
||||
def apkUrl = ''
|
||||
def ipaUrl = ''
|
||||
def testPassed = true
|
||||
|
||||
load "$HOME/env.groovy"
|
||||
|
||||
try {
|
||||
|
||||
stage('Git & Dependencies') {
|
||||
slackSend color: 'good', message: 'Nightly build started. ' + env.BUILD_URL
|
||||
|
||||
checkout scm
|
||||
|
||||
sh 'rm -rf node_modules'
|
||||
sh 'cp .env.jenkins .env'
|
||||
|
||||
installJSDeps()
|
||||
|
||||
sh 'mvn -f modules/react-native-status/ios/RCTStatus dependency:unpack'
|
||||
sh 'cd ios && pod install && cd ..'
|
||||
}
|
||||
|
||||
stage('Tests') {
|
||||
sh 'lein test-cljs'
|
||||
}
|
||||
|
||||
stage('Build') {
|
||||
sh 'lein prod-build'
|
||||
}
|
||||
|
||||
stage('Build (Android)') {
|
||||
sh 'cd android && ./gradlew react-native-android:installArchives && ./gradlew assembleRelease'
|
||||
}
|
||||
|
||||
stage('Build (iOS)') {
|
||||
env.RCT_NO_LAUNCH_PACKAGER = true
|
||||
sh 'xcodebuild -workspace ios/StatusIm.xcworkspace -scheme StatusIm -configuration release -archivePath status clean archive'
|
||||
sh 'xcodebuild -exportArchive -exportPath status -archivePath status.xcarchive -exportOptionsPlist ios/archive-develop.plist'
|
||||
}
|
||||
|
||||
stage('Deploy (Android)') {
|
||||
def artifact_dir = pwd() + '/android/app/build/outputs/apk/release/'
|
||||
println (artifact_dir + 'app-release.apk')
|
||||
sh ('ls -la ' + artifact_dir)
|
||||
def artifact = (artifact_dir + 'app-release.apk')
|
||||
def server = Artifactory.server('artifacts')
|
||||
def shortCommit = sh(returnStdout: true, script: 'git rev-parse HEAD').trim().take(6)
|
||||
def filename = 'im.status.ethereum-' + shortCommit + '-nightly' + '.apk'
|
||||
def newArtifact = (artifact_dir + filename)
|
||||
sh ('mv ' + artifact + ' ' + newArtifact)
|
||||
def uploadSpec = '{ "files": [ { "pattern": "*apk/release/' + filename + '", "target": "nightlies-local" }]}'
|
||||
def buildInfo = server.upload(uploadSpec)
|
||||
apkUrl = 'http://artifacts.status.im:8081/artifactory/nightlies-local/' + filename
|
||||
|
||||
sh ('echo ARTIFACT Android: ' + apkUrl)
|
||||
}
|
||||
|
||||
stage('Deploy (iOS)') {
|
||||
withCredentials([string(credentialsId: 'diawi-token', variable: 'token')]) {
|
||||
def job = sh(returnStdout: true, script: 'curl https://upload.diawi.com/ -F token='+token+' -F file=@status/StatusIm.ipa -F find_by_udid=0 -F wall_of_apps=0 | jq -r ".job"').trim()
|
||||
sh 'sleep 10'
|
||||
def hash = sh(returnStdout: true, script: "curl -vvv 'https://upload.diawi.com/status?token="+token+"&job="+job+"'|jq -r '.hash'").trim()
|
||||
ipaUrl = 'https://i.diawi.com/' + hash
|
||||
|
||||
sh ('echo ARTIFACT iOS: ' + ipaUrl)
|
||||
}
|
||||
}
|
||||
} catch (e) {
|
||||
slackSend color: 'bad', message: 'Nightly build (develop) failed to build. ' + env.BUILD_URL
|
||||
throw e
|
||||
}
|
||||
|
||||
stage('Slack Notification') {
|
||||
def c = (testPassed ? 'good' : 'warning' )
|
||||
slackSend color: c, message: 'Nightly build (develop) \nTests: ' + (testPassed ? ':+1:' : ':-1:') + ')\nAndroid: ' + apkUrl + '\n iOS: ' + ipaUrl
|
||||
build(
|
||||
job: 'misc/status-im.github.io-update_env',
|
||||
parameters: [
|
||||
[$class: 'StringParameterValue', name: 'APK_URL', value: apkUrl],
|
||||
[$class: 'StringParameterValue', name: 'IOS_URL', value: ipaUrl]
|
||||
]
|
||||
)
|
||||
}
|
||||
|
||||
stage('Build (Android) for e2e tests') {
|
||||
sh 'cd android && mv app/build/outputs/apk/release/app-release.apk app/build/outputs/apk/release/app-release.original.apk && ENVFILE=.env.e2e ./gradlew assembleRelease'
|
||||
}
|
||||
|
||||
stage('Upload apk for e2e tests') {
|
||||
if (env.CHANGE_ID != null){
|
||||
withCredentials([string(credentialsId: 'SAUCE_ACCESS_KEY', variable: 'key'), string(credentialsId: 'SAUCE_USERNAME', variable: 'username')]){
|
||||
def apk_name = env.CHANGE_ID + '.apk'
|
||||
sh('curl -u ' + username+ ':' + key + ' -X POST -H "Content-Type: application/octet-stream" https://saucelabs.com/rest/v1/storage/' + username + '/' + apk_name + '?overwrite=true --data-binary @android/app/build/outputs/apk/release/app-release.apk')
|
||||
}
|
||||
withCredentials([string(credentialsId: 'diawi-token', variable: 'token')]) {
|
||||
def job = sh(returnStdout: true, script: 'curl https://upload.diawi.com/ -F token='+token+' -F file=@android/app/build/outputs/apk/release/app-release.apk -F find_by_udid=0 -F wall_of_apps=0 | jq -r ".job"').trim()
|
||||
sh 'sleep 10'
|
||||
def hash = sh(returnStdout: true, script: "curl -vvv 'https://upload.diawi.com/status?token="+token+"&job="+job+"'|jq -r '.hash'").trim()
|
||||
apkUrl = 'https://i.diawi.com/' + hash
|
||||
|
||||
sh ('echo ARTIFACT Android for e2e tests: ' + apkUrl)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -26,7 +26,7 @@ def installJSDeps() {
|
|||
}
|
||||
|
||||
timeout(90) {
|
||||
node ('macos'){
|
||||
node ('fastlane'){
|
||||
def apkUrl = ''
|
||||
def ipaUrl = ''
|
||||
def testPassed = true
|
||||
|
@ -80,21 +80,6 @@ timeout(90) {
|
|||
sh 'cd android && ./gradlew react-native-android:installArchives && ./gradlew assembleRelease'
|
||||
}
|
||||
|
||||
stage('Build (iOS)') {
|
||||
withCredentials([string(
|
||||
credentialsId: "slave-pass-${env.NODE_NAME}",
|
||||
variable: 'password'
|
||||
)]) {
|
||||
sh "plutil -replace CFBundleShortVersionString -string ${version} ios/StatusIm/Info.plist"
|
||||
sh "plutil -replace CFBundleVersion -string ${build_no} ios/StatusIm/Info.plist"
|
||||
env.RCT_NO_LAUNCH_PACKAGER = true
|
||||
sh "security unlock-keychain -p ${password} login.keychain"
|
||||
sh 'xcodebuild -workspace ios/StatusIm.xcworkspace -scheme StatusIm -configuration release -archivePath status clean archive'
|
||||
sh 'xcodebuild -exportArchive -exportPath status_appstore -archivePath status.xcarchive -exportOptionsPlist ios/archive-release.plist'
|
||||
sh 'xcodebuild -exportArchive -exportPath status -archivePath status.xcarchive -exportOptionsPlist ios/archive-develop.plist'
|
||||
}
|
||||
}
|
||||
|
||||
stage('Deploy (Android)') {
|
||||
def artifact_dir = pwd() + '/android/app/build/outputs/apk/release/'
|
||||
println (artifact_dir + 'app-release.apk')
|
||||
|
@ -112,14 +97,30 @@ timeout(90) {
|
|||
sh ('echo ARTIFACT Android: ' + apkUrl)
|
||||
}
|
||||
|
||||
stage('Deploy (iOS)') {
|
||||
stage('Build & TestFlight (iOS)') {
|
||||
withCredentials([
|
||||
string(
|
||||
credentialsId: "slave-pass-${env.NODE_NAME}",
|
||||
variable: 'KEYCHAIN_PASSWORD'
|
||||
),
|
||||
string(
|
||||
credentialsId: 'fastlane-match-password',
|
||||
variable:'MATCH_PASSWORD'
|
||||
)]) {
|
||||
|
||||
sh "plutil -replace CFBundleShortVersionString -string ${version} ios/StatusIm/Info.plist"
|
||||
sh "plutil -replace CFBundleVersion -string ${build_no} ios/StatusIm/Info.plist"
|
||||
sh 'fastlane ios nightly'
|
||||
}
|
||||
}
|
||||
|
||||
stage('Deploy diawi (iOS)') {
|
||||
withCredentials([string(credentialsId: 'diawi-token', variable: 'token')]) {
|
||||
def job = sh(returnStdout: true, script: 'curl https://upload.diawi.com/ -F token='+token+' -F file=@status/StatusIm.ipa -F find_by_udid=0 -F wall_of_apps=0 | jq -r ".job"').trim()
|
||||
def job = sh(returnStdout: true, script: 'curl https://upload.diawi.com/ -F token='+token+' -F file=@status-adhoc/StatusIm.ipa -F find_by_udid=0 -F wall_of_apps=0 | jq -r ".job"').trim()
|
||||
sh 'sleep 10'
|
||||
def hash = sh(returnStdout: true, script: "curl -vvv 'https://upload.diawi.com/status?token="+token+"&job="+job+"'|jq -r '.hash'").trim()
|
||||
ipaUrl = 'https://i.diawi.com/' + hash
|
||||
|
||||
sh ('bundle exec fastlane ios nightly')
|
||||
sh ('echo ARTIFACT iOS: ' + ipaUrl)
|
||||
}
|
||||
}
|
||||
|
|
|
@ -18,7 +18,7 @@ def installJSDeps() {
|
|||
}
|
||||
|
||||
timeout(90) {
|
||||
node ('macos') {
|
||||
node ('fastlane') {
|
||||
def apkUrl = ''
|
||||
def ipaUrl = ''
|
||||
def testPassed = true
|
||||
|
@ -84,26 +84,24 @@ timeout(90) {
|
|||
}
|
||||
}
|
||||
|
||||
// try {
|
||||
// stage('Test (Android)') {
|
||||
// sauce('b9aded57-5cc1-4f6b-b5ea-42d989987852') {
|
||||
// sh 'cd test/appium && mvn -DapkUrl=' + apkUrl + ' test'
|
||||
// saucePublisher()
|
||||
// }
|
||||
// }
|
||||
// } catch(e) {
|
||||
// testPassed = false
|
||||
// }
|
||||
|
||||
// iOS
|
||||
stage('Build (iOS)') {
|
||||
env.RCT_NO_LAUNCH_PACKAGER = true
|
||||
sh 'xcodebuild -workspace ios/StatusIm.xcworkspace -scheme StatusIm -configuration release -archivePath status clean archive'
|
||||
sh 'xcodebuild -exportArchive -exportPath status -archivePath status.xcarchive -exportOptionsPlist ios/archive-develop.plist'
|
||||
withCredentials([
|
||||
string(
|
||||
credentialsId: "slave-pass-${env.NODE_NAME}",
|
||||
variable: 'KEYCHAIN_PASSWORD'
|
||||
),
|
||||
string(
|
||||
credentialsId: 'fastlane-match-password',
|
||||
variable:'MATCH_PASSWORD'
|
||||
)]) {
|
||||
|
||||
sh 'fastlane ios adhoc'
|
||||
}
|
||||
}
|
||||
stage('Deploy (iOS)') {
|
||||
withCredentials([string(credentialsId: 'diawi-token', variable: 'token')]) {
|
||||
def job = sh(returnStdout: true, script: 'curl https://upload.diawi.com/ -F token='+token+' -F file=@status/StatusIm.ipa -F find_by_udid=0 -F wall_of_apps=0 | jq -r ".job"').trim()
|
||||
def job = sh(returnStdout: true, script: 'curl https://upload.diawi.com/ -F token='+token+' -F file=@status-adhoc/StatusIm.ipa -F find_by_udid=0 -F wall_of_apps=0 | jq -r ".job"').trim()
|
||||
sh 'sleep 10'
|
||||
def hash = sh(returnStdout: true, script: "curl -vvv 'https://upload.diawi.com/status?token="+token+"&job="+job+"'|jq -r '.hash'").trim()
|
||||
ipaUrl = 'https://i.diawi.com/' + hash
|
||||
|
|
|
@ -20,7 +20,7 @@ def installJSDeps() {
|
|||
}
|
||||
|
||||
timeout(90) {
|
||||
node ('macos'){
|
||||
node ('fastlane'){
|
||||
def apkUrl = ''
|
||||
def ipaUrl = ''
|
||||
def testPassed = true
|
||||
|
@ -75,14 +75,6 @@ timeout(90) {
|
|||
sh 'cd android && ./gradlew react-native-android:installArchives && ./gradlew assembleRelease -PreleaseVersion=' + version
|
||||
}
|
||||
|
||||
stage('Build (iOS)') {
|
||||
sh "plutil -replace CFBundleShortVersionString -string ${version} ios/StatusIm/Info.plist"
|
||||
sh "plutil -replace CFBundleVersion -string ${build_no} ios/StatusIm/Info.plist"
|
||||
env.RCT_NO_LAUNCH_PACKAGER = true
|
||||
sh 'xcodebuild -workspace ios/StatusIm.xcworkspace -scheme StatusIm -configuration release -archivePath status clean archive'
|
||||
sh 'xcodebuild -exportArchive -exportPath status -archivePath status.xcarchive -exportOptionsPlist ios/archive-develop.plist'
|
||||
}
|
||||
|
||||
stage('Deploy (Android)') {
|
||||
def artifact_dir = pwd() + '/android/app/build/outputs/apk/release/'
|
||||
println (artifact_dir + 'app-release.apk')
|
||||
|
@ -100,9 +92,24 @@ timeout(90) {
|
|||
sh ('echo ARTIFACT Android: ' + apkUrl)
|
||||
}
|
||||
|
||||
stage('Build (iOS)') {
|
||||
withCredentials([
|
||||
string(
|
||||
credentialsId: "slave-pass-${env.NODE_NAME}",
|
||||
variable: 'KEYCHAIN_PASSWORD'
|
||||
),
|
||||
string(
|
||||
credentialsId: 'fastlane-match-password',
|
||||
variable:'MATCH_PASSWORD'
|
||||
)]) {
|
||||
sh "plutil -replace CFBundleShortVersionString -string ${version} ios/StatusIm/Info.plist"
|
||||
sh "plutil -replace CFBundleVersion -string ${build_no} ios/StatusIm/Info.plist"
|
||||
sh 'fastlane ios adhoc'
|
||||
}
|
||||
|
||||
stage('Deploy (iOS)') {
|
||||
withCredentials([string(credentialsId: 'diawi-token', variable: 'token')]) {
|
||||
def job = sh(returnStdout: true, script: 'curl https://upload.diawi.com/ -F token='+token+' -F file=@status/StatusIm.ipa -F find_by_udid=0 -F wall_of_apps=0 | jq -r ".job"').trim()
|
||||
def job = sh(returnStdout: true, script: 'curl https://upload.diawi.com/ -F token='+token+' -F file=@status-adhoc/StatusIm.ipa -F find_by_udid=0 -F wall_of_apps=0 | jq -r ".job"').trim()
|
||||
sh 'sleep 10'
|
||||
def hash = sh(returnStdout: true, script: "curl -vvv 'https://upload.diawi.com/status?token="+token+"&job="+job+"'|jq -r '.hash'").trim()
|
||||
ipaUrl = 'https://i.diawi.com/' + hash
|
||||
|
|
|
@ -20,7 +20,7 @@ def installJSDeps() {
|
|||
}
|
||||
|
||||
timeout(90) {
|
||||
node ('macos'){
|
||||
node ('fastlane'){
|
||||
def apkUrl = ''
|
||||
def ipaUrl = ''
|
||||
def testPassed = true
|
||||
|
@ -74,28 +74,24 @@ timeout(90) {
|
|||
sh 'lein prod-build'
|
||||
}
|
||||
|
||||
stage('Build (iOS)') {
|
||||
withCredentials([string(
|
||||
credentialsId: "slave-pass-${env.NODE_NAME}",
|
||||
variable: 'password'
|
||||
)]) {
|
||||
sh "plutil -replace CFBundleShortVersionString -string ${version} ios/StatusIm/Info.plist"
|
||||
sh "plutil -replace CFBundleVersion -string ${build_no} ios/StatusIm/Info.plist"
|
||||
env.RCT_NO_LAUNCH_PACKAGER = true
|
||||
sh "security unlock-keychain -p ${password} login.keychain"
|
||||
sh 'xcodebuild -workspace ios/StatusIm.xcworkspace -scheme StatusIm -configuration release -archivePath status clean archive'
|
||||
sh 'xcodebuild -exportArchive -exportPath status_appstore -archivePath status.xcarchive -exportOptionsPlist ios/archive-release.plist'
|
||||
stage('Build & TestFlight (iOS)') {
|
||||
withCredentials([
|
||||
string(
|
||||
credentialsId: "slave-pass-${env.NODE_NAME}",
|
||||
variable: 'KEYCHAIN_PASSWORD'
|
||||
),
|
||||
string(
|
||||
credentialsId: 'fastlane-match-password',
|
||||
variable:'MATCH_PASSWORD'
|
||||
)]) {
|
||||
|
||||
|
||||
sh "plutil -replace CFBundleShortVersionString -string ${version} ios/StatusIm/Info.plist"
|
||||
sh "plutil -replace CFBundleVersion -string ${build_no} ios/StatusIm/Info.plist"
|
||||
sh 'fastlane ios release'
|
||||
}
|
||||
}
|
||||
|
||||
stage('Deploy (iOS)') {
|
||||
sh ('bundle exec fastlane ios release')
|
||||
}
|
||||
} catch (e) {
|
||||
slackSend color: 'bad', message: 'Release build failed uploading to iTunes Connect. ' + env.BUILD_URL
|
||||
throw e
|
||||
}
|
||||
|
||||
stage('Slack Notification') {
|
||||
slackSend color: 'good', message: 'Release build ' + version + ' succesfully aploade to iTunes Connect'
|
||||
}
|
||||
|
|
|
@ -0,0 +1 @@
|
|||
RCT_NO_LAUNCH_PACKAGER=true
|
|
@ -6,25 +6,112 @@
|
|||
# https://docs.fastlane.tools/actions
|
||||
#
|
||||
|
||||
# Uncomment the line if you want fastlane to automatically update itself
|
||||
# update_fastlane
|
||||
# There are a few env variables defined in the .env file in
|
||||
# this directory (fastlane/.env)
|
||||
|
||||
|
||||
# unlocks keychain if KEYCHAIN_PASSWORD variable is present
|
||||
# (to be used on CI machines)
|
||||
def unlock_keychain_if_needed
|
||||
if ENV["KEYCHAIN_PASSWORD"]
|
||||
unlock_keychain(
|
||||
path:"login.keychain",
|
||||
password:ENV["password"],
|
||||
set_default: true)
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
# builds an ios app with ad-hoc configuration and put it
|
||||
# to "status-adhoc" output folder
|
||||
def build_ios_adhoc
|
||||
match(
|
||||
type: "adhoc",
|
||||
force_for_new_devices: true,
|
||||
readonly: true,
|
||||
keychain_name: "login.keychain"
|
||||
)
|
||||
build_ios_app(
|
||||
scheme: "StatusIm",
|
||||
workspace: "ios/StatusIm.xcworkspace",
|
||||
configuration: "Release",
|
||||
clean: true,
|
||||
export_method: "ad-hoc",
|
||||
output_directory: "status-adhoc"
|
||||
)
|
||||
end
|
||||
|
||||
|
||||
platform :ios do
|
||||
desc "Deploy a new internal build to iTunes Connect"
|
||||
desc "`fastlane ios adhoc` - ad-hoc lane for iOS."
|
||||
desc "This lane is used PRs, Releases, etc."
|
||||
desc "It creates an .ipa that can be used by a list of devices, registeded in the App Store Connect."
|
||||
desc "This .ipa is ready to be distibuted through diawi.com"
|
||||
lane :adhoc do
|
||||
unlock_keychain_if_needed
|
||||
build_ios_adhoc
|
||||
end
|
||||
|
||||
desc "`fastlane ios nightly` - makes a new nightly in TestFlight"
|
||||
desc "This lane builds a new nightly and uploads it to TestFlight"
|
||||
desc "It also leaves an .ipa that is ad-hoc signed (can be uploaded to diawi)"
|
||||
lane :nightly do
|
||||
unlock_keychain_if_needed
|
||||
|
||||
match(
|
||||
type: "appstore",
|
||||
force_for_new_devices: true,
|
||||
readonly: true,
|
||||
keychain_name: "login.keychain"
|
||||
)
|
||||
build_ios_app(
|
||||
scheme: "StatusIm",
|
||||
workspace: "ios/StatusIm.xcworkspace",
|
||||
configuration: "Release",
|
||||
clean: true,
|
||||
export_method: "app-store",
|
||||
output_directory: "status_appstore"
|
||||
)
|
||||
upload_to_testflight(
|
||||
ipa: "status_appstore/StatusIm.ipa"
|
||||
)
|
||||
slack(message: "New nightly build uploaded to iTunes Connect")
|
||||
slack(message: "New nightly build uploaded to TestFlight")
|
||||
|
||||
# additional .ipa is for diawi
|
||||
# we have to re-build it because it uses different config
|
||||
build_ios_adhoc
|
||||
end
|
||||
|
||||
desc "`fastlane ios release` builds a release & uploads it to TestFlight"
|
||||
lane :release do
|
||||
match(
|
||||
type: "appstore",
|
||||
force_for_new_devices: true,
|
||||
readonly: true,
|
||||
keychain_name: "login.keychain"
|
||||
)
|
||||
build_ios_app(
|
||||
scheme: "StatusIm",
|
||||
workspace: "ios/StatusIm.xcworkspace",
|
||||
configuration: "Release",
|
||||
clean: true,
|
||||
export_method: "app-store",
|
||||
output_directory: "status_appstore",
|
||||
export_options: {
|
||||
"combileBitcode": true,
|
||||
"uploadBitcode": false,
|
||||
"ITSAppUsesNonExemptEncryption": false
|
||||
}
|
||||
)
|
||||
upload_to_testflight(
|
||||
ipa: "status_appstore/StatusIm.ipa"
|
||||
)
|
||||
slack(message: "New release build uploaded to iTunes Connect")
|
||||
slack(message: "New release build uploaded to TestFlight")
|
||||
end
|
||||
desc "Remove inactive TestFlight users"
|
||||
|
||||
desc "`fastlane ios clean` - remove inactive TestFlight users"
|
||||
desc "uses custom plugin, installed via"
|
||||
desc "`sudo get install fastlane-plugin-clean_testflight_testers`"
|
||||
lane :clean do
|
||||
clean_testflight_testers
|
||||
end
|
||||
|
|
|
@ -0,0 +1,9 @@
|
|||
git_url("git@github.com:status-im/ios-certificates.git")
|
||||
|
||||
type("development") # The default type, can be: appstore, adhoc, enterprise or development
|
||||
|
||||
# app_identifier(["tools.fastlane.app", "tools.fastlane.app2"])
|
||||
username("support@status.im") # Your Apple Developer Portal username
|
||||
|
||||
# For all available options run `fastlane match --help`
|
||||
# Remove the # in the beginning of the line to enable the other options
|
|
@ -1186,11 +1186,12 @@
|
|||
00E356ED1AD99517003FC87E = {
|
||||
CreatedOnToolsVersion = 6.2;
|
||||
DevelopmentTeam = DTX7Z4U3YA;
|
||||
ProvisioningStyle = Manual;
|
||||
TestTargetID = 13B07F861A680F5B00A75B9A;
|
||||
};
|
||||
13B07F861A680F5B00A75B9A = {
|
||||
DevelopmentTeam = DTX7Z4U3YA;
|
||||
ProvisioningStyle = Automatic;
|
||||
ProvisioningStyle = Manual;
|
||||
SystemCapabilities = {
|
||||
com.apple.BackgroundModes = {
|
||||
enabled = 1;
|
||||
|
@ -1911,6 +1912,7 @@
|
|||
buildSettings = {
|
||||
BUNDLE_ID_SUFFIX = .debug;
|
||||
BUNDLE_LOADER = "$(TEST_HOST)";
|
||||
CODE_SIGN_IDENTITY = "iPhone Developer";
|
||||
DEVELOPMENT_TEAM = DTX7Z4U3YA;
|
||||
FRAMEWORK_SEARCH_PATHS = (
|
||||
"$(SDKROOT)/Developer/Library/Frameworks",
|
||||
|
@ -1949,6 +1951,8 @@
|
|||
);
|
||||
PRODUCT_BUNDLE_IDENTIFIER = im.status.ethereum;
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
PROVISIONING_PROFILE = "";
|
||||
PROVISIONING_PROFILE_SPECIFIER = "";
|
||||
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/StatusIm.app/StatusIm";
|
||||
};
|
||||
name = Debug;
|
||||
|
@ -1959,6 +1963,7 @@
|
|||
buildSettings = {
|
||||
BUNDLE_ID_SUFFIX = "";
|
||||
BUNDLE_LOADER = "$(TEST_HOST)";
|
||||
CODE_SIGN_IDENTITY = "iPhone Distribution";
|
||||
COPY_PHASE_STRIP = NO;
|
||||
DEVELOPMENT_TEAM = DTX7Z4U3YA;
|
||||
FRAMEWORK_SEARCH_PATHS = (
|
||||
|
@ -1994,6 +1999,8 @@
|
|||
);
|
||||
PRODUCT_BUNDLE_IDENTIFIER = im.status.ethereum;
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
PROVISIONING_PROFILE = "";
|
||||
PROVISIONING_PROFILE_SPECIFIER = "";
|
||||
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/StatusIm.app/StatusIm";
|
||||
};
|
||||
name = Release;
|
||||
|
@ -2005,7 +2012,9 @@
|
|||
ASSETCATALOG_COMPILER_APPICON_NAME = "AppIcon$(BUNDLE_ID_SUFFIX)";
|
||||
BUNDLE_ID_SUFFIX = .debug;
|
||||
CODE_SIGN_ENTITLEMENTS = StatusIm/StatusIm.entitlements;
|
||||
CODE_SIGN_IDENTITY = "iPhone Developer";
|
||||
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
|
||||
CODE_SIGN_STYLE = Manual;
|
||||
CUSTOM_PRODUCT_NAME = "Status Debug";
|
||||
DEAD_CODE_STRIPPING = NO;
|
||||
DEVELOPMENT_TEAM = DTX7Z4U3YA;
|
||||
|
@ -2057,6 +2066,8 @@
|
|||
);
|
||||
PRODUCT_BUNDLE_IDENTIFIER = im.status.ethereum;
|
||||
PRODUCT_NAME = StatusIm;
|
||||
PROVISIONING_PROFILE = "9da75626-9594-43d9-a827-0f6d43c28f54";
|
||||
PROVISIONING_PROFILE_SPECIFIER = "match Development im.status.ethereum";
|
||||
TARGETED_DEVICE_FAMILY = "1,2";
|
||||
VALID_ARCHS = "arm64 armv7 armv7s";
|
||||
};
|
||||
|
@ -2069,7 +2080,9 @@
|
|||
ASSETCATALOG_COMPILER_APPICON_NAME = "AppIcon$(BUNDLE_ID_SUFFIX)";
|
||||
BUNDLE_ID_SUFFIX = "";
|
||||
CODE_SIGN_ENTITLEMENTS = StatusIm/StatusIm.entitlements;
|
||||
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
|
||||
CODE_SIGN_IDENTITY = "iPhone Distribution";
|
||||
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution";
|
||||
CODE_SIGN_STYLE = Manual;
|
||||
CUSTOM_PRODUCT_NAME = Status;
|
||||
DEAD_CODE_STRIPPING = NO;
|
||||
DEVELOPMENT_TEAM = DTX7Z4U3YA;
|
||||
|
@ -2121,6 +2134,8 @@
|
|||
);
|
||||
PRODUCT_BUNDLE_IDENTIFIER = im.status.ethereum;
|
||||
PRODUCT_NAME = StatusIm;
|
||||
PROVISIONING_PROFILE = "e2202b12-7a66-4ff7-af3c-a52e35f32dc1";
|
||||
PROVISIONING_PROFILE_SPECIFIER = "match AdHoc im.status.ethereum";
|
||||
TARGETED_DEVICE_FAMILY = "1,2";
|
||||
VALID_ARCHS = "armv7 armv7s arm64";
|
||||
};
|
||||
|
@ -2145,7 +2160,9 @@
|
|||
CLANG_WARN_SUSPICIOUS_MOVE = YES;
|
||||
CLANG_WARN_UNREACHABLE_CODE = YES;
|
||||
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
|
||||
CODE_SIGN_IDENTITY = "iPhone Developer";
|
||||
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
|
||||
CODE_SIGN_STYLE = Manual;
|
||||
COPY_PHASE_STRIP = NO;
|
||||
DEVELOPMENT_TEAM = DTX7Z4U3YA;
|
||||
ENABLE_BITCODE = NO;
|
||||
|
@ -2212,7 +2229,9 @@
|
|||
CLANG_WARN_SUSPICIOUS_MOVE = YES;
|
||||
CLANG_WARN_UNREACHABLE_CODE = YES;
|
||||
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
|
||||
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
|
||||
CODE_SIGN_IDENTITY = "iPhone Distribution";
|
||||
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution";
|
||||
CODE_SIGN_STYLE = Manual;
|
||||
COPY_PHASE_STRIP = YES;
|
||||
DEVELOPMENT_TEAM = DTX7Z4U3YA;
|
||||
ENABLE_BITCODE = NO;
|
||||
|
|
Loading…
Reference in New Issue