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

Automate All the Things

Avatar for yhkaplan yhkaplan
February 21, 2019

Automate All the Things

Avatar for yhkaplan

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