diff --git a/src/lib/Hydra/Plugin/BitBucketPulls.pm b/src/lib/Hydra/Plugin/BitBucketPulls.pm index cb26da30..8e7a087a 100644 --- a/src/lib/Hydra/Plugin/BitBucketPulls.pm +++ b/src/lib/Hydra/Plugin/BitBucketPulls.pm @@ -10,6 +10,7 @@ use Hydra::Helper::CatalystUtils; use Hydra::Helper::Nix; use File::Temp; use POSIX qw(strftime); +use IPC::Run qw(run); sub supportedInputTypes { my ($self, $inputTypes) = @_; @@ -48,7 +49,7 @@ sub fetchInput { open(my $fh, ">", $filename) or die "Cannot open $filename for writing: $!"; print $fh encode_json \%pulls; close $fh; - system("jq -S . < $filename > $tempdir/bitbucket-pulls-sorted.json"); + run(["jq", "-S", "."], '<', $filename, '>', "$tempdir/bitbucket-pulls-sorted.json") or die "jq command failed: $?"; my $storePath = addToStore("$tempdir/bitbucket-pulls-sorted.json"); my $timestamp = time; return { storePath => $storePath, revision => strftime "%Y%m%d%H%M%S", gmtime($timestamp) }; diff --git a/src/lib/Hydra/Plugin/GithubRefs.pm b/src/lib/Hydra/Plugin/GithubRefs.pm index 1739204e..105c70ae 100644 --- a/src/lib/Hydra/Plugin/GithubRefs.pm +++ b/src/lib/Hydra/Plugin/GithubRefs.pm @@ -10,6 +10,7 @@ use Hydra::Helper::CatalystUtils; use Hydra::Helper::Nix; use File::Temp; use POSIX qw(strftime); +use IPC::Run qw(run); =head1 NAME @@ -115,7 +116,7 @@ sub fetchInput { open(my $fh, ">", $filename) or die "Cannot open $filename for writing: $!"; print $fh encode_json \%refs; close $fh; - system("jq -S . < $filename > $tempdir/github-refs-sorted.json"); + run(["jq", "-S", "."], '<', $filename, '>', "$tempdir/github-refs-sorted.json") or die "jq command failed: $?"; my $storePath = addToStore("$tempdir/github-refs-sorted.json"); my $timestamp = time; return { storePath => $storePath, revision => strftime "%Y%m%d%H%M%S", gmtime($timestamp) }; diff --git a/src/lib/Hydra/Plugin/GitlabPulls.pm b/src/lib/Hydra/Plugin/GitlabPulls.pm index 2a31b1cf..b53d387e 100644 --- a/src/lib/Hydra/Plugin/GitlabPulls.pm +++ b/src/lib/Hydra/Plugin/GitlabPulls.pm @@ -24,6 +24,7 @@ use Hydra::Helper::CatalystUtils; use Hydra::Helper::Nix; use File::Temp; use POSIX qw(strftime); +use IPC::Run qw(run); sub supportedInputTypes { my ($self, $inputTypes) = @_; @@ -86,7 +87,7 @@ sub fetchInput { open(my $fh, ">", $filename) or die "Cannot open $filename for writing: $!"; print $fh encode_json \%pulls; close $fh; - system("jq -S . < $filename > $tempdir/gitlab-pulls-sorted.json"); + run(["jq", "-S", "."], '<', $filename, '>', "$tempdir/gitlab-pulls-sorted.json") or die "jq command failed: $?"; my $storePath = addToStore("$tempdir/gitlab-pulls-sorted.json"); my $timestamp = time; return { storePath => $storePath, revision => strftime "%Y%m%d%H%M%S", gmtime($timestamp) }; diff --git a/src/lib/Hydra/Plugin/S3Backup.pm b/src/lib/Hydra/Plugin/S3Backup.pm index f1f50754..133b62d1 100644 --- a/src/lib/Hydra/Plugin/S3Backup.pm +++ b/src/lib/Hydra/Plugin/S3Backup.pm @@ -7,6 +7,8 @@ use File::Temp; use File::Basename; use Fcntl; use IO::File; +use IPC::Run qw(run); +use IPC::Run3; use Net::Amazon::S3; use Net::Amazon::S3::Client; use Digest::SHA; @@ -27,11 +29,11 @@ my %compressors = (); $compressors{"none"} = ""; if (defined($Nix::Config::bzip2)) { - $compressors{"bzip2"} = "| $Nix::Config::bzip2", + $compressors{"bzip2"} = "$Nix::Config::bzip2", } if (defined($Nix::Config::xz)) { - $compressors{"xz"} = "| $Nix::Config::xz", + $compressors{"xz"} = "$Nix::Config::xz", } my $lockfile = Hydra::Model::DB::getHydraPath . "/.hydra-s3backup.lock"; @@ -111,7 +113,16 @@ sub buildFinished { } next unless @incomplete_buckets; my $compressor = $compressors{$compression_type}; - system("$Nix::Config::binDir/nix-store --dump $path $compressor > $tempdir/nar") == 0 or die; + if ($compressor eq "") { + # No compression - use IPC::Run3 to redirect stdout to file + run3(["$Nix::Config::binDir/nix-store", "--dump", $path], + \undef, "$tempdir/nar", \undef) or die "nix-store --dump failed: $!"; + } else { + # With compression - use IPC::Run to pipe nix-store output to compressor + my $dump_cmd = ["$Nix::Config::binDir/nix-store", "--dump", $path]; + my $compress_cmd = [$compressor]; + run($dump_cmd, '|', $compress_cmd, '>', "$tempdir/nar") or die "Pipeline failed: $?"; + } my $digest = Digest::SHA->new(256); $digest->addfile("$tempdir/nar"); my $file_hash = $digest->hexdigest; diff --git a/t/Hydra/Plugin/gitea.t b/t/Hydra/Plugin/gitea.t index d84c8f57..3de4ea8f 100644 --- a/t/Hydra/Plugin/gitea.t +++ b/t/Hydra/Plugin/gitea.t @@ -50,7 +50,7 @@ my $pid; if (!defined($pid = fork())) { die "Cannot fork(): $!"; } elsif ($pid == 0) { - exec("python3 $ctx{jobsdir}/server.py $filename"); + exec("python3", "$ctx{jobsdir}/server.py", $filename); } else { my $newbuild = $db->resultset('Builds')->find($build->id); is($newbuild->finished, 1, "Build should be finished."); diff --git a/t/s3-backup-test.pl b/t/s3-backup-test.pl index a367981f..3132571e 100644 --- a/t/s3-backup-test.pl +++ b/t/s3-backup-test.pl @@ -19,11 +19,11 @@ my $jobsetinput; $jobsetinput = $jobset->jobsetinputs->create({name => "jobs", type => "path"}); $jobsetinput->jobsetinputalts->create({altnr => 0, value => getcwd . "/jobs"}); -system("hydra-eval-jobset " . $jobset->project->name . " " . $jobset->name); +system("hydra-eval-jobset", $jobset->project->name, $jobset->name); my $successful_hash; foreach my $build ($jobset->builds->search({finished => 0})) { - system("hydra-build " . $build->id); + system("hydra-build", $build->id); my @outputs = $build->buildoutputs->all; my $hash = substr basename($outputs[0]->path), 0, 32; if ($build->job->name eq "job") {