Skip to content

Commit ef38182

Browse files
Merge pull request #60 from RodrigoMNardi/feature/github/cancelled_info
Detailed execution info
2 parents f4257d6 + 51e3551 commit ef38182

17 files changed

+330
-25
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
# SPDX-License-Identifier: BSD-2-Clause
2+
#
3+
# 20240408141736_add_check_suite_cancelled_ref.rb
4+
# Part of NetDEF CI System
5+
#
6+
# Copyright (c) 2024 by
7+
# Network Device Education Foundation, Inc. ("NetDEF")
8+
#
9+
# frozen_string_literal: true
10+
11+
class AddCheckSuiteCancelledRef < ActiveRecord::Migration[6.0]
12+
def change
13+
add_column :check_suites, :cancelled_by_id, :bigint
14+
add_index :check_suites, :cancelled_by_id
15+
add_foreign_key :check_suites, :stages, column: :cancelled_by_id
16+
end
17+
end
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
# SPDX-License-Identifier: BSD-2-Clause
2+
#
3+
# 20240408152636_add_check_suite_cancelled_in_stage.rb
4+
# Part of NetDEF CI System
5+
#
6+
# Copyright (c) 2024 by
7+
# Network Device Education Foundation, Inc. ("NetDEF")
8+
#
9+
# frozen_string_literal: true
10+
11+
class AddCheckSuiteCancelledInStage < ActiveRecord::Migration[6.0]
12+
def change
13+
add_reference :stages, :cancelled_at_stage, foreign_key: { to_table: :check_suites }
14+
end
15+
end
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
# SPDX-License-Identifier: BSD-2-Clause
2+
#
3+
# 20240417094603_change_check_suite_cancelled_by_id.rb
4+
# Part of NetDEF CI System
5+
#
6+
# Copyright (c) 2024 by
7+
# Network Device Education Foundation, Inc. ("NetDEF")
8+
#
9+
# frozen_string_literal: true
10+
11+
class ChangeCheckSuiteCancelledById < ActiveRecord::Migration[6.0]
12+
def change
13+
change_table :check_suites do |t|
14+
t.references :cancelled_previous_check_suite, foreign_key: { to_table: :check_suites }
15+
end
16+
end
17+
end
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
# SPDX-License-Identifier: BSD-2-Clause
2+
#
3+
# 20240417102854_remove_check_suite_columns.rb
4+
# Part of NetDEF CI System
5+
#
6+
# Copyright (c) 2024 by
7+
# Network Device Education Foundation, Inc. ("NetDEF")
8+
#
9+
# frozen_string_literal: true
10+
11+
class RemoveCheckSuiteColumns < ActiveRecord::Migration[6.0]
12+
def change
13+
if ActiveRecord::Base.connection.column_exists?(:check_suites, :cancelled_by_id)
14+
remove_column :check_suites, :cancelled_by_id
15+
end
16+
17+
remove_column :check_suites, :id_id if ActiveRecord::Base.connection.column_exists?(:check_suites, :id_id)
18+
end
19+
end
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
# SPDX-License-Identifier: BSD-2-Clause
2+
#
3+
# 202404130601_change_check_suite_stopped_in_stage.rb
4+
# Part of NetDEF CI System
5+
#
6+
# Copyright (c) 2024 by
7+
# Network Device Education Foundation, Inc. ("NetDEF")
8+
#
9+
# frozen_string_literal: true
10+
11+
class ChangeCheckSuiteStoppedInStage < ActiveRecord::Migration[6.0]
12+
def change
13+
if ActiveRecord::Base.connection.column_exists?(:stages, :cancelled_at_stage_id)
14+
remove_column :stages, :cancelled_at_stage_id
15+
end
16+
17+
if ActiveRecord::Base.connection.column_exists?(:check_suites, :cancelled_in_stage_id)
18+
remove_column :check_suites, :cancelled_in_stage_id
19+
end
20+
21+
if ActiveRecord::Base.connection.column_exists?(:check_suites, :cancelled_previous_check_suite_id)
22+
remove_column :check_suites, :cancelled_previous_check_suite_id
23+
end
24+
25+
change_table :check_suites do |t|
26+
t.references :stopped_in_stage, foreign_key: { to_table: :stages }
27+
t.references :cancelled_previous_check_suite, foreign_key: { to_table: :check_suites }
28+
end
29+
end
30+
end

