deploy_docs.rs

  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}