module Fastlane module Actions module SharedValues end class SlackAction def self.git_author s = `git log --name-status HEAD^..HEAD` s = s.match(/Author:.*<(.*)>/)[1] return s if s.to_s.length > 0 return nil rescue return nil end def self.last_git_commit s = `git log -1 --pretty=%B`.strip return s if s.to_s.length > 0 nil end def self.run(params) options = { message: '', success: true, channel: nil, payload: {} }.merge(params.first || {}) require 'slack-notifier' color = (options[:success] ? 'good' : 'danger') options[:message] = options[:message].to_s options[:message] = Slack::Notifier::LinkFormatter.format(options[:message]) url = ENV['SLACK_URL'] unless url Helper.log.fatal "Please add 'ENV[\"SLACK_URL\"] = \"https://hooks.slack.com/services/...\"' to your Fastfile's `before_all` section.".red raise 'No SLACK_URL given.'.red end notifier = Slack::Notifier.new url notifier.username = 'fastlane' if options[:channel].to_s.length > 0 notifier.channel = options[:channel] notifier.channel = ('#' + notifier.channel) unless ['#', '@'].include?(notifier.channel[0]) # send message to channel by default end should_add_payload = ->(payload_name) { options[:default_payloads].nil? || options[:default_payloads].include?(payload_name) } slack_attachment = { fallback: options[:message], text: options[:message], color: color, fields: [] } # custom user payloads slack_attachment[:fields] += options[:payload].map do |k, v| { title: k.to_s, value: v.to_s, short: false } end # lane if should_add_payload[:lane] slack_attachment[:fields] << { title: 'Lane', value: Actions.lane_context[Actions::SharedValues::LANE_NAME], short: true } end # test_result if should_add_payload[:test_result] slack_attachment[:fields] << { title: 'Test Result', value: (options[:success] ? 'Success' : 'Error'), short: true } end # git branch if Actions.git_branch && should_add_payload[:git_branch] slack_attachment[:fields] << { title: 'Git Branch', value: Actions.git_branch, short: true } end # git_author if git_author && should_add_payload[:git_author] if ENV['FASTLANE_SLACK_HIDE_AUTHOR_ON_SUCCESS'] && options[:success] # We only show the git author if the build failed else slack_attachment[:fields] << { title: 'Git Author', value: git_author, short: true } end end # last_git_commit if last_git_commit && should_add_payload[:last_git_commit] slack_attachment[:fields] << { title: 'Git Commit', value: last_git_commit, short: false } end result = notifier.ping '', icon_url: 'https://s3-eu-west-1.amazonaws.com/fastlane.tools/fastlane.png', attachments: [slack_attachment] unless result.code.to_i == 200 Helper.log.debug result raise 'Error pushing Slack message, maybe the integration has no permission to post on this channel? Try removing the channel parameter in your Fastfile.'.red else Helper.log.info 'Successfully sent Slack notification'.green end end end end end