Skip to content

Commit

Permalink
Implemented continuous delivery with Travis-CI
Browse files Browse the repository at this point in the history
  • Loading branch information
CognitiveDisson committed Aug 15, 2016
1 parent ad5287e commit 399b9a6
Show file tree
Hide file tree
Showing 8 changed files with 460 additions and 0 deletions.
24 changes: 24 additions & 0 deletions .travis.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
language: objective-c
osx_image: xcode7.3
branches:
only:
- master
- develop
script: fastlane beta
before_install:
- gem update --system
- gem --version
- gem install bundler
- bundle install --gemfile fastlane/Gemfile
- brew install imagemagick
before_script:
- openssl aes-256-cbc -k $ENCRYPTION_PASSWORD -in fastlane/Certificates/distribution.p12.enc -d -a -out fastlane/Certificates/distribution.p12
env:
global:
- SCHEME="ProkrutObjc"
- XCODEPROJ_NAME="ProkrutObjc.xcodeproj"
- XCWORKSPACE_NAME="ProkrutObjc.xcworkspace"
- INFO_PLIST_PATH="ProkrutObjc/Info.plist"
- APP_IDENTIFIER="com.rambler.ProkrutObjc"
- secure: TLkotM760IpT2cvRcDDB/sRhux6C6gKzlwAjO6xK2asYIrGjHm5n9dyh9y5COLHwIyHjrS5/0f3PK+dsbHBHwdyzLDSsMzQmPUpXGKVBg9lc+yS9EENJ/v8nmj1CtyLraCoyJLwbLINzqW558/AtxFUu99KeWSamEQsdluLK0SZpZ0UKqJ6ER3m9sJo95boUrqLzfxaGyyldMCKNYEWChjnfBiXKU3HTavQoEHbBcJSLZkdmXBpXuEx3XOlfyRZwH24hHe7eGT2OqlXPupdF8ZjeQx97gV5o/0hdJIgUj2cHx39OK4MRcZDu8hxJ2ViW+dGhy23APmmZZzJobYYx8VhYzumXUrwq3/WOxGP8fu1jGwKj20oCXPMfOzbvkSZmm2LtXN4IWmLkzRL3pttQE61moEfRCRAt8wdw8UnB0v2fdaTnbcEQwQJYINIHN+dFIKepr0rzcpTL8wt8HoYHzuOtA1C6+9E4zJed1EvDTOv+F+pPr457iKLvipKz6pZV+lhmCOGMi4kdkoNHnCRnwHNgC/XflIMtXDw8H5WEKND9VkjJ/ezfvevZCHOo9VOIiuTX7ecNgm7r1s9HN6WLSzd7vbbp5+6I7eFhsDvnQM7dUlxU8RWfl+qXkTjW0/ZFLQhztHT87fmg5k0iSaTKqGxHteBi27gLyRwaLOTPezo=
- secure: cwaBKS7G+owrtxedG3Ebjvw6VFkGfQOjqQUHvhDmQ9u+pxX+JVq2Kdxlosz4ZbLCKyH+FADBSkUSm9R6WVxGkMKzxgj4cucfg3y9NQgN9g2VM06eWuM4GX7xa8L4jOjr/BiDwZZ0zD7v9qz5MkkMhe8NwF1DLTe5qkTesprwI31fk3ukV1oPf7xS3EdIMlq63lJFknzP6UdZUJ6yLFrtux+baWq5NHg2E179FuzxSyF8aEExHOnXC4D6zfwB4cQPW9L+DY8vTF/XV99e693znVD7WZXIMCaJG+TOc4KdZheCcv0L0zCuzM5hbz6ZfnQmemBRNXbMnPEO0FPwRuP6LSVLjoR331gKGd9Kyu2WP+c7+qGy+bZ8qug0+xuVwI4amqS/2HspT2QnrTmS6mX2nvI5aomvjDM+lJej8lsuNSmXg8yGCqNydJ+Begt7yYstF1i0TcTR/eTjRvp6ViRV7r9YxwbqliOkzkM6I/4ZKEe+IZInpiEmuT5QNyIAUN6jzCOkjIucYXtgfP3H4/HUijMuPOrjXh1gh/DKxDp6Cb0SVgwkPokd/nYRD02YnqwqvbOMKW11CfeHYrJCzvjxVxTTn3bHwJeShDhYA8FrpGG8ArBX8jq07ejWWLikHlS7Bht741JHqv6nGUpH03YWJPUTgDYwhaui6b9yhKNCv44=
91 changes: 91 additions & 0 deletions ProkrutObjc.xcodeproj/xcshareddata/xcschemes/ProkrutObjc.xcscheme
Original file line number Diff line number Diff line change
@@ -0,0 +1,91 @@
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "0730"
version = "1.3">
<BuildAction
parallelizeBuildables = "YES"
buildImplicitDependencies = "YES">
<BuildActionEntries>
<BuildActionEntry
buildForTesting = "YES"
buildForRunning = "YES"
buildForProfiling = "YES"
buildForArchiving = "YES"
buildForAnalyzing = "YES">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "B12510ECB4AFD3A6E2DEDCF2"
BuildableName = "ProkrutObjc.app"
BlueprintName = "ProkrutObjc"
ReferencedContainer = "container:ProkrutObjc.xcodeproj">
</BuildableReference>
</BuildActionEntry>
</BuildActionEntries>
</BuildAction>
<TestAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv = "YES">
<Testables>
</Testables>
<MacroExpansion>
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "B12510ECB4AFD3A6E2DEDCF2"
BuildableName = "ProkrutObjc.app"
BlueprintName = "ProkrutObjc"
ReferencedContainer = "container:ProkrutObjc.xcodeproj">
</BuildableReference>
</MacroExpansion>
<AdditionalOptions>
</AdditionalOptions>
</TestAction>
<LaunchAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
launchStyle = "0"
useCustomWorkingDirectory = "NO"
ignoresPersistentStateOnLaunch = "NO"
debugDocumentVersioning = "YES"
debugServiceExtension = "internal"
allowLocationSimulation = "YES">
<BuildableProductRunnable
runnableDebuggingMode = "0">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "B12510ECB4AFD3A6E2DEDCF2"
BuildableName = "ProkrutObjc.app"
BlueprintName = "ProkrutObjc"
ReferencedContainer = "container:ProkrutObjc.xcodeproj">
</BuildableReference>
</BuildableProductRunnable>
<AdditionalOptions>
</AdditionalOptions>
</LaunchAction>
<ProfileAction
buildConfiguration = "Release"
shouldUseLaunchSchemeArgsEnv = "YES"
savedToolIdentifier = ""
useCustomWorkingDirectory = "NO"
debugDocumentVersioning = "YES">
<BuildableProductRunnable
runnableDebuggingMode = "0">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "B12510ECB4AFD3A6E2DEDCF2"
BuildableName = "ProkrutObjc.app"
BlueprintName = "ProkrutObjc"
ReferencedContainer = "container:ProkrutObjc.xcodeproj">
</BuildableReference>
</BuildableProductRunnable>
</ProfileAction>
<AnalyzeAction
buildConfiguration = "Debug">
</AnalyzeAction>
<ArchiveAction
buildConfiguration = "Release"
revealArchiveInOrganizer = "YES">
</ArchiveAction>
</Scheme>
69 changes: 69 additions & 0 deletions fastlane/Certificates/distribution.p12.enc
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
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
58 changes: 58 additions & 0 deletions fastlane/Fastfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
lane :beta do |options|
# Create keychain for store certificate
keychain_name = 'ci-keychain'
create_keychain(
name: keychain_name,
default_keychain: true,
unlock: true,
timeout: 3600,
lock_when_sleeps: true,
password: SecureRandom.base64
)

