Skip to content

Commit

Permalink
Implement latest_major and lastest_minor tag for docker init cont…
Browse files Browse the repository at this point in the history
…ainer (#3643)

* Implement latest_major and lastest_minor tag for docker init container
tags

* Update with latest_major condition and ensure gem presence

* Use Ruby image

* Abort when fail
  • Loading branch information
TonyCTHsu authored May 23, 2024
1 parent f8144d9 commit 14da809
Show file tree
Hide file tree
Showing 3 changed files with 104 additions and 23 deletions.
48 changes: 25 additions & 23 deletions .gitlab-ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -194,40 +194,42 @@ deploy_to_reliability_env:
UPSTREAM_PROJECT_NAME: $CI_PROJECT_NAME
UPSTREAM_COMMIT_SHA: $CI_COMMIT_SHA

deploy_to_docker_registries:
prepare_image_destinations:
stage: deploy
tags: ["arch:amd64"]
image: $DOCKER_REGISTRY/images/mirror/ruby:3.2.2
rules:
- if: "$POPULATE_CACHE"
- if: '$POPULATE_CACHE'
when: never
- if: $CI_COMMIT_TAG =~ /^v(\d+)\.(\d+)\.(\d+)$/ # Exclude prerelease
when: delayed
start_in: 1 day
- if: $CI_COMMIT_TAG =~ /^v(\d+)\.(\d+)\.(\d+)$/ # Exclude prerelease
when: always
- when: manual
allow_failure: true
trigger:
project: DataDog/public-images
branch: main
strategy: depend
variables:
IMG_SOURCES: ghcr.io/datadog/dd-trace-rb/dd-lib-ruby-init:$CI_COMMIT_TAG
IMG_DESTINATIONS: dd-lib-ruby-init:$CI_COMMIT_TAG
IMG_SIGNING: "false"
script:
- ruby -v
- gem -v
- bundle -v
- ./.gitlab/check_gem_presence.rb $CI_COMMIT_TAG
- |
IMG_DESTINATIONS=$(./.gitlab/prepare_image_destinations.rb dd-lib-ruby-init $CI_COMMIT_TAG) || {
echo "Failed to prepare image destinations: $CI_COMMIT_TAG"
exit 1
}
echo "IMG_DESTINATIONS=$IMG_DESTINATIONS" > build.env
artifacts:
reports:
dotenv: build.env

deploy_latest_tag_to_docker_registries:
deploy_to_docker_registries:
stage: deploy
rules:
- if: "$POPULATE_CACHE"
when: never
- if: $CI_COMMIT_TAG =~ /^v(\d+)\.(\d+)\.(\d+)$/ && $CI_COMMIT_BRANCH == 'master' # Exclude prerelease and only for master branch
when: delayed
start_in: 1 day
- when: manual
allow_failure: true
needs:
- job: prepare_image_destinations
artifacts: true
trigger:
project: DataDog/public-images
branch: main
strategy: depend
variables:
IMG_SOURCES: ghcr.io/datadog/dd-trace-rb/dd-lib-ruby-init:$CI_COMMIT_TAG
IMG_DESTINATIONS: dd-lib-ruby-init:latest
IMG_DESTINATIONS: $IMG_DESTINATIONS
IMG_SIGNING: "false"
37 changes: 37 additions & 0 deletions .gitlab/check_gem_presence.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
#!/usr/bin/env ruby

require 'bundler/inline'

gemfile { gem 'gems', source: 'https://rubygems.org' }

require 'rubygems'
require 'gems'

version = ARGV[0].chomp
version = version.delete_prefix('v') if version.start_with?('v')

candidate = Gem::Version.new(version)

retry_count = 0
max_retries = 60
interval = 60

loop do
versions = Gems.versions('datadog').map { |h| Gem::Version.new(h['number']) }

if versions.include?(candidate)
puts "Gem version #{candidate} found!"
exit 0
else
retry_count += 1
puts "Attempt(#{retry_count}): Gem 'datadog' version '#{candidate}' not found."

if retry_count >= max_retries
puts "Max retries(#{max_retries}) reached, stopping..."
exit 1
else
puts "Retrying in #{interval} seconds..."
sleep interval
end
end
end
42 changes: 42 additions & 0 deletions .gitlab/prepare_image_destinations.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
#!/usr/bin/env ruby

require 'bundler/inline'

gemfile { gem 'gems', source: 'https://rubygems.org' }

require 'rubygems'
require 'gems'

image_name = ARGV[0].chomp
version = ARGV[1].chomp
version = version.delete_prefix('v') if version.start_with?('v')

candidate = Gem::Version.new(version)
versions = Gems.versions('datadog').map { |h| Gem::Version.new(h['number']) }

# Make sure candidate has already been published to 'https://rubygems.org'
unless versions.include?(candidate)
warn "Version #{candidate} not found in RubyGems"
exit 1
end

# Skip pre-releases
if candidate.prerelease?
warn 'No tags for pre-releases'
exit 1
end

major, minor, = candidate.to_s.split('.')
current_major_versions = versions.select { |v| v.to_s.start_with?("#{major}.") }

tags = []

tags << 'latest' if versions.all? { |v| candidate >= v }
tags << "v#{major}" if current_major_versions.all? { |v| candidate >= v }
tags << "v#{major}.#{minor}"
tags << "v#{candidate}"

# $stdout.puts "tags: #{tags}" # Uncomment for debugging

destinations = tags.map { |tag| "#{image_name}:#{tag}" }
$stdout.puts destinations.join(',')

0 comments on commit 14da809

Please sign in to comment.