Skip to content
Permalink

Comparing changes

Choose two branches to see what’s changed or to start a new pull request. If you need to, you can also or learn more about diff comparisons.

Open a pull request

Create a new pull request by comparing changes across two branches. If you need to, you can also . Learn more about diff comparisons here.
base repository: NixOS/hydra
Failed to load repositories. Confirm that selected base ref is valid, then try again.
Loading
base: bcb1c2916d0e
Choose a base ref
...
head repository: NixOS/hydra
Failed to load repositories. Confirm that selected head ref is valid, then try again.
Loading
compare: c88745140b94
Choose a head ref
  • 2 commits
  • 1 file changed
  • 2 contributors

Commits on Apr 11, 2019

  1. Create a gitlab status plugin

    This plugin expects as inputs to a jobset the following:
     - gitlab_status_repo => Name of the repository input pointing to that
       status updates should be POST'ed, i.e. the jobset has a git input
       "nixexprs": "https://gitlab.example.com/project/nixexprs", in which
       case "gitlab_status_repo" would be "nixexprs".
     - gitlab_project_id => ID of the project in Gitlab, i.e. in the above
       case the ID in gitlab of "nixexprs"
    globin committed Apr 11, 2019
    Copy the full SHA
    f4e7c10 View commit details

Commits on Apr 28, 2019

  1. Merge pull request #649 from mayflower/upstream-gitlab-status

    Create a gitlab status plugin
    grahamc authored Apr 28, 2019
    Copy the full SHA
    c887451 View commit details
Showing with 88 additions and 0 deletions.
  1. +88 −0 src/lib/Hydra/Plugin/GitlabStatus.pm
88 changes: 88 additions & 0 deletions src/lib/Hydra/Plugin/GitlabStatus.pm
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
package Hydra::Plugin::GitlabStatus;

use strict;
use parent 'Hydra::Plugin';
use HTTP::Request;
use JSON;
use LWP::UserAgent;
use Hydra::Helper::CatalystUtils;
use List::Util qw(max);

# This plugin expects as inputs to a jobset the following:
# - gitlab_status_repo => Name of the repository input pointing to that
# status updates should be POST'ed, i.e. the jobset has a git input
# "nixexprs": "https://gitlab.example.com/project/nixexprs", in which
# case "gitlab_status_repo" would be "nixexprs".
# - gitlab_project_id => ID of the project in Gitlab, i.e. in the above
# case the ID in gitlab of "nixexprs"

sub toGitlabState {
my ($status, $buildStatus) = @_;
if ($status == 0) {
return "pending";
} elsif ($status == 1) {
return "running";
} elsif ($buildStatus == 0) {
return "success";
} elsif ($buildStatus == 3 || $buildStatus == 4 || $buildStatus == 8 || $buildStatus == 10 || $buildStatus == 11) {
return "canceled";
} else {
return "failed";
}
}

sub common {
my ($self, $build, $dependents, $status) = @_;
my $baseurl = $self->{config}->{'base_uri'} || "http://localhost:3000";

# Find matching configs
foreach my $b ($build, @{$dependents}) {
my $jobName = showJobName $b;
my $evals = $build->jobsetevals;
my $ua = LWP::UserAgent->new();

# Don't send out "pending/running" status updates if the build is already finished
next if $status < 2 && $b->finished == 1;

my $state = toGitlabState($status, $b->buildstatus);
my $body = encode_json(
{
state => $state,
target_url => "$baseurl/build/" . $b->id,
description => "Hydra build #" . $b->id . " of $jobName",
name => "Hydra " . $b->job->name,
});
while (my $eval = $evals->next) {
my $gitlabstatusInput = $eval->jobsetevalinputs->find({ name => "gitlab_status_repo" });
next unless defined $gitlabstatusInput->value;
my $i = $eval->jobsetevalinputs->find({ name => $gitlabstatusInput->value, altnr => 0 });
next unless defined $i;
my $projectId = $eval->jobsetevalinputs->find({ name => "gitlab_project_id" })->value;
my $accessToken = $self->{config}->{gitlab_authorization}->{$projectId};
my $rev = $i->revision;
my $domain = URI->new($i->uri)->host;
my $url = "https://$domain/api/v4/projects/$projectId/statuses/$rev";
print STDERR "GitlabStatus POSTing $state to $url\n";
my $req = HTTP::Request->new('POST', $url);
$req->header('Content-Type' => 'application/json');
$req->header('Private-Token' => $accessToken);
$req->content($body);
my $res = $ua->request($req);
print STDERR $res->status_line, ": ", $res->decoded_content, "\n" unless $res->is_success;
}
}
}

sub buildQueued {
common(@_, [], 0);
}

sub buildStarted {
common(@_, [], 1);
}

sub buildFinished {
common(@_, 2);
}

1;