# Import distribution certificate
import_certificate(
certificate_path: 'fastlane/Certificates/distribution.p12',
certificate_password: ENV['KEY_PASSWORD'],
keychain_name: keychain_name
)

# Prepare project
update_app_identifier(
xcodeproj: ENV['XCODEPROJ_NAME'],
app_identifier: ENV['APP_IDENTIFIER'],
plist_path: ENV['INFO_PLIST_PATH']
)
sigh(
username: ENV['APPLE_ID'],
app_identifier: ENV['APP_IDENTIFIER'],
team_id: ENV['TEAM_ID']
)

# Setting up the icon badge
shield_text = options[:shield_text]
shield_data = "#{shield_text}-blue"
badge(shield: shield_data, dark: true)

# Building the ipa file of the enterprise build
gym(
workspace: ENV['XCWORKSPACE_NAME'],
scheme: ENV['SCHEME'],
use_legacy_build_api: true,
export_method: 'enterprise'
)

# Uploading
ipa_path = lane_context[SharedValues::IPA_OUTPUT_PATH]
branch_name = git_branch
upload_path = "#{ENV['DROPBOX_UPLOAD_PATH']}/#{branch_name}"
dropbox_token = ENV['DROPBOX_KEY']
dropbox_upload(
dropbox_access_token: dropbox_token,
ipa_path: ipa_path,
upload_path: upload_path
)

