forked from the-distro/ofborg
Send build job messages to build-results too
This commit is contained in:
parent
6ddf619334
commit
da9b84b9e3
|
@ -13,6 +13,12 @@ pub struct BuildJob {
|
||||||
pub statusreport: Option<ExchangeQueue>, // (Exchange, Routing Key)
|
pub statusreport: Option<ExchangeQueue>, // (Exchange, Routing Key)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Serialize, Deserialize, Debug)]
|
||||||
|
pub struct QueuedBuildJobs {
|
||||||
|
pub job: BuildJob,
|
||||||
|
pub architectures: Vec<String>,
|
||||||
|
}
|
||||||
|
|
||||||
pub type ExchangeQueue = (Option<Exchange>, Option<RoutingKey>);
|
pub type ExchangeQueue = (Option<Exchange>, Option<RoutingKey>);
|
||||||
type Exchange = String;
|
type Exchange = String;
|
||||||
type RoutingKey = String;
|
type RoutingKey = String;
|
||||||
|
|
|
@ -7,7 +7,9 @@ use amqp::protocol::basic::{BasicProperties, Deliver};
|
||||||
use chrono::{DateTime, Utc};
|
use chrono::{DateTime, Utc};
|
||||||
use hubcaps;
|
use hubcaps;
|
||||||
use hubcaps::checks::{CheckRunOptions, CheckRunState, Conclusion, Output};
|
use hubcaps::checks::{CheckRunOptions, CheckRunState, Conclusion, Output};
|
||||||
|
use message::buildjob::{BuildJob, QueuedBuildJobs};
|
||||||
use ofborg::message::buildresult::{BuildResult, BuildStatus, LegacyBuildResult};
|
use ofborg::message::buildresult::{BuildResult, BuildStatus, LegacyBuildResult};
|
||||||
|
use ofborg::message::Repo;
|
||||||
use ofborg::worker;
|
use ofborg::worker;
|
||||||
|
|
||||||
pub struct GitHubCommentPoster {
|
pub struct GitHubCommentPoster {
|
||||||
|
@ -20,8 +22,29 @@ impl GitHubCommentPoster {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub enum PostableEvent {
|
||||||
|
BuildQueued(QueuedBuildJobs),
|
||||||
|
BuildFinished(BuildResult),
|
||||||
|
}
|
||||||
|
|
||||||
|
impl PostableEvent {
|
||||||
|
fn from(bytes: &[u8]) -> Result<PostableEvent, String> {
|
||||||
|
match serde_json::from_slice::<QueuedBuildJobs>(bytes) {
|
||||||
|
Ok(e) => Ok(PostableEvent::BuildQueued(e)),
|
||||||
|
Err(_) => match serde_json::from_slice::<BuildResult>(bytes) {
|
||||||
|
Ok(e) => Ok(PostableEvent::BuildFinished(e)),
|
||||||
|
Err(e) => Err(format!(
|
||||||
|
"Failed to deserialize PostableEvent: {:?}, err: {:}",
|
||||||
|
String::from_utf8_lossy(&bytes.to_vec()),
|
||||||
|
e
|
||||||
|
)),
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl worker::SimpleWorker for GitHubCommentPoster {
|
impl worker::SimpleWorker for GitHubCommentPoster {
|
||||||
type J = BuildResult;
|
type J = PostableEvent;
|
||||||
|
|
||||||
fn msg_to_job(
|
fn msg_to_job(
|
||||||
&mut self,
|
&mut self,
|
||||||
|
@ -29,40 +52,73 @@ impl worker::SimpleWorker for GitHubCommentPoster {
|
||||||
_: &BasicProperties,
|
_: &BasicProperties,
|
||||||
body: &[u8],
|
body: &[u8],
|
||||||
) -> Result<Self::J, String> {
|
) -> Result<Self::J, String> {
|
||||||
match serde_json::from_slice(body) {
|
PostableEvent::from(body)
|
||||||
Ok(e) => Ok(e),
|
|
||||||
Err(e) => Err(format!(
|
|
||||||
"Failed to deserialize BuildResult: {:?}, err: {:}",
|
|
||||||
String::from_utf8_lossy(&body.to_vec()),
|
|
||||||
e
|
|
||||||
)),
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fn consumer(&mut self, job: &BuildResult) -> worker::Actions {
|
fn consumer(&mut self, job: &PostableEvent) -> worker::Actions {
|
||||||
let result = job.legacy();
|
let mut checks: Vec<CheckRunOptions> = vec![];
|
||||||
let comment = hubcaps::comments::CommentOptions {
|
let repo: Repo;
|
||||||
body: result_to_comment(&result),
|
|
||||||
};
|
|
||||||
let check = result_to_check(&result, Utc::now());
|
|
||||||
println!(":{:?}", check);
|
|
||||||
println!(":{:?}", comment);
|
|
||||||
|
|
||||||
let check_create_attempt = self
|
match job {
|
||||||
.github
|
PostableEvent::BuildQueued(queued_job) => {
|
||||||
.repo(result.repo.owner.clone(), result.repo.name.clone())
|
repo = queued_job.job.repo.clone();
|
||||||
.checkruns()
|
for architecture in queued_job.architectures.iter() {
|
||||||
.create(&check);
|
checks.push(job_to_check(&queued_job.job, &architecture, Utc::now()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
PostableEvent::BuildFinished(finished_job) => {
|
||||||
|
let result = finished_job.legacy();
|
||||||
|
repo = result.repo.clone();
|
||||||
|
checks.push(result_to_check(&result, Utc::now()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
match check_create_attempt {
|
for check in checks {
|
||||||
Ok(comment) => info!("Successfully sent {:?} to {}", comment, result.pr.number,),
|
println!(":{:?}", check);
|
||||||
Err(err) => info!("Failed to send check {:?} to {}", err, result.pr.number,),
|
|
||||||
|
let check_create_attempt = self
|
||||||
|
.github
|
||||||
|
.repo(repo.owner.clone(), repo.name.clone())
|
||||||
|
.checkruns()
|
||||||
|
.create(&check);
|
||||||
|
|
||||||
|
match check_create_attempt {
|
||||||
|
Ok(_) => info!("Successfully sent."),
|
||||||
|
Err(err) => info!("Failed to send check {:?}", err),
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
vec![worker::Action::Ack]
|
vec![worker::Action::Ack]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn job_to_check(job: &BuildJob, architecture: &str, timestamp: DateTime<Utc>) -> CheckRunOptions {
|
||||||
|
let mut all_attrs: Vec<String> = job.attrs.clone();
|
||||||
|
all_attrs.sort();
|
||||||
|
|
||||||
|
if all_attrs.is_empty() {
|
||||||
|
all_attrs = vec![String::from("(unknown attributes)")];
|
||||||
|
}
|
||||||
|
|
||||||
|
CheckRunOptions {
|
||||||
|
name: format!("{} on {}", all_attrs.join(", "), architecture),
|
||||||
|
actions: None,
|
||||||
|
completed_at: None,
|
||||||
|
started_at: Some(timestamp.to_rfc3339_opts(chrono::SecondsFormat::Secs, true)),
|
||||||
|
conclusion: None,
|
||||||
|
details_url: Some(format!(
|
||||||
|
"https://logs.nix.ci/?key={}/{}.{}",
|
||||||
|
&job.repo.owner.to_lowercase(),
|
||||||
|
&job.repo.name.to_lowercase(),
|
||||||
|
job.pr.number,
|
||||||
|
)),
|
||||||
|
external_id: None,
|
||||||
|
head_sha: job.pr.head_sha.clone(),
|
||||||
|
output: None,
|
||||||
|
status: Some(CheckRunState::Queued),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
fn result_to_check(result: &LegacyBuildResult, timestamp: DateTime<Utc>) -> CheckRunOptions {
|
fn result_to_check(result: &LegacyBuildResult, timestamp: DateTime<Utc>) -> CheckRunOptions {
|
||||||
let mut all_attrs: Vec<String> =
|
let mut all_attrs: Vec<String> =
|
||||||
vec![result.attempted_attrs.clone(), result.skipped_attrs.clone()]
|
vec![result.attempted_attrs.clone(), result.skipped_attrs.clone()]
|
||||||
|
@ -138,56 +194,6 @@ fn result_to_check(result: &LegacyBuildResult, timestamp: DateTime<Utc>) -> Chec
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn result_to_comment(result: &LegacyBuildResult) -> String {
|
|
||||||
let mut reply: Vec<String> = vec![];
|
|
||||||
|
|
||||||
let log_link = if !result.output.is_empty() {
|
|
||||||
format!(
|
|
||||||
" [(full log)](https://logs.nix.ci/?key={}/{}.{}&attempt_id={})",
|
|
||||||
&result.repo.owner.to_lowercase(),
|
|
||||||
&result.repo.name.to_lowercase(),
|
|
||||||
result.pr.number,
|
|
||||||
result.attempt_id,
|
|
||||||
)
|
|
||||||
} else {
|
|
||||||
"".to_owned()
|
|
||||||
};
|
|
||||||
|
|
||||||
reply.push(format!("<!--REQUEST_ID={}-->", result.request_id));
|
|
||||||
reply.push(format!(
|
|
||||||
"{} on {}{}",
|
|
||||||
String::from(result.status.clone()),
|
|
||||||
result.system,
|
|
||||||
log_link
|
|
||||||
));
|
|
||||||
reply.push("".to_owned());
|
|
||||||
|
|
||||||
if let Some(ref attempted) = result.attempted_attrs {
|
|
||||||
reply.extend(list_segment("Attempted", &attempted));
|
|
||||||
}
|
|
||||||
|
|
||||||
if let Some(ref skipped) = result.skipped_attrs {
|
|
||||||
reply.extend(list_segment(
|
|
||||||
&format!(
|
|
||||||
"The following builds were skipped because they don't evaluate on {}",
|
|
||||||
result.system
|
|
||||||
),
|
|
||||||
&skipped,
|
|
||||||
));
|
|
||||||
}
|
|
||||||
|
|
||||||
if !result.output.is_empty() {
|
|
||||||
reply.extend(partial_log_segment(&result.output));
|
|
||||||
reply.push("".to_owned());
|
|
||||||
reply.push("".to_owned());
|
|
||||||
} else {
|
|
||||||
reply.push("No partial log is available.".to_owned());
|
|
||||||
reply.push("".to_owned());
|
|
||||||
}
|
|
||||||
|
|
||||||
reply.join("\n")
|
|
||||||
}
|
|
||||||
|
|
||||||
fn list_segment(name: &str, things: &[String]) -> Vec<String> {
|
fn list_segment(name: &str, things: &[String]) -> Vec<String> {
|
||||||
let mut reply: Vec<String> = vec![];
|
let mut reply: Vec<String> = vec![];
|
||||||
|
|
||||||
|
@ -199,19 +205,6 @@ fn list_segment(name: &str, things: &[String]) -> Vec<String> {
|
||||||
reply
|
reply
|
||||||
}
|
}
|
||||||
|
|
||||||
fn partial_log_segment(output: &[String]) -> Vec<String> {
|
|
||||||
let mut reply: Vec<String> = vec![];
|
|
||||||
|
|
||||||
reply.push("<details><summary>Partial log (click to expand)</summary><p>".to_owned());
|
|
||||||
reply.push("".to_owned());
|
|
||||||
reply.push("```".to_owned());
|
|
||||||
reply.extend(output.to_vec());
|
|
||||||
reply.push("```".to_owned());
|
|
||||||
reply.push("</p></details>".to_owned());
|
|
||||||
|
|
||||||
reply
|
|
||||||
}
|
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
use super::*;
|
use super::*;
|
||||||
|
@ -219,8 +212,8 @@ mod tests {
|
||||||
use message::{Pr, Repo};
|
use message::{Pr, Repo};
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
pub fn test_passing_build() {
|
pub fn test_queued_build() {
|
||||||
let result = LegacyBuildResult {
|
let job = BuildJob {
|
||||||
repo: Repo {
|
repo: Repo {
|
||||||
clone_url: "https://github.com/nixos/nixpkgs.git".to_owned(),
|
clone_url: "https://github.com/nixos/nixpkgs.git".to_owned(),
|
||||||
full_name: "NixOS/nixpkgs".to_owned(),
|
full_name: "NixOS/nixpkgs".to_owned(),
|
||||||
|
@ -232,366 +225,29 @@ mod tests {
|
||||||
number: 2345,
|
number: 2345,
|
||||||
target_branch: Some("master".to_owned()),
|
target_branch: Some("master".to_owned()),
|
||||||
},
|
},
|
||||||
output: vec![
|
logs: None,
|
||||||
"make[2]: Entering directory '/private/tmp/nix-build-gdb-8.1.drv-0/gdb-8.1/readline'".to_owned(),
|
statusreport: None,
|
||||||
"make[2]: Nothing to be done for 'install'.".to_owned(),
|
subset: None,
|
||||||
"make[2]: Leaving directory '/private/tmp/nix-build-gdb-8.1.drv-0/gdb-8.1/readline'".to_owned(),
|
|
||||||
"make[1]: Nothing to be done for 'install-target'.".to_owned(),
|
|
||||||
"make[1]: Leaving directory '/private/tmp/nix-build-gdb-8.1.drv-0/gdb-8.1'".to_owned(),
|
|
||||||
"removed '/nix/store/pcja75y9isdvgz5i00pkrpif9rxzxc29-gdb-8.1/share/info/bfd.info'".to_owned(),
|
|
||||||
"post-installation fixup".to_owned(),
|
|
||||||
"strip is /nix/store/5a88zk3jgimdmzg8rfhvm93kxib3njf9-cctools-binutils-darwin/bin/strip".to_owned(),
|
|
||||||
"patching script interpreter paths in /nix/store/pcja75y9isdvgz5i00pkrpif9rxzxc29-gdb-8.1".to_owned(),
|
|
||||||
"/nix/store/pcja75y9isdvgz5i00pkrpif9rxzxc29-gdb-8.1".to_owned(),
|
|
||||||
],
|
|
||||||
attempt_id: "neatattemptid".to_owned(),
|
|
||||||
request_id: "bogus-request-id".to_owned(),
|
request_id: "bogus-request-id".to_owned(),
|
||||||
system: "x86_64-linux".to_owned(),
|
attrs: vec!["foo".to_owned(), "bar".to_owned()],
|
||||||
attempted_attrs: Some(vec!["foo".to_owned()]),
|
|
||||||
skipped_attrs: Some(vec!["bar".to_owned()]),
|
|
||||||
status: BuildStatus::Success,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
let timestamp = Utc.ymd(2023, 4, 20).and_hms(13, 37, 42);
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
&result_to_comment(&result),
|
job_to_check(&job, "x86_64-linux", timestamp),
|
||||||
"<!--REQUEST_ID=bogus-request-id-->
|
CheckRunOptions {
|
||||||
Success on x86_64-linux [(full log)](https://logs.nix.ci/?key=nixos/nixpkgs.2345&attempt_id=neatattemptid)
|
name: "bar, foo on x86_64-linux".to_string(),
|
||||||
|
actions: None,
|
||||||
Attempted: foo
|
started_at: Some("2023-04-20T13:37:42Z".to_string()),
|
||||||
|
completed_at: None,
|
||||||
The following builds were skipped because they don't evaluate on x86_64-linux: bar
|
status: Some(CheckRunState::Queued),
|
||||||
|
conclusion: None,
|
||||||
<details><summary>Partial log (click to expand)</summary><p>
|
details_url: Some("https://logs.nix.ci/?key=nixos/nixpkgs.2345".to_string()),
|
||||||
|
external_id: None,
|
||||||
```
|
head_sha: "abc123".to_string(),
|
||||||
make[2]: Entering directory '/private/tmp/nix-build-gdb-8.1.drv-0/gdb-8.1/readline'
|
output: None,
|
||||||
make[2]: Nothing to be done for 'install'.
|
}
|
||||||
make[2]: Leaving directory '/private/tmp/nix-build-gdb-8.1.drv-0/gdb-8.1/readline'
|
|
||||||
make[1]: Nothing to be done for 'install-target'.
|
|
||||||
make[1]: Leaving directory '/private/tmp/nix-build-gdb-8.1.drv-0/gdb-8.1'
|
|
||||||
removed '/nix/store/pcja75y9isdvgz5i00pkrpif9rxzxc29-gdb-8.1/share/info/bfd.info'
|
|
||||||
post-installation fixup
|
|
||||||
strip is /nix/store/5a88zk3jgimdmzg8rfhvm93kxib3njf9-cctools-binutils-darwin/bin/strip
|
|
||||||
patching script interpreter paths in /nix/store/pcja75y9isdvgz5i00pkrpif9rxzxc29-gdb-8.1
|
|
||||||
/nix/store/pcja75y9isdvgz5i00pkrpif9rxzxc29-gdb-8.1
|
|
||||||
```
|
|
||||||
</p></details>
|
|
||||||
|
|
||||||
"
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
pub fn test_failing_build() {
|
|
||||||
let result = LegacyBuildResult {
|
|
||||||
repo: Repo {
|
|
||||||
clone_url: "https://github.com/nixos/nixpkgs.git".to_owned(),
|
|
||||||
full_name: "NixOS/nixpkgs".to_owned(),
|
|
||||||
owner: "NixOS".to_owned(),
|
|
||||||
name: "nixpkgs".to_owned(),
|
|
||||||
},
|
|
||||||
pr: Pr {
|
|
||||||
head_sha: "abc123".to_owned(),
|
|
||||||
number: 2345,
|
|
||||||
target_branch: Some("master".to_owned()),
|
|
||||||
},
|
|
||||||
output: vec![
|
|
||||||
"make[2]: Entering directory '/private/tmp/nix-build-gdb-8.1.drv-0/gdb-8.1/readline'".to_owned(),
|
|
||||||
"make[2]: Nothing to be done for 'install'.".to_owned(),
|
|
||||||
"make[2]: Leaving directory '/private/tmp/nix-build-gdb-8.1.drv-0/gdb-8.1/readline'".to_owned(),
|
|
||||||
"make[1]: Nothing to be done for 'install-target'.".to_owned(),
|
|
||||||
"make[1]: Leaving directory '/private/tmp/nix-build-gdb-8.1.drv-0/gdb-8.1'".to_owned(),
|
|
||||||
"removed '/nix/store/pcja75y9isdvgz5i00pkrpif9rxzxc29-gdb-8.1/share/info/bfd.info'".to_owned(),
|
|
||||||
"post-installation fixup".to_owned(),
|
|
||||||
"strip is /nix/store/5a88zk3jgimdmzg8rfhvm93kxib3njf9-cctools-binutils-darwin/bin/strip".to_owned(),
|
|
||||||
"patching script interpreter paths in /nix/store/pcja75y9isdvgz5i00pkrpif9rxzxc29-gdb-8.1".to_owned(),
|
|
||||||
"/nix/store/pcja75y9isdvgz5i00pkrpif9rxzxc29-gdb-8.1".to_owned(),
|
|
||||||
],
|
|
||||||
attempt_id: "neatattemptid".to_owned(),
|
|
||||||
request_id: "bogus-request-id".to_owned(),
|
|
||||||
system: "x86_64-linux".to_owned(),
|
|
||||||
attempted_attrs: Some(vec!["foo".to_owned()]),
|
|
||||||
skipped_attrs: None,
|
|
||||||
status: BuildStatus::Failure,
|
|
||||||
};
|
|
||||||
|
|
||||||
assert_eq!(
|
|
||||||
&result_to_comment(&result),
|
|
||||||
"<!--REQUEST_ID=bogus-request-id-->
|
|
||||||
Failure on x86_64-linux [(full log)](https://logs.nix.ci/?key=nixos/nixpkgs.2345&attempt_id=neatattemptid)
|
|
||||||
|
|
||||||
Attempted: foo
|
|
||||||
|
|
||||||
<details><summary>Partial log (click to expand)</summary><p>
|
|
||||||
|
|
||||||
```
|
|
||||||
make[2]: Entering directory '/private/tmp/nix-build-gdb-8.1.drv-0/gdb-8.1/readline'
|
|
||||||
make[2]: Nothing to be done for 'install'.
|
|
||||||
make[2]: Leaving directory '/private/tmp/nix-build-gdb-8.1.drv-0/gdb-8.1/readline'
|
|
||||||
make[1]: Nothing to be done for 'install-target'.
|
|
||||||
make[1]: Leaving directory '/private/tmp/nix-build-gdb-8.1.drv-0/gdb-8.1'
|
|
||||||
removed '/nix/store/pcja75y9isdvgz5i00pkrpif9rxzxc29-gdb-8.1/share/info/bfd.info'
|
|
||||||
post-installation fixup
|
|
||||||
strip is /nix/store/5a88zk3jgimdmzg8rfhvm93kxib3njf9-cctools-binutils-darwin/bin/strip
|
|
||||||
patching script interpreter paths in /nix/store/pcja75y9isdvgz5i00pkrpif9rxzxc29-gdb-8.1
|
|
||||||
/nix/store/pcja75y9isdvgz5i00pkrpif9rxzxc29-gdb-8.1
|
|
||||||
```
|
|
||||||
</p></details>
|
|
||||||
|
|
||||||
"
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
pub fn test_timedout_build() {
|
|
||||||
let result = LegacyBuildResult {
|
|
||||||
repo: Repo {
|
|
||||||
clone_url: "https://github.com/nixos/nixpkgs.git".to_owned(),
|
|
||||||
full_name: "NixOS/nixpkgs".to_owned(),
|
|
||||||
owner: "NixOS".to_owned(),
|
|
||||||
name: "nixpkgs".to_owned(),
|
|
||||||
},
|
|
||||||
pr: Pr {
|
|
||||||
head_sha: "abc123".to_owned(),
|
|
||||||
number: 2345,
|
|
||||||
target_branch: Some("master".to_owned()),
|
|
||||||
},
|
|
||||||
output: vec![
|
|
||||||
"make[2]: Entering directory '/private/tmp/nix-build-gdb-8.1.drv-0/gdb-8.1/readline'".to_owned(),
|
|
||||||
"make[2]: Nothing to be done for 'install'.".to_owned(),
|
|
||||||
"make[2]: Leaving directory '/private/tmp/nix-build-gdb-8.1.drv-0/gdb-8.1/readline'".to_owned(),
|
|
||||||
"make[1]: Nothing to be done for 'install-target'.".to_owned(),
|
|
||||||
"make[1]: Leaving directory '/private/tmp/nix-build-gdb-8.1.drv-0/gdb-8.1'".to_owned(),
|
|
||||||
"removed '/nix/store/pcja75y9isdvgz5i00pkrpif9rxzxc29-gdb-8.1/share/info/bfd.info'".to_owned(),
|
|
||||||
"post-installation fixup".to_owned(),
|
|
||||||
"building of '/nix/store/l1limh50lx2cx45yb2gqpv7k8xl1mik2-gdb-8.1.drv' timed out after 1 seconds".to_owned(),
|
|
||||||
"error: build of '/nix/store/l1limh50lx2cx45yb2gqpv7k8xl1mik2-gdb-8.1.drv' failed".to_owned(),
|
|
||||||
],
|
|
||||||
attempt_id: "neatattemptid".to_owned(),
|
|
||||||
request_id: "bogus-request-id".to_owned(),
|
|
||||||
system: "x86_64-linux".to_owned(),
|
|
||||||
attempted_attrs: Some(vec!["foo".to_owned()]),
|
|
||||||
skipped_attrs: None,
|
|
||||||
status: BuildStatus::TimedOut,
|
|
||||||
};
|
|
||||||
|
|
||||||
assert_eq!(
|
|
||||||
&result_to_comment(&result),
|
|
||||||
"<!--REQUEST_ID=bogus-request-id-->
|
|
||||||
Timed out, unknown build status on x86_64-linux [(full log)](https://logs.nix.ci/?key=nixos/nixpkgs.2345&attempt_id=neatattemptid)
|
|
||||||
|
|
||||||
Attempted: foo
|
|
||||||
|
|
||||||
<details><summary>Partial log (click to expand)</summary><p>
|
|
||||||
|
|
||||||
```
|
|
||||||
make[2]: Entering directory '/private/tmp/nix-build-gdb-8.1.drv-0/gdb-8.1/readline'
|
|
||||||
make[2]: Nothing to be done for 'install'.
|
|
||||||
make[2]: Leaving directory '/private/tmp/nix-build-gdb-8.1.drv-0/gdb-8.1/readline'
|
|
||||||
make[1]: Nothing to be done for 'install-target'.
|
|
||||||
make[1]: Leaving directory '/private/tmp/nix-build-gdb-8.1.drv-0/gdb-8.1'
|
|
||||||
removed '/nix/store/pcja75y9isdvgz5i00pkrpif9rxzxc29-gdb-8.1/share/info/bfd.info'
|
|
||||||
post-installation fixup
|
|
||||||
building of '/nix/store/l1limh50lx2cx45yb2gqpv7k8xl1mik2-gdb-8.1.drv' timed out after 1 seconds
|
|
||||||
error: build of '/nix/store/l1limh50lx2cx45yb2gqpv7k8xl1mik2-gdb-8.1.drv' failed
|
|
||||||
```
|
|
||||||
</p></details>
|
|
||||||
|
|
||||||
"
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
pub fn test_passing_build_unspecified_attributes() {
|
|
||||||
let result = LegacyBuildResult {
|
|
||||||
repo: Repo {
|
|
||||||
clone_url: "https://github.com/nixos/nixpkgs.git".to_owned(),
|
|
||||||
full_name: "NixOS/nixpkgs".to_owned(),
|
|
||||||
owner: "NixOS".to_owned(),
|
|
||||||
name: "nixpkgs".to_owned(),
|
|
||||||
},
|
|
||||||
pr: Pr {
|
|
||||||
head_sha: "abc123".to_owned(),
|
|
||||||
number: 2345,
|
|
||||||
target_branch: Some("master".to_owned()),
|
|
||||||
},
|
|
||||||
output: vec![
|
|
||||||
"make[2]: Entering directory '/private/tmp/nix-build-gdb-8.1.drv-0/gdb-8.1/readline'".to_owned(),
|
|
||||||
"make[2]: Nothing to be done for 'install'.".to_owned(),
|
|
||||||
"make[2]: Leaving directory '/private/tmp/nix-build-gdb-8.1.drv-0/gdb-8.1/readline'".to_owned(),
|
|
||||||
"make[1]: Nothing to be done for 'install-target'.".to_owned(),
|
|
||||||
"make[1]: Leaving directory '/private/tmp/nix-build-gdb-8.1.drv-0/gdb-8.1'".to_owned(),
|
|
||||||
"removed '/nix/store/pcja75y9isdvgz5i00pkrpif9rxzxc29-gdb-8.1/share/info/bfd.info'".to_owned(),
|
|
||||||
"post-installation fixup".to_owned(),
|
|
||||||
"strip is /nix/store/5a88zk3jgimdmzg8rfhvm93kxib3njf9-cctools-binutils-darwin/bin/strip".to_owned(),
|
|
||||||
"patching script interpreter paths in /nix/store/pcja75y9isdvgz5i00pkrpif9rxzxc29-gdb-8.1".to_owned(),
|
|
||||||
"/nix/store/pcja75y9isdvgz5i00pkrpif9rxzxc29-gdb-8.1".to_owned(),
|
|
||||||
],
|
|
||||||
attempt_id: "neatattemptid".to_owned(),
|
|
||||||
request_id: "bogus-request-id".to_owned(),
|
|
||||||
system: "x86_64-linux".to_owned(),
|
|
||||||
attempted_attrs: None,
|
|
||||||
skipped_attrs: None,
|
|
||||||
status: BuildStatus::Success,
|
|
||||||
};
|
|
||||||
|
|
||||||
assert_eq!(
|
|
||||||
&result_to_comment(&result),
|
|
||||||
"<!--REQUEST_ID=bogus-request-id-->
|
|
||||||
Success on x86_64-linux [(full log)](https://logs.nix.ci/?key=nixos/nixpkgs.2345&attempt_id=neatattemptid)
|
|
||||||
|
|
||||||
<details><summary>Partial log (click to expand)</summary><p>
|
|
||||||
|
|
||||||
```
|
|
||||||
make[2]: Entering directory '/private/tmp/nix-build-gdb-8.1.drv-0/gdb-8.1/readline'
|
|
||||||
make[2]: Nothing to be done for 'install'.
|
|
||||||
make[2]: Leaving directory '/private/tmp/nix-build-gdb-8.1.drv-0/gdb-8.1/readline'
|
|
||||||
make[1]: Nothing to be done for 'install-target'.
|
|
||||||
make[1]: Leaving directory '/private/tmp/nix-build-gdb-8.1.drv-0/gdb-8.1'
|
|
||||||
removed '/nix/store/pcja75y9isdvgz5i00pkrpif9rxzxc29-gdb-8.1/share/info/bfd.info'
|
|
||||||
post-installation fixup
|
|
||||||
strip is /nix/store/5a88zk3jgimdmzg8rfhvm93kxib3njf9-cctools-binutils-darwin/bin/strip
|
|
||||||
patching script interpreter paths in /nix/store/pcja75y9isdvgz5i00pkrpif9rxzxc29-gdb-8.1
|
|
||||||
/nix/store/pcja75y9isdvgz5i00pkrpif9rxzxc29-gdb-8.1
|
|
||||||
```
|
|
||||||
</p></details>
|
|
||||||
|
|
||||||
"
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
pub fn test_failing_build_unspecified_attributes() {
|
|
||||||
let result = LegacyBuildResult {
|
|
||||||
repo: Repo {
|
|
||||||
clone_url: "https://github.com/nixos/nixpkgs.git".to_owned(),
|
|
||||||
full_name: "NixOS/nixpkgs".to_owned(),
|
|
||||||
owner: "NixOS".to_owned(),
|
|
||||||
name: "nixpkgs".to_owned(),
|
|
||||||
},
|
|
||||||
pr: Pr {
|
|
||||||
head_sha: "abc123".to_owned(),
|
|
||||||
number: 2345,
|
|
||||||
target_branch: Some("master".to_owned()),
|
|
||||||
},
|
|
||||||
output: vec![
|
|
||||||
"make[2]: Entering directory '/private/tmp/nix-build-gdb-8.1.drv-0/gdb-8.1/readline'".to_owned(),
|
|
||||||
"make[2]: Nothing to be done for 'install'.".to_owned(),
|
|
||||||
"make[2]: Leaving directory '/private/tmp/nix-build-gdb-8.1.drv-0/gdb-8.1/readline'".to_owned(),
|
|
||||||
"make[1]: Nothing to be done for 'install-target'.".to_owned(),
|
|
||||||
"make[1]: Leaving directory '/private/tmp/nix-build-gdb-8.1.drv-0/gdb-8.1'".to_owned(),
|
|
||||||
"removed '/nix/store/pcja75y9isdvgz5i00pkrpif9rxzxc29-gdb-8.1/share/info/bfd.info'".to_owned(),
|
|
||||||
"post-installation fixup".to_owned(),
|
|
||||||
"strip is /nix/store/5a88zk3jgimdmzg8rfhvm93kxib3njf9-cctools-binutils-darwin/bin/strip".to_owned(),
|
|
||||||
"patching script interpreter paths in /nix/store/pcja75y9isdvgz5i00pkrpif9rxzxc29-gdb-8.1".to_owned(),
|
|
||||||
"/nix/store/pcja75y9isdvgz5i00pkrpif9rxzxc29-gdb-8.1".to_owned(),
|
|
||||||
],
|
|
||||||
attempt_id: "neatattemptid".to_owned(),
|
|
||||||
request_id: "bogus-request-id".to_owned(),
|
|
||||||
system: "x86_64-linux".to_owned(),
|
|
||||||
attempted_attrs: None,
|
|
||||||
skipped_attrs: None,
|
|
||||||
status: BuildStatus::Failure,
|
|
||||||
};
|
|
||||||
|
|
||||||
assert_eq!(
|
|
||||||
&result_to_comment(&result),
|
|
||||||
"<!--REQUEST_ID=bogus-request-id-->
|
|
||||||
Failure on x86_64-linux [(full log)](https://logs.nix.ci/?key=nixos/nixpkgs.2345&attempt_id=neatattemptid)
|
|
||||||
|
|
||||||
<details><summary>Partial log (click to expand)</summary><p>
|
|
||||||
|
|
||||||
```
|
|
||||||
make[2]: Entering directory '/private/tmp/nix-build-gdb-8.1.drv-0/gdb-8.1/readline'
|
|
||||||
make[2]: Nothing to be done for 'install'.
|
|
||||||
make[2]: Leaving directory '/private/tmp/nix-build-gdb-8.1.drv-0/gdb-8.1/readline'
|
|
||||||
make[1]: Nothing to be done for 'install-target'.
|
|
||||||
make[1]: Leaving directory '/private/tmp/nix-build-gdb-8.1.drv-0/gdb-8.1'
|
|
||||||
removed '/nix/store/pcja75y9isdvgz5i00pkrpif9rxzxc29-gdb-8.1/share/info/bfd.info'
|
|
||||||
post-installation fixup
|
|
||||||
strip is /nix/store/5a88zk3jgimdmzg8rfhvm93kxib3njf9-cctools-binutils-darwin/bin/strip
|
|
||||||
patching script interpreter paths in /nix/store/pcja75y9isdvgz5i00pkrpif9rxzxc29-gdb-8.1
|
|
||||||
/nix/store/pcja75y9isdvgz5i00pkrpif9rxzxc29-gdb-8.1
|
|
||||||
```
|
|
||||||
</p></details>
|
|
||||||
|
|
||||||
"
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
pub fn test_no_attempt() {
|
|
||||||
let result = LegacyBuildResult {
|
|
||||||
repo: Repo {
|
|
||||||
clone_url: "https://github.com/nixos/nixpkgs.git".to_owned(),
|
|
||||||
full_name: "NixOS/nixpkgs".to_owned(),
|
|
||||||
owner: "NixOS".to_owned(),
|
|
||||||
name: "nixpkgs".to_owned(),
|
|
||||||
},
|
|
||||||
pr: Pr {
|
|
||||||
head_sha: "abc123".to_owned(),
|
|
||||||
number: 2345,
|
|
||||||
target_branch: Some("master".to_owned()),
|
|
||||||
},
|
|
||||||
output: vec!["foo".to_owned()],
|
|
||||||
attempt_id: "foo".to_owned(),
|
|
||||||
request_id: "bogus-request-id".to_owned(),
|
|
||||||
system: "x86_64-linux".to_owned(),
|
|
||||||
attempted_attrs: None,
|
|
||||||
skipped_attrs: Some(vec!["not-attempted".to_owned()]),
|
|
||||||
status: BuildStatus::Skipped,
|
|
||||||
};
|
|
||||||
|
|
||||||
assert_eq!(
|
|
||||||
&result_to_comment(&result),
|
|
||||||
"<!--REQUEST_ID=bogus-request-id-->
|
|
||||||
No attempt on x86_64-linux [(full log)](https://logs.nix.ci/?key=nixos/nixpkgs.2345&attempt_id=foo)
|
|
||||||
|
|
||||||
The following builds were skipped because they don't evaluate on x86_64-linux: not-attempted
|
|
||||||
|
|
||||||
<details><summary>Partial log (click to expand)</summary><p>
|
|
||||||
|
|
||||||
```
|
|
||||||
foo
|
|
||||||
```
|
|
||||||
</p></details>
|
|
||||||
|
|
||||||
"
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
pub fn test_no_attempt_no_log() {
|
|
||||||
let result = LegacyBuildResult {
|
|
||||||
repo: Repo {
|
|
||||||
clone_url: "https://github.com/nixos/nixpkgs.git".to_owned(),
|
|
||||||
full_name: "NixOS/nixpkgs".to_owned(),
|
|
||||||
owner: "NixOS".to_owned(),
|
|
||||||
name: "nixpkgs".to_owned(),
|
|
||||||
},
|
|
||||||
pr: Pr {
|
|
||||||
head_sha: "abc123".to_owned(),
|
|
||||||
number: 2345,
|
|
||||||
target_branch: Some("master".to_owned()),
|
|
||||||
},
|
|
||||||
output: vec![],
|
|
||||||
attempt_id: "foo".to_owned(),
|
|
||||||
request_id: "bogus-request-id".to_owned(),
|
|
||||||
system: "x86_64-linux".to_owned(),
|
|
||||||
attempted_attrs: None,
|
|
||||||
skipped_attrs: Some(vec!["not-attempted".to_owned()]),
|
|
||||||
status: BuildStatus::Skipped,
|
|
||||||
};
|
|
||||||
|
|
||||||
assert_eq!(
|
|
||||||
&result_to_comment(&result),
|
|
||||||
"<!--REQUEST_ID=bogus-request-id-->
|
|
||||||
No attempt on x86_64-linux
|
|
||||||
|
|
||||||
The following builds were skipped because they don't evaluate on x86_64-linux: not-attempted
|
|
||||||
|
|
||||||
No partial log is available.
|
|
||||||
"
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -18,6 +18,7 @@ use ofborg::nix;
|
||||||
use ofborg::outpathdiff::{OutPathDiff, OutPaths};
|
use ofborg::outpathdiff::{OutPathDiff, OutPaths};
|
||||||
use ofborg::stats;
|
use ofborg::stats;
|
||||||
use ofborg::stats::Event;
|
use ofborg::stats::Event;
|
||||||
|
use ofborg::systems;
|
||||||
use ofborg::tagger::{PathsTagger, PkgsAddedRemovedTagger, RebuildTagger, StdenvTagger};
|
use ofborg::tagger::{PathsTagger, PkgsAddedRemovedTagger, RebuildTagger, StdenvTagger};
|
||||||
use ofborg::worker;
|
use ofborg::worker;
|
||||||
use std::collections::HashMap;
|
use std::collections::HashMap;
|
||||||
|
@ -123,7 +124,7 @@ impl<E: stats::SysEvents + 'static> worker::SimpleWorker for MassRebuildWorker<E
|
||||||
let pull = pulls.get(job.pr.number);
|
let pull = pulls.get(job.pr.number);
|
||||||
let issue = repo.issue(job.pr.number);
|
let issue = repo.issue(job.pr.number);
|
||||||
|
|
||||||
let auto_schedule_build_archs: Vec<buildjob::ExchangeQueue>;
|
let auto_schedule_build_archs: Vec<systems::System>;
|
||||||
|
|
||||||
match issue.get() {
|
match issue.get() {
|
||||||
Ok(iss) => {
|
Ok(iss) => {
|
||||||
|
@ -136,9 +137,10 @@ impl<E: stats::SysEvents + 'static> worker::SimpleWorker for MassRebuildWorker<E
|
||||||
if issue_is_wip(&iss) {
|
if issue_is_wip(&iss) {
|
||||||
auto_schedule_build_archs = vec![];
|
auto_schedule_build_archs = vec![];
|
||||||
} else {
|
} else {
|
||||||
auto_schedule_build_archs = self
|
auto_schedule_build_archs = self.acl.build_job_architectures_for_user_repo(
|
||||||
.acl
|
&iss.user.login,
|
||||||
.build_job_destinations_for_user_repo(&iss.user.login, &job.repo.full_name);
|
&job.repo.full_name,
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Err(e) => {
|
Err(e) => {
|
||||||
|
@ -464,9 +466,21 @@ impl<E: stats::SysEvents + 'static> worker::SimpleWorker for MassRebuildWorker<E
|
||||||
None,
|
None,
|
||||||
format!("{}", Uuid::new_v4()),
|
format!("{}", Uuid::new_v4()),
|
||||||
);
|
);
|
||||||
for (dest, rk) in auto_schedule_build_archs {
|
for arch in auto_schedule_build_archs.iter() {
|
||||||
response.push(worker::publish_serde_action(dest, rk, &msg));
|
let (exchange, routingkey) = arch.as_build_destination();
|
||||||
|
response.push(worker::publish_serde_action(exchange, routingkey, &msg));
|
||||||
}
|
}
|
||||||
|
response.push(worker::publish_serde_action(
|
||||||
|
Some("build-results".to_string()),
|
||||||
|
None,
|
||||||
|
&buildjob::QueuedBuildJobs {
|
||||||
|
job: msg,
|
||||||
|
architectures: auto_schedule_build_archs
|
||||||
|
.into_iter()
|
||||||
|
.map(|arch| arch.to_string())
|
||||||
|
.collect(),
|
||||||
|
},
|
||||||
|
));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Err(mut out) => {
|
Err(mut out) => {
|
||||||
|
|
Loading…
Reference in a new issue