mirror of
https://github.com/taiki-e/install-action.git
synced 2026-05-10 14:40:32 +00:00
Speedup codegen by caching tools/codegen compilation (#554)
This commit is contained in:
11
.github/workflows/ci.yml
vendored
11
.github/workflows/ci.yml
vendored
@@ -83,6 +83,8 @@ jobs:
|
|||||||
- uses: ./
|
- uses: ./
|
||||||
with:
|
with:
|
||||||
tool: ${{ steps.tool-list.outputs.tool }}
|
tool: ${{ steps.tool-list.outputs.tool }}
|
||||||
|
env:
|
||||||
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
# https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsshell
|
# https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsshell
|
||||||
- name: Test bash
|
- name: Test bash
|
||||||
run: just --version && shfmt --version && protoc --version
|
run: just --version && shfmt --version && protoc --version
|
||||||
@@ -151,6 +153,8 @@ jobs:
|
|||||||
- uses: ./
|
- uses: ./
|
||||||
with:
|
with:
|
||||||
tool: ${{ steps.tool-list.outputs.tool }}
|
tool: ${{ steps.tool-list.outputs.tool }}
|
||||||
|
env:
|
||||||
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
|
||||||
manifest:
|
manifest:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
@@ -161,7 +165,12 @@ jobs:
|
|||||||
steps:
|
steps:
|
||||||
- uses: taiki-e/checkout-action@v1
|
- uses: taiki-e/checkout-action@v1
|
||||||
- name: Install Rust
|
- name: Install Rust
|
||||||
run: rustup toolchain add nightly --no-self-update && rustup default nightly
|
run: rustup update stable --no-self-update
|
||||||
|
- name: Generate Cargo.lock
|
||||||
|
run: cargo update
|
||||||
|
- uses: Swatinem/rust-cache@v2
|
||||||
|
with:
|
||||||
|
cache-all-crates: 'true'
|
||||||
- run: tools/manifest.sh
|
- run: tools/manifest.sh
|
||||||
env:
|
env:
|
||||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ use std::{
|
|||||||
ffi::OsStr,
|
ffi::OsStr,
|
||||||
io::Read,
|
io::Read,
|
||||||
path::Path,
|
path::Path,
|
||||||
sync::{LazyLock, RwLock},
|
sync::{OnceLock, RwLock},
|
||||||
time::Duration,
|
time::Duration,
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -649,38 +649,43 @@ struct GitHubTokens {
|
|||||||
other: RwLock<Option<String>>,
|
other: RwLock<Option<String>>,
|
||||||
}
|
}
|
||||||
impl GitHubTokens {
|
impl GitHubTokens {
|
||||||
fn get(&self, url: &str) -> Option<String> {
|
// TODO: Use std::sync::LazyLock once 1.80 is released
|
||||||
if url.starts_with("https://raw.githubusercontent.com/") {
|
fn get_github_tokens() -> &'static GitHubTokens {
|
||||||
self.raw.read().unwrap().clone()
|
static GITHUB_TOKENS: OnceLock<GitHubTokens> = OnceLock::new();
|
||||||
} else if url.starts_with("https://api.github.com/") {
|
GITHUB_TOKENS.get_or_init(|| {
|
||||||
self.api.read().unwrap().clone()
|
|
||||||
} else if url.starts_with("https://github.com/") {
|
|
||||||
self.other.read().unwrap().clone()
|
|
||||||
} else {
|
|
||||||
None
|
|
||||||
}
|
|
||||||
}
|
|
||||||
fn clear(&self, url: &str) {
|
|
||||||
if url.starts_with("https://raw.githubusercontent.com/") {
|
|
||||||
*self.raw.write().unwrap() = None;
|
|
||||||
} else if url.starts_with("https://api.github.com/") {
|
|
||||||
*self.api.write().unwrap() = None;
|
|
||||||
} else if url.starts_with("https://github.com/") {
|
|
||||||
*self.other.write().unwrap() = None;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
static GITHUB_TOKENS: LazyLock<GitHubTokens> = LazyLock::new(|| {
|
|
||||||
let token = env::var("GITHUB_TOKEN").ok().filter(|v| !v.is_empty());
|
let token = env::var("GITHUB_TOKEN").ok().filter(|v| !v.is_empty());
|
||||||
GitHubTokens {
|
GitHubTokens {
|
||||||
raw: RwLock::new(token.clone()),
|
raw: RwLock::new(token.clone()),
|
||||||
api: RwLock::new(token.clone()),
|
api: RwLock::new(token.clone()),
|
||||||
other: RwLock::new(token),
|
other: RwLock::new(token),
|
||||||
}
|
}
|
||||||
});
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
fn get(url: &str) -> Option<String> {
|
||||||
|
if url.starts_with("https://raw.githubusercontent.com/") {
|
||||||
|
Self::get_github_tokens().raw.read().unwrap().clone()
|
||||||
|
} else if url.starts_with("https://api.github.com/") {
|
||||||
|
Self::get_github_tokens().api.read().unwrap().clone()
|
||||||
|
} else if url.starts_with("https://github.com/") {
|
||||||
|
Self::get_github_tokens().other.read().unwrap().clone()
|
||||||
|
} else {
|
||||||
|
None
|
||||||
|
}
|
||||||
|
}
|
||||||
|
fn clear(url: &str) {
|
||||||
|
if url.starts_with("https://raw.githubusercontent.com/") {
|
||||||
|
*Self::get_github_tokens().raw.write().unwrap() = None;
|
||||||
|
} else if url.starts_with("https://api.github.com/") {
|
||||||
|
*Self::get_github_tokens().api.write().unwrap() = None;
|
||||||
|
} else if url.starts_with("https://github.com/") {
|
||||||
|
*Self::get_github_tokens().other.write().unwrap() = None;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
fn download(url: &str) -> Result<ureq::Response> {
|
fn download(url: &str) -> Result<ureq::Response> {
|
||||||
let mut token = GITHUB_TOKENS.get(url);
|
let mut token = GitHubTokens::get(url);
|
||||||
let mut retry = 0;
|
let mut retry = 0;
|
||||||
let mut retry_time = 0;
|
let mut retry_time = 0;
|
||||||
let mut max_retry = 6;
|
let mut max_retry = 6;
|
||||||
@@ -702,7 +707,7 @@ fn download(url: &str) -> Result<ureq::Response> {
|
|||||||
retry_time = 0;
|
retry_time = 0;
|
||||||
token = None;
|
token = None;
|
||||||
// rate limit
|
// rate limit
|
||||||
GITHUB_TOKENS.clear(url);
|
GitHubTokens::clear(url);
|
||||||
}
|
}
|
||||||
retry += 1;
|
retry += 1;
|
||||||
if retry > max_retry {
|
if retry > max_retry {
|
||||||
@@ -716,7 +721,7 @@ fn download(url: &str) -> Result<ureq::Response> {
|
|||||||
|
|
||||||
fn github_head(url: &str) -> Result<()> {
|
fn github_head(url: &str) -> Result<()> {
|
||||||
eprintln!("fetching head of {url} ..");
|
eprintln!("fetching head of {url} ..");
|
||||||
let mut token = GITHUB_TOKENS.get(url);
|
let mut token = GitHubTokens::get(url);
|
||||||
let mut retry = 0;
|
let mut retry = 0;
|
||||||
let mut retry_time = 0;
|
let mut retry_time = 0;
|
||||||
let mut max_retry = 2;
|
let mut max_retry = 2;
|
||||||
@@ -739,7 +744,7 @@ fn github_head(url: &str) -> Result<()> {
|
|||||||
if token.is_some() && retry == max_retry / 2 {
|
if token.is_some() && retry == max_retry / 2 {
|
||||||
retry_time = 0;
|
retry_time = 0;
|
||||||
token = None;
|
token = None;
|
||||||
GITHUB_TOKENS.clear(url);
|
GitHubTokens::clear(url);
|
||||||
}
|
}
|
||||||
retry += 1;
|
retry += 1;
|
||||||
if retry > max_retry {
|
if retry > max_retry {
|
||||||
|
|||||||
@@ -10,11 +10,11 @@ cd "$(dirname "$0")"/..
|
|||||||
# ./tools/manifest.sh [PACKAGE [VERSION_REQ]]
|
# ./tools/manifest.sh [PACKAGE [VERSION_REQ]]
|
||||||
|
|
||||||
if [[ $# -gt 0 ]]; then
|
if [[ $# -gt 0 ]]; then
|
||||||
cargo +nightly run --manifest-path tools/codegen/Cargo.toml --release -- "$@"
|
cargo run --manifest-path tools/codegen/Cargo.toml --release -- "$@"
|
||||||
exit 0
|
exit 0
|
||||||
fi
|
fi
|
||||||
|
|
||||||
for manifest in tools/codegen/base/*.json; do
|
for manifest in tools/codegen/base/*.json; do
|
||||||
package=$(basename "${manifest%.*}")
|
package=$(basename "${manifest%.*}")
|
||||||
cargo +nightly run --manifest-path tools/codegen/Cargo.toml --release -- "${package}" latest
|
cargo run --manifest-path tools/codegen/Cargo.toml --release -- "${package}" latest
|
||||||
done
|
done
|
||||||
|
|||||||
Reference in New Issue
Block a user