Skip to content
This repository has been archived by the owner on Apr 11, 2024. It is now read-only.

Slack message implementation #13

Merged
merged 3 commits into from
Mar 6, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 4 additions & 1 deletion .github/workflows/version_checker.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,10 @@ name: "Gem Version Checker"
on:
workflow_dispatch: {}
schedule:
- cron: '00 10 * * 1-5' # Runs at 10:00, Monday through Friday.
- cron: '00 13 * * 3' # Runs at 13:00, Every Wednesday.

env:
SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK }}

jobs:
gem-version-checker:
Expand Down
1 change: 1 addition & 0 deletions Gemfile
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ source "https://rubygems.org"

gem "octokit"
gem "rake"
gem "slack-poster"
gem "webmock"

group :development, :test do
Expand Down
3 changes: 3 additions & 0 deletions Gemfile.lock
Original file line number Diff line number Diff line change
Expand Up @@ -101,6 +101,8 @@ GEM
sawyer (0.9.2)
addressable (>= 2.3.5)
faraday (>= 0.17.3, < 3)
slack-poster (2.2.2)
faraday (>= 1.0.0)
tzinfo (2.0.6)
concurrent-ruby (~> 1.0)
unicode-display_width (2.5.0)
Expand All @@ -117,6 +119,7 @@ DEPENDENCIES
rake
rspec
rubocop-govuk
slack-poster
webmock

BUNDLED WITH
Expand Down
36 changes: 26 additions & 10 deletions lib/version_checker.rb
Original file line number Diff line number Diff line change
Expand Up @@ -4,29 +4,45 @@
require "net/http"
require "json"
require "octokit"
require "slack/poster"

class HttpError < RuntimeError
end

class VersionChecker
GEMS_API = URI("https://docs.publishing.service.gov.uk/gems.json")

def slack_options(team)
{
icon_emoji: ":gem:",
username: "Gem Release Bot",
channel: team.to_s,
}
end

def print_version_discrepancies
all_govuk_gems.group_by { |gem| gem["team"] }.each do |team, gems|
message = gems.filter_map { |gem|
repo_name = gem["app_name"]
rubygems_version = fetch_rubygems_version(repo_name)
if !rubygems_version.nil? &&
files_changed_since_tag(repo_name, "v#{rubygems_version}").any? { |path| path_built_into_gem?(path) }
" #{repo_name} has unreleased changes since v#{rubygems_version}"
end
}.join("\n")
message = message_builder(gems)

puts "team: #{team}\n#{message}"

puts team
puts message
poster = Slack::Poster.new(ENV["SLACK_WEBHOOK"], slack_options(team))
poster.send_message(message.to_s) unless message.empty?
end
end

def message_builder(gems)
gems.filter_map { |gem|
repo_name = gem["app_name"]
repo_url = gem["links"]["repo_url"]
rubygems_version = fetch_rubygems_version(repo_name)
if !rubygems_version.nil? &&
files_changed_since_tag(repo_name, "v#{rubygems_version}").any? { |path| path_built_into_gem?(path) }
"<#{repo_url}|#{repo_name}> has unreleased changes since v#{rubygems_version}"
end
}.join("\n")
end

def all_govuk_gems
res = Net::HTTP.get_response(GEMS_API)
if res.is_a?(Net::HTTPSuccess)
Expand Down
21 changes: 18 additions & 3 deletions spec/version_checker_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,12 @@
RSpec.describe VersionChecker do
subject(:version_checker) { described_class.new }

let(:webhook_url) { "https://slack/webhook" }

before do
ENV["SLACK_WEBHOOK"] = webhook_url
end

it "fetches version number of a gem from rubygems" do
stub_rubygems_call("6.0.1")

Expand All @@ -17,16 +23,17 @@
stub_rubygems_call("1.2.3")
stub_files_changed_since_tag(["README.md"])

expect { version_checker.print_version_discrepancies }.to output("#platform-security-reliability-team\n\n").to_stdout
expect { version_checker.print_version_discrepancies }.to output("team: #platform-security-reliability-team\n").to_stdout
end

it "detects when there are files changed since the last release that are built into the gem" do
stub_slack_poster_call_with_changes
stub_devdocs_call
stub_rubygems_call("1.2.2")
stub_files_changed_since_tag(["lib/foo.rb"])

expect { version_checker.print_version_discrepancies }.to output(
"#platform-security-reliability-team\n example has unreleased changes since v1.2.2\n",
"team: #platform-security-reliability-team\n<https://example.com|example> has unreleased changes since v1.2.2\n",
).to_stdout
end

Expand All @@ -45,8 +52,16 @@ def stub_rubygems_call(version)
end

def stub_devdocs_call
repo = [{ "app_name": "example", "team": "#platform-security-reliability-team" }]
repo = [{ "app_name": "example", "team": "#platform-security-reliability-team", "links": { "repo_url": "https://example.com" } }]
stub_request(:get, "https://docs.publishing.service.gov.uk/gems.json")
.to_return(status: 200, body: repo.to_json, headers: {})
end

def stub_slack_poster_call_with_changes
stub_request(:post, "https://slack/webhook")
.with(
body: { "payload" => "{\"icon_emoji\":\":gem:\",\"username\":\"Gem Release Bot\",\"channel\":\"#platform-security-reliability-team\",\"text\":\"<https://example.com|example> has unreleased changes since v1.2.2\"}" },
)
.to_return(status: 200)
end
end
Loading