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

Commit

Permalink
Merge pull request #13 from alphagov/slack-message-integration
Browse files Browse the repository at this point in the history
Slack message implementation
  • Loading branch information
PeterHattyar authored Mar 6, 2024
2 parents 94e3684 + ed8912e commit 925863c
Show file tree
Hide file tree
Showing 5 changed files with 52 additions and 14 deletions.
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

0 comments on commit 925863c

Please sign in to comment.