Moved ci_status environments logic to new action ci_envrionments_status and set up frontend polling

This commit is contained in:
Luke Bennett 2016-10-07 23:10:06 +01:00 committed by Z.J. van de Weg
parent fa58068b28
commit 58368fbc53
6 changed files with 96 additions and 62 deletions

View file

@ -35,13 +35,17 @@
}); });
this.firstCICheck = true; this.firstCICheck = true;
this.readyForCICheck = false; this.readyForCICheck = false;
this.readyForCIEnvironmentCheck = false;
this.cancel = false; this.cancel = false;
clearInterval(this.fetchBuildStatusInterval); clearInterval(this.fetchBuildStatusInterval);
clearInterval(this.fetchBuildEnvironmentStatusInterval);
this.clearEventListeners(); this.clearEventListeners();
this.addEventListeners(); this.addEventListeners();
this.getCIStatus(false); this.getCIStatus(false);
this.getCIEnvironmentsStatus();
this.retrieveSuccessIcon(); this.retrieveSuccessIcon();
this.pollCIStatus(); this.pollCIStatus();
this.pollCIEnvironmentsStatus();
notifyPermissions(); notifyPermissions();
} }
@ -62,6 +66,7 @@
page = $('body').data('page').split(':').last(); page = $('body').data('page').split(':').last();
if (allowedPages.indexOf(page) < 0) { if (allowedPages.indexOf(page) < 0) {
clearInterval(_this.fetchBuildStatusInterval); clearInterval(_this.fetchBuildStatusInterval);
clearInterval(_this.fetchBuildEnvironmentStatusInterval);
_this.cancelPolling(); _this.cancelPolling();
return _this.clearEventListeners(); return _this.clearEventListeners();
} }
@ -178,6 +183,22 @@
})(this)); })(this));
}; };
MergeRequestWidget.prototype.pollCIEnvironmentsStatus = function() {
this.fetchBuildEnvironmentStatusInterval = setInterval(() => {
if (!this.readyForCIEnvironmentCheck) return;
this.getCIEnvironmentsStatus();
this.readyForCIEnvironmentCheck = false;
}, 300000);
};
MergeRequestWidget.prototype.getCIEnvironmentsStatus = function() {
$.getJSON(this.opts.ci_environments_status_url, (environments) => {
if (this.cancel) return;
this.readyForCIEnvironmentCheck = true;
if (environments && environments.length) this.renderEnvironments(environments);
});
};
MergeRequestWidget.prototype.renderEnvironments = function(environments) { MergeRequestWidget.prototype.renderEnvironments = function(environments) {
for (let i = 0; i < environments.length; i++) { for (let i = 0; i < environments.length; i++) {
const environment = environments[i]; const environment = environments[i];

View file

@ -10,7 +10,7 @@ class Projects::MergeRequestsController < Projects::ApplicationController
before_action :module_enabled before_action :module_enabled
before_action :merge_request, only: [ before_action :merge_request, only: [
:edit, :update, :show, :diffs, :commits, :conflicts, :builds, :pipelines, :merge, :merge_check, :edit, :update, :show, :diffs, :commits, :conflicts, :builds, :pipelines, :merge, :merge_check,
:ci_status, :toggle_subscription, :cancel_merge_when_build_succeeds, :remove_wip, :resolve_conflicts, :assign_related_issues :ci_status, :ci_environments_status, :toggle_subscription, :cancel_merge_when_build_succeeds, :remove_wip, :resolve_conflicts, :assign_related_issues
] ]
before_action :validates_merge_request, only: [:show, :diffs, :commits, :builds, :pipelines] before_action :validates_merge_request, only: [:show, :diffs, :commits, :builds, :pipelines]
before_action :define_show_vars, only: [:show, :diffs, :commits, :conflicts, :builds, :pipelines] before_action :define_show_vars, only: [:show, :diffs, :commits, :conflicts, :builds, :pipelines]
@ -393,11 +393,23 @@ class Projects::MergeRequestsController < Projects::ApplicationController
end end
end end
environments = @merge_request.environments.map do |environment| response = {
title: merge_request.title,
sha: merge_request.diff_head_commit.short_id,
status: status,
coverage: coverage
}
render json: response
end
def ci_environments_status
render json: @merge_request.environments.map do |environment|
next unless can?(current_user, :read_environment, environment) next unless can?(current_user, :read_environment, environment)
deployment = environment.first_deployment_for(@merge_request.diff_head_commit) deployment = environment.first_deployment_for(@merge_request.diff_head_commit)
environment = {
environment_data = {
name: environment.name, name: environment.name,
id: environment.id, id: environment.id,
url: namespace_project_environment_path(@project.namespace, @project, environment), url: namespace_project_environment_path(@project.namespace, @project, environment),
@ -405,26 +417,16 @@ class Projects::MergeRequestsController < Projects::ApplicationController
deployed_at: deployment ? deployment.created_at : nil deployed_at: deployment ? deployment.created_at : nil
} }
if environment[:external_url] if environment_data[:external_url]
environment[:external_url_formatted] = environment[:external_url].gsub(/\A.*?:\/\//, '') environment_data[:external_url_formatted] = environment_data[:external_url].gsub(/\A.*?:\/\//, '')
end end
if environment[:deployed_at] if environment_data[:deployed_at]
environment[:deployed_at_formatted] = environment[:deployed_at].to_time.in_time_zone.to_s(:medium) environment_data[:deployed_at_formatted] = environment_data[:deployed_at].to_time.in_time_zone.to_s(:medium)
end end
environment environment_data
end.compact end.compact
response = {
title: merge_request.title,
sha: merge_request.diff_head_commit.short_id,
status: status,
coverage: coverage,
environments: environments
}
render json: response
end end
protected protected

View file

@ -12,6 +12,7 @@
merge_check_url: "#{merge_check_namespace_project_merge_request_path(@project.namespace, @project, @merge_request)}", merge_check_url: "#{merge_check_namespace_project_merge_request_path(@project.namespace, @project, @merge_request)}",
check_enable: #{@merge_request.unchecked? ? "true" : "false"}, check_enable: #{@merge_request.unchecked? ? "true" : "false"},
ci_status_url: "#{ci_status_namespace_project_merge_request_path(@project.namespace, @project, @merge_request)}", ci_status_url: "#{ci_status_namespace_project_merge_request_path(@project.namespace, @project, @merge_request)}",
ci_environments_status_url: "#{ci_environments_status_namespace_project_merge_request_path(@project.namespace, @project, @merge_request)}",
gitlab_icon: "#{asset_path 'gitlab_logo.png'}", gitlab_icon: "#{asset_path 'gitlab_logo.png'}",
ci_status: "#{@merge_request.pipeline ? @merge_request.pipeline.status : ''}", ci_status: "#{@merge_request.pipeline ? @merge_request.pipeline.status : ''}",
ci_message: { ci_message: {

View file

@ -83,9 +83,4 @@ Rails.application.routes.draw do
draw :group draw :group
draw :user draw :user
draw :project draw :project
# Get all keys of user
get ':username.keys' => 'profiles/keys#get_keys', constraints: { username: /.*/ }
root to: "root#index"
end end

View file

@ -273,6 +273,7 @@ resources :namespaces, path: '/', constraints: { id: /[a-zA-Z.0-9_\-]+/ }, only:
post :merge post :merge
post :cancel_merge_when_build_succeeds post :cancel_merge_when_build_succeeds
get :ci_status get :ci_status
get :ci_environments_status
post :toggle_subscription post :toggle_subscription
post :remove_wip post :remove_wip
get :diff_for_path get :diff_for_path

View file

@ -8,6 +8,7 @@
window.notify = function() {}; window.notify = function() {};
this.opts = { this.opts = {
ci_status_url: "http://sampledomain.local/ci/getstatus", ci_status_url: "http://sampledomain.local/ci/getstatus",
ci_environments_status_url: "http://sampledomain.local/ci/getenvironmentsstatus",
ci_status: "", ci_status: "",
ci_message: { ci_message: {
normal: "Build {{status}} for \"{{title}}\"", normal: "Build {{status}} for \"{{title}}\"",
@ -21,15 +22,45 @@
builds_path: "http://sampledomain.local/sampleBuildsPath" builds_path: "http://sampledomain.local/sampleBuildsPath"
}; };
this["class"] = new window.gl.MergeRequestWidget(this.opts); this["class"] = new window.gl.MergeRequestWidget(this.opts);
return this.ciStatusData = { });
describe('getCIEnvironmentsStatus', function() {
beforeEach(function() {
this.ciEnvironmentsStatusData = {
created_at: '2016-09-12T13:38:30.636Z',
environment_id: 1,
environment_name: 'env1',
external_url: 'https://test-url.com',
external_url_formatted: 'test-url.com'
};
spyOn(jQuery, 'getJSON').and.callFake((req, cb) => {
cb(this.ciEnvironmentsStatusData);
});
});
it('should call renderEnvironments when the environments property is set', function() {
const spy = spyOn(this.class, 'renderEnvironments').and.stub();
this.class.getCIEnvironmentsStatus();
expect(spy).toHaveBeenCalledWith(this.ciEnvironmentsStatusData);
});
it('should not call renderEnvironments when the environments property is not set', function() {
const spy = spyOn(this.class, 'renderEnvironments').and.stub();
this.class.getCIEnvironmentsStatus();
expect(spy).not.toHaveBeenCalled();
});
});
return describe('getCIStatus', function() {
beforeEach(function() {
this.ciStatusData = {
"title": "Sample MR title", "title": "Sample MR title",
"sha": "12a34bc5", "sha": "12a34bc5",
"status": "success", "status": "success",
"coverage": 98 "coverage": 98
}; };
});
return describe('getCIStatus', function() {
beforeEach(function() {
spyOn(jQuery, 'getJSON').and.callFake((function(_this) { spyOn(jQuery, 'getJSON').and.callFake((function(_this) {
return function(req, cb) { return function(req, cb) {
return cb(_this.ciStatusData); return cb(_this.ciStatusData);
@ -68,23 +99,6 @@
this["class"].getCIStatus(true); this["class"].getCIStatus(true);
return expect(spy).not.toHaveBeenCalled(); return expect(spy).not.toHaveBeenCalled();
}); });
it('should call renderEnvironments when the environments property is set', function() {
this.ciStatusData.environments = [{
created_at: '2016-09-12T13:38:30.636Z',
environment_id: 1,
environment_name: 'env1',
external_url: 'https://test-url.com',
external_url_formatted: 'test-url.com'
}];
var spy = spyOn(this['class'], 'renderEnvironments').and.stub();
this['class'].getCIStatus(false);
expect(spy).toHaveBeenCalledWith(this.ciStatusData.environments);
});
it('should not call renderEnvironments when the environments property is not set', function() {
var spy = spyOn(this['class'], 'renderEnvironments').and.stub();
this['class'].getCIStatus(false);
expect(spy).not.toHaveBeenCalled();
});
}); });
}); });