be09845914
Add environments and deployments This MR is a continuation of https://gitlab.com/gitlab-org/gitlab-ce/issues/17009. The current implementation is as follow: 1. We have two new tables: `environments` and `deployments`. 2. We have a new tab: `Environments` under `Pipelines` where you can see all you environments and add a new one. 3. We add a new option to `.gitlab-ci.yml` to track where we should create a deployment for environment. 4. If environment in `.gitlab-ci.yml` is specified it will create a deployment. **If environment does not exist it will be created.** (this got changed) 5. The deployment is always successful and shows the time of the action, in that case a build that presumably should do deployment. In the future we could extend deployment with statuses: success, failure. We could extend deployments with information that this is partial or full deployment. 6. User have to create environments that he will track first. 7. User can remove environments. 8. User can retry/rollback past deployment (in that case we retry past build). The new build when succeeds it will create a new deployment. 9. Currently environment have only one parameter: `name`. In the future it should have: `variables`, `credentials` and possibly `runners` and maybe other resources. 10. Currently deployment have this parameters: `sha`, `ref`, `deployable (in this case a build)`, `user (who triggered a deployment)`, `created_at`. The `.gitlab-ci.yml`: ``` deploy to production: stage: deploy script: dpl travis... environment: production ``` What needs to be done: - [x] Write initial implementation - [x] Improve implementation (@ayufan) - [x] Write tests (@ayufan) - [x] Improve UX of the forms (cc @markpundsack) - reviewed by @markpundsack - [x] Improve implementation of the views (cc @jschatz1) - done by @iamphill - [x] Write .gitlab-ci.yml documentation for `environments` - done by @ayufan - [ ] Write user documentation (@ayufan and @markpundsack) See merge request !4605
152 lines
4.9 KiB
Ruby
152 lines
4.9 KiB
Ruby
# Shorter routing method for project and project items
|
|
# Since update to rails 4.1.9 we are now allowed to use `/` in project routing
|
|
# so we use nested routing for project resources which include project and
|
|
# project namespace. To avoid writing long methods every time we define shortcuts for
|
|
# some of routing.
|
|
#
|
|
# For example instead of this:
|
|
#
|
|
# namespace_project_merge_request_path(merge_request.project.namespace, merge_request.project, merge_request)
|
|
#
|
|
# We can simply use shortcut:
|
|
#
|
|
# merge_request_path(merge_request)
|
|
#
|
|
module GitlabRoutingHelper
|
|
# Project
|
|
def project_path(project, *args)
|
|
namespace_project_path(project.namespace, project, *args)
|
|
end
|
|
|
|
def project_url(project, *args)
|
|
namespace_project_url(project.namespace, project, *args)
|
|
end
|
|
|
|
def edit_project_path(project, *args)
|
|
edit_namespace_project_path(project.namespace, project, *args)
|
|
end
|
|
|
|
def edit_project_url(project, *args)
|
|
edit_namespace_project_url(project.namespace, project, *args)
|
|
end
|
|
|
|
def project_files_path(project, *args)
|
|
namespace_project_tree_path(project.namespace, project, @ref || project.repository.root_ref)
|
|
end
|
|
|
|
def project_commits_path(project, *args)
|
|
namespace_project_commits_path(project.namespace, project, @ref || project.repository.root_ref)
|
|
end
|
|
|
|
def project_pipelines_path(project, *args)
|
|
namespace_project_pipelines_path(project.namespace, project, *args)
|
|
end
|
|
|
|
def project_environments_path(project, *args)
|
|
namespace_project_environments_path(project.namespace, project, *args)
|
|
end
|
|
|
|
def project_builds_path(project, *args)
|
|
namespace_project_builds_path(project.namespace, project, *args)
|
|
end
|
|
|
|
def project_container_registry_path(project, *args)
|
|
namespace_project_container_registry_index_path(project.namespace, project, *args)
|
|
end
|
|
|
|
def activity_project_path(project, *args)
|
|
activity_namespace_project_path(project.namespace, project, *args)
|
|
end
|
|
|
|
def runners_path(project, *args)
|
|
namespace_project_runners_path(project.namespace, project, *args)
|
|
end
|
|
|
|
def runner_path(runner, *args)
|
|
namespace_project_runner_path(@project.namespace, @project, runner, *args)
|
|
end
|
|
|
|
def issue_path(entity, *args)
|
|
namespace_project_issue_path(entity.project.namespace, entity.project, entity, *args)
|
|
end
|
|
|
|
def merge_request_path(entity, *args)
|
|
namespace_project_merge_request_path(entity.project.namespace, entity.project, entity, *args)
|
|
end
|
|
|
|
def milestone_path(entity, *args)
|
|
namespace_project_milestone_path(entity.project.namespace, entity.project, entity, *args)
|
|
end
|
|
|
|
def issue_url(entity, *args)
|
|
namespace_project_issue_url(entity.project.namespace, entity.project, entity, *args)
|
|
end
|
|
|
|
def merge_request_url(entity, *args)
|
|
namespace_project_merge_request_url(entity.project.namespace, entity.project, entity, *args)
|
|
end
|
|
|
|
def project_snippet_url(entity, *args)
|
|
namespace_project_snippet_url(entity.project.namespace, entity.project, entity, *args)
|
|
end
|
|
|
|
def toggle_subscription_path(entity, *args)
|
|
if entity.is_a?(Issue)
|
|
toggle_subscription_namespace_project_issue_path(entity.project.namespace, entity.project, entity)
|
|
else
|
|
toggle_subscription_namespace_project_merge_request_path(entity.project.namespace, entity.project, entity)
|
|
end
|
|
end
|
|
|
|
## Members
|
|
def project_members_url(project, *args)
|
|
namespace_project_project_members_url(project.namespace, project)
|
|
end
|
|
|
|
def project_member_path(project_member, *args)
|
|
namespace_project_project_member_path(project_member.source.namespace, project_member.source, project_member)
|
|
end
|
|
|
|
def request_access_project_members_path(project, *args)
|
|
request_access_namespace_project_project_members_path(project.namespace, project)
|
|
end
|
|
|
|
def leave_project_members_path(project, *args)
|
|
leave_namespace_project_project_members_path(project.namespace, project)
|
|
end
|
|
|
|
def approve_access_request_project_member_path(project_member, *args)
|
|
approve_access_request_namespace_project_project_member_path(project_member.source.namespace, project_member.source, project_member)
|
|
end
|
|
|
|
def resend_invite_project_member_path(project_member, *args)
|
|
resend_invite_namespace_project_project_member_path(project_member.source.namespace, project_member.source, project_member)
|
|
end
|
|
|
|
# Groups
|
|
|
|
## Members
|
|
def group_members_url(group, *args)
|
|
group_group_members_url(group, *args)
|
|
end
|
|
|
|
def group_member_path(group_member, *args)
|
|
group_group_member_path(group_member.source, group_member)
|
|
end
|
|
|
|
def request_access_group_members_path(group, *args)
|
|
request_access_group_group_members_path(group)
|
|
end
|
|
|
|
def leave_group_members_path(group, *args)
|
|
leave_group_group_members_path(group)
|
|
end
|
|
|
|
def approve_access_request_group_member_path(group_member, *args)
|
|
approve_access_request_group_group_member_path(group_member.source, group_member)
|
|
end
|
|
|
|
def resend_invite_group_member_path(group_member, *args)
|
|
resend_invite_group_group_member_path(group_member.source, group_member)
|
|
end
|
|
end
|