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)
|
||||
}
|
||||
|
||||
#[derive(Serialize, Deserialize, Debug)]
|
||||
pub struct QueuedBuildJobs {
|
||||
pub job: BuildJob,
|
||||
pub architectures: Vec<String>,
|
||||
}
|
||||
|
||||
pub type ExchangeQueue = (Option<Exchange>, Option<RoutingKey>);
|
||||
type Exchange = String;
|
||||
type RoutingKey = String;
|
||||
|
|
|
@ -7,7 +7,9 @@ use amqp::protocol::basic::{BasicProperties, Deliver};
|
|||
use chrono::{DateTime, Utc};
|
||||
use hubcaps;
|
||||
use hubcaps::checks::{CheckRunOptions, CheckRunState, Conclusion, Output};
|
||||
use message::buildjob::{BuildJob, QueuedBuildJobs};
|
||||
use ofborg::message::buildresult::{BuildResult, BuildStatus, LegacyBuildResult};
|
||||
use ofborg::message::Repo;
|
||||
use ofborg::worker;
|
||||
|
||||
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 {
|
||||
type J = BuildResult;
|
||||
type J = PostableEvent;
|
||||
|
||||
fn msg_to_job(
|
||||
&mut self,
|
||||
|
@ -29,40 +52,73 @@ impl worker::SimpleWorker for GitHubCommentPoster {
|
|||
_: &BasicProperties,
|
||||
body: &[u8],
|
||||
) -> Result<Self::J, String> {
|
||||
match serde_json::from_slice(body) {
|
||||
Ok(e) => Ok(e),
|
||||
Err(e) => Err(format!(
|
||||
"Failed to deserialize BuildResult: {:?}, err: {:}",
|
||||
String::from_utf8_lossy(&body.to_vec()),
|
||||
e
|
||||
)),
|
||||
}
|
||||
PostableEvent::from(body)
|
||||
}
|
||||
|
||||
fn consumer(&mut self, job: &BuildResult) -> worker::Actions {
|
||||
let result = job.legacy();
|
||||
let comment = hubcaps::comments::CommentOptions {
|
||||
body: result_to_comment(&result),
|
||||
};
|
||||
let check = result_to_check(&result, Utc::now());
|
||||
println!(":{:?}", check);
|
||||
println!(":{:?}", comment);
|
||||
fn consumer(&mut self, job: &PostableEvent) -> worker::Actions {
|
||||
let mut checks: Vec<CheckRunOptions> = vec![];
|
||||
let repo: Repo;
|
||||
|
||||
let check_create_attempt = self
|
||||
.github
|
||||
.repo(result.repo.owner.clone(), result.repo.name.clone())
|
||||
.checkruns()
|
||||
.create(&check);
|
||||
match job {
|
||||
PostableEvent::BuildQueued(queued_job) => {
|
||||
repo = queued_job.job.repo.clone();
|
||||
for architecture in queued_job.architectures.iter() {
|
||||
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 {
|
||||
Ok(comment) => info!("Successfully sent {:?} to {}", comment, result.pr.number,),
|
||||
Err(err) => info!("Failed to send check {:?} to {}", err, result.pr.number,),
|
||||
for check in checks {
|
||||
println!(":{:?}", check);
|
||||
|
||||
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]
|
||||
}
|
||||
}
|
||||
|
||||
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 {
|
||||
let mut all_attrs: Vec<String> =
|
||||
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> {
|
||||
let mut reply: Vec<String> = vec![];
|
||||
|
||||
|
@ -199,19 +205,6 @@ fn list_segment(name: &str, things: &[String]) -> Vec<String> {
|
|||
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)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
|
@ -219,8 +212,8 @@ mod tests {
|
|||
use message::{Pr, Repo};
|
||||
|
||||
#[test]
|
||||
pub fn test_passing_build() {
|
||||
let result = LegacyBuildResult {
|
||||
pub fn test_queued_build() {
|
||||
let job = BuildJob {
|
||||
repo: Repo {
|
||||
clone_url: "https://github.com/nixos/nixpkgs.git".to_owned(),
|
||||
full_name: "NixOS/nixpkgs".to_owned(),
|
||||
|
@ -232,366 +225,29 @@ mod tests {
|
|||
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(),
|
||||
logs: None,
|
||||
statusreport: None,
|
||||
subset: None,
|
||||
|
||||
request_id: "bogus-request-id".to_owned(),
|
||||
system: "x86_64-linux".to_owned(),
|
||||
attempted_attrs: Some(vec!["foo".to_owned()]),
|
||||
skipped_attrs: Some(vec!["bar".to_owned()]),
|
||||
status: BuildStatus::Success,
|
||||
attrs: vec!["foo".to_owned(), "bar".to_owned()],
|
||||
};
|
||||
|
||||
let timestamp = Utc.ymd(2023, 4, 20).and_hms(13, 37, 42);
|
||||
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)
|
||||
|
||||
Attempted: foo
|
||||
|
||||
The following builds were skipped because they don't evaluate on x86_64-linux: bar
|
||||
|
||||
<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() {
|
||||
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.
|
||||
"
|
||||
job_to_check(&job, "x86_64-linux", timestamp),
|
||||
CheckRunOptions {
|
||||
name: "bar, foo on x86_64-linux".to_string(),
|
||||
actions: None,
|
||||
started_at: Some("2023-04-20T13:37:42Z".to_string()),
|
||||
completed_at: None,
|
||||
status: Some(CheckRunState::Queued),
|
||||
conclusion: None,
|
||||
details_url: Some("https://logs.nix.ci/?key=nixos/nixpkgs.2345".to_string()),
|
||||
external_id: None,
|
||||
head_sha: "abc123".to_string(),
|
||||
output: None,
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
|
|
|
@ -18,6 +18,7 @@ use ofborg::nix;
|
|||
use ofborg::outpathdiff::{OutPathDiff, OutPaths};
|
||||
use ofborg::stats;
|
||||
use ofborg::stats::Event;
|
||||
use ofborg::systems;
|
||||
use ofborg::tagger::{PathsTagger, PkgsAddedRemovedTagger, RebuildTagger, StdenvTagger};
|
||||
use ofborg::worker;
|
||||
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 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() {
|
||||
Ok(iss) => {
|
||||
|
@ -136,9 +137,10 @@ impl<E: stats::SysEvents + 'static> worker::SimpleWorker for MassRebuildWorker<E
|
|||
if issue_is_wip(&iss) {
|
||||
auto_schedule_build_archs = vec![];
|
||||
} else {
|
||||
auto_schedule_build_archs = self
|
||||
.acl
|
||||
.build_job_destinations_for_user_repo(&iss.user.login, &job.repo.full_name);
|
||||
auto_schedule_build_archs = self.acl.build_job_architectures_for_user_repo(
|
||||
&iss.user.login,
|
||||
&job.repo.full_name,
|
||||
);
|
||||
}
|
||||
}
|
||||
Err(e) => {
|
||||
|
@ -464,9 +466,21 @@ impl<E: stats::SysEvents + 'static> worker::SimpleWorker for MassRebuildWorker<E
|
|||
None,
|
||||
format!("{}", Uuid::new_v4()),
|
||||
);
|
||||
for (dest, rk) in auto_schedule_build_archs {
|
||||
response.push(worker::publish_serde_action(dest, rk, &msg));
|
||||
for arch in auto_schedule_build_archs.iter() {
|
||||
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) => {
|
||||
|
|
Loading…
Reference in a new issue