Skip to repository content148 lines · 5.6 KB · rust
tenant.openagents/omega
No repository description is available.
OpenAgents Git authority 2026-07-28T05:42:17.487Z Public web read
NIP-34 coordinate
30617:7649603503856e5148d571eac2766b288a8ff1e9e35d380337a1d2b0015b4f92:omegaMaintainersHidden in public view
References2 branches · 1 tag
Read-only clone
git clone https://openagents.com/git/tenant.openagents/omega.gitBrowse files
release_nightly.rs
1use crate::tasks::workflows::{
2 nix_build::build_nix,
3 release::{
4 ReleaseBundleJobs, create_sentry_release, download_workflow_artifacts, notify_on_failure,
5 prep_release_artifacts,
6 },
7 run_bundling::{build_static_bwrap, bundle_linux, bundle_mac, bundle_windows},
8 run_tests::run_platform_tests_no_filter,
9 runners::{Arch, Platform, ReleaseChannel},
10 steps::{
11 CommonJobConditions, CommonPermissionSets, DEFAULT_REPOSITORY_OWNER_GUARD, FluentBuilder,
12 GitRef, NamedJob, RefSha, RepositoryTarget, TokenPermissions,
13 },
14};
15
16use super::{runners, steps, steps::named, vars};
17use gh_workflow::*;
18
19/// Generates the release_nightly.yml workflow
20pub fn release_nightly() -> Workflow {
21 let (check_tag, skip) = check_nightly_tag();
22 let mut tests = run_platform_tests_no_filter(Platform::Linux);
23 tests.job = tests
24 .job
25 .needs([check_tag.name.clone()])
26 .cond(Expression::new(format!(
27 "{DEFAULT_REPOSITORY_OWNER_GUARD} && {} != 'true'",
28 skip.expr()
29 )));
30
31 const NIGHTLY: Option<ReleaseChannel> = Some(ReleaseChannel::Nightly);
32
33 let bundle = ReleaseBundleJobs {
34 linux_aarch64: bundle_linux(Arch::AARCH64, NIGHTLY, &[&tests]),
35 linux_x86_64: bundle_linux(Arch::X86_64, NIGHTLY, &[&tests]),
36 bwrap_linux_aarch64: build_static_bwrap(Arch::AARCH64, &[&tests]),
37 bwrap_linux_x86_64: build_static_bwrap(Arch::X86_64, &[&tests]),
38 mac_aarch64: bundle_mac(Arch::AARCH64, NIGHTLY, &[&tests]),
39 mac_x86_64: bundle_mac(Arch::X86_64, NIGHTLY, &[&tests]),
40 windows_aarch64: bundle_windows(Arch::AARCH64, NIGHTLY, &[&tests]),
41 windows_x86_64: bundle_windows(Arch::X86_64, NIGHTLY, &[&tests]),
42 };
43
44 let nix_linux_x86 = build_nix(Platform::Linux, Arch::X86_64, "default", None, &[&tests]);
45 let nix_mac_arm = build_nix(Platform::Mac, Arch::AARCH64, "default", None, &[&tests]);
46 let update_nightly_tag = update_nightly_tag_job(&bundle);
47 let notify_on_failure = notify_on_failure(&bundle.jobs());
48
49 named::workflow()
50 .with_minimal_permissions()
51 .on(Event::default()
52 // Fire 6 times a day
53 .schedule([Schedule::new("0 */4 * * *")])
54 .workflow_dispatch(WorkflowDispatch::default()))
55 .concurrency(
56 Concurrency::default()
57 .group("release-nightly")
58 .cancel_in_progress(true),
59 )
60 .add_env(("CARGO_TERM_COLOR", "always"))
61 .add_env(("RUST_BACKTRACE", "1"))
62 .add_job(check_tag.name, check_tag.job)
63 .add_job(tests.name, tests.job)
64 .map(|mut workflow| {
65 for job in bundle.into_jobs() {
66 workflow = workflow.add_job(job.name, job.job);
67 }
68 workflow
69 })
70 .add_job(nix_linux_x86.name, nix_linux_x86.job)
71 .add_job(nix_mac_arm.name, nix_mac_arm.job)
72 .add_job(update_nightly_tag.name, update_nightly_tag.job)
73 .add_job(notify_on_failure.name, notify_on_failure.job)
74}
75
76fn check_nightly_tag() -> (NamedJob, vars::JobOutput) {
77 let step = named::bash(indoc::indoc! {r#"
78 NIGHTLY_SHA=$(git rev-parse "nightly" 2>/dev/null || echo "")
79 if [ "$NIGHTLY_SHA" = "$GITHUB_SHA" ]; then
80 echo "Nightly tag already points to current commit. Skipping."
81 echo "skip=true" >> "$GITHUB_OUTPUT"
82 else
83 echo "skip=false" >> "$GITHUB_OUTPUT"
84 fi
85 "#})
86 .id("check");
87
88 let skip_output = vars::StepOutput::new(&step, "skip");
89
90 let job = release_job(&[])
91 .runs_on(runners::LINUX_SMALL)
92 .timeout_minutes(5u32)
93 .outputs([("skip".to_owned(), skip_output.to_string())])
94 .add_step(steps::checkout_repo().with_fetch_tags())
95 .add_step(step);
96
97 let job = named::job(job);
98 let skip = skip_output.as_job_output(&job);
99 (job, skip)
100}
101
102fn release_job(deps: &[&NamedJob]) -> Job {
103 let job = Job::default()
104 .with_repository_owner_guard()
105 .timeout_minutes(60u32);
106 if deps.len() > 0 {
107 job.needs(deps.iter().map(|j| j.name.clone()).collect::<Vec<_>>())
108 } else {
109 job
110 }
111}
112
113fn update_nightly_tag_job(bundle: &ReleaseBundleJobs) -> NamedJob {
114 let (authenticate, token) = steps::authenticate_as_zippy()
115 .for_repository(RepositoryTarget::current())
116 .with_permissions([(TokenPermissions::Contents, Level::Write)])
117 .into();
118
119 NamedJob {
120 name: "update_nightly_tag".to_owned(),
121 job: steps::release_job(&bundle.jobs())
122 .runs_on(runners::LINUX_MEDIUM)
123 .add_step(authenticate)
124 .add_step(steps::checkout_repo().with_fetch_tags())
125 .add_step(download_workflow_artifacts())
126 .add_step(steps::script("ls -lR ./artifacts"))
127 .add_step(prep_release_artifacts())
128 .add_step(
129 steps::script("./script/upload-nightly")
130 .add_env((
131 "DIGITALOCEAN_SPACES_ACCESS_KEY",
132 vars::DIGITALOCEAN_SPACES_ACCESS_KEY,
133 ))
134 .add_env((
135 "DIGITALOCEAN_SPACES_SECRET_KEY",
136 vars::DIGITALOCEAN_SPACES_SECRET_KEY,
137 )),
138 )
139 .add_step(steps::update_ref(
140 GitRef::tag("nightly"),
141 RefSha::Context,
142 &token,
143 true,
144 ))
145 .add_step(create_sentry_release()),
146 }
147}
148