Skip to content

Commit 527298e

Browse files
committed
feat: Small updates and add error contexts
1 parent 7c0f5ee commit 527298e

5 files changed

Lines changed: 71 additions & 17 deletions

File tree

Cargo.lock

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@ thiserror = "2"
2121
dotenvy = "0.15"
2222
# Actions
2323
ghactions = { version = "^0.16", features = ["dotenvy", "log", "generate", "octocrab", "toolcache"] }
24+
ghactions-core = { version = "^0.16" }
25+
2426
ghastoolkit = { version = "^0.8", features = ["toolcache"] }
2527

2628
# GitHub API

action.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@ inputs:
1515
language:
1616
description: Language(s) to use
1717
required: true
18+
packs:
19+
description: Query Packs to use
1820
codeql_version:
1921
description: CodeQL Version
2022
default: latest

src/action.rs

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
#![allow(dead_code)]
2-
use anyhow::Result;
2+
use anyhow::{Context, Result};
33
use ghactions::prelude::*;
44
use ghactions_core::repository::reference::RepositoryReference as Repository;
5-
use ghastoolkit::codeql::CodeQLLanguage;
5+
use ghastoolkit::{CodeQL, codeql::CodeQLLanguage};
66

77
/// This action is for 3rd party CodeQL extractors to be used in GitHub Actions
88
#[derive(Actions, Debug, Clone, Default)]
@@ -36,6 +36,10 @@ pub struct Action {
3636
#[input(description = "Language(s) to use", split = ",", required = true)]
3737
language: Vec<String>,
3838

39+
/// Queries packs to use
40+
#[input(description = "Query Packs to use", split = ",")]
41+
packs: Vec<String>,
42+
3943
/// CodeQL Version
4044
#[input(description = "CodeQL Version", default = "latest")]
4145
codeql_version: String,
@@ -101,9 +105,26 @@ impl Action {
101105
}
102106

103107
pub fn codeql_version(&self) -> &str {
108+
if self.codeql_version.is_empty() {
109+
log::debug!("No CodeQL version provided, using the latest version");
110+
return "latest";
111+
}
104112
&self.codeql_version
105113
}
106114

115+
pub async fn install_packs(&self, codeql: &CodeQL) -> Result<()> {
116+
log::info!("Installing CodeQL Packs");
117+
for pack in &self.packs {
118+
log::info!("Installing pack `{}`", pack);
119+
120+
codeql
121+
.run(vec!["pack", "download", pack])
122+
.await
123+
.context(format!("Failed to download pack `{}`", pack))?;
124+
}
125+
Ok(())
126+
}
127+
107128
pub fn attestation(&self) -> bool {
108129
self.attestation
109130
}

src/main.rs

Lines changed: 43 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -16,29 +16,36 @@ async fn main() -> Result<()> {
1616
let action = Action::init()?;
1717
debug!("Action :: {:?}", action);
1818

19-
group!("Setting up Extractor");
20-
2119
let client = action.octocrab()?;
2220

21+
group!("Setting up CodeQL");
22+
2323
let mut codeql = CodeQL::init()
2424
.build()
2525
.await
2626
.context("Failed to create CodeQL instance")?;
2727

2828
if !codeql.is_installed().await {
2929
let codeql_version = action.codeql_version();
30-
log::info!("CodeQL not installed, installing {}...", codeql_version);
31-
codeql.install(&client, codeql_version).await?;
30+
log::info!("CodeQL not installed, installing `{}`...", codeql_version);
31+
codeql
32+
.install(&client, codeql_version)
33+
.await
34+
.context("Failed to install CodeQL")?;
3235
log::info!("CodeQL installed");
3336
} else {
3437
log::info!("CodeQL already installed");
3538
}
39+
// Packs installation
40+
action.install_packs(&codeql).await?;
3641

37-
log::info!("CodeQL :: {:?}", codeql);
42+
groupend!();
43+
group!("Setting up Extractor");
3844

3945
// Extractor
40-
let extractor_repo = action.extractor_repository()?;
41-
info!("Extractor Repository :: {}", extractor_repo);
46+
let extractor_repo = action
47+
.extractor_repository()
48+
.context("Failed to get extractor repository")?;
4249

4350
let extractor_path = PathBuf::from("./extractors");
4451
if !extractor_path.exists() {
@@ -57,9 +64,12 @@ async fn main() -> Result<()> {
5764
.context("Failed to fetch extractor")?;
5865
log::info!("Extractor :: {:?}", extractor);
5966

60-
codeql.append_search_path(extractor.display().to_string());
67+
codeql.append_search_path(extractor);
6168

62-
let languages = codeql.get_languages().await?;
69+
let languages = codeql
70+
.get_languages()
71+
.await
72+
.context("Failed to get languages")?;
6373
log::info!("Languages :: {:#?}", languages);
6474

6575
if !action.languages().is_empty() {
@@ -73,12 +83,14 @@ async fn main() -> Result<()> {
7383
log::info!("No languages provided, using all available languages");
7484
}
7585

86+
log::info!("CodeQL :: {:?}", codeql);
87+
7688
groupend!();
7789

7890
let databases = PathBuf::from("./.codeql");
7991
let sarif_output = databases.join("results");
8092

81-
std::fs::create_dir_all(&sarif_output)?;
93+
std::fs::create_dir_all(&sarif_output).context("Failed to create results directory")?;
8294

8395
for language in action.languages() {
8496
let group = format!("Running {} extractor", language.language());
@@ -94,29 +106,45 @@ async fn main() -> Result<()> {
94106
.source(".".to_string())
95107
.path(database_path.display().to_string())
96108
.language(language.language())
97-
.build()?;
109+
.build()
110+
.context("Failed to create database")?;
98111

99112
log::info!("Creating database...");
100-
codeql.database(&database).overwrite().create().await?;
113+
codeql
114+
.database(&database)
115+
.overwrite()
116+
.create()
117+
.await
118+
.context("Failed to create database")?;
101119
log::info!("Created database :: {:?}", database);
102120

121+
// TODO: Queries
103122
let queries = CodeQLQueries::from(format!(
104123
"{}/{}-queries",
105124
extractor_repo.owner.clone(),
106125
language.language()
107126
));
108-
log::debug!("Queries :: {:?}", queries);
127+
log::info!("Queries :: {:?}", queries);
109128

110129
log::info!("Running analysis...");
111-
if let Err(err) = codeql
130+
match codeql
112131
.database(&database)
113132
.queries(queries)
114133
.output(sarif_path)
115134
.analyze()
116135
.await
117136
{
118-
log::error!("Failed to analyze database: {:?}", err);
137+
Ok(_) => {
138+
log::info!("Analysis complete");
139+
}
140+
Err(ghastoolkit::GHASError::SerdeError(e)) => {
141+
log::warn!("Failed to parse SARIF: {:?}", e);
142+
}
143+
Err(e) => {
144+
log::error!("Failed to analyze database: {:?}", e);
145+
}
119146
}
147+
120148
log::info!("Analysis complete :: {:?}", database);
121149
groupend!();
122150
}

0 commit comments

Comments
 (0)