compliance_check.rs

 1use gh_workflow::{Event, Job, Run, Schedule, Step, Workflow, WorkflowDispatch};
 2use indoc::formatdoc;
 3
 4use crate::tasks::workflows::{
 5    release::{
 6        COMPLIANCE_REPORT_PATH, COMPLIANCE_STEP_ID, ComplianceContext,
 7        add_compliance_notification_steps,
 8    },
 9    runners,
10    steps::{self, CommonJobConditions, named},
11    vars::{self, StepOutput},
12};
13
14pub fn compliance_check() -> Workflow {
15    let check = scheduled_compliance_check();
16
17    named::workflow()
18        .on(Event::default()
19            .schedule([Schedule::new("30 17 * * 2")])
20            .workflow_dispatch(WorkflowDispatch::default()))
21        .add_env(("CARGO_TERM_COLOR", "always"))
22        .add_job(check.name, check.job)
23}
24
25fn scheduled_compliance_check() -> steps::NamedJob {
26    let determine_version_step = named::bash(indoc::indoc! {r#"
27        VERSION=$(sed -n 's/^version = "\(.*\)"/\1/p' crates/zed/Cargo.toml | tr -d '[:space:]')
28        if [ -z "$VERSION" ]; then
29            echo "Could not determine version from crates/zed/Cargo.toml"
30            exit 1
31        fi
32        TAG="v${VERSION}-pre"
33        echo "Checking compliance for $TAG"
34        echo "tag=$TAG" >> "$GITHUB_OUTPUT"
35    "#})
36    .id("determine-version");
37
38    let tag_output = StepOutput::new(&determine_version_step, "tag");
39
40    fn run_compliance_check(tag: &StepOutput) -> Step<Run> {
41        named::bash(
42            formatdoc! {r#"
43                cargo xtask compliance "$LATEST_TAG" --branch main --report-path "{COMPLIANCE_REPORT_PATH}"
44                "#,
45            }
46        )
47        .id(COMPLIANCE_STEP_ID)
48        .add_env(("LATEST_TAG", tag.to_string()))
49        .add_env(("GITHUB_APP_ID", vars::ZED_ZIPPY_APP_ID))
50        .add_env(("GITHUB_APP_KEY", vars::ZED_ZIPPY_APP_PRIVATE_KEY))
51    }
52
53    let job = Job::default()
54        .with_repository_owner_guard()
55        .runs_on(runners::LINUX_SMALL)
56        .add_step(steps::checkout_repo().with_full_history())
57        .add_step(steps::cache_rust_dependencies_namespace())
58        .add_step(determine_version_step)
59        .add_step(run_compliance_check(&tag_output));
60
61    named::job(add_compliance_notification_steps(
62        job,
63        ComplianceContext::Scheduled {
64            tag_source: tag_output,
65        },
66    ))
67}