db/schema.rb

+7-1
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
#
1111
# It's strongly recommended that you check this file into your version control system.
1212

13-
ActiveRecord::Schema[7.0].define(version: 2024_03_27_112035) do
13+
ActiveRecord::Schema[7.0].define(version: 2024_04_17_130601) do
1414
# These are extensions that must be enabled in order to support this database
1515
enable_extension "plpgsql"
1616

@@ -58,8 +58,12 @@
5858
t.integer "retry", default: 0
5959
t.boolean "sync", default: false
6060
t.bigint "github_user_id"
61+
t.bigint "stopped_in_stage_id"
62+
t.bigint "cancelled_previous_check_suite_id"
63+
t.index ["cancelled_previous_check_suite_id"], name: "index_check_suites_on_cancelled_previous_check_suite_id"
6164
t.index ["github_user_id"], name: "index_check_suites_on_github_user_id"
6265
t.index ["pull_request_id"], name: "index_check_suites_on_pull_request_id"
66+
t.index ["stopped_in_stage_id"], name: "index_check_suites_on_stopped_in_stage_id"
6367
end
6468

6569
create_table "ci_jobs", force: :cascade do |t|
@@ -159,8 +163,10 @@
159163

160164
add_foreign_key "audit_retries", "check_suites"
161165
add_foreign_key "audit_retries", "github_users"
166+
add_foreign_key "check_suites", "check_suites", column: "cancelled_previous_check_suite_id"
162167
add_foreign_key "check_suites", "github_users"
163168
add_foreign_key "check_suites", "pull_requests"
169+
add_foreign_key "check_suites", "stages", column: "stopped_in_stage_id"
164170
add_foreign_key "ci_jobs", "check_suites"
165171
add_foreign_key "ci_jobs", "stages"
166172
add_foreign_key "plans", "check_suites"

lib/github/build_plan.rb

+3
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,8 @@ def cancel_previous_ci_jobs
120120
ci_job.cancelled(@github_check)
121121
end
122122

123+
@last_check_suite.update(stopped_in_stage: @last_check_suite.stages.where(status: :in_progress).last)
124+
123125
@last_check_suite.stages.where(status: %w[queued in_progress]).each do |stage|
124126
stage.cancelled(@github_check)
125127
end
@@ -169,6 +171,7 @@ def ci_jobs
169171
end
170172

171173
def stop_execution_message
174+
@check_suite.update(cancelled_previous_check_suite_id: @last_check_suite.id)
172175
BambooCi::StopPlan.comment(@last_check_suite, @check_suite)
173176
end
174177

lib/github/plan_execution/finished.rb

+1-8
Original file line numberDiff line numberDiff line change
@@ -118,19 +118,12 @@ def build_summary(ci_job)
118118
end
119119

120120
def finished_execution?(check_suite)
121-
return false unless current_execution?(check_suite)
121+
return false unless check_suite.pull_request.current_execution?(check_suite)
122122
return false unless check_suite.finished?
123123

124124
SlackBot.instance.execution_finished_notification(check_suite)
125125
end
126126

127-
def current_execution?(check_suite)
128-
pull_request = check_suite.pull_request
129-
last_check_suite = pull_request.check_suites.reload.all.order(:created_at).last
130-
131-
check_suite.id == last_check_suite.id
132-
end
133-
134127
def slack_notify_success(job)
135128
SlackBot.instance.notify_success(job)
136129
end

lib/github/re_run/base.rb

