From 10ee7b0ba2e6ceb1626196ce20e6dd0bd0737d13 Mon Sep 17 00:00:00 2001 From: Amaan Qureshi Date: Sat, 22 Jul 2023 17:22:50 -0400 Subject: [PATCH] ci: add fuzz, lint, and release workflow, update CI action versions --- .github/workflows/ci.yml | 14 ++--- .github/workflows/fuzz.yml | 22 ++++++++ .github/workflows/lint.yml | 19 +++++++ .github/workflows/release.yml | 103 ++++++++++++++++++++++++++++++++++ package.json | 3 +- 5 files changed, 153 insertions(+), 8 deletions(-) create mode 100644 .github/workflows/fuzz.yml create mode 100644 .github/workflows/lint.yml create mode 100644 .github/workflows/release.yml diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 1c460fa8..a5a381eb 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -1,4 +1,4 @@ -name: Build/test +name: CI on: pull_request: branches: @@ -14,18 +14,18 @@ jobs: matrix: os: [macos-latest, ubuntu-latest] steps: - - uses: actions/checkout@v2 - - uses: actions/setup-node@v2 + - uses: actions/checkout@v3 + - uses: actions/setup-node@v3 with: - node-version: 16 + node-version: 18 - run: npm install - run: npm test test_windows: runs-on: windows-latest steps: - - uses: actions/checkout@v2 - - uses: actions/setup-node@v2 + - uses: actions/checkout@v3 + - uses: actions/setup-node@v3 with: - node-version: 16 + node-version: 18 - run: npm install - run: npm run-script test-windows diff --git a/.github/workflows/fuzz.yml b/.github/workflows/fuzz.yml new file mode 100644 index 00000000..f503b443 --- /dev/null +++ b/.github/workflows/fuzz.yml @@ -0,0 +1,22 @@ +name: Fuzz Parser + +on: + push: + paths: + - src/scanner.c + pull_request: + paths: + - src/scanner.c + workflow_dispatch: + +jobs: + test: + name: Parser fuzzing + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - uses: vigoux/tree-sitter-fuzz-action@v1 + with: + language: python + external-scanner: src/scanner.c + time: 60 diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml new file mode 100644 index 00000000..d94f7f39 --- /dev/null +++ b/.github/workflows/lint.yml @@ -0,0 +1,19 @@ +name: Lint + +on: + push: + branches: + - master + pull_request: + branches: + - "**" + +jobs: + lint: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - name: Install modules + run: npm install + - name: Run ESLint + run: npm run lint diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 00000000..c2020e92 --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,103 @@ +name: Release + +on: + workflow_run: + workflows: ["CI"] + branches: + - master + types: + - completed + +jobs: + release: + runs-on: ubuntu-latest + steps: + - name: Checkout code + uses: actions/checkout@v3 + with: + fetch-depth: 0 + + - name: Get previous commit SHA + id: get_previous_commit + run: | + LATEST_TAG=$(git describe --tags --abbrev=0) + if [[ -z "$LATEST_TAG" ]]; then + echo "No tag found. Failing..." + exit 1 + fi + echo "latest_tag=${LATEST_TAG#v}" >> "$GITHUB_ENV" # Remove 'v' prefix from the tag + + - name: Check if version changed and is greater than the previous + id: version_check + run: | + # Compare the current version with the version from the previous commit + PREVIOUS_NPM_VERSION=${{ env.latest_tag }} + CURRENT_NPM_VERSION=$(jq -r '.version' package.json) + CURRENT_CARGO_VERSION=$(awk -F '"' '/^version/ {print $2}' Cargo.toml) + if [[ "$CURRENT_NPM_VERSION" != "$CURRENT_CARGO_VERSION" ]]; then # Cargo.toml and package.json versions must match + echo "Mismatch: NPM version ($CURRENT_NPM_VERSION) and Cargo.toml version ($CURRENT_CARGO_VERSION)" + echo "version_changed=false" >> "$GITHUB_ENV" + else + if [[ "$PREVIOUS_NPM_VERSION" == "$CURRENT_NPM_VERSION" ]]; then + echo "version_changed=" >> "$GITHUB_ENV" + else + IFS='.' read -ra PREVIOUS_VERSION_PARTS <<< "$PREVIOUS_NPM_VERSION" + IFS='.' read -ra CURRENT_VERSION_PARTS <<< "$CURRENT_NPM_VERSION" + VERSION_CHANGED=false + for i in "${!PREVIOUS_VERSION_PARTS[@]}"; do + if [[ ${CURRENT_VERSION_PARTS[i]} -gt ${PREVIOUS_VERSION_PARTS[i]} ]]; then + VERSION_CHANGED=true + break + elif [[ ${CURRENT_VERSION_PARTS[i]} -lt ${PREVIOUS_VERSION_PARTS[i]} ]]; then + break + fi + done + + echo "version_changed=$VERSION_CHANGED" >> "$GITHUB_ENV" + echo "current_version=${CURRENT_NPM_VERSION}" >> "$GITHUB_ENV" + fi + fi + + - name: Display result + run: | + echo "Version bump detected: ${{ env.version_changed }}" + + - name: Fail if version is lower + if: env.version_changed == 'false' + run: exit 1 + + - name: Setup Node + if: env.version_changed == 'true' + uses: actions/setup-node@v3 + with: + node-version: 18 + registry-url: "https://registry.npmjs.org" + - name: Publish to NPM + if: env.version_changed == 'true' + env: + NODE_AUTH_TOKEN: ${{secrets.NPM_TOKEN}} + run: npm publish + + - name: Setup Rust + if: env.version_changed == 'true' + uses: actions-rs/toolchain@v1 + with: + profile: minimal + toolchain: stable + override: true + - name: Publish to Crates.io + if: env.version_changed == 'true' + uses: katyo/publish-crates@v2 + with: + registry-token: ${{ secrets.CARGO_REGISTRY_TOKEN }} + + - name: Tag versions + if: env.version_changed == 'true' + run: | + git checkout master + git config user.name github-actions[bot] + git config user.email github-actions[bot]@users.noreply.github.com + git tag -d "v${{ env.current_version }}" || true + git push origin --delete "v${{ env.current_version }}" || true + git tag -a "v${{ env.current_version }}" -m "Version ${{ env.current_version }}" + git push origin "v${{ env.current_version }}" diff --git a/package.json b/package.json index 91e7e566..330daebc 100644 --- a/package.json +++ b/package.json @@ -19,8 +19,9 @@ }, "scripts": { "build": "tree-sitter generate && node-gyp build", - "test": "tree-sitter test && script/parse-examples", + "lint": "eslint grammar.js", "parse": "tree-sitter parse", + "test": "tree-sitter test && script/parse-examples", "test-windows": "tree-sitter test" }, "repository": "https://github.com/tree-sitter/tree-sitter-python",