#!/usr/bin/env ruby require 'gitlab' # # Configure credentials to be used with gitlab gem # Gitlab.configure do |config| config.endpoint = 'https://gitlab.com/api/v4' config.private_token = ENV["DOCS_API_TOKEN"] # GitLab Docs bot access token with Developer access to gitlab-docs end # # The remote docs project # GITLAB_DOCS_REPO = 'gitlab-org/gitlab-docs'.freeze # # This is the branch that will be created in the gitlab-docs project. # Name it after the product we're previewing and the ID of the MR that # kicked the review app. # def docs_branch # Check if CI_MERGE_REQUEST_IID is present. This requires pipelines # for merge requests to be enabled. if ENV["CI_MERGE_REQUEST_IID"].nil? "docs-preview-#{slug}-#{ENV["CI_COMMIT_REF_SLUG"]}" else "docs-preview-#{slug}-#{ENV["CI_MERGE_REQUEST_IID"]}" end end # # Create a remote branch in gitlab-docs and immediately cancel the pipeline # to avoid race conditions, since a triggered pipeline will also run right # after the branch creation. This only happens the very first time a branch # is created and will be skipped in subsequent runs. Read more in # https://gitlab.com/gitlab-org/gitlab-docs/issues/154. # def create_remote_branch Gitlab.create_branch(GITLAB_DOCS_REPO, docs_branch, 'master') puts "=> Remote branch '#{docs_branch}' created" pipelines = nil # Wait until the pipeline is started loop do sleep 1 puts "=> Waiting for pipeline to start..." pipelines = Gitlab.pipelines(GITLAB_DOCS_REPO, { ref: docs_branch }) break if pipelines.any? end # Get the first pipeline ID which should be the only one for the branch pipeline_id = pipelines.first.id # Cancel the pipeline Gitlab.cancel_pipeline(GITLAB_DOCS_REPO, pipeline_id) rescue Gitlab::Error::BadRequest puts "=> Remote branch '#{docs_branch}' already exists" end # # Remove a remote branch in gitlab-docs # def remove_remote_branch Gitlab.delete_branch(GITLAB_DOCS_REPO, docs_branch) puts "=> Remote branch '#{docs_branch}' deleted" end # # Define suffix in review app URL based on project # def slug case ENV["CI_PROJECT_PATH"] when 'gitlab-org/gitlab-foss' 'ce' when 'gitlab-org/gitlab' 'ee' when 'gitlab-org/gitlab-runner' 'runner' when 'gitlab-org/omnibus-gitlab' 'omnibus' when 'gitlab-org/charts/gitlab' 'charts' end end # # Overriding vars in https://gitlab.com/gitlab-org/gitlab-docs/blob/master/.gitlab-ci.yml # def param_name "BRANCH_#{slug.upcase}" end # # Trigger a pipeline in gitlab-docs # def trigger_pipeline # The review app URL app_url = "http://#{docs_branch}.#{ENV["DOCS_REVIEW_APPS_DOMAIN"]}/#{slug}" # Create the cross project pipeline using CI_JOB_TOKEN pipeline = Gitlab.run_trigger(GITLAB_DOCS_REPO, ENV["CI_JOB_TOKEN"], docs_branch, { param_name => ENV["CI_COMMIT_REF_NAME"] }) puts "=> Follow the status of the triggered pipeline:" puts "" puts pipeline.web_url puts "" puts "=> In a few minutes, you will be able to preview your changes under the following URL:" puts "" puts app_url puts "" puts "=> For more information, see the documentation" puts "=> https://docs.gitlab.com/ee/development/documentation/index.html#previewing-the-changes-live" puts "" puts "=> If something doesn't work, drop a line in the #docs chat channel." puts "" end # # When the first argument is deploy then create the branch and trigger pipeline # When it is 'stop', it deleted the remote branch. That way, we ensure there # are no stale remote branches and the Review server doesn't fill. # case ARGV[0] when 'deploy' create_remote_branch trigger_pipeline when 'cleanup' remove_remote_branch else puts "Please provide a valid option: deploy - Creates the remote branch and triggers a pipeline cleanup - Deletes the remote branch and stops the Review App" end