+25-4
Original file line numberDiff line numberDiff line change
@@ -46,12 +46,31 @@ def stop_previous_execution
4646
logger(Logger::INFO, 'Stopping previous execution')
4747
logger(Logger::INFO, fetch_run_ci_by_pr.inspect)
4848

49+
@last_check_suite = nil
50+
4951
fetch_run_ci_by_pr.each do |check_suite|
50-
check_suite.ci_jobs.not_skipped.each do |ci_job|
51-
ci_job.cancelled(@github_check)
52-
end
52+
stop_and_update_previous_execution(check_suite)
53+
end
54+
end
55+
56+
def stop_and_update_previous_execution(check_suite)
57+
if @last_check_suite.nil?
58+
check_suite.update(stopped_in_stage: check_suite.stages.where(status: :in_progress).last)
59+
else
60+
check_suite.update(cancelled_previous_check_suite_id: @last_check_suite.id)
61+
@last_check_suite.update(stopped_in_stage: check_suite.stages.where(status: :in_progress).last)
62+
end
5363

54-
BambooCi::StopPlan.build(check_suite.bamboo_ci_ref)
64+
cancel_previous_jobs(check_suite)
65+
66+
@last_check_suite = check_suite
67+
68+
BambooCi::StopPlan.build(check_suite.bamboo_ci_ref)
69+
end
70+
71+
def cancel_previous_jobs(check_suite)
72+
check_suite.ci_jobs.not_skipped.each do |ci_job|
73+
ci_job.cancelled(@github_check)
5574
end
5675
end
5776

@@ -106,6 +125,8 @@ def ci_jobs(check_suite, bamboo_plan)
106125

107126
check_suite.update(bamboo_ci_ref: bamboo_plan.bamboo_reference, re_run: true)
108127

128+
check_suite.update(cancelled_previous_check_suite: @last_check_suite)
129+
109130
create_ci_jobs(bamboo_plan, check_suite)
110131

111132
CheckSuite.where(commit_sha_ref: check_suite.commit_sha_ref).each do |cs|

lib/models/check_suite.rb

+4
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,10 @@ class CheckSuite < ActiveRecord::Base
1515
validates :commit_sha_ref, presence: true
1616

1717
belongs_to :pull_request
18+
19+
belongs_to :stopped_in_stage, class_name: 'Stage', optional: true
20+
belongs_to :cancelled_previous_check_suite, class_name: 'CheckSuite', optional: true
21+
1822
has_many :ci_jobs, dependent: :delete_all
1923
has_many :stages, dependent: :delete_all
2024
has_many :audit_retries, dependent: :delete_all

reports/build_stage_failed.rb

+32
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
# SPDX-License-Identifier: BSD-2-Clause
2+
#
3+
# build_stage_failed.rb
4+
# Part of NetDEF CI System
5+
#
6+
# Copyright (c) 2024 by
7+
# Network Device Education Foundation, Inc. ("NetDEF")
8+
#
9+
# frozen_string_literal: true
10+
11+
require_relative '../database_loader'
12+
require_relative '../lib/helpers/configuration'
13+
14+
begin_date = ARGV[0]
15+
end_date = ARGV[1]
16+
author = ARGV[2]
17+
18+
check_suites = []
19+
20+
Stage
21+
.joins(:jobs, :check_suite)
22+
.where(stages: { name: 'Build' })
23+
.where(jobs: { created_at: [begin_date..end_date], status: %i[failure skipped] })
24+
.where(check_suites: { author: author })
25+
.each do |stage|
26+
message = "Check Suite ID: https://ci1.netdef.org/browse/#{stage.check_suite.bamboo_ci_ref}"
27+
check_suites << message unless check_suites.include? message
28+
end
29+
30+
check_suites.each do |line|
31+
puts line
32+
end

reports/chained_rerun_report.rb

