diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..d7b2a8d --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,66 @@ +name: ci + +on: + push: + branches: + - main + pull_request: + +env: + CARGO_TERM_COLOR: always + RUST_VERSION: 1.74.0 + +jobs: + test: + runs-on: ubuntu-latest-16-cores + steps: + - uses: actions/checkout@v3 + - uses: actions-rs/toolchain@v1 + with: + toolchain: ${{ env.RUST_VERSION }} + - uses: Swatinem/rust-cache@v2 + - run: cargo llvm-cov nextest --all-features --lcov --output-path lcov.info + - uses: codecov/codecov-action@v3 + with: + token: ${{ secrets.CODECOV_TOKEN }} + files: lcov.info + + ensure-wasm: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - uses: actions-rs/toolchain@v1 + with: + toolchain: ${{ env.RUST_VERSION }} + - uses: Swatinem/rust-cache@v2 + - run: cargo build -r --target wasm32-unknown-unknown -p account-sdk + + cairo-check: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - uses: software-mansion/setup-scarb@v1 + with: + scarb-version: "2.5.3" + - run: scarb fmt --check + - run: scarb test + + clippy: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - uses: actions-rs/toolchain@v1 + with: + toolchain: ${{ env.RUST_VERSION }} + - uses: Swatinem/rust-cache@v2 + - run: scripts/clippy.sh + + fmt: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - uses: actions-rs/toolchain@v1 + with: + toolchain: ${{ env.RUST_VERSION }} + - uses: Swatinem/rust-cache@v2 + - run: scripts/rust_fmt.sh --check diff --git a/.github/workflows/release-dispatch.yml b/.github/workflows/release-dispatch.yml new file mode 100644 index 0000000..f060c09 --- /dev/null +++ b/.github/workflows/release-dispatch.yml @@ -0,0 +1,35 @@ +name: release-dispatch +on: + workflow_dispatch: + inputs: + version: + description: Version to release + required: true + type: string + +jobs: + propose-release: + permissions: + pull-requests: write + contents: write + runs-on: ubuntu-latest + container: + image: ghcr.io/dojoengine/dojo-dev:5d61184 + steps: + # Workaround described here: https://github.com/actions/checkout/issues/760 + - uses: actions/checkout@v3 + - run: git config --global --add safe.directory "$GITHUB_WORKSPACE" + - run: cargo release version ${{ inputs.version }} --execute --no-confirm && cargo release replace --execute --no-confirm + - id: version_info + run: | + cargo install cargo-get + echo "version=$(cargo get workspace.package.version)" >> $GITHUB_OUTPUT + - uses: peter-evans/create-pull-request@v5 + with: + # We have to use a PAT in order to trigger ci + token: ${{ secrets.CREATE_PR_TOKEN }} + title: "Prepare release: v${{ steps.version_info.outputs.version }}" + commit-message: "Prepare release: v${{ steps.version_info.outputs.version }}" + branch: prepare-release + base: main + delete-branch: true diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 0000000..5fd3f38 --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,198 @@ +name: release + +on: + pull_request: + types: [closed] + branches: + - main + +env: + CARGO_TERM_COLOR: always + RUST_VERSION: 1.74.0 + REGISTRY_IMAGE: ghcr.io/${{ github.repository }} + +jobs: + prepare: + if: github.event.pull_request.merged == true && github.event.pull_request.head.ref == 'prepare-release' + runs-on: ubuntu-latest + outputs: + tag_name: ${{ steps.release_info.outputs.tag_name }} + steps: + - uses: actions/checkout@v3 + - name: Get version + id: release_info + run: | + cargo install cargo-get + echo "tag_name=$(cargo get workspace.package.version)" >> $GITHUB_OUTPUT + + release: + name: ${{ matrix.job.target }} (${{ matrix.job.os }}) + needs: prepare + runs-on: ${{ matrix.job.os }} + env: + PLATFORM_NAME: ${{ matrix.job.platform }} + TARGET: ${{ matrix.job.target }} + ARCH: ${{ matrix.job.arch }} + strategy: + matrix: + job: + # The OS is used for the runner + # The platform is a generic platform name + # The target is used by Cargo + # The arch is either 386, arm64 or amd64 + # The svm target platform to use for the binary https://github.com/roynalnaruto/svm-rs/blob/84cbe0ac705becabdc13168bae28a45ad2299749/svm-builds/build.rs#L4-L24 + - os: ubuntu-20.04-4-cores + platform: linux + target: x86_64-unknown-linux-gnu + arch: amd64 + - os: ubuntu-20.04-8-cores + platform: linux + target: aarch64-unknown-linux-gnu + arch: arm64 + svm_target_platform: linux-aarch64 + - os: macos-latest-xlarge + platform: darwin + target: x86_64-apple-darwin + arch: amd64 + - os: macos-latest + platform: darwin + target: aarch64-apple-darwin + arch: arm64 + - os: windows-latest + platform: win32 + target: x86_64-pc-windows-msvc + arch: amd64 + + steps: + - uses: actions/checkout@v3 + + - uses: dtolnay/rust-toolchain@master + name: Rust Toolchain Setup + with: + targets: ${{ matrix.job.target }} + toolchain: ${{ env.RUST_VERSION }} + + - uses: Swatinem/rust-cache@v1 + with: + cache-on-failure: true + + - uses: arduino/setup-protoc@v2 + with: + repo-token: ${{ secrets.GITHUB_TOKEN }} + version: "25.x" + + - name: Apple M1 setup + if: ${{ matrix.job.target == 'aarch64-apple-darwin' }} + run: | + echo "SDKROOT=$(xcrun -sdk macosx --show-sdk-path)" >> $GITHUB_ENV + echo "MACOSX_DEPLOYMENT_TARGET=$(xcrun -sdk macosx --show-sdk-platform-version)" >> $GITHUB_ENV + + - name: Linux ARM setup + if: ${{ matrix.job.target == 'aarch64-unknown-linux-gnu' }} + run: | + sudo apt-get update -y + sudo apt-get install -y gcc-aarch64-linux-gnu libssl-dev + echo "CARGO_TARGET_AARCH64_UNKNOWN_LINUX_GNU_LINKER=aarch64-linux-gnu-gcc" >> $GITHUB_ENV + + - name: Build binaries + run: cargo build --release --bins --target ${{ matrix.job.target }} + + - name: Archive binaries + id: artifacts + env: + VERSION_NAME: v${{ needs.prepare.outputs.tag_name }} + run: | + if [ "$PLATFORM_NAME" == "linux" ]; then + tar -czvf "dojo_${VERSION_NAME}_${PLATFORM_NAME}_${ARCH}.tar.gz" -C ./target/${TARGET}/release katana sozo torii dojo-language-server + echo "file_name=dojo_${VERSION_NAME}_${PLATFORM_NAME}_${ARCH}.tar.gz" >> $GITHUB_OUTPUT + elif [ "$PLATFORM_NAME" == "darwin" ]; then + # We need to use gtar here otherwise the archive is corrupt. + # See: https://github.com/actions/virtual-environments/issues/2619 + gtar -czvf "dojo_${VERSION_NAME}_${PLATFORM_NAME}_${ARCH}.tar.gz" -C ./target/${TARGET}/release katana sozo torii dojo-language-server + echo "file_name=dojo_${VERSION_NAME}_${PLATFORM_NAME}_${ARCH}.tar.gz" >> $GITHUB_OUTPUT + else + cd ./target/${TARGET}/release + 7z a -tzip "dojo_${VERSION_NAME}_${PLATFORM_NAME}_${ARCH}.zip" katana.exe sozo.exe torii.exe dojo-language-server.exe + mv "dojo_${VERSION_NAME}_${PLATFORM_NAME}_${ARCH}.zip" ../../../ + echo "file_name=dojo_${VERSION_NAME}_${PLATFORM_NAME}_${ARCH}.tar.gz" >> $GITHUB_OUTPUT + fi + shell: bash + + # We move binaries so they match $TARGETPLATFORM in the Docker build + - name: Move Binaries + if: ${{ env.PLATFORM_NAME == 'linux' }} + run: | + mkdir -p $PLATFORM_NAME/$ARCH + mv target/$TARGET/release/katana $PLATFORM_NAME/$ARCH + mv target/$TARGET/release/sozo $PLATFORM_NAME/$ARCH + mv target/$TARGET/release/torii $PLATFORM_NAME/$ARCH + shell: bash + + # Upload these for use with the Docker build later + - name: Upload docker binaries + uses: actions/upload-artifact@v3 + with: + name: binaries + path: ${{ env.PLATFORM_NAME }} + retention-days: 1 + + - name: Upload release artifacts + uses: actions/upload-artifact@v3 + with: + name: artifacts + path: ${{ steps.artifacts.outputs.file_name }} + retention-days: 1 + + create-draft-release: + runs-on: ubuntu-20.04-4-cores + needs: [prepare, release] + env: + GITHUB_USER: ${{ github.repository_owner }} + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + steps: + - uses: actions/checkout@v2 + - uses: actions/download-artifact@v3 + with: + name: artifacts + path: artifacts + - id: version_info + run: | + cargo install cargo-get + echo "version=$(cargo get workspace.package.version)" >> $GITHUB_OUTPUT + - name: Display structure of downloaded files + run: ls -R artifacts + - run: gh release create v${{ steps.version_info.outputs.version }} ./artifacts/*.gz --generate-notes --draft + + docker-build-and-push: + runs-on: ubuntu-20.04-4-cores + needs: [prepare, release] + + steps: + - name: Checkout repository + uses: actions/checkout@v2 + + - name: Download binaries + uses: actions/download-artifact@v3 + with: + name: binaries + path: artifacts/linux + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v1 + + - name: Login to GitHub Container Registry + uses: docker/login-action@v1 + with: + registry: ghcr.io + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Build and push docker image + uses: docker/build-push-action@v3 + with: + push: true + tags: ghcr.io/${{ github.repository }}:latest,ghcr.io/${{ github.repository }}:v${{ needs.prepare.outputs.tag_name }} + platforms: linux/amd64,linux/arm64 + build-contexts: | + artifacts=artifacts diff --git a/scripts/clippy.sh b/scripts/clippy.sh new file mode 100755 index 0000000..8c01e87 --- /dev/null +++ b/scripts/clippy.sh @@ -0,0 +1,7 @@ +#!/bin/bash + +run_clippy() { + cargo clippy --all-targets --all-features "$@" -- -D warnings -D future-incompatible -D nonstandard-style -D rust-2018-idioms -D unused +} + +run_clippy diff --git a/scripts/rust_fmt.sh b/scripts/rust_fmt.sh new file mode 100755 index 0000000..62a4186 --- /dev/null +++ b/scripts/rust_fmt.sh @@ -0,0 +1,3 @@ +#!/bin/bash + +cargo +nightly fmt --check --all -- "$@"