From dad867c7ca34fa71cad3be9ea9d09e3baa2e3e6f Mon Sep 17 00:00:00 2001 From: Ethan Dennis Date: Wed, 10 May 2023 10:23:04 -0700 Subject: [PATCH 1/5] Run all scripts in a bash shell --- .github/workflows/issue_ops.yml | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/.github/workflows/issue_ops.yml b/.github/workflows/issue_ops.yml index 7dc0477..66d2de3 100644 --- a/.github/workflows/issue_ops.yml +++ b/.github/workflows/issue_ops.yml @@ -8,6 +8,10 @@ permissions: contents: read issues: write +defaults: + run: + shell: bash + env: GITHUB_INSTANCE_URL: ${{ secrets.GITHUB_INSTANCE_URL || 'https://github.com' }} GITHUB_ACCESS_TOKEN: ${{ secrets.GH_ACCESS_TOKEN }} @@ -31,7 +35,6 @@ jobs: log-filename: ${{ steps.logs.outputs.filename }} steps: - name: Install GitHub Actions Importer - shell: bash run: | gh actions-importer version || gh extension install github/gh-actions-importer gh actions-importer update @@ -55,7 +58,9 @@ jobs: # env: # ImageOS: ubuntu22 - name: Install dependencies - run: bundle install --without development + run: bundle install + env: + BUNDLE_WITHOUT: development - name: Prepare arguments id: prepare env: From 0a01e3e14110e527cb9836aadade99954e371062 Mon Sep 17 00:00:00 2001 From: Ethan Dennis Date: Mon, 15 May 2023 10:58:01 -0700 Subject: [PATCH 2/5] Write to random env variables --- lib/concerns/environment_writer.rb | 21 +++++++++++++++++++ lib/concerns/output_writer.rb | 11 ---------- lib/models/arguments.rb | 18 ++++++++++++---- lib/models/command.rb | 4 ++-- lib/models/provider.rb | 2 +- ...ter_spec.rb => environment_writer_spec.rb} | 20 ++++++++++++++++-- spec/models/arguments_spec.rb | 3 ++- spec/spec_helper.rb | 1 + 8 files changed, 59 insertions(+), 21 deletions(-) create mode 100644 lib/concerns/environment_writer.rb delete mode 100644 lib/concerns/output_writer.rb rename spec/concerns/{output_writer_spec.rb => environment_writer_spec.rb} (51%) diff --git a/lib/concerns/environment_writer.rb b/lib/concerns/environment_writer.rb new file mode 100644 index 0000000..1bacce3 --- /dev/null +++ b/lib/concerns/environment_writer.rb @@ -0,0 +1,21 @@ +# frozen_string_literal: true + +module EnvironmentWriter + def set_output(name, value) + modify_env("GITHUB_OUTPUT", name, value) + end + + def set_environment(name, value) + modify_env("GITHUB_ENV", name, value) + end + + private + + def modify_env(file, name, value) + return if value.nil? + + File.open(ENV[file], "a") do |f| + f.puts "#{name}=#{value}" + end + end +end diff --git a/lib/concerns/output_writer.rb b/lib/concerns/output_writer.rb deleted file mode 100644 index a602d95..0000000 --- a/lib/concerns/output_writer.rb +++ /dev/null @@ -1,11 +0,0 @@ -# frozen_string_literal: true - -module OutputWriter - def set_output(name, value) - return if value.nil? - - File.open(ENV["GITHUB_OUTPUT"], "a") do |f| - f.puts "#{name}=#{value}" - end - end -end diff --git a/lib/models/arguments.rb b/lib/models/arguments.rb index f67c7b5..7ae5adb 100644 --- a/lib/models/arguments.rb +++ b/lib/models/arguments.rb @@ -1,9 +1,9 @@ # frozen_string_literal: true -require_relative "../concerns/output_writer" +require_relative "../concerns/environment_writer" class Arguments - include OutputWriter + include EnvironmentWriter def initialize(provider, command, issue_content) @args = argument_class(provider, command, issue_content) @@ -24,12 +24,22 @@ class Arguments arguments.concat(["--custom-transformers", *@custom_transformers]) if @custom_transformers.length.positive? + # rng = ENV["CI"] ? Random.new(0) : Random.new + rng = Random.new(0) + set_output( "args", arguments.map do |a| - next a unless a.include?(" ") + value = a.include?(" ") ? a.inspect : a + + unless value.start_with?("--") + name = "variable_#{rng.rand(0..1000)}" + set_environment(name, value) + + value = "$#{name}" + end - a.inspect + value end.join(" ") ) end diff --git a/lib/models/command.rb b/lib/models/command.rb index 3911c8c..3b4fb75 100644 --- a/lib/models/command.rb +++ b/lib/models/command.rb @@ -1,10 +1,10 @@ # frozen_string_literal: true require "active_support/core_ext/string" -require_relative "../concerns/output_writer" +require_relative "../concerns/environment_writer" class Command - include OutputWriter + include EnvironmentWriter VALID_COMMANDS = %w[audit migrate dry-run].freeze diff --git a/lib/models/provider.rb b/lib/models/provider.rb index 0802dba..0d8258e 100644 --- a/lib/models/provider.rb +++ b/lib/models/provider.rb @@ -7,7 +7,7 @@ require_rel "./jenkins/**/*.rb" require_rel "./travis_ci/**/*.rb" class Provider - include OutputWriter + include EnvironmentWriter PROVIDER_MAP = { "azure-devops" => ::AzureDevops, diff --git a/spec/concerns/output_writer_spec.rb b/spec/concerns/environment_writer_spec.rb similarity index 51% rename from spec/concerns/output_writer_spec.rb rename to spec/concerns/environment_writer_spec.rb index 129cf7e..1f0bc5a 100644 --- a/spec/concerns/output_writer_spec.rb +++ b/spec/concerns/environment_writer_spec.rb @@ -1,9 +1,9 @@ # frozen_string_literal: true -RSpec.describe OutputWriter do +RSpec.describe EnvironmentWriter do let(:test_class) do class TestClass - include OutputWriter + include EnvironmentWriter end TestClass.new @@ -24,4 +24,20 @@ RSpec.describe OutputWriter do it { expect { subject }.not_to change { File.read(ENV["GITHUB_OUTPUT"], chomp: true).last } } end end + + describe "#set_environment" do + let(:name) { "env_var_name" } + let(:value) { "env_var_value" } + let(:output) { "#{name}=#{value}" } + + subject { test_class.set_environment(name, value) } + + it { expect { subject }.to change { File.readlines(ENV["GITHUB_ENV"], chomp: true).last }.to(/#{output}/) } + + context "when value is nil" do + let(:value) { nil } + + it { expect { subject }.not_to change { File.read(ENV["GITHUB_ENV"], chomp: true).last } } + end + end end diff --git a/spec/models/arguments_spec.rb b/spec/models/arguments_spec.rb index 28ff873..350ff45 100644 --- a/spec/models/arguments_spec.rb +++ b/spec/models/arguments_spec.rb @@ -54,7 +54,8 @@ RSpec.describe Arguments do let(:output) { ["--option", "value"] } it "writes an output variable" do - expect(arguments).to receive(:set_output).with("args", "--option value") + expect(arguments).to receive(:set_output).with("args", "--option $variable_1") + expect(arguments).to receive(:set_environment).with("variable_684", "value") subject end end diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index 555e5f7..bb54771 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -29,6 +29,7 @@ RSpec.configure do |config| Dir.mkdir("tmp") unless Dir.exist?("tmp") FileUtils.touch "tmp/test.txt" ENV["GITHUB_OUTPUT"] = "tmp/test.txt" + ENV["GITHUB_ENV"] = "tmp/test.txt" end config.after(:suite) do From b0e1adc47cc3b718efee14240ed837b140f948a8 Mon Sep 17 00:00:00 2001 From: Ethan Dennis Date: Mon, 15 May 2023 12:29:15 -0700 Subject: [PATCH 3/5] Add test coverage --- lib/models/arguments.rb | 9 ++++----- spec/models/arguments_spec.rb | 18 +++++++++++++----- 2 files changed, 17 insertions(+), 10 deletions(-) diff --git a/lib/models/arguments.rb b/lib/models/arguments.rb index 7ae5adb..d9fc3d8 100644 --- a/lib/models/arguments.rb +++ b/lib/models/arguments.rb @@ -24,18 +24,17 @@ class Arguments arguments.concat(["--custom-transformers", *@custom_transformers]) if @custom_transformers.length.positive? - # rng = ENV["CI"] ? Random.new(0) : Random.new - rng = Random.new(0) + rng = Random.new set_output( "args", arguments.map do |a| value = a.include?(" ") ? a.inspect : a - + unless value.start_with?("--") - name = "variable_#{rng.rand(0..1000)}" + name = "variable_#{rng.rand(1000..9999)}" set_environment(name, value) - + value = "$#{name}" end diff --git a/spec/models/arguments_spec.rb b/spec/models/arguments_spec.rb index 350ff45..48ef05d 100644 --- a/spec/models/arguments_spec.rb +++ b/spec/models/arguments_spec.rb @@ -54,8 +54,8 @@ RSpec.describe Arguments do let(:output) { ["--option", "value"] } it "writes an output variable" do - expect(arguments).to receive(:set_output).with("args", "--option $variable_1") - expect(arguments).to receive(:set_environment).with("variable_684", "value") + expect(arguments).to receive(:set_output).with("args", /--option \$variable_\d{4}/) + expect(arguments).to receive(:set_environment).with(/variable_\d{4}/, "value") subject end end @@ -64,7 +64,8 @@ RSpec.describe Arguments do let(:output) { ["--option", "some value"] } it "writes an output variable" do - expect(arguments).to receive(:set_output).with("args", "--option \"some value\"") + expect(arguments).to receive(:set_output).with("args", /--option \$variable_\d{4}/) + expect(arguments).to receive(:set_environment).with(/variable_\d{4}/, "\"some value\"") subject end end @@ -74,7 +75,10 @@ RSpec.describe Arguments do let(:options) { { "custom-transformers" => "transformers/**/*.rb" } } it "writes an output variable" do - expect(arguments).to receive(:set_output).with("args", "--option value --custom-transformers transformers/**/*.rb") + expect(arguments).to receive(:set_output).with("args", /--option \$variable_\d{4} --custom-transformers \$variable_\d{4}/) + ["value", "transformers/**/*.rb"].each do |value| + expect(arguments).to receive(:set_environment).with(/variable_\d{4}/, value) + end subject end end @@ -88,7 +92,11 @@ RSpec.describe Arguments do end it "writes an output variable" do - expect(arguments).to receive(:set_output).with("args", "--option value --custom-transformers transformers/jenkins/transformers.rb transformers/all.rb") + expect(arguments).to receive(:set_output).with("args", /--option \$variable_\d{4} --custom-transformers \$variable_\d{4} \$variable_\d{4}/) + ["value", *files].each do |value| + expect(arguments).to receive(:set_environment).with(/variable_\d{4}/, value) + end + subject end end From 15f467cdf125126f251853ce11f574b8b0cb350b Mon Sep 17 00:00:00 2001 From: Ethan Dennis Date: Mon, 15 May 2023 15:39:52 -0700 Subject: [PATCH 4/5] Ensure no new line chars in envs --- lib/concerns/environment_writer.rb | 2 ++ spec/concerns/environment_writer_spec.rb | 12 ++++++++++++ 2 files changed, 14 insertions(+) diff --git a/lib/concerns/environment_writer.rb b/lib/concerns/environment_writer.rb index 1bacce3..0d7f0c6 100644 --- a/lib/concerns/environment_writer.rb +++ b/lib/concerns/environment_writer.rb @@ -14,6 +14,8 @@ module EnvironmentWriter def modify_env(file, name, value) return if value.nil? + raise ArgumentError, "Invalid input: #{name}=#{value}" if value.include?("\n") + File.open(ENV[file], "a") do |f| f.puts "#{name}=#{value}" end diff --git a/spec/concerns/environment_writer_spec.rb b/spec/concerns/environment_writer_spec.rb index 1f0bc5a..dc89f63 100644 --- a/spec/concerns/environment_writer_spec.rb +++ b/spec/concerns/environment_writer_spec.rb @@ -23,6 +23,12 @@ RSpec.describe EnvironmentWriter do it { expect { subject }.not_to change { File.read(ENV["GITHUB_OUTPUT"], chomp: true).last } } end + + context "when value contains a newline" do + let(:value) { "var_value\n" } + + it { expect { subject }.to raise_error(ArgumentError) } + end end describe "#set_environment" do @@ -39,5 +45,11 @@ RSpec.describe EnvironmentWriter do it { expect { subject }.not_to change { File.read(ENV["GITHUB_ENV"], chomp: true).last } } end + + context "when value contains a newline" do + let(:value) { "env_var_value\n" } + + it { expect { subject }.to raise_error(ArgumentError) } + end end end From 821f7fe05b52c87fe1c0ac6e41227684f864356c Mon Sep 17 00:00:00 2001 From: Ethan Dennis Date: Wed, 17 May 2023 12:57:32 -0700 Subject: [PATCH 5/5] Ensure variables are unique --- lib/models/arguments.rb | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/lib/models/arguments.rb b/lib/models/arguments.rb index d9fc3d8..b7ff4e0 100644 --- a/lib/models/arguments.rb +++ b/lib/models/arguments.rb @@ -25,6 +25,7 @@ class Arguments arguments.concat(["--custom-transformers", *@custom_transformers]) if @custom_transformers.length.positive? rng = Random.new + variable_names = Set.new set_output( "args", @@ -33,6 +34,10 @@ class Arguments unless value.start_with?("--") name = "variable_#{rng.rand(1000..9999)}" + name = "variable_#{rng.rand(1000..9999)}" while variable_names.include?(name) + + variable_names.add(name) + set_environment(name, value) value = "$#{name}"