1use gh_workflow::{Event, Expression, Job, Push, Run, Step, Use, Workflow};
2
3use crate::tasks::workflows::{
4 runners::{self, Platform},
5 steps::{self, FluentBuilder as _, NamedJob, named, release_job},
6 vars,
7};
8
9pub(crate) fn lychee_link_check(dir: &str) -> Step<Use> {
10 named::uses(
11 "lycheeverse",
12 "lychee-action",
13 "82202e5e9c2f4ef1a55a3d02563e1cb6041e5332",
14 ) // v2.4.1
15 .add_with(("args", format!("--no-progress --exclude '^http' '{dir}'")))
16 .add_with(("fail", true))
17 .add_with(("jobSummary", false))
18}
19
20pub(crate) fn install_mdbook() -> Step<Use> {
21 named::uses(
22 "peaceiris",
23 "actions-mdbook",
24 "ee69d230fe19748b7abf22df32acaa93833fad08", // v2
25 )
26 .with(("mdbook-version", "0.4.37"))
27}
28
29pub(crate) fn build_docs_book() -> Step<Run> {
30 named::bash(indoc::indoc! {r#"
31 mkdir -p target/deploy
32 mdbook build ./docs --dest-dir=../target/deploy/docs/
33 "#})
34}
35
36fn deploy_docs_to_pages() -> Step<Use> {
37 named::uses(
38 "cloudflare",
39 "wrangler-action",
40 "da0e0dfe58b7a431659754fdf3f186c529afbe65",
41 ) // v3
42 .add_with(("apiToken", vars::CLOUDFLARE_API_TOKEN))
43 .add_with(("accountId", vars::CLOUDFLARE_ACCOUNT_ID))
44 .add_with(("command", "pages deploy target/deploy --project-name=docs"))
45}
46
47fn deploy_install_script() -> Step<Use> {
48 named::uses(
49 "cloudflare",
50 "wrangler-action",
51 "da0e0dfe58b7a431659754fdf3f186c529afbe65",
52 ) // v3
53 .add_with(("apiToken", vars::CLOUDFLARE_API_TOKEN))
54 .add_with(("accountId", vars::CLOUDFLARE_ACCOUNT_ID))
55 .add_with((
56 "command",
57 "r2 object put -f script/install.sh zed-open-source-website-assets/install.sh",
58 ))
59}
60
61fn deploy_docs_worker() -> Step<Use> {
62 named::uses(
63 "cloudflare",
64 "wrangler-action",
65 "da0e0dfe58b7a431659754fdf3f186c529afbe65",
66 ) // v3
67 .add_with(("apiToken", vars::CLOUDFLARE_API_TOKEN))
68 .add_with(("accountId", vars::CLOUDFLARE_ACCOUNT_ID))
69 .add_with(("command", "deploy .cloudflare/docs-proxy/src/worker.js"))
70}
71
72fn upload_wrangler_logs() -> Step<Use> {
73 named::uses(
74 "actions",
75 "upload-artifact",
76 "ea165f8d65b6e75b540449e92b4886f43607fa02",
77 ) // v4
78 .if_condition(Expression::new("always()"))
79 .add_with(("name", "wrangler_logs"))
80 .add_with(("path", "/home/runner/.config/.wrangler/logs/"))
81}
82
83fn docs_build_steps(job: Job) -> Job {
84 job.add_env(("DOCS_AMPLITUDE_API_KEY", vars::DOCS_AMPLITUDE_API_KEY))
85 .runs_on(runners::LINUX_XL)
86 .add_step(steps::checkout_repo())
87 .add_step(steps::setup_cargo_config(Platform::Linux))
88 .add_step(steps::cache_rust_dependencies_namespace())
89 .map(steps::install_linux_dependencies)
90 .add_step(steps::script("./script/generate-action-metadata"))
91 .add_step(lychee_link_check("./docs/src/**/*"))
92 .add_step(install_mdbook())
93 .add_step(build_docs_book())
94 .add_step(lychee_link_check("target/deploy/docs"))
95}
96
97pub(crate) fn check_docs() -> NamedJob {
98 NamedJob {
99 name: "check_docs".to_owned(),
100 job: docs_build_steps(release_job(&[])),
101 }
102}
103
104pub(crate) fn deploy_docs_job() -> NamedJob {
105 named::job(
106 docs_build_steps(
107 release_job(&[])
108 .name("Build and Deploy Docs")
109 .cond(Expression::new(
110 "github.repository_owner == 'zed-industries'",
111 )),
112 )
113 .add_step(deploy_docs_to_pages())
114 .add_step(deploy_install_script())
115 .add_step(deploy_docs_worker())
116 .add_step(upload_wrangler_logs()),
117 )
118}
119
120pub(crate) fn deploy_docs() -> Workflow {
121 let deploy_docs = deploy_docs_job();
122
123 named::workflow()
124 .add_event(
125 Event::default().push(
126 Push::default()
127 .add_branch("main")
128 // todo! remove
129 .add_branch("staged-docs-releases"),
130 ),
131 )
132 .add_job(deploy_docs.name, deploy_docs.job)
133}