# Delete keychain
delete_keychain(name: keychain_name)
end
4 changes: 4 additions & 0 deletions fastlane/Gemfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
source "https://rubygems.org"

gem 'dropbox-sdk'
gem 'badge'
120 changes: 120 additions & 0 deletions fastlane/actions/dropbox_upload.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,120 @@
require 'dropbox_sdk'

module Fastlane
module Actions
# Action for upload build to dropbox
class DropboxUploadAction < Action
TEMPLATE_PROJECTS_HTML_FILENAME = 'fastlane/assets/projects_index_template.html'.freeze
TEMPLATE_PROJECT_HTML_FILENAME = 'fastlane/assets/project_index_template.html'.freeze
TEMPLATE_PROJECT_PLIST_FILENAME = 'fastlane/assets/project_plist_template.plist'.freeze

def self.run(params)
# Authorization
token = params[:dropbox_access_token]
client = DropboxClient.new(token)

# Set Paths
ipa_path = params[:ipa_path]
ipa = open(ipa_path)
@project_path = params[:upload_path]
project_name = 'Prokrut'
upload_ipa_path = "#{@project_path}/#{project_name}.ipa"

# Upload IPA
client.put_file(upload_ipa_path, ipa, true)
ipa_url = client.media(upload_ipa_path)['url']
ipa_paths = ipa_url.split('/')
ipa_url = "#{ipa_paths[5]}/#{ipa_paths.last}"

# Gets info used for the plist
info = FastlaneCore::IpaFileAnalyser.fetch_info_plist_file(ipa_path)
bundle_id = info['CFBundleIdentifier']
bundle_version = info['CFBundleShortVersionString']
title = info['CFBundleName']

# Asset path
assets_path = "#{File.dirname(File.dirname(__FILE__))}/assets/"

# grabs module
eth = Fastlane::ErbTemplateHelper

# Create temp path
tmp_path = "/tmp/DropboxAction_#{project_name}"
FileUtils.mkpath(tmp_path)

# Creates plist from template
plist_template = eth.load_from_path("#{assets_path}plist.erb")
plist_render_option = {
ipa_url: ipa_url,
bundle_id: bundle_id,
bundle_version: bundle_version,
title: title
}
plist_render = eth.render(plist_template, plist_render_option)

plist_name = "#{tmp_path}/#{project_name}.plist"
plist = File.new(plist_name, 'w')
plist.puts(plist_render.to_s)
plist.close

# Upload Plist
plist = open(plist_name)
plist_file_path = "#{@project_path}/#{project_name}.plist"
client.put_file(plist_file_path, plist, true)
plist_url = client.media(plist_file_path)['url']
plist_paths = plist_url.split('/')
plist_url = "#{plist_paths[5]}/#{plist_paths.last}"

# Creates html from template
html_template = eth.load_from_path("#{assets_path}index.erb")
html_render_option = {
plist_url: plist_url,
title: title
}
html_render = eth.render(html_template, html_render_option)
html_name = "#{tmp_path}/index.html"
html = File.new(html_name, 'w')
html.puts(html_render.to_s)
html.close

# Upload Html
html = open(html_name)
html_file_path = "#{@project_path}/index.html"
client.put_file(html_file_path, html, true)
client.shares(html_file_path)['url']
end

#####################################################
# @!group Documentation
#####################################################
def self.description
'Upload ipa to dropbox'
end

def self.available_options
[
FastlaneCore::ConfigItem.new(key: :ipa_path,
env_name: 'FL_RDS_DROPBOX_DEPLOY_IPA_PATH',
description: 'Path to ipa file',
is_string: true),
FastlaneCore::ConfigItem.new(key: :dropbox_access_token,
env_name: 'FL_RDS_DROPBOX_ACCESS_TOKEN',
description: 'DropBox api key',
is_string: true),
FastlaneCore::ConfigItem.new(key: :upload_path,
env_name: 'FL_RDS_DROPBOX_UPLOAD_PATH',
description: 'Upload path',
is_string: true)
]
end

def self.authors
['CognitiveDisson']
end

def self.is_supported?(platform)
true
end
end
end
end
Loading

0 comments on commit 399b9a6

Please sign in to comment.