class DeployChanges::Notifier

Attributes

deploy_job_build_number[R]
deploy_job_name[R]
git_repo_url[R]
new_tag_name[RW]
slack_bot_api_token[RW]
slack_channel[R]
tag_prefix[R]
validator[RW]

Public Class Methods

new() { |config| ... } click to toggle source
# File lib/deploy_changes/notifier.rb, line 35
def initialize
  self.validator = Validator.new(self)

  config = OpenStruct.new

  yield config if block_given?

  self.git_repo_url = config.git_repo_url || ENV["GIT_REPO_URL"]
  self.tag_prefix = config.tag_prefix || ENV["TAG_PREFIX"]

  self.deploy_job_build_number = config.deploy_job_build_number || ENV["DEPLOY_JOB_BUILD_NUMBER"]
  self.deploy_job_name = config.deploy_job_name || ENV["DEPLOY_JOB_NAME"]

  self.new_tag_name = tag_prefix + deploy_job_build_number

  self.slack_channel = config.slack_channel || ENV["SLACK_CHANNEL"]
  self.slack_bot_api_token = config.slack_bot_api_token || ENV["SLACK_BOT_API_TOKEN"]
  configure_slack
end

Public Instance Methods

git_repo_directory() click to toggle source
# File lib/deploy_changes/notifier.rb, line 65
def git_repo_directory
  @git_repo_directory ||= git_repo_url
                            .split('/')
                            .last
                            .gsub('.git', '')
end
send_deploy_changes_notification() click to toggle source
# File lib/deploy_changes/notifier.rb, line 55
def send_deploy_changes_notification
  cleanup_repo
  clone_repo
  send_slack_notification
rescue StandardError => e
  raise e
ensure
  cleanup_repo
end

Private Instance Methods

cleanup_repo() click to toggle source
# File lib/deploy_changes/notifier.rb, line 168
def cleanup_repo
  return true unless Dir.exist?(git_repo_directory)

  puts "Deleting '#{git_repo_directory}' folder"

  `rm -rf #{git_repo_directory}`
end
clone_repo() click to toggle source
# File lib/deploy_changes/notifier.rb, line 160
def clone_repo
  puts "Cloning from '#{git_repo_url}'"

  `git clone #{git_repo_url}`

  validator.validate_repo_cloned(git_repo_directory)
end
configure_slack() click to toggle source
# File lib/deploy_changes/notifier.rb, line 77
def configure_slack
  validator.validate_slack_api_token(ENV["SLACK_BOT_API_TOKEN"])

  Slack.configure do |config|
    config.token = ENV["SLACK_BOT_API_TOKEN"]
  end
end
deploy_changes_command() click to toggle source
# File lib/deploy_changes/notifier.rb, line 126
def deploy_changes_command
  validator.validate_new_tag(new_tag_name)

  puts "New tag name: #{new_tag_name}"

  "cd #{git_repo_directory} && git log  --pretty=oneline --no-merges --format=\"%s [%an]\" #{previous_tag_name}...#{new_tag_name}"
end
deploy_changes_command_output() click to toggle source
# File lib/deploy_changes/notifier.rb, line 122
def deploy_changes_command_output
  `#{deploy_changes_command}`
end
deploy_changes_list() click to toggle source
# File lib/deploy_changes/notifier.rb, line 113
def deploy_changes_list
  return [] if previous_tag_name.nil? || previous_tag_name.empty?

  deploy_changes_string = deploy_changes_command_output
  return [] unless validator.last_command_successful?

  deploy_changes_string.split("\n")
end
deploy_changes_message() click to toggle source
# File lib/deploy_changes/notifier.rb, line 95
def deploy_changes_message
  deploy_changes_array = deploy_changes_list

  message = "*#{deploy_job_name} \##{deploy_job_build_number} changes:*\n"

  message += if deploy_changes_array.empty?
               " - No changes"
             else
               deploy_changes_array
               .map { |commit_message| " - " + commit_message }
               .join("\n")
             end

  puts message

  message
end
deploy_job_build_number=(job_build_number) click to toggle source
# File lib/deploy_changes/notifier.rb, line 188
def deploy_job_build_number=(job_build_number)
  validator.validate_deploy_job_build_number(job_build_number)

  @deploy_job_build_number = job_build_number
end
deploy_job_name=(job_name) click to toggle source
# File lib/deploy_changes/notifier.rb, line 194
def deploy_job_name=(job_name)
  validator.validate_deploy_job_name(job_name)

  @deploy_job_name = job_name
end
git_repo_url=(repo_url) click to toggle source
# File lib/deploy_changes/notifier.rb, line 176
def git_repo_url=(repo_url)
  validator.validate_repo_url(repo_url)

  @git_repo_url = repo_url
end
previous_tag_from_tags_list(tags_list) click to toggle source
# File lib/deploy_changes/notifier.rb, line 154
def previous_tag_from_tags_list(tags_list)
  tags_list.each_with_index do |tag, index|
    return tags_list[index + 1] if tag == new_tag_name
  end
end
previous_tag_name() click to toggle source
# File lib/deploy_changes/notifier.rb, line 134
def previous_tag_name
  return @previous_tag_name if @previous_tag_name

  previous_tag = previous_tag_from_tags_list(tags_list)

  puts "Previous tag name: #{previous_tag}"
  @previous_tag_name = previous_tag
end
send_slack_notification() click to toggle source
# File lib/deploy_changes/notifier.rb, line 85
def send_slack_notification
  slack_client.auth_test

  slack_client.chat_postMessage(
    channel: slack_channel,
    text: deploy_changes_message,
    as_user: true
  )
end
slack_channel=(channel_name) click to toggle source
# File lib/deploy_changes/notifier.rb, line 200
def slack_channel=(channel_name)
  validator.validate_slack_channel_name(channel_name)

  @slack_channel = channel_name
end
slack_client() click to toggle source
# File lib/deploy_changes/notifier.rb, line 206
def slack_client
  @slack_client ||= Slack::Web::Client.new
end
tag_prefix=(prefix) click to toggle source
# File lib/deploy_changes/notifier.rb, line 182
def tag_prefix=(prefix)
  validator.validate_tag_prefix(prefix)

  @tag_prefix = prefix
end
tags_list() click to toggle source
# File lib/deploy_changes/notifier.rb, line 143
def tags_list
  tags = tags_list_command_output
  tags.split("\n")
    .reverse
    .map { |ref| ref.gsub("refs/tags/", "") }
end
tags_list_command_output() click to toggle source
# File lib/deploy_changes/notifier.rb, line 150
def tags_list_command_output
  `cd #{git_repo_directory} && git for-each-ref --sort=taggerdate --format="%(refname)" refs/tags/#{tag_prefix}*`
end