2015-08-25 21:42:46 -04:00
module Ci
2015-10-06 06:01:16 -04:00
class Build < CommitStatus
2017-09-19 03:14:06 -04:00
prepend ArtifactMigratable
2016-08-08 06:01:25 -04:00
include TokenAuthenticatable
2016-10-13 06:45:16 -04:00
include AfterCommitQueue
2017-01-09 15:47:15 -05:00
include Presentable
2017-09-01 04:54:07 -04:00
include Importable
2016-08-08 06:01:25 -04:00
2016-10-18 17:20:36 -04:00
belongs_to :runner
belongs_to :trigger_request
2016-02-16 02:39:20 -05:00
belongs_to :erased_by , class_name : 'User'
2015-08-25 21:42:46 -04:00
2016-11-04 11:35:22 -04:00
has_many :deployments , as : :deployable
2017-09-21 04:34:12 -04:00
2017-01-30 19:26:40 -05:00
has_one :last_deployment , - > { order ( 'deployments.id DESC' ) } , as : :deployable , class_name : 'Deployment'
2017-09-25 12:54:08 -04:00
has_many :trace_sections , class_name : 'Ci::BuildTraceSection'
2016-11-04 11:35:22 -04:00
2017-09-21 04:34:12 -04:00
has_many :job_artifacts , class_name : 'Ci::JobArtifact' , foreign_key : :ci_job_id
has_one :job_archive , - > ( ) { where ( file_type : Ci :: JobArtifact . file_types [ :archive ] ) } , class_name : 'Ci::JobArtifact' , foreign_key : :ci_job_id
has_one :job_metadata , - > ( ) { where ( file_type : Ci :: JobArtifact . file_types [ :metadata ] ) } , class_name : 'Ci::JobArtifact' , foreign_key : :ci_job_id
2016-12-08 11:21:16 -05:00
# The "environment" field for builds is a String, and is the unexpanded name
def persisted_environment
@persisted_environment || = Environment . find_by (
name : expanded_environment_name ,
2017-03-17 19:06:11 -04:00
project : project
2016-12-08 11:21:16 -05:00
)
end
2017-07-03 10:01:41 -04:00
serialize :options # rubocop:disable Cop/ActiveRecordSerialize
serialize :yaml_variables , Gitlab :: Serializer :: Ci :: Variables # rubocop:disable Cop/ActiveRecordSerialize
2015-08-25 21:42:46 -04:00
2017-02-22 17:35:08 -05:00
delegate :name , to : :project , prefix : true
2015-08-25 21:42:46 -04:00
validates :coverage , numericality : true , allow_blank : true
2017-02-21 19:40:04 -05:00
validates :ref , presence : true
2015-08-25 21:42:46 -04:00
scope :unstarted , - > ( ) { where ( runner_id : nil ) }
2015-10-02 07:46:38 -04:00
scope :ignore_failures , - > ( ) { where ( allow_failure : false ) }
2017-09-21 04:34:12 -04:00
scope :with_artifacts , - > ( ) do
where ( '(artifacts_file IS NOT NULL AND artifacts_file <> ?) OR EXISTS (?)' , '' , Ci :: JobArtifact . select ( 1 ) . where ( 'ci_builds.id = ci_job_artifacts.ci_job_id' ) )
end
2016-07-28 01:09:40 -04:00
scope :with_artifacts_not_expired , - > ( ) { with_artifacts . where ( 'artifacts_expire_at IS NULL OR artifacts_expire_at > ?' , Time . now ) }
2016-06-08 11:18:54 -04:00
scope :with_expired_artifacts , - > ( ) { with_artifacts . where ( 'artifacts_expire_at < ?' , Time . now ) }
2016-07-07 06:56:02 -04:00
scope :last_month , - > ( ) { where ( 'created_at > ?' , Date . today - 1 . month ) }
2017-06-13 04:17:11 -04:00
scope :manual_actions , - > ( ) { where ( when : :manual , status : COMPLETED_STATUSES + [ :manual ] ) }
2017-08-29 02:56:03 -04:00
scope :ref_protected , - > { where ( protected : true ) }
2017-07-31 10:25:11 -04:00
2015-10-12 17:47:32 -04:00
mount_uploader :artifacts_file , ArtifactUploader
2015-12-30 08:41:44 -05:00
mount_uploader :artifacts_metadata , ArtifactUploader
2015-10-12 17:47:32 -04:00
2015-08-25 21:42:46 -04:00
acts_as_taggable
2016-08-08 06:01:25 -04:00
add_authentication_token_field :token
2016-06-29 05:44:39 -04:00
before_save :update_artifacts_size , if : :artifacts_file_changed?
2016-08-08 06:01:25 -04:00
before_save :ensure_token
2017-02-03 10:21:10 -05:00
before_destroy { unscoped_project }
2016-01-05 14:38:35 -05:00
2017-08-22 04:57:52 -04:00
after_create do | build |
2017-08-23 02:32:44 -04:00
run_after_commit { BuildHooksWorker . perform_async ( build . id ) }
2017-08-22 04:57:52 -04:00
end
2017-06-01 17:36:04 -04:00
after_commit :update_project_statistics_after_save , on : [ :create , :update ]
after_commit :update_project_statistics , on : :destroy
2015-08-25 21:42:46 -04:00
class << self
2017-05-16 07:41:15 -04:00
# This is needed for url_for to work,
# as the controller is JobsController
def model_name
ActiveModel :: Name . new ( self , nil , 'job' )
end
2015-08-25 21:42:46 -04:00
def first_pending
pending . unstarted . order ( 'created_at ASC' ) . first
end
2017-02-13 07:01:52 -05:00
def retry ( build , current_user )
2017-02-14 04:38:17 -05:00
Ci :: RetryBuildService
. new ( build . project , current_user )
. execute ( build )
2015-08-25 21:42:46 -04:00
end
end
2016-08-11 09:22:35 -04:00
state_machine :status do
2017-03-03 08:35:19 -05:00
event :actionize do
transition created : :manual
2017-02-28 10:48:39 -05:00
end
2016-12-14 10:06:50 -05:00
after_transition any = > [ :pending ] do | build |
build . run_after_commit do
2016-12-15 16:29:47 -05:00
BuildQueueWorker . perform_async ( id )
2016-12-14 10:06:50 -05:00
end
end
2016-02-19 11:38:47 -05:00
after_transition pending : :running do | build |
2016-10-13 06:58:25 -04:00
build . run_after_commit do
BuildHooksWorker . perform_async ( id )
end
2015-12-07 07:23:23 -05:00
end
2016-02-19 11:38:47 -05:00
after_transition any = > [ :success , :failed , :canceled ] do | build |
2016-10-13 06:58:25 -04:00
build . run_after_commit do
2016-10-14 06:53:51 -04:00
BuildFinishedWorker . perform_async ( id )
2016-10-13 06:58:25 -04:00
end
2015-08-25 21:42:46 -04:00
end
2016-06-10 17:36:54 -04:00
2016-06-14 08:44:09 -04:00
after_transition any = > [ :success ] do | build |
2016-10-13 06:58:25 -04:00
build . run_after_commit do
BuildSuccessWorker . perform_async ( id )
2016-06-10 17:36:54 -04:00
end
end
2017-07-17 07:00:32 -04:00
2017-07-17 07:30:49 -04:00
before_transition any = > [ :failed ] do | build |
2017-11-24 10:30:08 -05:00
next unless build . project
2017-07-17 07:30:49 -04:00
next if build . retries_max . zero?
2017-07-17 07:00:32 -04:00
2017-07-17 07:30:49 -04:00
if build . retries_count < build . retries_max
Ci :: Build . retry ( build , build . user )
2017-07-17 07:00:32 -04:00
end
end
2015-08-25 21:42:46 -04:00
end
2016-12-08 11:52:24 -05:00
def detailed_status ( current_user )
2016-12-13 07:24:25 -05:00
Gitlab :: Ci :: Status :: Build :: Factory
. new ( self , current_user )
. fabricate!
2016-12-08 03:51:36 -05:00
end
2016-07-16 19:48:51 -04:00
def other_actions
2016-07-20 10:38:38 -04:00
pipeline . manual_actions . where . not ( name : name )
2016-07-16 19:48:51 -04:00
end
2016-07-16 12:39:58 -04:00
def playable?
2017-06-13 04:17:11 -04:00
action? && ( manual? || complete? )
2017-02-28 10:48:39 -05:00
end
2017-03-03 08:35:19 -05:00
def action?
2017-03-02 07:45:01 -05:00
self . when == 'manual'
end
2017-02-13 07:01:52 -05:00
def play ( current_user )
2017-04-12 05:46:24 -04:00
Ci :: PlayBuildService
. new ( project , current_user )
. execute ( self )
2016-07-16 12:39:58 -04:00
end
2016-12-08 04:40:56 -05:00
def cancelable?
active?
end
2015-11-03 05:44:07 -05:00
def retryable?
2017-04-06 08:31:38 -04:00
success? || failed? || canceled?
2015-11-03 05:44:07 -05:00
end
2017-07-17 06:38:21 -04:00
def retries_count
pipeline . builds . retried . where ( name : self . name ) . count
end
def retries_max
self . options . fetch ( :retry , 0 ) . to_i
end
2015-11-03 05:44:07 -05:00
2017-04-16 07:14:39 -04:00
def latest?
! retried?
2016-03-31 13:51:28 -04:00
end
2016-11-16 18:23:05 -05:00
def expanded_environment_name
2016-12-08 11:21:16 -05:00
ExpandVariables . expand ( environment , simple_variables ) if environment
2016-11-16 18:23:05 -05:00
end
2016-11-17 06:08:28 -05:00
def has_environment?
2016-12-16 07:24:03 -05:00
environment . present?
2016-11-17 06:08:28 -05:00
end
2016-11-16 18:23:05 -05:00
def starts_environment?
2016-11-17 06:08:28 -05:00
has_environment? && self . environment_action == 'start'
2016-11-16 18:23:05 -05:00
end
def stops_environment?
2016-11-17 06:08:28 -05:00
has_environment? && self . environment_action == 'stop'
2016-11-16 18:23:05 -05:00
end
def environment_action
2016-12-08 11:52:24 -05:00
self . options . fetch ( :environment , { } ) . fetch ( :action , 'start' ) if self . options
2016-11-16 18:23:05 -05:00
end
def outdated_deployment?
success? && ! last_deployment . try ( :last? )
2016-11-04 11:35:22 -04:00
end
2016-11-02 18:25:19 -04:00
2016-01-14 13:45:43 -05:00
def depends_on_builds
# Get builds of the same type
2016-06-02 10:19:18 -04:00
latest_builds = self . pipeline . builds . latest
2016-01-14 13:45:43 -05:00
# Return builds from previous stages
latest_builds . where ( 'stage_idx < ?' , stage_idx )
end
2015-08-25 21:42:46 -04:00
def timeout
2015-12-04 06:55:23 -05:00
project . build_timeout
2015-08-25 21:42:46 -04:00
end
2017-11-06 12:47:05 -05:00
def triggered_by? ( current_user )
2017-11-06 08:20:44 -05:00
user == current_user
end
2016-12-13 14:21:30 -05:00
# A slugified version of the build ref, suitable for inclusion in URLs and
# domain names. Rules:
#
# * Lowercased
# * Anything not matching [a-z0-9-] is replaced with a -
# * Maximum length is 63 bytes
2017-07-05 08:00:22 -04:00
# * First/Last Character is not a hyphen
2016-12-13 14:21:30 -05:00
def ref_slug
2017-08-07 14:00:11 -04:00
Gitlab :: Utils . slugify ( ref . to_s )
2016-12-13 14:21:30 -05:00
end
2017-06-21 06:25:27 -04:00
# Variables whose value does not depend on environment
2016-12-08 11:21:16 -05:00
def simple_variables
2017-07-06 03:45:38 -04:00
variables ( environment : nil )
end
# All variables, including those dependent on environment, which could
# contain unexpanded variables.
def variables ( environment : persisted_environment )
2016-07-20 07:17:21 -04:00
variables = predefined_variables
2017-06-01 05:50:10 -04:00
variables += project . predefined_variables
variables += pipeline . predefined_variables
variables += runner . predefined_variables if runner
variables += project . container_registry_variables
variables += project . deployment_variables if has_environment?
2017-09-06 12:57:07 -04:00
variables += project . auto_devops_variables
2017-06-01 05:50:10 -04:00
variables += yaml_variables
variables += user_variables
2017-05-03 14:51:55 -04:00
variables += project . group . secret_variables_for ( ref , project ) . map ( & :to_runner_variable ) if project . group
2017-07-06 03:45:38 -04:00
variables += secret_variables ( environment : environment )
2017-06-28 08:29:31 -04:00
variables += trigger_request . user_variables if trigger_request
2017-07-27 09:41:21 -04:00
variables += pipeline . variables . map ( & :to_runner_variable )
2017-07-01 02:23:09 -04:00
variables += pipeline . pipeline_schedule . job_variables if pipeline . pipeline_schedule
2017-07-06 03:45:38 -04:00
variables += persisted_environment_variables if environment
2015-08-25 21:42:46 -04:00
2017-07-06 03:45:38 -04:00
variables
2016-12-08 11:21:16 -05:00
end
2017-09-27 10:01:33 -04:00
def features
{ trace_sections : true }
end
2015-12-08 00:10:17 -05:00
def merge_request
2017-05-26 04:31:42 -04:00
return @merge_request if defined? ( @merge_request )
2017-05-29 03:58:20 -04:00
2017-05-23 11:10:07 -04:00
@merge_request || =
begin
Use latest_merge_request_diff association
Compared to the merge_request_diff association:
1. It's simpler to query. The query uses a foreign key to the
merge_request_diffs table, so no ordering is necessary.
2. It's faster for preloading. The merge_request_diff association has to load
every diff for the MRs in the set, then discard all but the most recent for
each. This association means that Rails can just query for N diffs from N
MRs.
3. It's more complicated to update. This is a bidirectional foreign key, so we
need to update two tables when adding a diff record. This also means we need
to handle this as a special case when importing a GitLab project.
There is some juggling with this association in the merge request model:
* `MergeRequest#latest_merge_request_diff` is _always_ the latest diff.
* `MergeRequest#merge_request_diff` reuses
`MergeRequest#latest_merge_request_diff` unless:
* Arguments are passed. These are typically to force-reload the association.
* It doesn't exist. That means we might be trying to implicitly create a
diff. This only seems to happen in specs.
* The association is already loaded. This is important for the reasons
explained in the comment, which I'll reiterate here: if we a) load a
non-latest diff, then b) get its `merge_request`, then c) get that MR's
`merge_request_diff`, we should get the diff we loaded in c), even though
that's not the latest diff.
Basically, `MergeRequest#merge_request_diff` is the latest diff in most cases,
but not quite all.
2017-11-15 12:22:18 -05:00
merge_requests = MergeRequest . includes ( :latest_merge_request_diff )
2017-05-23 11:10:07 -04:00
. where ( source_branch : ref ,
source_project : pipeline . project )
2017-05-29 03:58:20 -04:00
. reorder ( iid : :desc )
2017-05-23 11:10:07 -04:00
merge_requests . find do | merge_request |
2017-06-16 10:00:58 -04:00
merge_request . commit_shas . include? ( pipeline . sha )
2017-05-23 11:10:07 -04:00
end
end
2015-12-08 00:10:17 -05:00
end
2015-08-25 21:42:46 -04:00
def repo_url
2016-09-16 06:46:33 -04:00
auth = " gitlab-ci-token: #{ ensure_token! } @ "
2015-12-04 06:55:23 -05:00
project . http_url_to_repo . sub ( / ^https?: \/ \/ / ) do | prefix |
prefix + auth
end
2015-08-25 21:42:46 -04:00
end
def allow_git_fetch
2015-12-04 06:55:23 -05:00
project . build_allow_git_fetch
2015-08-25 21:42:46 -04:00
end
def update_coverage
2017-04-06 12:20:27 -04:00
coverage = trace . extract_coverage ( coverage_regex )
2017-01-24 22:48:03 -05:00
update_attributes ( coverage : coverage ) if coverage . present?
2015-08-25 21:42:46 -04:00
end
2017-09-25 12:54:08 -04:00
def parse_trace_sections!
2017-10-06 06:33:10 -04:00
ExtractSectionsFromBuildTraceService . new ( project , user ) . execute ( self )
2017-09-25 12:54:08 -04:00
end
2017-04-06 12:20:27 -04:00
def trace
Gitlab :: Ci :: Trace . new ( self )
2016-06-21 07:12:02 -04:00
end
2016-02-02 06:12:03 -05:00
def has_trace?
2017-04-06 12:20:27 -04:00
trace . exist?
2016-08-25 07:53:20 -04:00
end
2017-04-06 12:20:27 -04:00
def trace = ( data )
raise NotImplementedError
2016-03-31 07:24:14 -04:00
end
2017-04-06 12:20:27 -04:00
def old_trace
read_attribute ( :trace )
2016-03-29 09:34:18 -04:00
end
2017-04-06 12:20:27 -04:00
def erase_old_trace!
write_attribute ( :trace , nil )
save
2015-08-25 21:42:46 -04:00
end
2016-10-27 11:05:02 -04:00
def needs_touch?
Time . now - updated_at > 15 . minutes . to_i
end
2016-05-18 18:43:00 -04:00
def valid_token? ( token )
2016-08-08 06:01:25 -04:00
self . token && ActiveSupport :: SecurityUtils . variable_size_secure_compare ( token , self . token )
2015-10-12 17:47:32 -04:00
end
2016-05-06 03:17:27 -04:00
def has_tags?
tag_list . any?
end
2015-10-12 15:12:31 -04:00
def any_runners_online?
2016-06-08 03:19:49 -04:00
project . any_runners? { | runner | runner . active? && runner . online? && runner . can_pick? ( self ) }
2015-10-12 15:12:31 -04:00
end
2016-03-09 10:24:02 -05:00
def stuck?
2015-10-12 15:12:31 -04:00
pending? && ! any_runners_online?
end
2015-12-07 07:23:23 -05:00
def execute_hooks
2016-02-19 11:38:47 -05:00
return unless project
2017-11-14 04:02:39 -05:00
2016-08-12 04:09:29 -04:00
build_data = Gitlab :: DataBuilder :: Build . build ( self )
2017-05-15 11:11:45 -04:00
project . execute_hooks ( build_data . dup , :job_hooks )
project . execute_services ( build_data . dup , :job_hooks )
2016-01-15 06:21:52 -05:00
PagesService . new ( build_data ) . execute
2016-06-01 10:50:32 -04:00
project . running_or_pending_build_count ( force : true )
2015-12-07 07:23:23 -05:00
end
2016-01-20 15:48:22 -05:00
def artifacts_metadata_entry ( path , ** options )
2016-06-28 07:16:48 -04:00
metadata = Gitlab :: Ci :: Build :: Artifacts :: Metadata . new (
artifacts_metadata . path ,
path ,
** options )
metadata . to_entry
2015-12-28 04:35:51 -05:00
end
2016-05-18 16:21:51 -04:00
def erase_artifacts!
remove_artifacts_file!
remove_artifacts_metadata!
2016-06-17 06:58:26 -04:00
save
2016-05-18 16:21:51 -04:00
end
2016-02-16 02:39:20 -05:00
def erase ( opts = { } )
return false unless erasable?
2016-05-18 16:21:51 -04:00
erase_artifacts!
2016-02-16 02:39:20 -05:00
erase_trace!
update_erased! ( opts [ :erased_by ] )
end
def erasable?
complete? && ( artifacts? || has_trace? )
end
def erased?
! self . erased_at . nil?
end
2016-05-18 16:21:51 -04:00
def artifacts_expired?
2016-06-10 08:40:25 -04:00
artifacts_expire_at && artifacts_expire_at < Time . now
2016-05-18 16:21:51 -04:00
end
2016-06-10 08:25:54 -04:00
def artifacts_expire_in
artifacts_expire_at - Time . now if artifacts_expire_at
end
def artifacts_expire_in = ( value )
2016-06-10 15:45:06 -04:00
self . artifacts_expire_at =
if value
2017-02-16 10:40:13 -05:00
ChronicDuration . parse ( value ) & . seconds & . from_now
2016-06-10 15:45:06 -04:00
end
2016-06-10 08:25:54 -04:00
end
2017-01-09 04:58:45 -05:00
def has_expiring_artifacts?
2017-05-29 03:58:20 -04:00
artifacts_expire_at . present? && artifacts_expire_at > Time . now
2017-01-09 04:58:45 -05:00
end
2016-06-08 11:18:54 -04:00
def keep_artifacts!
2016-05-18 16:21:51 -04:00
self . update ( artifacts_expire_at : nil )
end
2016-11-13 22:56:39 -05:00
def coverage_regex
2016-12-12 23:53:12 -05:00
super || project . try ( :build_coverage_regex )
2016-11-13 22:56:39 -05:00
end
2016-07-19 07:23:14 -04:00
def when
read_attribute ( :when ) || build_attributes_from_config [ :when ] || 'on_success'
2016-02-16 02:39:20 -05:00
end
2016-07-19 07:23:14 -04:00
def yaml_variables
read_attribute ( :yaml_variables ) || build_attributes_from_config [ :yaml_variables ] || [ ]
2016-02-16 02:39:20 -05:00
end
2016-09-05 05:42:59 -04:00
def user_variables
return [ ] if user . blank?
[
{ key : 'GITLAB_USER_ID' , value : user . id . to_s , public : true } ,
2017-08-25 00:01:01 -04:00
{ key : 'GITLAB_USER_EMAIL' , value : user . email , public : true } ,
2017-08-25 00:01:55 -04:00
{ key : 'GITLAB_USER_LOGIN' , value : user . username , public : true } ,
2017-08-25 00:01:01 -04:00
{ key : 'GITLAB_USER_NAME' , value : user . name , public : true }
2016-09-05 05:42:59 -04:00
]
end
2017-07-06 03:45:38 -04:00
def secret_variables ( environment : persisted_environment )
project . secret_variables_for ( ref : ref , environment : environment )
. map ( & :to_runner_variable )
end
2017-02-15 19:05:44 -05:00
def steps
2017-03-07 06:30:34 -05:00
[ Gitlab :: Ci :: Build :: Step . from_commands ( self ) ,
Gitlab :: Ci :: Build :: Step . from_after_script ( self ) ] . compact
2017-02-15 19:05:44 -05:00
end
def image
2017-03-02 11:44:15 -05:00
Gitlab :: Ci :: Build :: Image . from_image ( self )
2017-02-15 19:05:44 -05:00
end
def services
2017-03-02 11:44:15 -05:00
Gitlab :: Ci :: Build :: Image . from_services ( self )
2017-02-15 19:05:44 -05:00
end
2017-09-21 04:34:12 -04:00
def artifacts
2017-03-06 08:50:56 -05:00
[ options [ :artifacts ] ]
2017-02-15 19:05:44 -05:00
end
def cache
2017-03-06 08:50:56 -05:00
[ options [ :cache ] ]
2017-02-15 19:05:44 -05:00
end
2016-11-20 14:43:50 -05:00
def credentials
2016-11-21 10:02:08 -05:00
Gitlab :: Ci :: Build :: Credentials :: Factory . new ( self ) . create!
2016-11-20 14:43:50 -05:00
end
2017-03-16 09:45:05 -04:00
def dependencies
2017-04-05 08:07:10 -04:00
return [ ] if empty_dependencies?
2017-03-16 09:45:05 -04:00
depended_jobs = depends_on_builds
2017-03-18 19:35:17 -04:00
return depended_jobs unless options [ :dependencies ] . present?
2017-03-16 09:45:05 -04:00
2017-03-18 19:35:17 -04:00
depended_jobs . select do | job |
options [ :dependencies ] . include? ( job . name )
2017-03-16 09:45:05 -04:00
end
end
2017-04-05 08:07:10 -04:00
def empty_dependencies?
options [ :dependencies ] & . empty?
end
2017-04-06 12:20:27 -04:00
def hide_secrets ( trace )
return unless trace
trace = trace . dup
2017-09-06 07:26:15 -04:00
Gitlab :: Ci :: MaskSecret . mask! ( trace , project . runners_token ) if project
Gitlab :: Ci :: MaskSecret . mask! ( trace , token )
2017-04-06 12:20:27 -04:00
trace
end
2017-09-05 11:10:57 -04:00
def serializable_hash ( options = { } )
2017-09-06 04:16:11 -04:00
super ( options ) . merge ( when : read_attribute ( :when ) )
2017-09-05 11:10:57 -04:00
end
2016-02-16 02:39:20 -05:00
private
2016-06-29 05:44:39 -04:00
def update_artifacts_size
2016-06-30 12:00:35 -04:00
self . artifacts_size = if artifacts_file . exists?
artifacts_file . size
2016-07-04 10:56:23 -04:00
else
nil
2016-06-30 12:00:35 -04:00
end
2016-06-29 05:44:39 -04:00
end
2016-02-16 02:39:20 -05:00
def erase_trace!
2017-04-06 12:20:27 -04:00
trace . erase!
2016-02-16 02:39:20 -05:00
end
def update_erased! ( user = nil )
2016-06-08 11:18:54 -04:00
self . update ( erased_by : user , erased_at : Time . now , artifacts_expire_at : nil )
2016-02-16 02:39:20 -05:00
end
2017-02-03 10:21:10 -05:00
def unscoped_project
2017-03-17 19:06:11 -04:00
@unscoped_project || = Project . unscoped . find_by ( id : project_id )
2017-02-03 10:21:10 -05:00
end
2017-03-07 04:06:53 -05:00
CI_REGISTRY_USER = 'gitlab-ci-token' . freeze
2015-10-12 11:06:53 -04:00
def predefined_variables
2016-07-20 07:17:21 -04:00
variables = [
{ key : 'CI' , value : 'true' , public : true } ,
{ key : 'GITLAB_CI' , value : 'true' , public : true } ,
2017-03-07 04:06:53 -05:00
{ key : 'CI_SERVER_NAME' , value : 'GitLab' , public : true } ,
{ key : 'CI_SERVER_VERSION' , value : Gitlab :: VERSION , public : true } ,
{ key : 'CI_SERVER_REVISION' , value : Gitlab :: REVISION , public : true } ,
{ key : 'CI_JOB_ID' , value : id . to_s , public : true } ,
{ key : 'CI_JOB_NAME' , value : name , public : true } ,
{ key : 'CI_JOB_STAGE' , value : stage , public : true } ,
{ key : 'CI_JOB_TOKEN' , value : token , public : false } ,
2017-03-07 11:37:05 -05:00
{ key : 'CI_COMMIT_SHA' , value : sha , public : true } ,
2017-03-07 04:06:53 -05:00
{ key : 'CI_COMMIT_REF_NAME' , value : ref , public : true } ,
{ key : 'CI_COMMIT_REF_SLUG' , value : ref_slug , public : true } ,
{ key : 'CI_REGISTRY_USER' , value : CI_REGISTRY_USER , public : true } ,
{ key : 'CI_REGISTRY_PASSWORD' , value : token , public : false } ,
{ key : 'CI_REPOSITORY_URL' , value : repo_url , public : false }
]
variables << { key : " CI_COMMIT_TAG " , value : ref , public : true } if tag?
variables << { key : " CI_PIPELINE_TRIGGERED " , value : 'true' , public : true } if trigger_request
variables << { key : " CI_JOB_MANUAL " , value : 'true' , public : true } if action?
variables . concat ( legacy_variables )
end
2017-05-24 15:57:58 -04:00
def persisted_environment_variables
2017-05-26 16:16:03 -04:00
return [ ] unless persisted_environment
2017-05-25 10:14:22 -04:00
variables = persisted_environment . predefined_variables
2017-06-21 08:22:26 -04:00
# Here we're passing unexpanded environment_url for runner to expand,
# and we need to make sure that CI_ENVIRONMENT_NAME and
# CI_ENVIRONMENT_SLUG so on are available for the URL be expanded.
2017-06-21 07:53:19 -04:00
variables << { key : 'CI_ENVIRONMENT_URL' , value : environment_url , public : true } if environment_url
2017-05-25 10:14:22 -04:00
variables
2017-05-24 15:57:58 -04:00
end
2017-03-07 04:06:53 -05:00
def legacy_variables
variables = [
2016-07-20 07:17:21 -04:00
{ key : 'CI_BUILD_ID' , value : id . to_s , public : true } ,
{ key : 'CI_BUILD_TOKEN' , value : token , public : false } ,
{ key : 'CI_BUILD_REF' , value : sha , public : true } ,
{ key : 'CI_BUILD_BEFORE_SHA' , value : before_sha , public : true } ,
{ key : 'CI_BUILD_REF_NAME' , value : ref , public : true } ,
2016-12-13 14:21:30 -05:00
{ key : 'CI_BUILD_REF_SLUG' , value : ref_slug , public : true } ,
2016-07-20 07:17:21 -04:00
{ key : 'CI_BUILD_NAME' , value : name , public : true } ,
2017-03-07 04:06:53 -05:00
{ key : 'CI_BUILD_STAGE' , value : stage , public : true }
2016-07-20 07:17:21 -04:00
]
2017-03-07 04:06:53 -05:00
variables << { key : " CI_BUILD_TAG " , value : ref , public : true } if tag?
variables << { key : " CI_BUILD_TRIGGERED " , value : 'true' , public : true } if trigger_request
variables << { key : " CI_BUILD_MANUAL " , value : 'true' , public : true } if action?
2015-10-12 11:06:53 -04:00
variables
end
2016-07-19 07:23:14 -04:00
2017-06-21 06:03:42 -04:00
def environment_url
2017-06-21 08:22:26 -04:00
options & . dig ( :environment , :url ) || persisted_environment & . external_url
2017-06-21 06:03:42 -04:00
end
2016-07-19 07:23:14 -04:00
def build_attributes_from_config
return { } unless pipeline . config_processor
2016-08-04 11:44:27 -04:00
2016-07-19 07:23:14 -04:00
pipeline . config_processor . build_attributes ( name )
end
2016-09-19 06:38:03 -04:00
2017-09-21 04:34:12 -04:00
def update_project_statistics
return unless project
ProjectCacheWorker . perform_async ( project_id , [ ] , [ :build_artifacts_size ] )
end
2017-06-01 17:36:04 -04:00
def update_project_statistics_after_save
if previous_changes . include? ( 'artifacts_size' )
update_project_statistics
end
end
2015-08-25 21:42:46 -04:00
end
end