How we use fastlane at Wantedly

How we use fastlane at Wantedly

2015.06.26 #fastlane_jp

03c0e11ea6f2a3e08b3c46db5877c8e1?s=128

Jiro Nagashima

June 26, 2015
Tweet

Transcript

  1. How we use fastlane at Wantedly JIRO NAGASHIMAʗ@hedjirog

  2. Jiro Nagashima @hedjirog wantedly.com/users/3153

  3. γΰτͰίίϩΦυϧ

  4. γΰτͰίίϩΦυϧ

  5. γΰτͰίίϩΦυϧ

  6. γΰτͰίίϩΦυϧ 2 Apps

  7. γΰτͰίίϩΦυϧ 2 Apps 1 Project (Targets)

  8. γΰτͰίίϩΦυϧ • It's a lot of trouble… • Beta Distribution

    • Submitting to the App Store • Integration Tests 2 Apps (Targets)
  9. γΰτͰίίϩΦυϧ

  10. γΰτͰίίϩΦυϧ • Use fastlane to 1. Distribute beta buils 2.

    Submit apps to the App Store 3. Take screenshots fastlane
  11. γΰτͰίίϩΦυϧ 1. Beta Distribution

  12. Build Distribution Download Import

  13. Build Distribution Download Import

  14. Workflow

  15. Workflow Push

  16. γΰτͰίίϩΦυϧ • Tools • Fabric (Crashlytics Beta) • fastlane •

    CircleCI Beta Distribution
  17. γΰτͰίίϩΦυϧ • Tools • Fabric (Crashlytics Beta) • fastlane •

    CircleCI Beta Distribution
  18. γΰτͰίίϩΦυϧ Beta Distribution fastlane / Fastfile lane :beta do #

    Import certificates cert_dir = "./fastlane/certificates" import_certificates( cert_paths: [ File.join(cert_dir, "apple.cer") ], key_paths: [ File.join(cert_dir, "development.p12"), File.join(cert_dir, "distribution.p12") ] ) # Download provisioning profiles sigh( app_identifier: "com.wantedly.app-qa", adhoc: true ) # Build ipa( scheme: "app", configuration: "QA" ) # Push to Crashlytics crashlytics( crashlytics_path: "./Pods/Fabric/Crashlytics.framework", groups: "Developers" ) end Build Distribution Download Import
  19. γΰτͰίίϩΦυϧ Beta Distribution fastlane / Fastfile lane :beta do #

    Import certificates cert_dir = "./fastlane/certificates" import_certificates( cert_paths: [ File.join(cert_dir, "apple.cer") ], key_paths: [ File.join(cert_dir, "development.p12"), File.join(cert_dir, "distribution.p12") ] ) # Download provisioning profiles sigh( app_identifier: "com.wantedly.app-qa", adhoc: true ) # Build ipa( scheme: "app", configuration: "QA" ) # Push to Crashlytics crashlytics( crashlytics_path: "./Pods/Fabric/Crashlytics.framework", groups: "Developers" ) end Build Distribution Download Import
  20. γΰτͰίίϩΦυϧ Beta Distribution fastlane / Fastfile lane :beta do #

    Import certificates cert_dir = "./fastlane/certificates" import_certificates( cert_paths: [ File.join(cert_dir, "apple.cer") ], key_paths: [ File.join(cert_dir, "development.p12"), File.join(cert_dir, "distribution.p12") ] ) # Download provisioning profiles sigh( app_identifier: "com.wantedly.app-qa", adhoc: true ) # Build ipa( scheme: "app", configuration: "QA" ) # Push to Crashlytics crashlytics( crashlytics_path: "./Pods/Fabric/Crashlytics.framework", groups: "Developers" ) end Build Distribution Download Import
  21. γΰτͰίίϩΦυϧ Beta Distribution fastlane / Fastfile lane :beta do #

    Import certificates cert_dir = "./fastlane/certificates" import_certificates( cert_paths: [ File.join(cert_dir, "apple.cer") ], key_paths: [ File.join(cert_dir, "development.p12"), File.join(cert_dir, "distribution.p12") ] ) # Download provisioning profiles sigh( app_identifier: "com.wantedly.app-qa", adhoc: true ) # Build ipa( scheme: "app", configuration: "QA" ) # Push to Crashlytics crashlytics( crashlytics_path: "./Pods/Fabric/Crashlytics.framework", groups: "Developers" ) end Build Distribution Download Import
  22. γΰτͰίίϩΦυϧ Beta Distribution fastlane / Fastfile lane :beta do #

    Import certificates cert_dir = "./fastlane/certificates" import_certificates( cert_paths: [ File.join(cert_dir, "apple.cer") ], key_paths: [ File.join(cert_dir, "development.p12"), File.join(cert_dir, "distribution.p12") ] ) # Download provisioning profiles sigh( app_identifier: "com.wantedly.app-qa", adhoc: true ) # Build ipa( scheme: "app", configuration: "QA" ) # Push to Crashlytics crashlytics( crashlytics_path: "./Pods/Fabric/Crashlytics.framework", groups: "Developers" ) end Build Distribution Download Import
  23. γΰτͰίίϩΦυϧ Beta Distribution fastlane / Fastfile - Built-in Action lane

    :beta do # Import certificates cert_dir = "./fastlane/certificates" import_certificates( cert_paths: [ File.join(cert_dir, "apple.cer") ], key_paths: [ File.join(cert_dir, "development.p12"), File.join(cert_dir, "distribution.p12") ] ) # Download provisioning profiles sigh( app_identifier: "com.wantedly.app-qa", adhoc: true ) # Build ipa( scheme: "app", configuration: "QA" ) # Push to Crashlytics crashlytics( crashlytics_path: "./Pods/Fabric/Crashlytics.framework", groups: "Developers" ) end Build Distribution Download Import Action Action Action
  24. γΰτͰίίϩΦυϧ Beta Distribution fastlane / Fastfile - Custom Action lane

    :beta do # Import certificates cert_dir = "./fastlane/certificates" import_certificates( cert_paths: [ File.join(cert_dir, "apple.cer") ], key_paths: [ File.join(cert_dir, "development.p12"), File.join(cert_dir, "distribution.p12") ] ) # Download provisioning profiles sigh( app_identifier: "com.wantedly.app-qa", adhoc: true ) # Build ipa( scheme: "app", configuration: "QA" ) # Push to Crashlytics crashlytics( crashlytics_path: "./Pods/Fabric/Crashlytics.framework", groups: "Developers" ) end Build Distribution Download Import Custom Action
  25. γΰτͰίίϩΦυϧ Beta Distribution fastlane / Fastfile - Custom Action class

    ImportCertificatesAction < Action def self.run(params) cert_paths = params[:cert_paths] key_paths = params[:key_paths] keychain = "ios-build.keychain" password = "ios-build" timeout_seconds = 3600 begin sh "security create-keychain -p #{password} #{keychain}" sh "security default-keychain -s #{keychain}" sh "security list-keychains -s #{keychain}" sh "security unlock-keychain -p #{password} #{keychain}" sh "security set-keychain-settings -t #{timeout_seconds} -l #{keychain}" cert_paths.each do |cert_path| sh "security import #{cert_path} -k #{keychain} -T /usr/bin/codesign" end key_paths.each do |key_path| # Don't use `sh` so as not to output a password. `security import #{key_path} -k #{keychain} -P #{ENV['P12_PASSWORD']} -T /usr/bin/codesign` raise "Password is not correct" unless $?.to_i == 0 end Helper.log.info 'Successfully import certificates .'.green rescue => ex Helper.log.error 'Failed to import certificates'.red raise ex end end …
  26. γΰτͰίίϩΦυϧ • Tools • Fabric (Crashlytics Beta) • fastlane •

    CircleCI Beta Distribution
  27. γΰτͰίίϩΦυϧ Beta Distribution CircleCI / circle.yml deployment: beta: branch: master

    commands: - bundle exec fastlane beta_app1 - bundle exec fastlane beta_app2 • Execute workflows with fastlane
  28. γΰτͰίίϩΦυϧ Beta Distribution CircleCI / circle.yml deployment: beta: branch: master

    commands: - bundle exec fastlane beta_app1 - bundle exec fastlane beta_app2 • Execute workflows with fastlane
  29. γΰτͰίίϩΦυϧ 2. Submitting Apps

  30. γΰτͰίίϩΦυϧ Submitting Apps Fastfile lane :deploy do ensure_git_status_clean increment_build_number commit_version_bump

    schemes = ["app1", "app2"] schemes.each do |scheme| ipa( scheme: scheme, configuration: "Release" ) deliver( deliver_file_path: "./fastlane/#{scheme}" ) end end
  31. γΰτͰίίϩΦυϧ Submitting Apps Fastfile lane :deploy do ensure_git_status_clean increment_build_number commit_version_bump

    schemes = ["app1", "app2"] schemes.each do |scheme| ipa( scheme: scheme, configuration: "Release" ) deliver( deliver_file_path: "./fastlane/#{scheme}" ) end end • Specify Deliverfile for each app
  32. γΰτͰίίϩΦυϧ Submitting Apps Contents of Directories $ tree fastlane fastlane

    ├── Fastfile ├── app1 │ ├── Deliverfile │ … └── app2 ├── Deliverfile …
  33. γΰτͰίίϩΦυϧ Submitting Apps Contents of Directories $ tree fastlane fastlane

    ├── Fastfile ├── app1 │ ├── Deliverfile │ … └── app2 ├── Deliverfile … Multiple Deliverfiles
  34. γΰτͰίίϩΦυϧ Submitting Apps Contents of Directories $ tree fastlane fastlane

    ├── Fastfile └── app1 ├── Deliverfile └── metadata └── ja-JP ├── description.txt ├── keywords.txt ├── privacy_url.txt ├── software_url.txt ├── support_url.txt ├── title.txt └── version_whats_new.txt
  35. γΰτͰίίϩΦυϧ Submitting Apps Commands $ bundle exec fastlane deploy •

    That’s all!
  36. γΰτͰίίϩΦυϧ 3. Taking Screenshots

  37. None
  38. None
  39. γΰτͰίίϩΦυϧ Taking Screenshots iPhone 5 iPhone 6 iPhone 6 Plus

    iPad Air 2 Apps
  40. γΰτͰίίϩΦυϧ Taking Screenshots Fastfile lane :snapshot do schemes = ["app1",

    "app2"] schemes.each do |scheme| snapshot( snapshot_file_path: "./fastlane/#{scheme}" ) end end
  41. γΰτͰίίϩΦυϧ Taking Screenshots Fastfile lane :snapshot do schemes = ["app1",

    "app2"] schemes.each do |scheme| snapshot( snapshot_file_path: "./fastlane/#{scheme}" ) end end • Specify Snapfile for each app
  42. γΰτͰίίϩΦυϧ Taking Screenshots Contents of Directories $ tree fastlane fastlane

    ├── Fastfile ├── app1 │ ├── Snapfile │ … └── app2 ├── Snapfile …
  43. γΰτͰίίϩΦυϧ Taking Screenshots Contents of Directories $ tree fastlane fastlane

    ├── Fastfile ├── app1 │ ├── Snapfile │ … └── app2 ├── Snapfile … Multiple Snapfile
  44. γΰτͰίίϩΦυϧ Taking Screenshots Contents of Directories $ tree fastlane fastlane

    ├── Fastfile └── app1 ├── Snapfile └── js ├── helpers │ └── capture.js ├── screens │ ├── activitiesScreen.js │ ├── featureScreen.js │ ├── messagesScreen.js │ ├── profileScreen.js │ ├── projectScreen.js │ ├── projectsScreen.js │ ├── screen.js │ ├── settingsScreen.js │ └── welcomeScreen.js ├── screens.js └── snapshot.js
  45. γΰτͰίίϩΦυϧ Taking Screenshots Commands $ bundle exec fastlane snapshot •

    That’s all!
  46. γΰτͰίίϩΦυϧ • Use fastlane to 1. Distribute beta buils 2.

    Submit apps to the App Store 3. Take screenshots
  47. None
  48. None
  49. iOS, Android, Rails Engineer WE’RE HIRING!!!