diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 9a80e188..d6e1e05e 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -1,4 +1,4 @@ -name: Build/test +name: CI on: push: branches: @@ -20,7 +20,7 @@ jobs: fetch-depth: 0 - uses: actions/setup-node@v3 with: - node-version: 16 + node-version: 18 - run: npm install - run: npm test test_windows: @@ -32,6 +32,6 @@ jobs: fetch-depth: 0 - 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..15fa4711 --- /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: bash + 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/publish.yml b/.github/workflows/publish.yml new file mode 100644 index 00000000..c2020e92 --- /dev/null +++ b/.github/workflows/publish.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 }}"