diff --git a/.gitlab/ci/release-environments/main.gitlab-ci.yml b/.gitlab/ci/release-environments/main.gitlab-ci.yml
index e2fed0a6dbdcbecb5ed29f076a3c1599b96aab95..982329646a704a07598e80e6472d89913bce964a 100644
--- a/.gitlab/ci/release-environments/main.gitlab-ci.yml
+++ b/.gitlab/ci/release-environments/main.gitlab-ci.yml
@@ -4,6 +4,7 @@ default:
 
 stages:
   - prepare
+  - deploy
 
 include:
   - local: .gitlab/ci/global.gitlab-ci.yml
@@ -56,7 +57,38 @@ release-environments-build-cng:
     GITLAB_SHELL_VERSION: "${GITLAB_SHELL_VERSION}"
     GITALY_SERVER_VERSION: "${GITALY_SERVER_VERSION}"
     RUBY_VERSION: "${FULL_RUBY_VERSION}"
+    IMAGE_TAG_EXT: "-${CI_COMMIT_SHORT_SHA}"
   trigger:
     project: gitlab-org/build/CNG-mirror
     branch: $TRIGGER_BRANCH
     strategy: depend
+
+release-environments-deploy-env:
+  allow_failure: true
+  stage: deploy
+  needs: ["release-environments-build-cng"]
+  variables:
+    DEPLOY_ENV: deploy.env
+  script:
+    - ./scripts/construct-release-environments-versions.rb > $DEPLOY_ENV
+  artifacts:
+    reports:
+      dotenv: $DEPLOY_ENV
+    paths:
+      - $DEPLOY_ENV
+    expire_in: 7 days
+    when: always
+
+release-environments-deploy:
+  allow_failure: true
+  stage: deploy
+  needs: ["release-environments-deploy-env"]
+  inherit:
+    variables: false
+  variables:
+    VERSIONS: "${VERSIONS}"
+    ENVIRONMENT: "${ENVIRONMENT}"
+  trigger:
+    project: gl-infra/release-environments
+    branch: main
+    strategy: depend
diff --git a/scripts/construct-release-environments-versions.rb b/scripts/construct-release-environments-versions.rb
new file mode 100755
index 0000000000000000000000000000000000000000..1af45923731d3bf91480c0c44839e5974080b467
--- /dev/null
+++ b/scripts/construct-release-environments-versions.rb
@@ -0,0 +1,37 @@
+#!/usr/bin/env ruby
+# frozen_string_literal: true
+
+require 'json'
+
+class ReleaseEnvironmentsModel
+  COMPONENTS = %w[gitaly registry kas mailroom pages gitlab shell].freeze
+
+  # Will generate a json object that has a key for every component and a value which is the environment combined with
+  # short sha
+  # Example:
+  # {
+  #  "gitaly": "15-10-stable-c7c5131c",
+  #  "registry": "15-10-stable-c7c5131c",
+  #  "kas": "15-10-stable-c7c5131c",
+  #  "mailroom": "15-10-stable-c7c5131c",
+  #  "pages": "15-10-stable-c7c5131c",
+  #  "gitlab": "15-10-stable-c7c5131c",
+  #  "shell": "15-10-stable-c7c5131c"
+  # }
+  def generate_json(environment)
+    output_json = {}
+    COMPONENTS.each do |component|
+      output_json[component.to_s] = "#{environment}-#{ENV['CI_COMMIT_SHORT_SHA']}"
+    end
+    JSON.generate(output_json)
+  end
+end
+
+# Outputs in `dotenv` format the ENVIRONMENT and VERSIONS to pass to release environments e.g.
+# ENVIRONMENT=15-10-stable
+# VERSIONS={"gitaly":"15-10-stable-c7c5131c","registry":"15-10-stable-c7c5131c","kas":"15-10-stable-c7c5131c", ...
+if $PROGRAM_NAME == __FILE__
+  environment = ENV['CI_COMMIT_REF_SLUG'].sub("-ee", "")
+  puts "ENVIRONMENT=#{environment}"
+  puts "VERSIONS=#{ReleaseEnvironmentsModel.new.generate_json(environment)}"
+end