Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Support for prebuilt plugin #2864

Merged
merged 33 commits into from
Feb 3, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
33 commits
Select commit Hold shift + click to select a range
78508b9
Refactor workflow
kkawula Jan 16, 2025
fd1e551
Wip
kkawula Jan 20, 2025
cb8a3d5
Remove other workflows
kkawula Jan 20, 2025
563c89e
Comment publish_plugin.yml
kkawula Jan 20, 2025
ade6fdc
Update workflow
kkawula Jan 21, 2025
371e636
Update workflow
kkawula Jan 21, 2025
9fb9d54
Revert "Remove other workflows"
kkawula Jan 21, 2025
a02df7d
Add add_allow_prebuilt_macros
kkawula Jan 21, 2025
27f9824
Add include field
kkawula Jan 21, 2025
1117d7e
Update settings name
kkawula Jan 23, 2025
9660178
Fix tests
kkawula Jan 23, 2025
26fb960
Merge branch 'master' into kkawula/2827-support-for-prebuilt-packages…
kkawula Jan 23, 2025
236d80c
Update CHANGELOG.md
kkawula Jan 23, 2025
4fc095b
Apply suggestions from code review
kkawula Jan 25, 2025
65ce5b4
Add docs
kkawula Jan 28, 2025
109c95c
Add comments to workflow
kkawula Jan 28, 2025
0229715
Apply suggestions from code review
kkawula Jan 28, 2025
2457e7c
Rename boolean output
kkawula Jan 28, 2025
115f22c
`cp` -> `mv`
kkawula Jan 28, 2025
9d725ff
Apply suggestions from code review
kkawula Jan 30, 2025
d8e1e5b
Update creatig table logic
kkawula Jan 30, 2025
5f2e338
Update CHANGELOG.md
kkawula Jan 30, 2025
777d111
Rename boolean output
kkawula Jan 30, 2025
595420a
Merge branch 'master' into kkawula/2827-support-for-prebuilt-packages…
kkawula Jan 30, 2025
00a9ef9
Update docs
kkawula Jan 30, 2025
2f2c786
Merge branch 'master' into kkawula/2827-support-for-prebuilt-packages…
kkawula Jan 31, 2025
7b810a3
Update CHANGELOG.md
kkawula Jan 31, 2025
a25597a
Update docs
kkawula Jan 31, 2025
70e881c
Remove wildcard
kkawula Jan 31, 2025
0ed225d
Merge branch 'master' into kkawula/2827-support-for-prebuilt-packages…
kkawula Jan 31, 2025
c589488
Update installation.md
cptartur Feb 3, 2025
57254be
Mention scarb version in CHANGELOG.md
cptartur Feb 3, 2025
3ba9e84
Add note on supported platforms
cptartur Feb 3, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
143 changes: 131 additions & 12 deletions .github/workflows/publish_plugin.yml
Original file line number Diff line number Diff line change
Expand Up @@ -5,33 +5,152 @@ on:
workflow_dispatch:

jobs:
upload-to-registry:
name: Upload plugin to the registry
check-version:
cptartur marked this conversation as resolved.
Show resolved Hide resolved
name: Check snforge_scarb_plugin Version
runs-on: ubuntu-latest
env:
SCARB_REGISTRY_AUTH_TOKEN: ${{ secrets.SCARB_REGISTRY_AUTH_TOKEN }}
outputs:
plugin_uploaded: ${{ steps.check-version.outputs.plugin_uploaded }}
steps:
- uses: actions/checkout@v4

- name: Check version
id: check-version
if: ${{ github.event_name != 'workflow_dispatch' }}
run: |
set -exo pipefail

snforge_scarb_plugin_version=$(grep version crates/snforge-scarb-plugin/Scarb.toml | cut -d '"' -f 2)
snforge_scarb_plugin_uploaded=$(curl -s https://scarbs.xyz/api/v1/index/sn/fo/snforge_scarb_plugin.json | jq --arg version "$snforge_scarb_plugin_version" '[.[] | select(.v == $version)] | length > 0')
echo "snforge_scarb_plugin_uploaded=$snforge_scarb_plugin_uploaded" >> $GITHUB_OUTPUT
plugin_uploaded=$(curl -s https://scarbs.xyz/api/v1/index/sn/fo/snforge_scarb_plugin.json | jq --arg version "$snforge_scarb_plugin_version" '[.[] | select(.v == $version)] | length > 0')
echo "plugin_uploaded=$plugin_uploaded" >> $GITHUB_OUTPUT

build-binaries:
name: Build ${{ matrix.target }}
needs: check-version
if: needs.check-version.outputs.plugin_uploaded == 'false' || github.event_name == 'workflow_dispatch'
runs-on: ${{ matrix.os }}

env:
# Cross-compiled targets will override this to `cross`.
kkawula marked this conversation as resolved.
Show resolved Hide resolved
CARGO: cargo

strategy:
matrix:
include:
- target: x86_64-unknown-linux-gnu
os: ubuntu-latest
# Use cross to link oldest GLIBC possible.
cross: true
lib-name: "libsnforge_scarb_plugin"
ext: "so"

- target: aarch64-unknown-linux-gnu
os: ubuntu-latest
cross: true
lib-name: "libsnforge_scarb_plugin"
ext: "so"

- target: x86_64-apple-darwin
os: macos-latest
lib-name: "libsnforge_scarb_plugin"
ext: "dylib"

- target: aarch64-apple-darwin
os: macos-latest
lib-name: "libsnforge_scarb_plugin"
ext: "dylib"

- uses: dtolnay/rust-toolchain@7b1c307e0dcbda6122208f10795a713336a9b35a
- target: x86_64-pc-windows-msvc
os: windows-latest
lib-name: "snforge_scarb_plugin"
ext: "dll"

# The scarb builds for following platforms are experimental and not officially supported by starknet-foundry.
# https://docs.swmansion.com/scarb/download.html#platform-support
# Reference issue: TODO(#2886)

# - target: aarch64-unknown-linux-musl
# os: ubuntu-latest
# cross: true
# ext: "so"

# - target: x86_64-unknown-linux-musl
# os: ubuntu-latest
# cross: true
# ext: "so"
kkawula marked this conversation as resolved.
Show resolved Hide resolved

steps:
- uses: actions/checkout@v4

- uses: dtolnay/rust-toolchain@stable
with:
toolchain: stable
target: ${{ matrix.target }}

- uses: Swatinem/rust-cache@3cf7f8cc28d1b4e7d01e3783be10a97d55d483c8

- name: Install cross
if: matrix.cross
uses: taiki-e/install-action@cross

- name: Enable cross-compilation
if: matrix.cross
shell: bash
run: |
echo "CARGO=cross" >> $GITHUB_ENV

- name: Build
working-directory: crates/snforge-scarb-plugin
run: ${{ env.CARGO }} build --release --locked --target ${{ matrix.target }}

- name: Rename Binary
shell: bash
run: |
set -euxo pipefail

PACKAGE_NAME="snforge_scarb_plugin"
PACKAGE_VERSION=$(grep version crates/snforge-scarb-plugin/Scarb.toml | cut -d '"' -f 2)

TARGET="${{ matrix.target }}"
EXT="${{ matrix.ext }}"
LIB_NAME="${{ matrix.lib-name }}"

OUTPUT_BINARY="${PACKAGE_NAME}_v${PACKAGE_VERSION}_${TARGET}.${EXT}"

mv ./target/${TARGET}/release/${LIB_NAME}.${EXT} ./target/${TARGET}/release/${OUTPUT_BINARY}

echo "OUTPUT_BINARY_PATH=./target/${TARGET}/release/${OUTPUT_BINARY}" >> $GITHUB_ENV

- name: Upload Artifact
uses: actions/upload-artifact@v4
with:
name: build-${{ matrix.target }}
path: ${{ env.OUTPUT_BINARY_PATH }}
compression-level: 0
cptartur marked this conversation as resolved.
Show resolved Hide resolved

upload-to-registry:
name: Upload snforge_scarb_plugin to the registry
runs-on: ubuntu-latest
needs: [check-version, build-binaries]
env:
SCARB_REGISTRY_AUTH_TOKEN: ${{ secrets.SCARB_REGISTRY_AUTH_TOKEN }}
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@stable
- uses: software-mansion/setup-scarb@v1
with:
scarb-version: "2.8.5"
scarb-version: "2.10.0-rc.1"
ddoktorski marked this conversation as resolved.
Show resolved Hide resolved

- name: Download artifacts
uses: actions/download-artifact@v4
with:
path: artifacts-dl

- name: Unpack artifacts to target directory
shell: bash
run: |
set -euxo pipefail
mkdir -p crates/snforge-scarb-plugin/target/scarb/cairo-plugin

mv artifacts-dl/build-*/snforge_scarb_plugin_* crates/snforge-scarb-plugin/target/scarb/cairo-plugin/

- name: Publish snforge_scarb_plugin
if: ${{ steps.check-version.outputs.snforge_scarb_plugin_uploaded == 'false' || github.event_name == 'workflow_dispatch' }}
if: needs.check-version.outputs.plugin_uploaded == 'false' || github.event_name == 'workflow_dispatch'
working-directory: crates/snforge-scarb-plugin
run: scarb publish
3 changes: 1 addition & 2 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,10 +11,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0

#### Added

- Rust is no longer required to use `snforge` if using Scarb >= 2.10.0 on supported platforms - precompiled `snforge_scarb_plugin` plugin binaries are now published to [package registry](https://scarbs.xyz) for new versions.
- Added a suggestion for using the `--max-n-steps` flag when the Cairo VM returns the error: `Could not reach the end of the program. RunResources has no remaining steps`.

### Forge

#### Fixed

- coverage validation now supports comments in `Scarb.toml`
Expand Down
25 changes: 24 additions & 1 deletion crates/forge/src/new.rs
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ use std::env;
use std::fs::{self, OpenOptions};
use std::io::Write;
use std::path::{Path, PathBuf};
use toml_edit::{value, ArrayOfTables, DocumentMut, Item, Table};
use toml_edit::{value, Array, ArrayOfTables, DocumentMut, Item, Table, Value};

static TEMPLATE: Dir = include_dir!("starknet_forge_template");

Expand Down Expand Up @@ -96,6 +96,7 @@ fn update_config(config_path: &Path, scarb: &Version) -> Result<()> {
set_cairo_edition(&mut document, CAIRO_EDITION);
add_test_script(&mut document);
add_assert_macros(&mut document, scarb)?;
add_allow_prebuilt_macros(&mut document)?;
kkawula marked this conversation as resolved.
Show resolved Hide resolved

fs::write(config_path, document.to_string())?;

Expand Down Expand Up @@ -142,6 +143,28 @@ fn add_assert_macros(document: &mut DocumentMut, scarb: &Version) -> Result<()>
Ok(())
}

fn add_allow_prebuilt_macros(document: &mut DocumentMut) -> Result<()> {
kkawula marked this conversation as resolved.
Show resolved Hide resolved
let tool_section = document.entry("tool").or_insert(Item::Table(Table::new()));
let tool_table = tool_section
.as_table_mut()
.context("Failed to get tool table from Scarb.toml")?;
tool_table.set_implicit(true);

let mut scarb_table = Table::new();

let mut allow_prebuilt_macros = Array::new();
allow_prebuilt_macros.push("snforge_std");

scarb_table.insert(
"allow-prebuilt-plugins",
Item::Value(Value::Array(allow_prebuilt_macros)),
);

tool_table.insert("scarb", Item::Table(scarb_table));

Ok(())
}

fn extend_gitignore(path: &Path) -> Result<()> {
if path.join(".gitignore").exists() {
let mut file = OpenOptions::new()
Expand Down
3 changes: 3 additions & 0 deletions crates/forge/tests/e2e/running.rs
Original file line number Diff line number Diff line change
Expand Up @@ -818,6 +818,9 @@ fn validate_init(project_path: &PathBuf, validate_snforge_std: bool) {

[scripts]
test = "snforge test"

[tool.scarb]
allow-prebuilt-plugins = ["snforge_std"]
{SCARB_MANIFEST_TEMPLATE_CONTENT}
"#,
snforge_std_assert
Expand Down
1 change: 1 addition & 0 deletions crates/snforge-scarb-plugin/Scarb.toml
Original file line number Diff line number Diff line change
Expand Up @@ -2,5 +2,6 @@
name = "snforge_scarb_plugin"
version = "0.36.0"
edition = "2024_07"
include = ["target/scarb/cairo-plugin/"]

[cairo-plugin]
11 changes: 11 additions & 0 deletions docs/src/appendix/scarb-toml.md
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,17 @@ url = "http://your.second.rpc.url"
block_id.number = "123"
```

### `[tool.scarb]`

```toml
[tool.scarb]
allow-prebuilt-plugins = ["snforge_std"]
```
Note: This configuration requires Scarb version >= 2.10.0 .

It allows `scarb` to download precompiled dependencies used by `snforge_std` from [the registry](https://scarbs.xyz).
The `snforge_std` library depends on a Cairo plugin that is written in Rust, and otherwise is compiled locally on the user's side.
cptartur marked this conversation as resolved.
Show resolved Hide resolved

### `[profile.<dev|release>.cairo]`
By default, these arguments do not need to be defined. Only set them to use [profiler](https://foundry-rs.github.io/starknet-foundry/snforge-advanced-features/profiling.html#profiling) or [coverage](https://foundry-rs.github.io/starknet-foundry/testing/coverage.html#coverage).

Expand Down
12 changes: 11 additions & 1 deletion docs/src/getting-started/first-steps.md
Original file line number Diff line number Diff line change
Expand Up @@ -100,4 +100,14 @@ Additionally, ensure that starknet-contract target is enabled in the `Scarb.toml
```toml
# ...
[[target.starknet-contract]]
```
```

> 📝 **Note**
>
> You can additionally specify `scarb` settings to avoid compiling Cairo plugin which `snforge_std` depends on. The plugin is written in Rust and, by default, is compiled locally on the user's side.
> ```
> [tool.scarb]
> allow-prebuilt-plugins = ["snforge_std"]
cptartur marked this conversation as resolved.
Show resolved Hide resolved
> ```
> This configuration requires Scarb version >= 2.10.0 .
>
Loading
Loading