Add MockCiService integration
MR: https://gitlab.com/gitlab-org/gitlab-ce/merge_requests/9250/ See https://gitlab.com/madlittlemods/gl-mock-ci-service
This commit is contained in:
		
							parent
							
								
									7d15f36be6
								
							
						
					
					
						commit
						1c85d86d19
					
				| 
						 | 
					@ -33,6 +33,7 @@ module ServiceParams
 | 
				
			||||||
    :issues_url,
 | 
					    :issues_url,
 | 
				
			||||||
    :jira_issue_transition_id,
 | 
					    :jira_issue_transition_id,
 | 
				
			||||||
    :merge_requests_events,
 | 
					    :merge_requests_events,
 | 
				
			||||||
 | 
					    :mock_service_url,
 | 
				
			||||||
    :namespace,
 | 
					    :namespace,
 | 
				
			||||||
    :new_issue_url,
 | 
					    :new_issue_url,
 | 
				
			||||||
    :notify,
 | 
					    :notify,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,82 @@
 | 
				
			||||||
 | 
					# For an example companion mocking service, see https://gitlab.com/gitlab-org/gitlab-mock-ci-service
 | 
				
			||||||
 | 
					class MockCiService < CiService
 | 
				
			||||||
 | 
					  ALLOWED_STATES = %w[failed canceled running pending success success_with_warnings skipped not_found].freeze
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  prop_accessor :mock_service_url
 | 
				
			||||||
 | 
					  validates :mock_service_url, presence: true, url: true, if: :activated?
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  def title
 | 
				
			||||||
 | 
					    'MockCI'
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  def description
 | 
				
			||||||
 | 
					    'Mock an external CI'
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  def self.to_param
 | 
				
			||||||
 | 
					    'mock_ci'
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  def fields
 | 
				
			||||||
 | 
					    [
 | 
				
			||||||
 | 
					      { type: 'text',
 | 
				
			||||||
 | 
					        name: 'mock_service_url',
 | 
				
			||||||
 | 
					        placeholder: 'http://localhost:4004' },
 | 
				
			||||||
 | 
					    ]
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  # Return complete url to build page
 | 
				
			||||||
 | 
					  #
 | 
				
			||||||
 | 
					  # Ex.
 | 
				
			||||||
 | 
					  #   http://jenkins.example.com:8888/job/test1/scm/bySHA1/12d65c
 | 
				
			||||||
 | 
					  #
 | 
				
			||||||
 | 
					  def build_page(sha, ref)
 | 
				
			||||||
 | 
					    url = [mock_service_url,
 | 
				
			||||||
 | 
					           "#{project.namespace.path}/#{project.path}/status/#{sha}"]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    URI.join(*url).to_s
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  # Return string with build status or :error symbol
 | 
				
			||||||
 | 
					  #
 | 
				
			||||||
 | 
					  # Allowed states: 'success', 'failed', 'running', 'pending', 'skipped'
 | 
				
			||||||
 | 
					  #
 | 
				
			||||||
 | 
					  #
 | 
				
			||||||
 | 
					  # Ex.
 | 
				
			||||||
 | 
					  #   @service.commit_status('13be4ac', 'master')
 | 
				
			||||||
 | 
					  #   # => 'success'
 | 
				
			||||||
 | 
					  #
 | 
				
			||||||
 | 
					  #   @service.commit_status('2abe4ac', 'dev')
 | 
				
			||||||
 | 
					  #   # => 'running'
 | 
				
			||||||
 | 
					  #
 | 
				
			||||||
 | 
					  #
 | 
				
			||||||
 | 
					  def commit_status(sha, ref)
 | 
				
			||||||
 | 
					    response = HTTParty.get(commit_status_path(sha), verify: false)
 | 
				
			||||||
 | 
					    read_commit_status(response)
 | 
				
			||||||
 | 
					  rescue Errno::ECONNREFUSED
 | 
				
			||||||
 | 
					    :error
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  def commit_status_path(sha)
 | 
				
			||||||
 | 
					    url = [mock_service_url,
 | 
				
			||||||
 | 
					           "#{project.namespace.path}/#{project.path}/status/#{sha}.json"]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    URI.join(*url).to_s
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  def read_commit_status(response)
 | 
				
			||||||
 | 
					    return :error unless response.code == 200 || response.code == 404
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    status = if response.code == 404
 | 
				
			||||||
 | 
					               'pending'
 | 
				
			||||||
 | 
					             else
 | 
				
			||||||
 | 
					               response['status']
 | 
				
			||||||
 | 
					             end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if status.present? && ALLOWED_STATES.include?(status)
 | 
				
			||||||
 | 
					      status
 | 
				
			||||||
 | 
					    else
 | 
				
			||||||
 | 
					      :error
 | 
				
			||||||
 | 
					    end
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
 | 
					end
 | 
				
			||||||
| 
						 | 
					@ -210,7 +210,7 @@ class Service < ActiveRecord::Base
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  def self.available_services_names
 | 
					  def self.available_services_names
 | 
				
			||||||
    %w[
 | 
					    service_names = %w[
 | 
				
			||||||
      asana
 | 
					      asana
 | 
				
			||||||
      assembla
 | 
					      assembla
 | 
				
			||||||
      bamboo
 | 
					      bamboo
 | 
				
			||||||
| 
						 | 
					@ -238,6 +238,9 @@ class Service < ActiveRecord::Base
 | 
				
			||||||
      slack
 | 
					      slack
 | 
				
			||||||
      teamcity
 | 
					      teamcity
 | 
				
			||||||
    ]
 | 
					    ]
 | 
				
			||||||
 | 
					    service_names << 'mock_ci' if Rails.env.development?
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    service_names.sort_by(&:downcase)
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  def self.build_from_template(project_id, template)
 | 
					  def self.build_from_template(project_id, template)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,4 @@
 | 
				
			||||||
 | 
					---
 | 
				
			||||||
 | 
					title: Add Mock CI service/integration for development
 | 
				
			||||||
 | 
					merge_request:
 | 
				
			||||||
 | 
					author:
 | 
				
			||||||
