Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Do not merge] Add review stacks #71

Closed
wants to merge 81 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
81 commits
Select commit Hold shift + click to select a range
d4f3bba
Add Repository admin UI
indiebrain Dec 16, 2019
3e974b7
Break repository fragment cache when stacks are added/removed
indiebrain Dec 23, 2019
2eec4ff
Add "provision pr stacks" config option to Repositories
indiebrain Dec 18, 2019
fff1884
Add ability to configure per-pull-request provisioning behavior
indiebrain Dec 31, 2019
937b127
Merge branch 'tweak-deployment-tasks' into pr-review-stacks
benlangfeld Jan 9, 2020
50feefe
Link from stacks back to Repository view
benlangfeld Jan 9, 2020
e0e4a04
Exposes DEPLOY_URL to deployments
benlangfeld Jan 9, 2020
3989ead
Merge remote-tracking branch 'origin/master' into pr-review-stacks
benlangfeld Jan 10, 2020
acb40ab
Makes archived stacks toggle work on repo page
benlangfeld Jan 10, 2020
6fbcca9
Merge branch 'master' into pr-review-stacks
benlangfeld Jan 14, 2020
c17f0a6
Permit locking stacks with machine-readable reason (#8)
benlangfeld Jan 15, 2020
4fe080f
Allow flagging stacks as auto-provisioned (#9)
benlangfeld Jan 15, 2020
6c7a605
Fix CSS typo
benlangfeld Jan 15, 2020
d82511e
Merge remote-tracking branch 'powerhome/display-stack-task-no-commits…
benlangfeld Jan 21, 2020
03146b9
Merge branch 'master' into pr-review-stacks
benlangfeld Jan 29, 2020
bffac2c
Merge branch 'master' into pr-review-stacks
benlangfeld Jan 29, 2020
dd8b2a6
Merge remote-tracking branch 'origin/master' into pr-review-stacks
benlangfeld Jan 31, 2020
b959957
Add environment_url to deployment status events (#11)
indiebrain Jan 31, 2020
de74012
Allow host application to define system-wide links to stack header (#15)
indiebrain Feb 5, 2020
647adcd
Merge remote-tracking branch 'origin/master' into pr-review-stacks
benlangfeld Feb 5, 2020
5600f48
Merge upstream master from Shopify/shipit-engine (#18)
indiebrain Feb 12, 2020
0765332
Assigns review request to stack (#19)
viniciusgama Feb 14, 2020
9b5fbed
GithubSyncJob must run once before syncing pull requests (#21)
indiebrain Feb 18, 2020
249627d
Introduces PR event and emits it after every changes (#23)
benlangfeld Mar 4, 2020
a4e84d3
Merge remote-tracking branch 'origin/master' into pr-review-stacks
benlangfeld Mar 25, 2020
936ee30
Link review stacks to their PR on Github (#24)
benlangfeld Mar 25, 2020
55fd47c
Reload records to be created on Github
benlangfeld Apr 2, 2020
3773611
Merge remote-tracking branch 'origin/master' into pr-review-stacks
benlangfeld Apr 7, 2020
d3e26d1
Merge branch 'master' into pr-review-stacks
benlangfeld Apr 7, 2020
8c6ad04
[GOG-150] Adding pre-condition check for uncached deploy spec (#26)
ryanmrodriguez Apr 14, 2020
df7f1bf
[GOG-153] Prevent erroneously marking deployments as dead soon after …
indiebrain Apr 14, 2020
aca062b
Fix return type of Stack#trigger_continuous_delivery (#29)
indiebrain Apr 14, 2020
0e1b19a
Sync pr-review-stacks with Shopify Master (#31)
ryanmrodriguez Apr 16, 2020
b46d0de
Merge branch 'master' into pr-review-stacks
benlangfeld Apr 17, 2020
4822fe4
[GOG-129] Adds pull request assignees to Ship It (#30)
viniciusgama Apr 20, 2020
c8696fa
Merge branch 'master' into pr-review-stacks
benlangfeld Apr 21, 2020
402d321
Merge remote-tracking branch 'origin/master' into pr-review-stacks
benlangfeld May 14, 2020
abd09af
Corrects Rubocop lint violations
benlangfeld May 14, 2020
ad2809f
Add provision_status state machine to review stacks (#33)
indiebrain Jun 8, 2020
e99b97c
Expose provisioning lifecycle hooks (#35)
indiebrain Jun 26, 2020
ff2c6f0
Allow provisioning handler to be configured via shipit.yml (#36)
indiebrain Jul 1, 2020
08fa317
Add ReviewStack into shipit engine (#37)
indiebrain Jul 14, 2020
6d13d75
Fix review stack routing (#38)
indiebrain Jul 14, 2020
4611295
Rename provision_pr_stacks to review_stacks_enabled (#39)
ryanmrodriguez Jul 16, 2020
82e4de7
Add optional #provision? predicate to ProvisioningHandler (#40)
indiebrain Jul 17, 2020
e084995
Remove auto_provisioned from Stacks (#42)
ryanmrodriguez Jul 20, 2020
9496b67
Put milano working branch in sync with upstream master (#41)
viniciusgama Jul 20, 2020
0fadfd8
Move review stack resource allocation queue into shipit-engine (#43)
indiebrain Jul 27, 2020
3975dfa
Sync working branch with upstream master (#44)
viniciusgama Jul 29, 2020
7218f55
Implement cleanup routine (#45)
viniciusgama Jul 30, 2020
67e68f5
Adds enqueued concept to stack (#46)
viniciusgama Aug 5, 2020
e4ec9d8
Merge upstream master to receive pull request rename (#49)
indiebrain Aug 6, 2020
3329f9c
Makes awaiting provision stacks not deployable (#48)
viniciusgama Aug 6, 2020
e6213b2
Revert "Merge upstream master to receive pull request rename (#49)" (…
indiebrain Aug 6, 2020
af75cd7
Revert "Revert "Merge upstream master to receive pull request rename …
indiebrain Aug 7, 2020
7652a35
Emit review stack events (#52)
indiebrain Aug 11, 2020
f361e71
Move pull request webhooks to shipit engine (#54)
indiebrain Aug 20, 2020
e70a005
Add pull_request serializer (#55)
indiebrain Aug 21, 2020
b5a8abf
Remove review_request flag from MergeRequest (#57)
indiebrain Aug 25, 2020
0d36add
Fixes ActionView::Template::Error undefined method `pull_requset' (#58)
indiebrain Aug 25, 2020
fbd5154
Add head commit to pull requests (#56)
indiebrain Aug 26, 2020
b914d6b
Revert "Add head commit to pull requests (#56)" (#59)
indiebrain Aug 26, 2020
dbf6f7d
Capture head commit for pull requsets (#60)
indiebrain Aug 27, 2020
5b1209f
Find out when things go wrong (#61)
benlangfeld Aug 27, 2020
f49e0ee
Revert "Capture head commit for pull requsets (#60)" (#62)
indiebrain Aug 27, 2020
99a39a3
Revert "Revert "Capture head commit for pull requsets (#60)" (#62)" (…
indiebrain Aug 31, 2020
21e7540
Merge shopify master into pr review stacks branch (#65)
indiebrain Sep 1, 2020
ae09cec
Revert "Merge shopify master into pr review stacks branch (#65)" (#66)
indiebrain Sep 1, 2020
56d0976
Merge remote-tracking branch 'shopify/master' into pr-review-stacks
indiebrain Sep 1, 2020
36abf56
Remove merge_request user and assignees (#69)
indiebrain Sep 2, 2020
445d23c
Remove stacks lock_reason_code (#70)
indiebrain Sep 2, 2020
24aa742
Fix Revie Stack documentation typos
indiebrain Sep 3, 2020
446dee8
Fixup merge 56d09761 (#73)
indiebrain Sep 3, 2020
9d2ad93
Remove no-op migrations (#72)
indiebrain Sep 3, 2020
44d77e5
Compress review stack feature flag migrations (#74)
indiebrain Sep 3, 2020
a4353b1
Atomically create Review Stacks and their Pull Requests (#75)
indiebrain Sep 16, 2020
33c8010
Change provisioning_behavior to string enum
indiebrain Sep 28, 2020
0af0c0b
Document the relevance of throw(:halt) in provisoining handler
indiebrain Sep 28, 2020
2ffdb52
Add review stacks changes (#76)
casperisfine Sep 29, 2020
73a3f3b
Store labels directly on PullRequests
indiebrain Sep 29, 2020
6531f6c
Collapse migrations to one per table
benlangfeld Oct 1, 2020
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
1 change: 1 addition & 0 deletions app/assets/images/magic-solid.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
60 changes: 60 additions & 0 deletions app/assets/javascripts/shipit/repositories_search.js.coffee
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
KEY =
UP: 38
DOWN: 40
ENTER: 13

class RepositorySearch

constructor: (root) ->
@$root = $(root)
@$root.on('keyup', '.repository-search', @onKeyUp)
@$root.on('click', '.show-all-repositories', (event) =>
@$root.find('.not-matching').removeClass('not-matching')
event.preventDefault()
)

onKeyUp: (event) =>
@$items = @$root.find('[data-search]')
switch event.keyCode
when KEY.ENTER
event.preventDefault()
@goToSelectedRepository()
when KEY.UP
event.preventDefault()
@selectPrevious()
when KEY.DOWN
event.preventDefault()
@selectNext()
else
@filterResults($.trim($(event.target).val()).toLowerCase())

filterResults: (query) ->
if query
for item in @$items
$item = $(item)
$item.toggleClass('not-matching', query not in $item.attr('data-search').toLowerCase())
@selectFirst()
else
@$items.removeClass('not-matching')

selectFirst: ->
@$items.removeClass('selected').first(':not(.not-matching)').addClass('selected')

selectNext: ->
$next = @$items.filter('.selected').removeClass('selected').nextAll(':not(.not-matching)').first()
$next = @$items.filter(':not(.not-matching)').first() unless $next.length
$next.addClass('selected')

selectPrevious: ->
$previous = @$items.filter('.selected').removeClass('selected').prevAll(':not(.not-matching)').first()
$previous = @$items.filter(':not(.not-matching)').last() unless $previous.length
$previous.addClass('selected')

goToSelectedRepository: ->
if repository = @$items.filter('.selected').filter(':not(.not-matching)').find('.commits-path').attr('href')
window.location = repository

search = new RepositorySearch(document)

jQuery ->
$('.repository-search').focus()
148 changes: 148 additions & 0 deletions app/assets/stylesheets/_pages/_repositories.scss
Original file line number Diff line number Diff line change
@@ -0,0 +1,148 @@
.repository-search {
-webkit-appearance: none;
width: 100%;
@extend h1;
border: none;
font-family: "Helvetica Neue", sans-serif;
font-weight: 200;
background: asset-data-url('search.svg') no-repeat center right;
&::-webkit-input-placeholder {
color: #B5C0CA;
}
&:focus {
outline: none;
background-image: asset-data-url('search-active.svg');
}
}

.repository-table-header {
@include clearfix;
margin: 0; padding: 1.25rem 0 1rem;
.col {
width: 25%;
float: left;
}
li {
list-style-type: none;
font-size: .875em;
color: #BAC5D1;
}
}

.repository-lst {
list-style-type: none;
margin: 0; padding: 0; margin-bottom: 1.5rem;
.col {
width: 25%;
float: left;
text-overflow: ellipsis;
white-space: nowrap;
overflow: hidden;
padding-right: .5rem;
box-sizing: border-box;
}
.undeployed {
background-image: asset-data-url('ship.png');
background-repeat: no-repeat;
background-size: 22px 22px;
background-position: 0px center;
padding-left: 30px;
margin-left: -30px;
}
.archived {
// From FontAwesome, license @ https://fontawesome.com/license/free
background-image: asset-data-url('archive-solid.svg');
background-repeat: no-repeat;
background-size: 22px 22px;
background-position: 0px center;
padding-left: 30px;
margin-left: -30px;
}
.auto-provisioned {
// From FontAwesome, license @ https://fontawesome.com/license/free
background-image: asset-data-url('magic-solid.svg');
background-repeat: no-repeat;
background-size: 22px 22px;
background-position: 0px center;
padding-left: 30px;
margin-left: -30px;
}
}

.repository-lst:empty:before {
content: "No environment to deploy to, Shipit Squirrel is displeased";
}

.repository-lst li {
&:nth-child(even) a {
background-color: lighten(#EDF1F3, 3.5%);
}

&.selected a {
background-color: $blue;
outline: none;
span { color: #fff; }
small { color: rgba(#fff, .8); }
}

a {
padding: .35rem;
margin-left: -0.35rem; margin-right: -0.35rem;
@include clearfix;
border-radius: 4px;
display: block;
&:hover, &:focus {
background-color: $blue;
outline: none;
span { color: #fff; }
small { color: rgba(#fff, .8); }
}
}
}

.repository-search input {
margin-left: 4%;
width: 92%;
padding: 6px;
font-size: larger;
-moz-border-radius: 8px;
-webkit-border-radius: 8px;
border-radius: 8px;
outline: 0;
border: 1px #a0a0a0 solid;
}

.repository-search-header {
display: none;
}

.show-all-repositories {
display: none;
}

.filtering-enabled {
.show-all-repositories {
display: inline-block;
}

.repository-search-header {
display: block;
}
.search-item.not-matching {
display: none;
}
}

.new_repository {
input.repo {
width: 200px;
display: inline;

&:focus {
padding-right: 30px !important;
}
}
input:focus {
border-color: $blue;
}
}
19 changes: 19 additions & 0 deletions app/assets/stylesheets/_pages/_stacks.scss
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,15 @@
padding-left: 30px;
margin-left: -30px;
}
.auto-provisioned {
// From FontAwesome, license @ https://fontawesome.com/license/free
background-image: asset-data-url('magic-solid.svg');
background-repeat: no-repeat;
background-size: 22px 22px;
background-position: 0px center;
padding-left: 30px;
margin-left: -30px;
}
}

.stack-lst:empty:before {
Expand Down Expand Up @@ -193,6 +202,16 @@
@include clearfix;
}

.auto-provisioned {
// From FontAwesome, license @ https://fontawesome.com/license/free
background-image: asset-data-url('magic-solid.svg');
background-repeat: no-repeat;
background-size: 22px 22px;
background-position: 0px center;
padding-left: 30px;
margin-left: 5px;
}

/* STATS */

.stats {
Expand Down
1 change: 1 addition & 0 deletions app/assets/stylesheets/shipit.scss
Original file line number Diff line number Diff line change
Expand Up @@ -17,4 +17,5 @@
@import "_pages/_commits";
@import "_pages/_settings";
@import "_pages/_stacks";
@import "_pages/_repositories";
@import "_pages/_deploy";
2 changes: 1 addition & 1 deletion app/controllers/shipit/deploys_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ def load_deploy
end

def load_stack
@stack ||= Stack.from_param!(params[:stack_id])
@stack ||= Stack.from_param!(params[:stack_id]).becomes(Stack)
end

def load_until_commit
Expand Down
74 changes: 74 additions & 0 deletions app/controllers/shipit/repositories_controller.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
# frozen_string_literal: true

module Shipit
class RepositoriesController < ShipitController
before_action :load_repository, only: %i(destroy settings update new_stack)

def index
@user_repositories = current_user.repositories_contributed_to

@repositories = Repository.order(:owner, :name).to_a
end

def show
@repository = Repository.from_param!(params[:id])

@stacks = @repository.stacks

@show_archived = params[:show_archived]
@stacks = @stacks.not_archived unless @show_archived
end

def create
@repository = Repository.new(create_params)
unless @repository.save
flash[:warning] = @repository.errors.full_messages.to_sentence
end
respond_with(@repository)
end

def new
@repository = Repository.new
end

def destroy
@repository.schedule_for_destroy!
redirect_to(repositories_url)
end

def update
options = {}
unless @repository.update(update_params)
options = { flash: { warning: @repository.errors.full_messages.to_sentence } }
end

redirect_to(params[:return_to].presence || repository_settings_path(@repository), options)
end

def settings
end

def new_stack
@stack = @repository.stacks.new
render("shipit/stacks/new")
end

private

def create_params
params.require(:repository).permit(:owner, :name)
end

def update_params
params.require(:repository).permit(
:review_stacks_enabled,
:provisioning_behavior,
:provisioning_label_name,
)
end

def load_repository
@repository = Repository.from_param!(params[:id])
end
end
end
4 changes: 2 additions & 2 deletions app/controllers/shipit/tasks_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -62,15 +62,15 @@ def lookup
def url_for_task
base_task = @task.is_a?(Deploy) ? @task.becomes(Deploy) : @task

url_for([base_task.stack, base_task])
url_for([base_task.stack.becomes(Stack), base_task])
end

def task
@task ||= stack.tasks.find(params[:id])
end

def stack
@stack ||= Stack.from_param!(params[:stack_id])
@stack ||= Stack.from_param!(params[:stack_id]).becomes(Stack)
end

def task_params
Expand Down
8 changes: 8 additions & 0 deletions app/helpers/shipit/github_url_helper.rb
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,14 @@ def github_pull_request_url(pull_request_or_commit)
github_repo_url(stack.repo_owner, stack.repo_name, 'pull', number)
end

def stack_github_url(stack)
if stack.respond_to?(:pull_request) && stack.pull_request
github_pull_request_url(stack.pull_request)
else
github_repo_url(stack.repo_owner, stack.repo_name)
end
end

def link_to_github_deploy(deploy)
url = github_commit_range_url(deploy.stack, *deploy.commit_range)
text = deploy.commit_range.map(&:short_sha).join('...')
Expand Down
4 changes: 4 additions & 0 deletions app/helpers/shipit/stacks_helper.rb
Original file line number Diff line number Diff line change
Expand Up @@ -91,5 +91,9 @@ def unlock_commit_tooltip(commit)
def positive_negative_class(value)
value.to_f >= 0 ? 'positive' : 'negative'
end

def contributor_class(stacks_contributed_to, stack_id)
stacks_contributed_to.include?(stack_id) ? "contributor" : "not-matching"
end
end
end
1 change: 1 addition & 0 deletions app/jobs/shipit/create_on_github_job.rb
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ class CreateOnGithubJob < BackgroundJob
include BackgroundJob::Unique

queue_as :default
on_duplicate :drop

# We observe that some objects regularly take longer than the default 10 seconds to create, e.g. deployments
self.timeout = 40
Expand Down
Loading