Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 7 additions & 3 deletions lib/buildkite/builder/commands/run.rb
Original file line number Diff line number Diff line change
Expand Up @@ -17,10 +17,14 @@ def run
# variables to be set. It also uploads the pipeline to Buildkite.
log.info "+++ 🧰 #{'Buildkite Builder'.color(:springgreen)} v#{Buildkite::Builder.version} ─ #{relative_pipeline_path.to_s.yellow}"

if Buildkite::Pipelines::Command.meta_data(:exists, Builder.meta_data.fetch(:job)).success?
log.info "Pipeline already uploaded in #{Buildkite.env.step_id} step".color(:dimgray)
# Pass the relative pipeline path to the Pipeline instance
# Let the Pipeline class handle its own metadata logic
pipeline = Pipeline.new(pipeline_path, logger: log)

if pipeline.already_uploaded?
log.info "Pipeline #{relative_pipeline_path.to_s.yellow} already uploaded in #{Buildkite.env.step_id} step".color(:dimgray)
else
Pipeline.new(pipeline_path, logger: log).upload
pipeline.upload
end
end
end
Expand Down
20 changes: 18 additions & 2 deletions lib/buildkite/builder/pipeline.rb
Original file line number Diff line number Diff line change
Expand Up @@ -66,8 +66,14 @@ def upload
end
end

logger.info "+++ :toolbox: Setting job meta-data to #{Buildkite.env.job_id.color(:yellow)}"
Buildkite::Pipelines::Command.meta_data!(:set, Builder.meta_data.fetch(:job), Buildkite.env.step_id)
# Use pipeline-specific metadata key instead of generic job metadata
logger.info "+++ :toolbox: Setting job meta-data #{pipeline_metadata_key.color(:yellow)} to #{Buildkite.env.step_id.color(:yellow)}"
Buildkite::Pipelines::Command.meta_data!(:set, pipeline_metadata_key, Buildkite.env.step_id)
end

# Check if this specific pipeline has already been uploaded
def already_uploaded?
Buildkite::Pipelines::Command.meta_data(:exists, pipeline_metadata_key).success?
end

def to_h
Expand All @@ -88,6 +94,16 @@ def to_yaml

private

def pipeline_metadata_key
@pipeline_metadata_key ||= begin
# Create a unique metadata key based on the pipeline path
# This allows multiple pipelines to be uploaded in the same step
relative_path = root.relative_path_from(Builder.root)
path_key = relative_path.to_s.gsub(/[^a-zA-Z0-9]/, '_').gsub(/_+/, '_').gsub(/^_|_$/, '')
"buildkite_builder_uploaded_#{path_key}"
end
end

def upload_artifacts
return if artifacts.empty?

Expand Down