Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Automate All the Things

yhkaplan
February 21, 2019

Automate All the Things

yhkaplan

February 21, 2019
Tweet

More Decks by yhkaplan

Other Decks in Programming

Transcript

  1. SELF INTRO ▸ Joshua Kaplan ▸ minne @ GMO Pepabo

    ▸ Danger-Swift contributer ▸ Likes 3
  2. 10

  3. 14

  4. # storyboardʹͣΕ͍ͯΔϏϡʔ΍੍໿ͷෆඋ͕ͳ͍͔ parsed_diff.each do |changed_file| next unless changed_file.file.match(/.*\.(storyboard)$/) changed_file.changed_lines.each do

    |changed_line| content = changed_line.content has_misplaced_view = content.include? 'misplaced="YES"' has_ambiguous_view = content.include? 'ambiguous="YES"' file = changed_file.file line_number = changed_line.number if has_misplaced_view fail('ͣΕ͍ͯΔϏϡʔ͕͋ΔͷͰɺUpdate FramesΛ࣮ߦ͍ͯͩ͘͠͞', file: file, line: line_number) end if has_ambiguous_view fail('੍໿͕ෆे෼ͳՕॴ͕͋ΔͷͰɺ௚͍ͯͩ͘͠͞', file: file, line: line_number) end end end 16
  5. 18

  6. # λΠϙΛݕ஌͢Δ added_and_modified_files = git.added_files + git.modified_files added_and_modified_files.each do |file_path|

    next unless file_path =~ /\.swift$/ stdout, status = Open3.capture2("npx", "cspell", file_path) next if status.success? stdout.split("\n").each do |line| next unless matches = /\w+\.swift:(\d+).*-\sUnknown\sword\s\((\w+)\)/.match(line) line_number = matches[1].to_i word = matches[2] warning = "λΠϙ͔΋ʁ #{word}" warn(warning, file: file_path, line: line_number) end end 19
  7. # ϨϏϡϫʔࢦఆʢίϝϯτࢦఆͷͨΊʹ͜ΕΛҰ൪্ʹॻ͘ඞཁ͋Γʣ reviewers = ["user1", "user2", "user3"].reject { |reviewer| reviewer

    == github.pr_author } repo_name = github.pr_json["head"]["repo"]["full_name"] pr_number = github.pr_json["number"] number_of_comments = github.api.issue_comments(repo_name, pr_number).size if number_of_comments.zero? reviewers = reviewers.sample(2) github.api.request_pull_request_review( repo_name, pr_number, {}, "reviewers": reviewers ) end 22
  8. 24

  9. 27

  10. prefer_gregorian_calendar: name: "Gregorian Calendar" regex: "Calendar\\.current" message: "Please use `Calendar(identifier:

    .gregorian)` to avoid Japanese calendar-related bugs" severity: error https_only: name: "HTTPS Only" match_kinds: - string # ίϝϯτͳͲΛແࢹͯ͠ɺจࣈྻͷΈΛΈΔ regex: "http:" message: "Please use HTTPS due to security policy" severity: error 31
  11. lane :release do capture_screenshots # generate new screenshots for the

    App Store sync_code_signing(type: "appstore") # see code signing guide for more information build_app(scheme: "MyApp") upload_to_app_store # upload your app to App Store Connect slack(message: "Successfully uploaded a new App Store build") end 33
  12. // App let app = XCUIApplication() setupSnapshot(app) app.launch() # Fastlane

    lane :screenshots do capture_screenshots frame_screenshots(white: true) upload_to_app_store end 35
  13. 37

  14. def get_dead_objc_code std_out, status = Open3.capture2("bundle", "exec", "fui", "--ignorexib", "--path",

    "minne/Classes") # fuiͷexitstatus͸ɺ࢖ΘΕ͍ͯͳ͍Ϋϥεͷ਺Ͱɺ # Bridging-Header͕ඞͣ౰ͨͬͯ͠·͏ͷͰɺ # 2ͭҎ্ͷ݁Ռ͕͋Δ৔߹௨஌͍ͯ͠Δɻ return status.exitstatus >= 2 ? std_out : "" end def get_dead_swift_code std_out, _ = Open3.capture2("periphery", "scan") r = /minne.*(Struct|Class) .*is unused$/ filtered_results_array = std_out.to_enum(:scan,r).map {$&}.flatten return filtered_results_array.join("\n") end # Main dead_objc_result = get_dead_objc_code dead_swift_result = get_dead_swift_code mention = "<!subteam^S1DDSFQSF|minne-ios>" message = "#{mention}, Unused files exist:\n" notify_slack(message + dead_objc_result) unless dead_objc_result == "" notify_slack(message + dead_swift_result) unless dead_swift_result == "" 38
  15. 40

  16. 41