+73
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
# SPDX-License-Identifier: BSD-2-Clause
2+
#
3+
# rerun_report.rb
4+
# Part of NetDEF CI System
5+
#
6+
# Copyright (c) 2024 by
7+
# Network Device Education Foundation, Inc. ("NetDEF")
8+
#
9+
# frozen_string_literal: true
10+
11+
require 'json'
12+
require 'csv'
13+
require_relative '../database_loader'
14+
15+
module Reports
16+
class ChainedRerun
17+
def report(begin_date, end_date)
18+
@result = {}
19+
@offenders = []
20+
21+
CheckSuite
22+
.left_joins(:audit_retries)
23+
.where.not(check_suites: { cancelled_previous_check_suite_id: nil })
24+
.where(created_at: [begin_date..end_date])
25+
.order(:created_at)
26+
.group_by(&:pull_request_id)
27+
.each_pair do |pull_request_id, chained_check_suites|
28+
generate_result(pull_request_id, chained_check_suites)
29+
end
30+
end
31+
32+
private
33+
34+
def generate_result(pull_request_id, chained_check_suites)
35+
@local_chained = {}
36+
@chain = 1
37+
38+
create_paths(chained_check_suites)
39+
40+
puts "Pull Request ID: #{pull_request_id}"
41+
@local_chained.each_pair do |_c, path|
42+
puts path.reverse.join(' -> ')
43+
end
44+
end
45+
46+
def create_paths(chained_check_suites)
47+
chained_check_suites.reverse_each do |check_suite|
48+
initialize_or_add(check_suite)
49+
50+
if chained_check_suites.map(&:id).include?(check_suite.cancelled_previous_check_suite_id)
51+
@local_chained[@chain] << check_suite.cancelled_previous_check_suite_id
52+
else
53+
@local_chained[@chain] << CheckSuite.find(check_suite.cancelled_previous_check_suite_id).id
54+
@chain += 1
55+
end
56+
end
57+
end
58+
59+
def initialize_or_add(check_suite)
60+
@local_chained[@chain] ||= []
61+
@local_chained[@chain] << check_suite.id unless @local_chained[@chain].include? check_suite.id
62+
end
63+
end
64+
end
65+
66+
return unless __FILE__ == $PROGRAM_NAME
67+
68+
ActiveRecord::Base.logger = Logger.new('/dev/null')
69+
70+
begin_date = ARGV[0]
71+
end_date = ARGV[1]
72+
73+
Reports::ChainedRerun.new.report(begin_date, end_date)

reports/github_user_usage.rb

+42
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
# SPDX-License-Identifier: BSD-2-Clause
2+
#
3+
# github_user_usage.rb
4+
# Part of NetDEF CI System
5+
#
6+
# Copyright (c) 2024 by
7+
# Network Device Education Foundation, Inc. ("NetDEF")
8+
#
9+
# frozen_string_literal: true
10+
11+
require_relative '../database_loader'
12+
13+
ActiveRecord::Base.logger = Logger.new('/dev/null')
14+
15+
user = GithubUser.find_by_github_login(ARGV[0])
16+
17+
if user.pull_requests.empty?
18+
puts "No pull requests found for user: #{user.github_login}"
19+
else
20+
puts "Pull Requests for user: #{user.github_login}"
21+
user.pull_requests.each do |pr|
22+
puts "Pull Request: https://github.com/FRRouting/frr/pull/#{pr.github_pr_id}"
23+
end
24+
end
25+
26+
if user.check_suites.empty?
27+
puts "No check suites found for user: #{user.github_login}"
28+
else
29+
puts "Check Suites for user: #{user.github_login}"
30+
user.check_suites.each do |cs|
31+
puts "Check Suite: https://ci1.netdef.org/browse/#{cs.bamboo_ci_ref}"
32+
end
33+
end
34+
35+
if user.audit_retries.empty?
36+
puts "No audit retries found for user: #{user.github_login}"
37+
else
38+
puts "Audit Retries for user: #{user.github_login}"
39+
user.audit_retries.each do |ar|
40+
puts "Audit Retry: #{ar.retry_type} at #{ar.created_at}"
41+
end
42+
end

0 commit comments

Comments
 (0)