shipit-engine 0.33.0 → 0.34.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +13 -2
- data/app/assets/stylesheets/_pages/_deploy.scss +0 -2
- data/app/controllers/shipit/api/ccmenu_controller.rb +1 -1
- data/app/controllers/shipit/api/deploys_controller.rb +2 -0
- data/app/controllers/shipit/api/rollbacks_controller.rb +2 -1
- data/app/controllers/shipit/api/stacks_controller.rb +1 -0
- data/app/controllers/shipit/deploys_controller.rb +1 -1
- data/app/controllers/shipit/stacks_controller.rb +2 -2
- data/app/controllers/shipit/tasks_controller.rb +2 -2
- data/app/controllers/shipit/webhooks_controller.rb +23 -4
- data/app/helpers/shipit/shipit_helper.rb +0 -1
- data/app/jobs/shipit/deliver_hook_job.rb +1 -1
- data/app/jobs/shipit/github_sync_job.rb +13 -9
- data/app/jobs/shipit/update_github_last_deployed_ref_job.rb +1 -1
- data/app/models/shipit/anonymous_user.rb +6 -2
- data/app/models/shipit/check_run.rb +36 -0
- data/app/models/shipit/commit.rb +20 -9
- data/app/models/shipit/commit_checks.rb +13 -13
- data/app/models/shipit/commit_deployment.rb +3 -3
- data/app/models/shipit/commit_deployment_status.rb +3 -3
- data/app/models/shipit/deploy.rb +16 -11
- data/app/models/shipit/deploy_spec/lerna_discovery.rb +12 -4
- data/app/models/shipit/duration.rb +2 -0
- data/app/models/shipit/hook.rb +26 -2
- data/app/models/shipit/merge_request.rb +9 -7
- data/app/models/shipit/pull_request.rb +1 -1
- data/app/models/shipit/release_status.rb +1 -1
- data/app/models/shipit/repository.rb +9 -3
- data/app/models/shipit/review_stack.rb +16 -2
- data/app/models/shipit/stack.rb +59 -25
- data/app/models/shipit/status/group.rb +1 -1
- data/app/models/shipit/task.rb +6 -2
- data/app/models/shipit/task_execution_strategy/default.rb +4 -5
- data/app/models/shipit/team.rb +4 -2
- data/app/models/shipit/user.rb +4 -0
- data/app/models/shipit/webhooks/handlers/pull_request/review_stack_adapter.rb +1 -1
- data/app/models/shipit/webhooks/handlers/push_handler.rb +4 -1
- data/app/serializers/shipit/merge_request_serializer.rb +1 -1
- data/app/validators/subset_validator.rb +1 -1
- data/app/views/layouts/merge_status.html.erb +1 -1
- data/app/views/shipit/stacks/_banners.html.erb +2 -1
- data/app/views/shipit/stacks/new.html.erb +1 -1
- data/config/secrets.development.example.yml +24 -0
- data/config/secrets.development.shopify.yml +20 -9
- data/db/migrate/20210325194053_remove_stacks_branch_default.rb +5 -0
- data/db/migrate/20210504200438_add_github_updated_at_to_check_runs.rb +5 -0
- data/lib/shipit.rb +39 -15
- data/lib/shipit/command.rb +7 -6
- data/lib/shipit/commands.rb +9 -2
- data/lib/shipit/engine.rb +2 -0
- data/lib/shipit/flock.rb +8 -1
- data/lib/shipit/github_app.rb +7 -5
- data/lib/shipit/octokit_iterator.rb +3 -3
- data/lib/shipit/simple_message_verifier.rb +2 -2
- data/lib/shipit/stack_commands.rb +28 -4
- data/lib/shipit/task_commands.rb +6 -0
- data/lib/shipit/version.rb +1 -1
- data/lib/snippets/publish-lerna-independent-packages +35 -34
- data/lib/snippets/publish-lerna-independent-packages-legacy +39 -0
- data/test/controllers/api/ccmenu_controller_test.rb +1 -1
- data/test/controllers/api/deploys_controller_test.rb +17 -0
- data/test/controllers/api/stacks_controller_test.rb +21 -7
- data/test/controllers/webhooks_controller_test.rb +26 -11
- data/test/dummy/app/assets/config/manifest.js +3 -0
- data/test/dummy/config/application.rb +1 -1
- data/test/dummy/config/database.yml +9 -0
- data/test/dummy/config/environments/development.rb +1 -1
- data/test/dummy/config/secrets_double_github_app.yml +79 -0
- data/test/dummy/db/schema.rb +5 -4
- data/test/dummy/db/seeds.rb +1 -0
- data/test/fixtures/payloads/check_suite_master.json +2 -30
- data/test/fixtures/payloads/push_master.json +1 -1
- data/test/fixtures/payloads/push_not_master.json +1 -1
- data/test/fixtures/shipit/commits.yml +2 -2
- data/test/fixtures/shipit/hooks.yml +1 -0
- data/test/fixtures/shipit/tasks.yml +1 -1
- data/test/helpers/json_helper.rb +5 -1
- data/test/jobs/github_sync_job_test.rb +2 -1
- data/test/models/commit_deployment_status_test.rb +3 -3
- data/test/models/commits_test.rb +2 -0
- data/test/models/deploy_spec_test.rb +7 -0
- data/test/models/deploys_test.rb +18 -0
- data/test/models/hook_test.rb +30 -1
- data/test/models/merge_request_test.rb +19 -4
- data/test/models/shipit/check_run_test.rb +124 -5
- data/test/models/shipit/review_stack_test.rb +38 -6
- data/test/models/shipit/stacks_test.rb +42 -4
- data/test/models/shipit/webhooks/handlers/pull_request/review_stack_adapter_test.rb +24 -0
- data/test/models/tasks_test.rb +22 -0
- data/test/test_helper.rb +15 -0
- data/test/unit/anonymous_user_serializer_test.rb +1 -1
- data/test/unit/command_test.rb +5 -0
- data/test/unit/commit_serializer_test.rb +1 -1
- data/test/unit/deploy_commands_test.rb +70 -14
- data/test/unit/deploy_serializer_test.rb +1 -1
- data/test/unit/github_app_test.rb +2 -3
- data/test/unit/github_apps_test.rb +416 -0
- data/test/unit/shipit_deployment_checks_test.rb +77 -0
- data/test/unit/shipit_test.rb +14 -0
- data/test/unit/user_serializer_test.rb +1 -1
- metadata +202 -191
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: e3fd7ab372e13432986f4bd927df32b97c0d4b969193035d9b34fbb0ce80630d
|
|
4
|
+
data.tar.gz: 5ac2897e8354b9fbae1f37ab192f2eca26cd4160169295a0ac6706e0b023affe
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: ba96ab58f4a67a0658f02bf7844c8a47bf65526bd4dc4d37560a4bab5a9606a12fde8204cbe4f8829c51578bbd815f99e73ca3e3b81559a9935f7c4e4c45da57
|
|
7
|
+
data.tar.gz: c20e5c8d2a9ff71c70e332760d46e1e9985624411828f39af00754de2dcf50beec0109b22fc48f8669811c2248f52781638a529f8bc5e5083dff41bc54d9266c
|
data/README.md
CHANGED
|
@@ -12,7 +12,7 @@ Shipit is compatible with just about anything that you can deploy using a script
|
|
|
12
12
|
|
|
13
13
|
This guide aims to help you [set up](#installation-and-setup), [use](#using-shipit), and [understand](#reference) Shipit.
|
|
14
14
|
|
|
15
|
-
*Shipit requires a database (MySQL, PostgreSQL or SQLite3), redis, and Ruby 2.
|
|
15
|
+
*Shipit requires a database (MySQL, PostgreSQL or SQLite3), redis, and Ruby 2.6 or superior.*
|
|
16
16
|
|
|
17
17
|
* * *
|
|
18
18
|
<h2 id="toc">Table of contents</h2>
|
|
@@ -270,7 +270,9 @@ deploy:
|
|
|
270
270
|
```
|
|
271
271
|
<br>
|
|
272
272
|
|
|
273
|
-
**<code>deploy.max_commits</code>** defines the maximum number of commits that should be shipped per
|
|
273
|
+
**<code>deploy.max_commits</code>** defines the maximum number of commits that should be shipped per deploy. Defaults to `8` if no value is provided.
|
|
274
|
+
|
|
275
|
+
To disable this limit, you can use use an explicit null value: `max_commits: null`. Continuous Delivery will then deploy any number of commits.
|
|
274
276
|
|
|
275
277
|
Human users will be warned that they are not respecting the recommendation, but allowed to continue.
|
|
276
278
|
However continuous delivery will respect this limit. If there is no deployable commits in this range, a human intervention will be required.
|
|
@@ -292,6 +294,15 @@ deploy:
|
|
|
292
294
|
interval: 5m
|
|
293
295
|
```
|
|
294
296
|
|
|
297
|
+
**<code>deploy.retries</code>** enables retries for a stack, and defines the maximum amount of times that Shipit will retry a deploy that finished with a `failed`, `error` or `timedout` status.
|
|
298
|
+
|
|
299
|
+
For example, this will retry a deploy twice if it fails.
|
|
300
|
+
|
|
301
|
+
```yaml
|
|
302
|
+
deploy:
|
|
303
|
+
retries: 2
|
|
304
|
+
```
|
|
305
|
+
|
|
295
306
|
**<code>rollback.override</code>** contains an array of the shell commands required to rollback the application to a previous state. Shipit will try to infer it from the repository structure, but you can change the default inference. This key defaults to `disabled` unless Capistrano is detected.
|
|
296
307
|
|
|
297
308
|
For example:
|
|
@@ -20,7 +20,7 @@ module Shipit
|
|
|
20
20
|
|
|
21
21
|
def show
|
|
22
22
|
latest_deploy = stack.deploys_and_rollbacks.last || NoDeploy.new
|
|
23
|
-
render('shipit/ccmenu/project
|
|
23
|
+
render('shipit/ccmenu/project', formats: [:xml], locals: { stack: stack, deploy: latest_deploy })
|
|
24
24
|
end
|
|
25
25
|
|
|
26
26
|
private
|
|
@@ -11,11 +11,13 @@ module Shipit
|
|
|
11
11
|
params do
|
|
12
12
|
requires :sha, String, length: { in: 6..40 }
|
|
13
13
|
accepts :force, Boolean, default: false
|
|
14
|
+
accepts :require_ci, Boolean, default: false
|
|
14
15
|
accepts :env, Hash, default: {}
|
|
15
16
|
end
|
|
16
17
|
def create
|
|
17
18
|
commit = stack.commits.by_sha(params.sha) || param_error!(:sha, 'Unknown revision')
|
|
18
19
|
param_error!(:force, "Can't deploy a locked stack") if !params.force && stack.locked?
|
|
20
|
+
param_error!(:require_ci, "Commit is not deployable") if params.require_ci && !commit.deployable?
|
|
19
21
|
deploy = stack.trigger_deploy(commit, current_user, env: params.env, force: params.force)
|
|
20
22
|
render_resource(deploy, status: :accepted)
|
|
21
23
|
end
|
|
@@ -8,6 +8,7 @@ module Shipit
|
|
|
8
8
|
requires :sha, String, length: { in: 6..40 }
|
|
9
9
|
accepts :force, Boolean, default: false
|
|
10
10
|
accepts :env, Hash, default: {}
|
|
11
|
+
accepts :lock, Boolean, default: true
|
|
11
12
|
end
|
|
12
13
|
def create
|
|
13
14
|
commit = stack.commits.by_sha(params.sha) || param_error!(:sha, 'Unknown revision')
|
|
@@ -23,7 +24,7 @@ module Shipit
|
|
|
23
24
|
active_task.abort!(aborted_by: current_user, rollback_once_aborted_to: deploy)
|
|
24
25
|
response = active_task
|
|
25
26
|
else
|
|
26
|
-
response = deploy.trigger_rollback(current_user, env: deploy_env, force: params.force)
|
|
27
|
+
response = deploy.trigger_rollback(current_user, env: deploy_env, force: params.force, lock: params.lock)
|
|
27
28
|
end
|
|
28
29
|
|
|
29
30
|
render_resource(response, status: :accepted)
|
|
@@ -154,7 +154,7 @@ module Shipit
|
|
|
154
154
|
end
|
|
155
155
|
|
|
156
156
|
def create_params
|
|
157
|
-
params.require(:stack).permit(:environment, :branch, :deploy_url, :ignore_ci)
|
|
157
|
+
params.require(:stack).permit(:repo_owner, :repo_name, :environment, :branch, :deploy_url, :ignore_ci)
|
|
158
158
|
end
|
|
159
159
|
|
|
160
160
|
def update_params
|
|
@@ -180,7 +180,7 @@ module Shipit
|
|
|
180
180
|
end
|
|
181
181
|
|
|
182
182
|
def repository_params
|
|
183
|
-
params.require(:stack).permit(:repo_owner, :repo_name)
|
|
183
|
+
params.require(:stack).permit(:repo_owner, :repo_name, :branch, :environment, :deploy_url, :ignore_ci)
|
|
184
184
|
end
|
|
185
185
|
end
|
|
186
186
|
end
|
|
@@ -62,7 +62,7 @@ module Shipit
|
|
|
62
62
|
def url_for_task
|
|
63
63
|
base_task = @task.is_a?(Deploy) ? @task.becomes(Deploy) : @task
|
|
64
64
|
|
|
65
|
-
url_for([base_task.stack
|
|
65
|
+
url_for([base_task.stack, base_task])
|
|
66
66
|
end
|
|
67
67
|
|
|
68
68
|
def task
|
|
@@ -70,7 +70,7 @@ module Shipit
|
|
|
70
70
|
end
|
|
71
71
|
|
|
72
72
|
def stack
|
|
73
|
-
@stack ||= Stack.from_param!(params[:stack_id])
|
|
73
|
+
@stack ||= Stack.from_param!(params[:stack_id])
|
|
74
74
|
end
|
|
75
75
|
|
|
76
76
|
def task_params
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
module Shipit
|
|
3
3
|
class WebhooksController < ActionController::Base
|
|
4
4
|
skip_before_action :verify_authenticity_token, raise: false
|
|
5
|
-
before_action :check_if_ping, :verify_signature
|
|
5
|
+
before_action :check_if_ping, :drop_unhandled_event, :verify_signature
|
|
6
6
|
|
|
7
7
|
respond_to :json
|
|
8
8
|
|
|
@@ -15,8 +15,26 @@ module Shipit
|
|
|
15
15
|
|
|
16
16
|
private
|
|
17
17
|
|
|
18
|
+
def drop_unhandled_event
|
|
19
|
+
# Acknowledge, but do nothing
|
|
20
|
+
head(204) unless Shipit::Webhooks.for_event(event).present?
|
|
21
|
+
end
|
|
22
|
+
|
|
18
23
|
def verify_signature
|
|
19
|
-
|
|
24
|
+
github_app = Shipit.github(organization: repository_owner)
|
|
25
|
+
verified = github_app.verify_webhook_signature(
|
|
26
|
+
request.headers['X-Hub-Signature'],
|
|
27
|
+
request.raw_post
|
|
28
|
+
)
|
|
29
|
+
head(422) unless verified
|
|
30
|
+
|
|
31
|
+
Rails.logger.info([
|
|
32
|
+
'WebhookController#verify_signature',
|
|
33
|
+
"event=#{event}",
|
|
34
|
+
"repository_owner=#{repository_owner}",
|
|
35
|
+
"signature=#{request.headers['X-Hub-Signature']}",
|
|
36
|
+
"status=#{status}",
|
|
37
|
+
].join(' '))
|
|
20
38
|
end
|
|
21
39
|
|
|
22
40
|
def check_if_ping
|
|
@@ -27,8 +45,9 @@ module Shipit
|
|
|
27
45
|
request.headers.fetch('X-Github-Event')
|
|
28
46
|
end
|
|
29
47
|
|
|
30
|
-
def
|
|
31
|
-
|
|
48
|
+
def repository_owner
|
|
49
|
+
# Fallback to the organization sub-object if repository isn't included in the payload
|
|
50
|
+
params.dig('repository', 'owner', 'login') || params.dig('organization', 'login')
|
|
32
51
|
end
|
|
33
52
|
end
|
|
34
53
|
end
|
|
@@ -3,8 +3,11 @@ module Shipit
|
|
|
3
3
|
class GithubSyncJob < BackgroundJob
|
|
4
4
|
include BackgroundJob::Unique
|
|
5
5
|
|
|
6
|
+
attr_reader :stack
|
|
7
|
+
|
|
6
8
|
MAX_FETCHED_COMMITS = 25
|
|
7
9
|
queue_as :default
|
|
10
|
+
on_duplicate :drop
|
|
8
11
|
|
|
9
12
|
self.timeout = 60
|
|
10
13
|
self.lock_timeout = 20
|
|
@@ -13,26 +16,27 @@ module Shipit
|
|
|
13
16
|
@stack = Stack.find(params[:stack_id])
|
|
14
17
|
|
|
15
18
|
handle_github_errors do
|
|
16
|
-
new_commits, shared_parent = fetch_missing_commits {
|
|
19
|
+
new_commits, shared_parent = fetch_missing_commits { stack.github_commits }
|
|
17
20
|
|
|
18
|
-
|
|
21
|
+
stack.transaction do
|
|
19
22
|
shared_parent&.detach_children!
|
|
20
23
|
appended_commits = new_commits.map do |gh_commit|
|
|
21
24
|
append_commit(gh_commit)
|
|
22
25
|
end
|
|
23
|
-
|
|
26
|
+
stack.lock_reverted_commits! if appended_commits.any?(&:revert?)
|
|
24
27
|
end
|
|
25
28
|
end
|
|
26
|
-
CacheDeploySpecJob.perform_later(
|
|
29
|
+
CacheDeploySpecJob.perform_later(stack)
|
|
27
30
|
end
|
|
28
31
|
|
|
29
32
|
def append_commit(gh_commit)
|
|
30
|
-
|
|
33
|
+
stack.commits.create_from_github!(gh_commit)
|
|
31
34
|
end
|
|
32
35
|
|
|
33
36
|
def fetch_missing_commits(&block)
|
|
34
37
|
commits = []
|
|
35
|
-
|
|
38
|
+
github_api = stack&.github_api
|
|
39
|
+
iterator = Shipit::FirstParentCommitsIterator.new(github_api: github_api, &block)
|
|
36
40
|
iterator.each_with_index do |commit, index|
|
|
37
41
|
break if index >= MAX_FETCHED_COMMITS
|
|
38
42
|
|
|
@@ -49,13 +53,13 @@ module Shipit
|
|
|
49
53
|
def handle_github_errors
|
|
50
54
|
yield
|
|
51
55
|
rescue Octokit::NotFound
|
|
52
|
-
|
|
56
|
+
stack.mark_as_inaccessible!
|
|
53
57
|
else
|
|
54
|
-
|
|
58
|
+
stack.mark_as_accessible!
|
|
55
59
|
end
|
|
56
60
|
|
|
57
61
|
def lookup_commit(sha)
|
|
58
|
-
|
|
62
|
+
stack.commits.find_by(sha: sha)
|
|
59
63
|
end
|
|
60
64
|
end
|
|
61
65
|
end
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
module Shipit
|
|
3
3
|
class AnonymousUser
|
|
4
|
-
def
|
|
5
|
-
|
|
4
|
+
def blank?
|
|
5
|
+
true
|
|
6
6
|
end
|
|
7
7
|
|
|
8
8
|
def email
|
|
@@ -63,5 +63,9 @@ module Shipit
|
|
|
63
63
|
def serializer_class
|
|
64
64
|
AnonymousUserSerializer
|
|
65
65
|
end
|
|
66
|
+
|
|
67
|
+
def marked_for_destruction?
|
|
68
|
+
true
|
|
69
|
+
end
|
|
66
70
|
end
|
|
67
71
|
end
|
|
@@ -5,6 +5,8 @@ module Shipit
|
|
|
5
5
|
include DeferredTouch
|
|
6
6
|
include Status::Common
|
|
7
7
|
|
|
8
|
+
CHECK_RUN_REFRESH_DELAY = 5.seconds
|
|
9
|
+
|
|
8
10
|
belongs_to :stack, required: true
|
|
9
11
|
belongs_to :commit, required: true
|
|
10
12
|
|
|
@@ -19,11 +21,30 @@ module Shipit
|
|
|
19
21
|
create!(selector.merge(attributes))
|
|
20
22
|
rescue ActiveRecord::RecordNotUnique
|
|
21
23
|
record = find_by!(selector)
|
|
24
|
+
|
|
25
|
+
# Checkruns can jump between states and conclusions, and the github timestamps are low precision and unreliable.
|
|
26
|
+
# Since there's a conflict and the webhook seems older, enqueue a refresh.
|
|
27
|
+
# Persist the received data anyways, in case it is now the canonical data on GitHub despite the timestamp.
|
|
28
|
+
if attributes[:conclusion] != record.conclusion && record.newer_than_webhook?(attributes)
|
|
29
|
+
Rails.logger.warn(
|
|
30
|
+
"Conflicting stale checkrun received. Checkrun id: #{selector[:github_id]}, Details: #{attributes}"
|
|
31
|
+
)
|
|
32
|
+
RefreshCheckRunsJob.set(wait: CHECK_RUN_REFRESH_DELAY).perform_later(commit_id: record.commit_id)
|
|
33
|
+
end
|
|
34
|
+
|
|
22
35
|
record.update!(attributes)
|
|
23
36
|
record
|
|
24
37
|
end
|
|
25
38
|
|
|
26
39
|
def create_or_update_from_github!(stack_id, github_check_run)
|
|
40
|
+
checkrun_date = parse_newest_date(github_check_run)
|
|
41
|
+
|
|
42
|
+
unless checkrun_date
|
|
43
|
+
Rails.logger.warn("No valid timestamp found in checkrun data. Checkrun id: #{github_check_run.id}.")
|
|
44
|
+
RefreshCheckRunsJob.set(wait: CHECK_RUN_REFRESH_DELAY).perform_later(stack_id: stack_id)
|
|
45
|
+
return
|
|
46
|
+
end
|
|
47
|
+
|
|
27
48
|
create_or_update_by!(
|
|
28
49
|
selector: {
|
|
29
50
|
github_id: github_check_run.id,
|
|
@@ -35,9 +56,20 @@ module Shipit
|
|
|
35
56
|
title: github_check_run.output.title.to_s.truncate(1_000),
|
|
36
57
|
details_url: github_check_run.details_url,
|
|
37
58
|
html_url: github_check_run.html_url,
|
|
59
|
+
github_updated_at: checkrun_date,
|
|
38
60
|
},
|
|
39
61
|
)
|
|
40
62
|
end
|
|
63
|
+
|
|
64
|
+
def parse_newest_date(github_check_run)
|
|
65
|
+
started_at = github_check_run.started_at
|
|
66
|
+
completed_at = github_check_run.completed_at
|
|
67
|
+
|
|
68
|
+
started_at_date = Time.parse(started_at.to_s) if started_at
|
|
69
|
+
completed_at_date = Time.parse(completed_at.to_s) if completed_at
|
|
70
|
+
|
|
71
|
+
[started_at_date, completed_at_date].compact.max
|
|
72
|
+
end
|
|
41
73
|
end
|
|
42
74
|
|
|
43
75
|
def state
|
|
@@ -71,6 +103,10 @@ module Shipit
|
|
|
71
103
|
'shipit/statuses/status'
|
|
72
104
|
end
|
|
73
105
|
|
|
106
|
+
def newer_than_webhook?(webhook_attributes)
|
|
107
|
+
github_updated_at && github_updated_at >= webhook_attributes[:github_updated_at]
|
|
108
|
+
end
|
|
109
|
+
|
|
74
110
|
private
|
|
75
111
|
|
|
76
112
|
def enable_ci_on_stack
|
data/app/models/shipit/commit.rb
CHANGED
|
@@ -8,7 +8,6 @@ module Shipit
|
|
|
8
8
|
AmbiguousRevision = Class.new(StandardError)
|
|
9
9
|
|
|
10
10
|
belongs_to :stack
|
|
11
|
-
has_many :deploys
|
|
12
11
|
has_many :statuses, -> { order(created_at: :desc) }, dependent: :destroy, inverse_of: :commit
|
|
13
12
|
has_many :check_runs, -> { order(created_at: :desc) }, dependent: :destroy, inverse_of: :commit
|
|
14
13
|
has_many :commit_deployments, dependent: :destroy
|
|
@@ -22,28 +21,40 @@ module Shipit
|
|
|
22
21
|
after_create { stack.update_undeployed_commits_count }
|
|
23
22
|
|
|
24
23
|
after_commit :schedule_refresh_statuses!, :schedule_refresh_check_runs!, :schedule_fetch_stats!,
|
|
25
|
-
|
|
24
|
+
:schedule_continuous_delivery, on: :create
|
|
26
25
|
|
|
27
|
-
belongs_to :author, class_name: 'User', inverse_of: :authored_commits
|
|
28
|
-
belongs_to :committer, class_name: 'User', inverse_of: :commits
|
|
29
|
-
belongs_to :lock_author, class_name:
|
|
26
|
+
belongs_to :author, class_name: 'User', optional: true, inverse_of: :authored_commits
|
|
27
|
+
belongs_to :committer, class_name: 'User', optional: true, inverse_of: :commits
|
|
28
|
+
belongs_to :lock_author, class_name: 'User', optional: true, inverse_of: false
|
|
30
29
|
|
|
31
30
|
def author
|
|
32
31
|
super || AnonymousUser.new
|
|
33
32
|
end
|
|
34
33
|
|
|
34
|
+
def author=(user)
|
|
35
|
+
super(user.presence)
|
|
36
|
+
end
|
|
37
|
+
|
|
35
38
|
def committer
|
|
36
39
|
super || AnonymousUser.new
|
|
37
40
|
end
|
|
38
41
|
|
|
42
|
+
def committer=(user)
|
|
43
|
+
super(user.presence)
|
|
44
|
+
end
|
|
45
|
+
|
|
39
46
|
def lock_author
|
|
40
47
|
super || AnonymousUser.new
|
|
41
48
|
end
|
|
42
49
|
|
|
50
|
+
def lock_author=(user)
|
|
51
|
+
super(user.presence)
|
|
52
|
+
end
|
|
53
|
+
|
|
43
54
|
scope :reachable, -> { where(detached: false) }
|
|
44
55
|
|
|
45
56
|
delegate :broadcast_update, :github_repo_name, :hidden_statuses, :required_statuses, :blocking_statuses,
|
|
46
|
-
|
|
57
|
+
:soft_failing_statuses, to: :stack
|
|
47
58
|
|
|
48
59
|
def self.newer_than(commit)
|
|
49
60
|
return all unless commit
|
|
@@ -144,7 +155,7 @@ module Shipit
|
|
|
144
155
|
|
|
145
156
|
def refresh_statuses!
|
|
146
157
|
github_statuses = stack.handle_github_redirections do
|
|
147
|
-
|
|
158
|
+
stack.github_api.statuses(github_repo_name, sha, per_page: 100)
|
|
148
159
|
end
|
|
149
160
|
github_statuses.each do |status|
|
|
150
161
|
create_status_from_github!(status)
|
|
@@ -159,7 +170,7 @@ module Shipit
|
|
|
159
170
|
|
|
160
171
|
def refresh_check_runs!
|
|
161
172
|
response = stack.handle_github_redirections do
|
|
162
|
-
|
|
173
|
+
stack.github_api.check_runs(github_repo_name, sha)
|
|
163
174
|
end
|
|
164
175
|
response.check_runs.each do |check_run|
|
|
165
176
|
create_or_update_check_run_from_github!(check_run)
|
|
@@ -261,7 +272,7 @@ module Shipit
|
|
|
261
272
|
end
|
|
262
273
|
|
|
263
274
|
def github_commit
|
|
264
|
-
@github_commit ||=
|
|
275
|
+
@github_commit ||= stack.github_api.commit(github_repo_name, sha)
|
|
265
276
|
end
|
|
266
277
|
|
|
267
278
|
def schedule_fetch_stats!
|