From 0aed957d0af05f78c45ec2dfbd4deeeb2360c0c2 Mon Sep 17 00:00:00 2001 From: Matt Solomon Date: Mon, 31 Oct 2022 21:15:16 -0400 Subject: [PATCH] ci: add ci (#1) * ci: add ci * ci: add release workflow * build: bump version to test release flow * style: formatting * docs: add missing docs --- .github/workflows/ci.yml | 63 ++++++++++++ .github/workflows/release.yml | 181 ++++++++++++++++++++++++++++++++++ Cargo.lock | 2 +- Cargo.toml | 2 +- src/lib.rs | 2 + 5 files changed, 248 insertions(+), 2 deletions(-) create mode 100644 .github/workflows/ci.yml create mode 100644 .github/workflows/release.yml diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..44dcb34 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,63 @@ +name: CI + +on: + workflow_dispatch: + pull_request: + push: + branches: + - main + +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - uses: actions-rs/toolchain@v1 + with: + profile: minimal + toolchain: nightly + override: true + - run: cargo --version --verbose + - run: cargo build --release --all-features + + test: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - uses: actions-rs/toolchain@v1 + with: + profile: minimal + toolchain: nightly + override: true + - run: cargo test --locked --all-features + + lint: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - uses: actions-rs/toolchain@v1 + with: + profile: minimal + toolchain: nightly + override: true + components: clippy, rustfmt + + - name: cargo fmt + uses: actions-rs/cargo@v1 + with: + command: fmt + args: --all --check + + - name: cargo clippy + uses: actions-rs/clippy-check@v1 + with: + args: --all --all-features -- -D warnings + token: ${{ secrets.GITHUB_TOKEN }} + + - name: cargo doc + uses: actions-rs/cargo@v1 + env: + RUSTDOCFLAGS: '-D missing_docs -D rustdoc::missing_doc_code_examples' + with: + command: doc + args: --workspace --all-features --no-deps --document-private-items diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 0000000..5bd5ef7 --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,181 @@ +name: Release +on: + push: + tags: + - 'v[0-9]+.[0-9]+.[0-9]+' + +env: + BIN_NAME: scopelint + PROJECT_NAME: scopelint + REPO_NAME: ScopeLift/scopelint + +jobs: + dist: + name: Dist + runs-on: ${{ matrix.os }} + strategy: + fail-fast: false # don't fail other jobs if one fails + 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 + - os: ubuntu-latest + platform: linux + target: x86_64-unknown-linux-gnu + arch: amd64 + - os: ubuntu-latest + platform: linux + target: aarch64-unknown-linux-gnu + arch: arm64 + - os: macos-latest + 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: + - name: Checkout sources + uses: actions/checkout@v2 + with: + submodules: true + + - name: Install nightly toolchain + uses: actions-rs/toolchain@v1 + with: + profile: minimal + toolchain: nightly + target: ${{ matrix.target }} + override: true + + - name: Run cargo test + uses: actions-rs/cargo@v1 + with: + use-cross: false + command: test + args: --release --locked --target ${{ matrix.target }} + + - name: Build release binary + uses: actions-rs/cargo@v1 + with: + use-cross: false + command: build + args: --release --locked --target ${{ matrix.target }} + + - name: Strip release binary (linux and macos) + if: matrix.build == 'x86_64-linux' || matrix.build == 'x86_64-macos' + run: strip "target/${{ matrix.target }}/release/$BIN_NAME" + + - name: Strip release binary (arm) + if: matrix.build == 'aarch64-linux' + run: | + docker run --rm -v \ + "$PWD/target:/target:Z" \ + rustembedded/cross:${{ matrix.target }} \ + aarch64-linux-gnu-strip \ + /target/${{ matrix.target }}/release/$BIN_NAME + + - name: Build archive + shell: bash + run: | + mkdir dist + if [ "${{ matrix.os }}" = "windows-2019" ]; then + cp "target/${{ matrix.target }}/release/$BIN_NAME.exe" "dist/" + else + cp "target/${{ matrix.target }}/release/$BIN_NAME" "dist/" + fi + + - uses: actions/upload-artifact@v2.2.4 + with: + name: bins-${{ matrix.build }} + path: dist + + publish: + name: Publish + needs: [dist] + runs-on: ubuntu-latest + steps: + - name: Checkout sources + uses: actions/checkout@v2 + with: + submodules: false + + - uses: actions/download-artifact@v2 + # with: + # path: dist + # - run: ls -al ./dist + - run: ls -al bins-* + + - name: Calculate tag name + run: | + name=dev + if [[ $GITHUB_REF == refs/tags/v* ]]; then + name=${GITHUB_REF:10} + fi + echo ::set-output name=val::$name + echo TAG=$name >> $GITHUB_ENV + id: tagname + + - name: Build archive + shell: bash + run: | + set -ex + + rm -rf tmp + mkdir tmp + mkdir dist + + for dir in bins-* ; do + platform=${dir#"bins-"} + unset exe + if [[ $platform =~ "windows" ]]; then + exe=".exe" + fi + pkgname=$PROJECT_NAME-$TAG-$platform + mkdir tmp/$pkgname + # cp LICENSE README.md tmp/$pkgname + mv bins-$platform/$BIN_NAME$exe tmp/$pkgname + chmod +x tmp/$pkgname/$BIN_NAME$exe + + if [ "$exe" = "" ]; then + tar cJf dist/$pkgname.tar.xz -C tmp $pkgname + else + (cd tmp && 7z a -r ../dist/$pkgname.zip $pkgname) + fi + done + + - name: Upload binaries to release + uses: svenstaro/upload-release-action@v2 + with: + repo_token: ${{ secrets.GITHUB_TOKEN }} + file: dist/* + file_glob: true + tag: ${{ steps.tagname.outputs.val }} + overwrite: true + + - name: Extract version + id: extract-version + run: | + printf "::set-output name=%s::%s\n" tag-name "${GITHUB_REF#refs/tags/}" + + # Uncomment this section if you want to release your package to crates.io + # Before publishing, make sure you have filled out the following fields: + # license or license-file, description, homepage, documentation, repository, readme. + # Read more: https://doc.rust-lang.org/cargo/reference/publishing.html + - name: Install ${{ matrix.rust }} toolchain + uses: actions-rs/toolchain@v1 + with: + profile: minimal + toolchain: nightly + target: ${{ matrix.target }} + - run: cargo publish --token ${CRATES_TOKEN} + env: + CRATES_TOKEN: ${{ secrets.CRATES_TOKEN }} diff --git a/Cargo.lock b/Cargo.lock index b0e33d4..cc92292 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -421,7 +421,7 @@ dependencies = [ [[package]] name = "scopelint" -version = "0.0.6" +version = "0.0.7" dependencies = [ "grep", "regex", diff --git a/Cargo.toml b/Cargo.toml index 63d5df9..d78aca5 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -4,7 +4,7 @@ license = "MIT" name = "scopelint" repository = "https://github.com/ScopeLift/scopelint" - version = "0.0.6" + version = "0.0.7" [dependencies] grep = "0.2.10" diff --git a/src/lib.rs b/src/lib.rs index 7a00d16..c0861e0 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,3 +1,4 @@ +//! An opinionated formatting and linting tool for foundry projects. use grep::{ matcher::Matcher, regex::RegexMatcher, @@ -25,6 +26,7 @@ pub struct Config { } impl Config { + /// Create a new configuration from the command line arguments. pub fn build(args: &[String]) -> Result { if args.len() > 2 { return Err("Too many arguments")