diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/api/entities.rb | 5 | ||||
-rw-r--r-- | lib/api/projects.rb | 111 | ||||
-rw-r--r-- | lib/gitlab_ci_yaml_processor.rb | 106 |
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 |