Skip to content
Snippets Groups Projects
Commit d179f002 authored by Rubén Dávila's avatar Rubén Dávila
Browse files

CE backport for creating CI/CD projects from GitHub

parent 42725ea9
No related branches found
No related tags found
No related merge requests found
import { __ } from './locale';
import _ from 'underscore';
import { __, sprintf } from './locale';
import axios from './lib/utils/axios_utils';
import flash from './flash';
import { convertPermissionToBoolean } from './lib/utils/common_utils';
 
class ImporterStatus {
constructor(jobsUrl, importUrl) {
constructor({ jobsUrl, importUrl, ciCdOnly }) {
this.jobsUrl = jobsUrl;
this.importUrl = importUrl;
this.ciCdOnly = ciCdOnly;
this.initStatusPage();
this.setAutoUpdate();
}
Loading
Loading
@@ -45,6 +48,7 @@ class ImporterStatus {
repo_id: id,
target_namespace: targetNamespace,
new_name: newName,
ci_cd_only: this.ciCdOnly,
})
.then(({ data }) => {
const job = $(`tr#repo_${id}`);
Loading
Loading
@@ -54,7 +58,13 @@ class ImporterStatus {
$('table.import-jobs tbody').prepend(job);
 
job.addClass('active');
job.find('.import-actions').html('<i class="fa fa-spinner fa-spin" aria-label="importing"></i> started');
const connectingVerb = this.ciCdOnly ? __('connecting') : __('importing');
job.find('.import-actions').html(sprintf(
_.escape(__('%{loadingIcon} Started')), {
loadingIcon: `<i class="fa fa-spinner fa-spin" aria-label="${_.escape(connectingVerb)}"></i>`,
},
false,
));
})
.catch(() => flash(__('An error occurred while importing project')));
}
Loading
Loading
@@ -71,13 +81,16 @@ class ImporterStatus {
switch (job.import_status) {
case 'finished':
jobItem.removeClass('active').addClass('success');
statusField.html('<span><i class="fa fa-check"></i> done</span>');
statusField.html(`<span><i class="fa fa-check"></i> ${__('Done')}</span>`);
break;
case 'scheduled':
statusField.html(`${spinner} scheduled`);
statusField.html(`${spinner} ${__('Scheduled')}`);
break;
case 'started':
statusField.html(`${spinner} started`);
statusField.html(`${spinner} ${__('Started')}`);
break;
case 'failed':
statusField.html(__('Failed'));
break;
default:
statusField.html(job.import_status);
Loading
Loading
@@ -98,7 +111,11 @@ function initImporterStatus() {
 
if (importerStatus) {
const data = importerStatus.dataset;
return new ImporterStatus(data.jobsImportPath, data.importPath);
return new ImporterStatus({
jobsUrl: data.jobsImportPath,
importUrl: data.importPath,
ciCdOnly: convertPermissionToBoolean(data.ciCdOnly),
});
}
}
 
Loading
Loading
Loading
Loading
@@ -42,7 +42,9 @@ class Import::GithubController < Import::BaseController
target_namespace = find_or_create_namespace(namespace_path, current_user.namespace_path)
 
if can?(current_user, :create_projects, target_namespace)
project = Gitlab::LegacyGithubImport::ProjectCreator.new(repo, project_name, target_namespace, current_user, access_params, type: provider).execute
project = Gitlab::LegacyGithubImport::ProjectCreator
.new(repo, project_name, target_namespace, current_user, access_params, type: provider)
.execute(extra_project_attrs)
 
if project.persisted?
render json: ProjectSerializer.new.represent(project)
Loading
Loading
@@ -73,15 +75,15 @@ class Import::GithubController < Import::BaseController
end
 
def new_import_url
public_send("new_import_#{provider}_url") # rubocop:disable GitlabSecurity/PublicSend
public_send("new_import_#{provider}_url", extra_import_params) # rubocop:disable GitlabSecurity/PublicSend
end
 
def status_import_url
public_send("status_import_#{provider}_url") # rubocop:disable GitlabSecurity/PublicSend
public_send("status_import_#{provider}_url", extra_import_params) # rubocop:disable GitlabSecurity/PublicSend
end
 
def callback_import_url
public_send("callback_import_#{provider}_url") # rubocop:disable GitlabSecurity/PublicSend
public_send("callback_import_#{provider}_url", extra_import_params) # rubocop:disable GitlabSecurity/PublicSend
end
 
def provider_unauthorized
Loading
Loading
@@ -116,4 +118,12 @@ class Import::GithubController < Import::BaseController
def client_options
{}
end
def extra_project_attrs
{}
end
def extra_import_params
{}
end
end
Loading
Loading
@@ -36,6 +36,42 @@ module ImportHelper
_('Please wait while we import the repository for you. Refresh at will.')
end
 
def import_github_title
_('Import repositories from GitHub')
end
def import_github_authorize_message
_('To import GitHub repositories, you first need to authorize GitLab to access the list of your GitHub repositories:')
end
def import_github_personal_access_token_message
personal_access_token_link = link_to _('Personal Access Token'), 'https://github.com/settings/tokens'
if github_import_configured?
_('Alternatively, you can use a %{personal_access_token_link}. When you create your Personal Access Token, you will need to select the <code>repo</code> scope, so we can display a list of your public and private repositories which are available to import.').html_safe % { personal_access_token_link: personal_access_token_link }
else
_('To import GitHub repositories, you can use a %{personal_access_token_link}. When you create your Personal Access Token, you will need to select the <code>repo</code> scope, so we can display a list of your public and private repositories which are available to import.').html_safe % { personal_access_token_link: personal_access_token_link }
end
end
def import_configure_github_admin_message
github_integration_link = link_to 'GitHub integration', help_page_path('integration/github')
if current_user.admin?
_('Note: As an administrator you may like to configure %{github_integration_link}, which will allow login via GitHub and allow importing repositories without generating a Personal Access Token.').html_safe % { github_integration_link: github_integration_link }
else
_('Note: Consider asking your GitLab administrator to configure %{github_integration_link}, which will allow login via GitHub and allow importing repositories without generating a Personal Access Token.').html_safe % { github_integration_link: github_integration_link }
end
end
def import_githubish_choose_repository_message
_('Choose which repositories you want to import.')
end
def import_all_githubish_repositories_button_label
_('Import all repositories')
end
private
 
def github_project_url(full_path)
Loading
Loading
Loading
Loading
@@ -2,11 +2,11 @@
- provider_title = Gitlab::ImportSources.title(provider)
 
%p.light
Select projects you want to import.
= import_githubish_choose_repository_message
%hr
%p
= button_tag class: "btn btn-import btn-success js-import-all" do
Import all projects
= import_all_githubish_repositories_button_label
= icon("spinner spin", class: "loading-icon")
 
.table-responsive
Loading
Loading
@@ -16,9 +16,9 @@
%colgroup.import-jobs-status-col
%thead
%tr
%th From #{provider_title}
%th To GitLab
%th Status
%th= _('From %{provider_title}') % { provider_title: provider_title }
%th= _('To GitLab')
%th= _('Status')
%tbody
- @already_added_projects.each do |project|
%tr{ id: "project_#{project.id}", class: "#{project_status_css_class(project.import_status)}" }
Loading
Loading
@@ -30,10 +30,12 @@
- if project.import_status == 'finished'
%span
%i.fa.fa-check
done
= _('Done')
- elsif project.import_status == 'started'
%i.fa.fa-spinner.fa-spin
started
= _('Started')
- elsif project.import_status == 'failed'
= _('Failed')
- else
= project.human_import_status_name
 
Loading
Loading
@@ -55,7 +57,9 @@
= text_field_tag :path, repo.name, class: "input-mini form-control", tabindex: 2, autofocus: true, required: true
%td.import-actions.job-status
= button_tag class: "btn btn-import js-add-to-import" do
Import
= has_ci_cd_only_params? ? _('Connect') : _('Import')
= icon("spinner spin", class: "loading-icon")
 
.js-importer-status{ data: { jobs_import_path: "#{url_for([:jobs, :import, provider])}", import_path: "#{url_for([:import, provider])}" } }
.js-importer-status{ data: { jobs_import_path: "#{url_for([:jobs, :import, provider])}",
import_path: "#{url_for([:import, provider])}",
ci_cd_only: "#{has_ci_cd_only_params?}" } }
- page_title "GitHub Import"
- title = has_ci_cd_only_params? ? _('Connect repositories from GitHub') : _('GitHub import')
- page_title title
- breadcrumb_title title
- header_title "Projects", root_path
 
%h3.page-title
= icon 'github', text: 'Import Projects from GitHub'
= icon 'github', text: import_github_title
 
- if github_import_configured?
%p
To import a GitHub project, you first need to authorize GitLab to access
the list of your GitHub repositories:
= import_github_authorize_message
 
= link_to 'List your GitHub repositories', status_import_github_path, class: 'btn btn-success'
= link_to _('List your GitHub repositories'), status_import_github_path, class: 'btn btn-success'
 
%hr
 
%p
- if github_import_configured?
Alternatively,
- else
To import a GitHub project,
you can use a
= succeed '.' do
= link_to 'Personal Access Token', 'https://github.com/settings/tokens'
When you create your Personal Access Token,
you will need to select the <code>repo</code> scope, so we can display a
list of your public and private repositories which are available for import.
= import_github_personal_access_token_message
 
= form_tag personal_access_token_import_github_path, method: :post, class: 'form-inline' do
.form-group
= text_field_tag :personal_access_token, '', class: 'form-control', placeholder: "Personal Access Token", size: 40
= submit_tag 'List your GitHub repositories', class: 'btn btn-success'
= text_field_tag :personal_access_token, '', class: 'form-control', placeholder: _('Personal Access Token'), size: 40
= submit_tag _('List your GitHub repositories'), class: 'btn btn-success'
-# EE-specific start
-# EE-specific end
 
- unless github_import_configured?
%hr
%p
Note:
- if current_user.admin?
As an administrator you may like to configure
- else
Consider asking your GitLab administrator to configure
= link_to 'GitHub integration', help_page_path("integration/github")
which will allow login via GitHub and allow importing projects without
generating a Personal Access Token.
= import_configure_github_admin_message
- page_title "GitHub Import"
- title = has_ci_cd_only_params? ? _('Connect repositories from GitHub') : _('GitHub import')
- page_title title
- breadcrumb_title title
- header_title "Projects", root_path
%h3.page-title
= icon 'github', text: 'Import Projects from GitHub'
= icon 'github', text: import_github_title
 
= render 'import/githubish_status', provider: 'github'
Loading
Loading
@@ -73,7 +73,7 @@
= icon('gitlab', text: 'GitLab export')
%div
- if github_import_enabled?
= link_to new_import_github_path, class: 'btn import_github' do
= link_to new_import_github_path, class: 'btn js-import-github' do
= icon('github', text: 'GitHub')
%div
- if bitbucket_import_enabled?
Loading
Loading
Loading
Loading
@@ -12,9 +12,8 @@ module Gitlab
@type = type
end
 
def execute
::Projects::CreateService.new(
current_user,
def execute(extra_attrs = {})
attrs = {
name: name,
path: name,
description: repo.description,
Loading
Loading
@@ -24,7 +23,9 @@ module Gitlab
import_source: repo.full_name,
import_url: import_url,
skip_wiki: skip_wiki
).execute
}.merge!(extra_attrs)
::Projects::CreateService.new(current_user, attrs).execute
end
 
private
Loading
Loading
Loading
Loading
@@ -8,8 +8,8 @@ msgid ""
msgstr ""
"Project-Id-Version: gitlab 1.0.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-03-05 13:02-0600\n"
"PO-Revision-Date: 2018-03-05 13:02-0600\n"
"POT-Creation-Date: 2018-03-05 17:10-0600\n"
"PO-Revision-Date: 2018-03-05 17:10-0600\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"Language: \n"
Loading
Loading
@@ -59,6 +59,9 @@ msgid_plural "%{count} participants"
msgstr[0] ""
msgstr[1] ""
 
msgid "%{loadingIcon} Started"
msgstr ""
msgid "%{number_commits_behind} commits behind %{default_branch}, %{number_commits_ahead} commits ahead"
msgstr ""
 
Loading
Loading
@@ -210,6 +213,9 @@ msgstr ""
msgid "Allows you to add and manage Kubernetes clusters."
msgstr ""
 
msgid "Alternatively, you can use a %{personal_access_token_link}. When you create your Personal Access Token, you will need to select the <code>repo</code> scope, so we can display a list of your public and private repositories which are available to import."
msgstr ""
msgid "An error occurred previewing the blob"
msgstr ""
 
Loading
Loading
@@ -288,9 +294,6 @@ msgstr ""
msgid "Are you sure you want to delete this pipeline schedule?"
msgstr ""
 
msgid "Are you sure you want to discard your changes?"
msgstr ""
msgid "Are you sure you want to reset registration token?"
msgstr ""
 
Loading
Loading
@@ -392,9 +395,6 @@ msgstr[1] ""
msgid "Branch <strong>%{branch_name}</strong> was created. To set up auto deploy, choose a GitLab CI Yaml template and commit your changes. %{link_to_autodeploy_doc}"
msgstr ""
 
msgid "Branch has changed"
msgstr ""
msgid "Branch is already taken"
msgstr ""
 
Loading
Loading
@@ -512,9 +512,6 @@ msgstr ""
msgid "Cancel"
msgstr ""
 
msgid "Cancel edit"
msgstr ""
msgid "Cannot modify managed Kubernetes cluster"
msgstr ""
 
Loading
Loading
@@ -569,6 +566,9 @@ msgstr ""
msgid "Choose file..."
msgstr ""
 
msgid "Choose which repositories you want to import."
msgstr ""
msgid "CiStatusLabel|canceled"
msgstr ""
 
Loading
Loading
@@ -662,6 +662,9 @@ msgstr ""
msgid "Clone repository"
msgstr ""
 
msgid "Close"
msgstr ""
msgid "ClusterIntegration|%{appList} was successfully installed on your Kubernetes cluster"
msgstr ""
 
Loading
Loading
@@ -1032,6 +1035,12 @@ msgstr ""
msgid "Confidentiality"
msgstr ""
 
msgid "Connect"
msgstr ""
msgid "Connect repositories from GitHub"
msgstr ""
msgid "Container Registry"
msgstr ""
 
Loading
Loading
@@ -1128,9 +1137,6 @@ msgstr ""
msgid "Create empty bare repository"
msgstr ""
 
msgid "Create file"
msgstr ""
msgid "Create lists from labels. Issues with that label appear in that list."
msgstr ""
 
Loading
Loading
@@ -1140,15 +1146,6 @@ msgstr ""
msgid "Create merge request and branch"
msgstr ""
 
msgid "Create new branch"
msgstr ""
msgid "Create new directory"
msgstr ""
msgid "Create new file"
msgstr ""
msgid "Create new label"
msgstr ""
 
Loading
Loading
@@ -1238,15 +1235,15 @@ msgstr ""
msgid "Directory name"
msgstr ""
 
msgid "Discard changes"
msgstr ""
msgid "Dismiss Cycle Analytics introduction box"
msgstr ""
 
msgid "Don't show again"
msgstr ""
 
msgid "Done"
msgstr ""
msgid "Download"
msgstr ""
 
Loading
Loading
@@ -1397,6 +1394,9 @@ msgstr ""
msgid "Explore public groups"
msgstr ""
 
msgid "Failed"
msgstr ""
msgid "Failed Jobs"
msgstr ""
 
Loading
Loading
@@ -1421,9 +1421,6 @@ msgstr ""
msgid "Fields on this page are now uneditable, you can configure"
msgstr ""
 
msgid "File name"
msgstr ""
msgid "Files"
msgstr ""
 
Loading
Loading
@@ -1462,6 +1459,9 @@ msgstr ""
msgid "Format"
msgstr ""
 
msgid "From %{provider_title}"
msgstr ""
msgid "From issue creation until deploy to production"
msgstr ""
 
Loading
Loading
@@ -1489,12 +1489,18 @@ msgstr ""
msgid "Git version"
msgstr ""
 
msgid "GitHub import"
msgstr ""
msgid "GitLab Runner section"
msgstr ""
 
msgid "Gitaly Servers"
msgstr ""
 
msgid "Go back"
msgstr ""
msgid "Go to your fork"
msgstr ""
 
Loading
Loading
@@ -1608,9 +1614,18 @@ msgstr ""
msgid "If your HTTP repository is not publicly accessible, add authentication information to the URL: <code>https://username:password@gitlab.company.com/group/project.git</code>."
msgstr ""
 
msgid "Import"
msgstr ""
msgid "Import all repositories"
msgstr ""
msgid "Import in progress"
msgstr ""
 
msgid "Import repositories from GitHub"
msgstr ""
msgid "Import repository"
msgstr ""
 
Loading
Loading
@@ -1701,6 +1716,15 @@ msgstr ""
msgid "LFSStatus|Enabled"
msgstr ""
 
msgid "Label"
msgstr ""
msgid "LabelSelect|%{firstLabelName} +%{remainingLabelCount} more"
msgstr ""
msgid "LabelSelect|%{labelsString}, and %{remainingLabelCount} more"
msgstr ""
msgid "Labels"
msgstr ""
 
Loading
Loading
@@ -1760,7 +1784,7 @@ msgstr ""
msgid "Leave project"
msgstr ""
 
msgid "Loading the GitLab IDE..."
msgid "List your GitHub repositories"
msgstr ""
 
msgid "Lock"
Loading
Loading
@@ -1954,6 +1978,12 @@ msgstr ""
msgid "Note that the master branch is automatically protected. %{link_to_protected_branches}"
msgstr ""
 
msgid "Note: As an administrator you may like to configure %{github_integration_link}, which will allow login via GitHub and allow importing repositories without generating a Personal Access Token."
msgstr ""
msgid "Note: Consider asking your GitLab administrator to configure %{github_integration_link}, which will allow login via GitHub and allow importing repositories without generating a Personal Access Token."
msgstr ""
msgid "Notification events"
msgstr ""
 
Loading
Loading
@@ -2071,6 +2101,9 @@ msgstr ""
msgid "Password"
msgstr ""
 
msgid "Personal Access Token"
msgstr ""
msgid "Pipeline"
msgstr ""
 
Loading
Loading
@@ -2505,12 +2538,18 @@ msgstr ""
msgid "Schedule a new pipeline"
msgstr ""
 
msgid "Scheduled"
msgstr ""
msgid "Schedules"
msgstr ""
 
msgid "Scheduling Pipelines"
msgstr ""
 
msgid "Search"
msgstr ""
msgid "Search branches and tags"
msgstr ""
 
Loading
Loading
@@ -2753,6 +2792,12 @@ msgstr ""
msgid "Start the Runner!"
msgstr ""
 
msgid "Started"
msgstr ""
msgid "Status"
msgstr ""
msgid "Stopped"
msgstr ""
 
Loading
Loading
@@ -3170,6 +3215,15 @@ msgstr ""
msgid "Tip:"
msgstr ""
 
msgid "To GitLab"
msgstr ""
msgid "To import GitHub repositories, you can use a %{personal_access_token_link}. When you create your Personal Access Token, you will need to select the <code>repo</code> scope, so we can display a list of your public and private repositories which are available to import."
msgstr ""
msgid "To import GitHub repositories, you first need to authorize GitLab to access the list of your GitHub repositories:"
msgstr ""
msgid "To import an SVN repository, check out %{svn_link}."
msgstr ""
 
Loading
Loading
@@ -3278,9 +3332,6 @@ msgstr ""
msgid "We want to be sure it is you, please confirm you are not a robot."
msgstr ""
 
msgid "Web IDE"
msgstr ""
msgid "Wiki"
msgstr ""
 
Loading
Loading
@@ -3395,13 +3446,13 @@ msgstr ""
msgid "You are going to remove %{group_name}. Removed groups CANNOT be restored! Are you ABSOLUTELY sure?"
msgstr ""
 
msgid "You are going to remove %{project_name_with_namespace}. Removed project CANNOT be restored! Are you ABSOLUTELY sure?"
msgid "You are going to remove %{project_full_name}. Removed project CANNOT be restored! Are you ABSOLUTELY sure?"
msgstr ""
 
msgid "You are going to remove the fork relationship to source project %{forked_from_project}. Are you ABSOLUTELY sure?"
msgstr ""
 
msgid "You are going to transfer %{project_name_with_namespace} to another owner. Are you ABSOLUTELY sure?"
msgid "You are going to transfer %{project_full_name} to another owner. Are you ABSOLUTELY sure?"
msgstr ""
 
msgid "You are on a read-only GitLab instance."
Loading
Loading
@@ -3497,6 +3548,9 @@ msgstr ""
msgid "confidentiality|You are going to turn on the confidentiality. This means that only team members with <strong>at least Reporter access</strong> are able to see and leave comments on the issue."
msgstr ""
 
msgid "connecting"
msgstr ""
msgid "day"
msgid_plural "days"
msgstr[0] ""
Loading
Loading
@@ -3505,6 +3559,9 @@ msgstr[1] ""
msgid "estimateCommand|%{slash_command} will update the estimated time with the latest command."
msgstr ""
 
msgid "importing"
msgstr ""
msgid "merge request"
msgid_plural "merge requests"
msgstr[0] ""
Loading
Loading
Loading
Loading
@@ -173,11 +173,11 @@ feature 'New project' do
 
context 'from GitHub' do
before do
first('.import_github').click
first('.js-import-github').click
end
 
it 'shows import instructions' do
expect(page).to have_content('Import Projects from GitHub')
expect(page).to have_content('Import repositories from GitHub')
expect(current_path).to eq new_import_github_path
end
end
Loading
Loading
Loading
Loading
@@ -29,7 +29,10 @@ describe('Importer Status', () => {
`);
spyOn(ImporterStatus.prototype, 'initStatusPage').and.callFake(() => {});
spyOn(ImporterStatus.prototype, 'setAutoUpdate').and.callFake(() => {});
instance = new ImporterStatus('', importUrl);
instance = new ImporterStatus({
jobsUrl: '',
importUrl,
});
});
 
it('sets table row to active after post request', (done) => {
Loading
Loading
@@ -65,7 +68,9 @@ describe('Importer Status', () => {
 
spyOn(ImporterStatus.prototype, 'initStatusPage').and.callFake(() => {});
spyOn(ImporterStatus.prototype, 'setAutoUpdate').and.callFake(() => {});
instance = new ImporterStatus(jobsUrl);
instance = new ImporterStatus({
jobsUrl,
});
});
 
function setupMock(importStatus) {
Loading
Loading
@@ -86,17 +91,17 @@ describe('Importer Status', () => {
 
it('sets the job status to done', (done) => {
setupMock('finished');
expectJobStatus(done, 'done');
expectJobStatus(done, 'Done');
});
 
it('sets the job status to scheduled', (done) => {
setupMock('scheduled');
expectJobStatus(done, 'scheduled');
expectJobStatus(done, 'Scheduled');
});
 
it('sets the job status to started', (done) => {
setupMock('started');
expectJobStatus(done, 'started');
expectJobStatus(done, 'Started');
});
 
it('sets the job status to custom status', (done) => {
Loading
Loading
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment