Skip to content

Commit 075ee77

Browse files
committed
feat: Update extractor and main workflow
1 parent b01eacd commit 075ee77

File tree

2 files changed

+65
-24
lines changed

2 files changed

+65
-24
lines changed

src/extractors.rs

Lines changed: 41 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ use std::path::PathBuf;
22

33
use anyhow::Result;
44
use ghastoolkit::Repository;
5-
use ghastoolkit::codeql::CodeQLExtractor;
65
use octocrab::models::repos::{Asset, Release};
76

87
async fn fetch_releases(client: &octocrab::Octocrab, repository: &Repository) -> Result<Release> {
@@ -32,31 +31,57 @@ async fn fetch_releases(client: &octocrab::Octocrab, repository: &Repository) ->
3231
pub async fn fetch_extractor(
3332
client: &octocrab::Octocrab,
3433
repository: &Repository,
34+
attest: bool,
3535
output: &PathBuf,
36-
) -> Result<CodeQLExtractor> {
37-
let release = fetch_releases(client, repository).await?;
38-
39-
let Some(release_asset) = release.assets.iter().find(|a| a.name.ends_with(".tar.gz")) else {
40-
return Err(anyhow::anyhow!("No asset found"));
41-
};
42-
log::info!("Asset URL :: {}", release_asset.browser_download_url);
43-
44-
let asset: Asset = client.get(release_asset.url.clone(), None::<&()>).await?;
45-
36+
) -> Result<PathBuf> {
4637
let extractor_tarball = output.join("extractor.tar.gz");
47-
let extractor_path = output.join("extractor-pack").join("codeql-extractor.yml");
38+
let extractor_pack = output.join("extractor-pack");
39+
let extractor_path = extractor_pack.join("codeql-extractor.yml");
4840

4941
let toolcache = ghactions::ToolCache::new();
5042

5143
if !extractor_tarball.exists() {
5244
log::info!("Downloading asset to {:?}", extractor_tarball);
5345

46+
let release = fetch_releases(client, repository).await?;
47+
48+
let Some(release_asset) = release.assets.iter().find(|a| a.name.ends_with(".tar.gz"))
49+
else {
50+
return Err(anyhow::anyhow!("No asset found"));
51+
};
52+
log::info!("Asset URL :: {}", release_asset.browser_download_url);
53+
54+
let asset: Asset = client.get(release_asset.url.clone(), None::<&()>).await?;
55+
5456
toolcache.download_asset(&asset, &extractor_tarball).await?;
5557
}
5658

57-
if extractor_path.exists() {
58-
log::info!("Removing existing asset {:?}", extractor_path);
59-
std::fs::remove_dir_all(&extractor_path)?;
59+
if attest {
60+
log::info!("Attesting asset {:?}", extractor_tarball);
61+
62+
let output = tokio::process::Command::new("gh")
63+
.arg("attestation")
64+
.arg("verify")
65+
.arg("--owner")
66+
.arg(repository.owner())
67+
.arg(&extractor_tarball)
68+
.output()
69+
.await?;
70+
71+
if !output.status.success() {
72+
return Err(anyhow::anyhow!(
73+
"Attestation failed: {}",
74+
String::from_utf8_lossy(&output.stderr)
75+
));
76+
}
77+
log::info!("Attestation successful");
78+
} else {
79+
log::info!("No attestation requested");
80+
}
81+
82+
if extractor_pack.exists() {
83+
log::info!("Removing existing asset {:?}", extractor_pack);
84+
std::fs::remove_dir_all(&extractor_pack)?;
6085
}
6186

6287
log::info!("Extracting asset to {:?}", extractor_path);
@@ -68,8 +93,5 @@ pub async fn fetch_extractor(
6893
return Err(anyhow::anyhow!("Extractor not found"));
6994
}
7095

71-
log::info!("Loading CodeQL Extractor from {:?}", extractor_path);
72-
let extractor = CodeQLExtractor::load_path(extractor_path)?;
73-
74-
Ok(extractor)
96+
Ok(extractor_path.canonicalize()?)
7597
}

src/main.rs

Lines changed: 24 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ use std::path::PathBuf;
22

33
use anyhow::{Context, Result};
44
use ghactions::{ActionTrait, ToolCache, group, groupend};
5+
use ghastoolkit::CodeQL;
56
use log::{debug, info};
67

78
mod action;
@@ -14,7 +15,7 @@ async fn main() -> Result<()> {
1415
let action = Action::init()?;
1516
debug!("Action :: {:?}", action);
1617

17-
group!("Initialise Workflow");
18+
group!("Setting up Extractor");
1819

1920
let client = octocrab::instance();
2021

@@ -32,14 +33,32 @@ async fn main() -> Result<()> {
3233
info!("Created Extractor Directory :: {:?}", extractor_path);
3334
}
3435

35-
let extractor = extractors::fetch_extractor(&client, &extractor_repo, &extractor_path).await?;
36+
let extractor = extractors::fetch_extractor(
37+
&client,
38+
&extractor_repo,
39+
action.attestation(),
40+
&extractor_path,
41+
)
42+
.await
43+
.context("Failed to fetch extractor")?;
3644
log::info!("Extractor :: {:?}", extractor);
3745

38-
groupend!();
46+
let codeql = CodeQL::init()
47+
.search_path(extractor)
48+
.build()
49+
.await
50+
.context("Failed to create CodeQL instance")?;
51+
log::info!("CodeQL :: {:?}", codeql);
52+
53+
let languages = codeql.get_languages().await?;
54+
log::info!("Languages :: {:?}", languages);
3955

40-
group!("Download and install extractor");
56+
// TODO: This is erroring during development
57+
// action.set_extractor_path(extractor_path.display().to_string());
58+
59+
groupend!();
4160

42-
// TODO: Validate the extractor
61+
group!("Running extractor");
4362

4463
groupend!();
4564

0 commit comments

Comments
 (0)