# frozen_string_literal: true def trigger_build project, header, payload, host, path require 'net/http' (http = Net::HTTP.new host, 443).use_ssl = true request = Net::HTTP::Post.new path, header request.body = payload response = http.request request if /^20\d$/.match? response.code puts %(Successfully triggered build on #{project} repository) else warn %(Unable to trigger build on #{project} repository: #{response.code} - #{response.message}) end end def parse_project project org, name, branch = project.split '/', 3 branch ||= 'master' [org, name, branch] end namespace :build do desc 'Trigger builds for dependent projects' task :dependents do next unless ENV['GITHUB_ACTIONS'].to_s == 'true' && ENV['GITHUB_EVENT_NAME'].to_s != 'pull_request' && !(ENV['GITHUB_REF'].to_s.start_with? 'refs/tags/') if (commit_hash = ENV['GITHUB_SHA']) commit_memo = %( (#{commit_hash.slice 0, 8})\n\nhttps://github.com/#{ENV['GITHUB_REPOSITORY'] || 'asciidoctor/asciidoctor'}/commit/#{commit_hash}) end # NOTE The GITHUB_TOKEN env var must be defined in the CI interface. # Retrieve this token using the settings of the account/org -> Developer Settings -> Personal Access Tokens # and generate a new "Personal Access Token" with the "repo" scope github_token = ENV['GITHUB_API_TOKEN'] require 'json' %w( asciidoctor/asciidoctor.js asciidoctor/asciidoctorj/main asciidoctor/asciidoctor-pdf/main asciidoctor/asciidoctor-reveal.js ).each do |project| org, name, branch = parse_project project project = [org, name, branch].join '/' header = { 'Content-Type' => 'application/json', 'Accept' => 'application/vnd.github.everest-preview+json', 'Authorization' => %(token #{github_token}), } payload = { 'event_type' => 'test_upstream', 'client_payload' => { 'branch' => (ENV['GITHUB_REF'].sub 'refs/heads/', ''), 'message' => %(Build triggered by Asciidoctor#{commit_memo}), }, }.to_json trigger_build project, header, payload, 'api.github.com', %(/repos/#{org}/#{name}/dispatches) end if github_token end end