| 
						 | 
					@ -810,3 +810,38 @@ GET /projects/:id/services/teamcity
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[jira-doc]: ../user/project/integrations/jira.md
 | 
					[jira-doc]: ../user/project/integrations/jira.md
 | 
				
			||||||
[old-jira-api]: https://gitlab.com/gitlab-org/gitlab-ce/blob/8-13-stable/doc/api/services.md#jira
 | 
					[old-jira-api]: https://gitlab.com/gitlab-org/gitlab-ce/blob/8-13-stable/doc/api/services.md#jira
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## MockCI
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Mock an external CI. See [`gitlab-org/gitlab-mock-ci-service`](https://gitlab.com/gitlab-org/gitlab-mock-ci-service) for an example of a companion mock service.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					This service is only available when your environment is set to development.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### Create/Edit MockCI service
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Set MockCI service for a project.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					PUT /projects/:id/services/mock-ci
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Parameters:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					- `mock_service_url` (**required**) - http://localhost:4004
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### Delete MockCI service
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Delete MockCI service for a project.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					DELETE /projects/:id/services/mock-ci
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### Get MockCI service settings
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Get MockCI service settings for a project.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					GET /projects/:id/services/mock-ci
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -2,11 +2,12 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
This document describes what services we use for testing GitLab and GitLab CI.
 | 
					This document describes what services we use for testing GitLab and GitLab CI.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
We currently use three CI services to test GitLab:
 | 
					We currently use four CI services to test GitLab:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
1. GitLab CI on [GitHost.io](https://gitlab-ce.githost.io/projects/4/) for the [GitLab.com repo](https://gitlab.com/gitlab-org/gitlab-ce)
 | 
					1. GitLab CI on [GitHost.io](https://gitlab-ce.githost.io/projects/4/) for the [GitLab.com repo](https://gitlab.com/gitlab-org/gitlab-ce)
 | 
				
			||||||
2. GitLab CI at ci.gitlab.org to test the private GitLab B.V. repo at dev.gitlab.org
 | 
					2. GitLab CI at ci.gitlab.org to test the private GitLab B.V. repo at dev.gitlab.org
 | 
				
			||||||
3. [Semephore](https://semaphoreapp.com/gitlabhq/gitlabhq/) for [GitHub.com repo](https://github.com/gitlabhq/gitlabhq)
 | 
					3. [Semephore](https://semaphoreapp.com/gitlabhq/gitlabhq/) for [GitHub.com repo](https://github.com/gitlabhq/gitlabhq)
 | 
				
			||||||
 | 
					4. [Mock CI Service](user/project/integrations/mock_ci.md) for local development
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| Software @ configuration being tested | GitLab CI (ci.gitlab.org) | GitLab CI (GitHost.io) | Semaphore |
 | 
					| Software @ configuration being tested | GitLab CI (ci.gitlab.org) | GitLab CI (GitHost.io) | Semaphore |
 | 
				
			||||||
|---------------------------------------|---------------------------|---------------------------------------------------------------------------|-----------|
 | 
					|---------------------------------------|---------------------------|---------------------------------------------------------------------------|-----------|
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,13 @@
 | 
				
			||||||
 | 
					# Mock CI Service
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					**NB: This service is only listed if you are in a development environment!**
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					To setup the mock CI service server, respond to the following endpoints
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					- `commit_status`: `#{project.namespace.path}/#{project.path}/status/#{sha}.json`
 | 
				
			||||||
 | 
					   - Have your service return `200 { status: ['failed'|'canceled'|'running'|'pending'|'success'|'success_with_warnings'|'skipped'|'not_found'] }`
 | 
				
			||||||
 | 
					   - If the service returns a 404, it is interpreted as `pending`
 | 
				
			||||||
 | 
					- `build_page`: `#{project.namespace.path}/#{project.path}/status/#{sha}`
 | 
				
			||||||
 | 
					   - Just where the build is linked to, doesn't matter if implemented
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					For an example of a mock CI server, see [`gitlab-org/gitlab-mock-ci-service`](https://gitlab.com/gitlab-org/gitlab-mock-ci-service)
 | 
				
			||||||
| 
						 | 
					@ -563,7 +563,20 @@ module API
 | 
				
			||||||
      SlackService,
 | 
					      SlackService,
 | 
				
			||||||
      MattermostService,
 | 
					      MattermostService,
 | 
				
			||||||
      TeamcityService,
 | 
					      TeamcityService,
 | 
				
			||||||
    ].freeze
 | 
					    ]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if Rails.env.development?
 | 
				
			||||||
 | 
					      services['mock-ci'] = [
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					          required: true,
 | 
				
			||||||
 | 
					          name: :mock_service_url,
 | 
				
			||||||
 | 
					          type: String,
 | 
				
			||||||
 | 
					          desc: 'URL to the mock service'
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      ]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      service_classes << MockCiService
 | 
				
			||||||
 | 
					    end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    trigger_services = {
 | 
					    trigger_services = {
 | 
				
			||||||
      'mattermost-slash-commands' => [
 | 
					      'mattermost-slash-commands' => [
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue