Skip to repository content201 lines · 7.1 KB · rust
tenant.openagents/omega
No repository description is available.
OpenAgents Git authority 2026-07-28T05:41:32.957Z 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
after_release.rs
1use gh_workflow::*;
2
3use crate::tasks::workflows::{
4 deploy_docs::deploy_docs_workflow_call,
5 release::{self, notify_on_failure},
6 runners,
7 steps::{
8 CommonJobConditions, CommonPermissionSets, NamedJob, checkout_repo, dependant_job, named,
9 },
10 vars::{self, StepOutput, WorkflowInput},
11};
12
13const TAG_NAME_ENV: &str = "${{ github.event.release.tag_name || inputs.tag_name }}";
14const IS_PRERELEASE_ENV: &str = "${{ github.event.release.prerelease || inputs.prerelease }}";
15const TAG_NAME: &str = "${{ env.TAG_NAME }}";
16const RELEASE_BODY: &str = "${{ github.event.release.body || inputs.body }}";
17const DOCS_CHANNEL: &str =
18 "${{ (github.event.release.prerelease || inputs.prerelease) && 'preview' || 'stable' }}";
19
20pub fn after_release() -> Workflow {
21 let tag_name = WorkflowInput::string("tag_name", None);
22 let prerelease = WorkflowInput::bool("prerelease", None);
23 let body = WorkflowInput::string("body", Some(String::new()));
24
25 let refresh_zed_dev = rebuild_releases_page();
26 let deploy_docs = deploy_docs_workflow_call(DOCS_CHANNEL, TAG_NAME_ENV);
27 let post_to_discord = post_to_discord(&[&refresh_zed_dev]);
28 let publish_winget = publish_winget();
29 let create_sentry_release = create_sentry_release();
30 let notify_on_failure = {
31 let notify_on_failure = notify_on_failure(&[
32 &refresh_zed_dev,
33 &post_to_discord,
34 &publish_winget,
35 &create_sentry_release,
36 ]);
37 NamedJob {
38 name: notify_on_failure.name,
39 job: notify_on_failure.job.add_need(deploy_docs.name.clone()),
40 }
41 };
42
43 named::workflow()
44 .with_minimal_permissions()
45 .add_env(("TAG_NAME", TAG_NAME_ENV))
46 .add_env(("IS_PRERELEASE", IS_PRERELEASE_ENV))
47 .on(Event::default()
48 .release(Release::default().types(vec![ReleaseType::Published]))
49 .workflow_dispatch(
50 WorkflowDispatch::default()
51 .add_input(tag_name.name, tag_name.input())
52 .add_input(prerelease.name, prerelease.input())
53 .add_input(body.name, body.input()),
54 ))
55 .add_job(refresh_zed_dev.name, refresh_zed_dev.job)
56 .add_job(deploy_docs.name, deploy_docs.job)
57 .add_job(post_to_discord.name, post_to_discord.job)
58 .add_job(publish_winget.name, publish_winget.job)
59 .add_job(create_sentry_release.name, create_sentry_release.job)
60 .add_job(notify_on_failure.name, notify_on_failure.job)
61}
62
63fn rebuild_releases_page() -> NamedJob {
64 fn refresh_cloud_releases() -> Step<Run> {
65 named::bash("curl -fX POST \"https://cloud.zed.dev/releases/refresh?expect_tag=$TAG_NAME\"")
66 }
67
68 fn revalidate_zed_dev() -> Step<Run> {
69 named::bash(
70 "curl -fX GET \"https://zed.dev/api/revalidate?tag=releases\" -H \"Authorization: Bearer $ZED_DEV_REVALIDATE_TOKEN\"",
71 )
72 .add_env(("ZED_DEV_REVALIDATE_TOKEN", vars::ZED_DEV_REVALIDATE_TOKEN))
73 }
74
75 named::job(
76 Job::default()
77 .runs_on(runners::LINUX_SMALL)
78 .with_repository_owner_guard()
79 .add_step(refresh_cloud_releases())
80 .add_step(revalidate_zed_dev()),
81 )
82}
83
84fn post_to_discord(deps: &[&NamedJob]) -> NamedJob {
85 fn get_release_url() -> Step<Run> {
86 named::bash(
87 r#"if [ "$IS_PRERELEASE" == "true" ]; then
88 URL="https://zed.dev/releases/preview"
89else
90 URL="https://zed.dev/releases/stable"
91fi
92
93echo "URL=$URL" >> "$GITHUB_OUTPUT"
94"#,
95 )
96 .id("get-release-url")
97 }
98
99 fn get_content() -> Step<Use> {
100 named::uses(
101 "2428392",
102 "gh-truncate-string-action",
103 "b3ff790d21cf42af3ca7579146eedb93c8fb0757", // v1.4.1
104 )
105 .id("get-content")
106 .add_with((
107 "stringToTruncate",
108 format!(
109 "📣 Zed [{TAG_NAME}](<${{{{ steps.get-release-url.outputs.URL }}}}>) was just released!\n\n{RELEASE_BODY}\n"
110 ),
111 ))
112 .add_with(("maxLength", 2000))
113 .add_with(("truncationSymbol", "..."))
114 }
115
116 fn discord_webhook_action() -> Step<Use> {
117 named::uses(
118 "tsickert",
119 "discord-webhook",
120 "c840d45a03a323fbc3f7507ac7769dbd91bfb164", // v5.3.0
121 )
122 .add_with(("webhook-url", vars::DISCORD_WEBHOOK_RELEASE_NOTES))
123 .add_with(("content", "${{ steps.get-content.outputs.string }}"))
124 }
125 let job = dependant_job(deps)
126 .runs_on(runners::LINUX_SMALL)
127 .with_repository_owner_guard()
128 .add_step(get_release_url())
129 .add_step(get_content())
130 .add_step(discord_webhook_action());
131 named::job(job)
132}
133
134fn publish_winget() -> NamedJob {
135 fn sync_winget_pkgs_fork() -> Step<Run> {
136 named::pwsh(indoc::indoc! {r#"
137 $headers = @{
138 "Authorization" = "Bearer $env:WINGET_TOKEN"
139 "Accept" = "application/vnd.github+json"
140 "X-GitHub-Api-Version" = "2022-11-28"
141 }
142 $body = @{ branch = "master" } | ConvertTo-Json
143 $uri = "https://api.github.com/repos/$env:GITHUB_REPOSITORY_OWNER/winget-pkgs/merge-upstream"
144 try {
145 Invoke-RestMethod -Uri $uri -Method Post -Headers $headers -Body $body -ContentType "application/json"
146 Write-Host "Successfully synced winget-pkgs fork"
147 } catch {
148 Write-Host "Fork sync response: $_"
149 Write-Host "Continuing anyway - fork may already be up to date"
150 }
151 "#})
152 .add_env(("WINGET_TOKEN", vars::WINGET_TOKEN))
153 }
154
155 fn set_package_name() -> (Step<Run>, StepOutput) {
156 let script = r#"if ($env:IS_PRERELEASE -eq "true") {
157 $PACKAGE_NAME = "ZedIndustries.Zed.Preview"
158} else {
159 $PACKAGE_NAME = "ZedIndustries.Zed"
160}
161
162echo "PACKAGE_NAME=$PACKAGE_NAME" >> $env:GITHUB_OUTPUT
163"#;
164 let step = named::pwsh(script).id("set-package-name");
165
166 let output = StepOutput::new(&step, "PACKAGE_NAME");
167 (step, output)
168 }
169
170 fn winget_releaser(package_name: &StepOutput) -> Step<Use> {
171 named::uses(
172 "vedantmgoyal9",
173 "winget-releaser",
174 "19e706d4c9121098010096f9c495a70a7518b30f", // v2
175 )
176 .add_with(("identifier", package_name.to_string()))
177 .add_with(("release-tag", TAG_NAME))
178 .add_with(("max-versions-to-keep", 5))
179 .add_with(("token", vars::WINGET_TOKEN))
180 }
181
182 let (set_package_name, package_name) = set_package_name();
183
184 named::job(
185 Job::default()
186 .runs_on(runners::WINDOWS_DEFAULT)
187 .add_step(sync_winget_pkgs_fork())
188 .add_step(set_package_name)
189 .add_step(winget_releaser(&package_name)),
190 )
191}
192
193fn create_sentry_release() -> NamedJob {
194 let job = Job::default()
195 .runs_on(runners::LINUX_SMALL)
196 .with_repository_owner_guard()
197 .add_step(checkout_repo())
198 .add_step(release::create_sentry_release());
199 named::job(job)
200}
201