summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/api/entities.rb5
-rw-r--r--lib/api/projects.rb111
-rw-r--r--lib/gitlab_ci_yaml_processor.rb106
3 files changed, 106 insertions, 116 deletions
diff --git a/lib/api/entities.rb b/lib/api/entities.rb
index 7417ef5..2089e23 100644
--- a/lib/api/entities.rb
+++ b/lib/api/entities.rb
@@ -29,11 +29,6 @@ module API
expose :id, :project_id, :url
end
- class Job < Grape::Entity
- expose :id, :project_id, :commands, :active, :name, :build_branches,
- :build_tags, :tags, :job_type, :tag_list
- end
-
class DeployJob < Grape::Entity
expose :id, :project_id, :commands, :active, :name,
:refs, :tags, :job_type, :refs, :tag_list
diff --git a/lib/api/projects.rb b/lib/api/projects.rb
index ea2ceeb..3ca099a 100644
--- a/lib/api/projects.rb
+++ b/lib/api/projects.rb
@@ -28,116 +28,6 @@ module API
end
end
- # Retrieve all jobs for a project
- #
- # Parameters
- # id (required) - The ID of a project
- # Example Request
- # GET /projects/:id/jobs
- get ":id/jobs" do
- project = Project.find(params[:id])
-
- unauthorized! unless current_user.can_manage_project?(project.gitlab_id)
-
- project.jobs
- end
-
- # Add a new job to a project
- #
- # Parameters
- # id (required) - The ID of a project
- # name (required) - The job name
- # commands (required) - The command line script for the job
- # active (optional) - The command is active of not
- # build_branches (optional) - Trigger commit builds
- # build_tags (optional) - Trigger tag builds
- # tags (optional) - The tags associated with this job
- # Example Request
- # POST /projects/:id/jobs
- post ":id/jobs" do
- required_attributes! [:name, :commands]
-
- project = Project.find(params[:id])
-
- unauthorized! unless current_user.can_manage_project?(project.gitlab_id)
-
- job_params =
- {
- name: params[:name],
- commands: params[:commands],
- }
-
- job_params[:active] = params[:active] unless params[:active].nil?
- job_params[:build_branches] = params[:build_branches] unless params[:build_branches].nil?
- job_params[:build_tags] = params[:build_tags] unless params[:build_tags].nil?
- job_params[:tag_list] = params[:tags] unless params[:tags].nil?
-
- job = project.jobs.new(job_params)
- if job.save
- present job, with: Entities::Job
- else
- errors = job.errors.full_messages.join(", ")
- render_api_error!(errors, 400)
- end
- end
-
- # Add a new deploy job to a project
- #
- # Parameters
- # id (required) - The ID of a project
- # name (required) - The job name
- # commands (required) - The command line script for the job
- # active (optional) - The command is active of not
- # refs (optional) - The list of refs
- # tags (optional) - The tags associated with this job
- # Example Request
- # POST /projects/:id/deploy_jobs
- post ":id/deploy_jobs" do
- required_attributes! [:name, :commands]
-
- project = Project.find(params[:id])
-
- unauthorized! unless current_user.can_manage_project?(project.gitlab_id)
-
- job_params =
- {
- name: params[:name],
- commands: params[:commands],
- job_type: "deploy"
- }
-
- job_params[:active] = params[:active] unless params[:active].nil?
- job_params[:refs] = params[:refs] unless params[:refs].nil?
- job_params[:tag_list] = params[:tags] unless params[:tags].nil?
-
- job = project.jobs.new(job_params)
- if job.save
- present job, with: Entities::DeployJob
- else
- errors = job.errors.full_messages.join(", ")
- render_api_error!(errors, 400)
- end
- end
-
- # Delete a job for a project
- #
- # Parameters
- # id (required) - The ID of a project
- # job_id (required) - The ID of the job to delete
- # Example Request
- # DELETE /projects/:id/jobs/:job_id
- delete ":id/jobs/:job_id" do
- required_attributes! [:job_id]
-
- project = Project.find(params[:id])
-
- unauthorized! unless current_user.can_manage_project?(project.gitlab_id)
-
- job = project.jobs.find(params[:job_id])
-
- job.destroy
- end
-
# Retrieve all Gitlab CI projects that the user has access to
#
# Example Request:
@@ -204,7 +94,6 @@ module API
project = Project.new(filtered_params)
project.build_missing_services
- project.build_default_job
if project.save
present project, with: Entities::Project
diff --git a/lib/gitlab_ci_yaml_processor.rb b/lib/gitlab_ci_yaml_processor.rb
new file mode 100644
index 0000000..3368232
--- /dev/null
+++ b/lib/gitlab_ci_yaml_processor.rb
@@ -0,0 +1,106 @@
+class GitlabCiYamlProcessor
+ attr_reader :before_script, :skip_refs
+
+ def initialize(config)
+ @config = YAML.load(config).deep_symbolize_keys
+ @skip_refs = @config[:skip_refs] || ""
+ @before_script = @config[:before_script] || []
+ @jobs = @config[:jobs] || []
+ @deploy_jobs = @config[:deploy_jobs] || []
+ end
+
+ def builds
+ normalized_jobs.map do |job|
+ {
+ name: job[:name],
+ commands: "#{normalized_script(@before_script)}\n#{job[:script]}",
+ tag_list: job[:runner],
+ branches: job[:branches],
+ tags: job[:tag]
+ }
+ end
+ end
+
+ def deploy_builds
+ normalized_deploy_jobs.map do |job|
+ {
+ name: job[:name],
+ commands: "#{normalized_script(@before_script)}\n#{job[:script]}",
+ deploy: true,
+ refs: job[:refs],
+ tag_list: job[:runner]
+ }
+ end
+ end
+
+ def create_commit_for_tag?(ref)
+ normalized_jobs.any?{|job| job[:tags] == true} ||
+ normalized_deploy_jobs.any?{|job| job[:refs].empty? || refs_matches?(job[:refs], ref)}
+ end
+
+ def deploy_builds_for_ref(ref)
+ deploy_builds.select do |build_attrs|
+ refs = build_attrs.delete(:refs)
+ refs.empty? || refs_matches?(refs, ref)
+ end
+ end
+
+ def skip_ref?(ref_name)
+ @skip_refs.split(",").each do |ref|
+ return true if File.fnmatch(ref, ref_name)
+ end
+
+ false
+ end
+
+ private
+
+ # refs - list of refs. Glob syntax is supported. Ex. ["feature*", "bug"]
+ # ref - ref that should be checked
+ def refs_matches?(refs, ref)
+ refs.each do |ref_pattern|
+ return true if File.fnmatch(ref_pattern, ref)
+ end
+
+ false
+ end
+
+ def normalized_jobs
+ @jobs.map do |job|
+ if job.is_a?(String)
+ { script: job, runner: "", name: job[0..10], branches: true, tags: true }
+ else
+ {
+ script: normalized_script(job[:script]),
+ runner: job[:runner] || "",
+ name: job[:name] || job[:script][0..10],
+ branches: job[:branches].nil? ? true : job[:branches],
+ tags: job[:tags].nil? ? true : job[:tags]
+ }
+ end
+ end
+ end
+
+ def normalized_deploy_jobs
+ @deploy_jobs.map do |job|
+ if job.is_a?(String)
+ { script: job, runner: "", refs: [], name: job[0..10].strip }
+ else
+ {
+ script: normalized_script(job[:script]),
+ refs: (job[:refs] || "").split(",").map(&:strip),
+ name: job[:name] || job[:script][0..10].strip,
+ runner: job[:runner] || "",
+ }
+ end
+ end
+ end
+
+ def normalized_script(script)
+ if script.is_a? Array
+ script.map(&:strip).join("\n")
+ else
+ script.strip
+ end
+ end
+end