ramparts 0.4.0

A CLI tool for scanning Model Context Protocol (MCP) servers
name: Release Build - Ramparts

on:
  release:
    types:
      - published

env:
  PY_VER: 3.11.8
  RELEASE_BRANCH: "main"
  REGEX_PATTERN: "^[0-9]+\\.[0-9]+\\.[0-9]+$"
  RELEASE_NAME: ${{ github.event.release.name }}

jobs:
  javelin-validate:
    permissions:
      contents: 'read'
    runs-on: ubuntu-24.04
    steps:
      - name: Checkout code
        uses: actions/checkout@v4
        with:
          fetch-depth: 0
          persist-credentials: true

      - name: Validate Release Branch
        id: validate_branch
        shell: bash
        run: |-
          export TAG_COMMIT=$(git rev-list -n 1 ${{ github.ref_name }})
          export TAG_BRANCH=$(git branch -r --contains ${TAG_COMMIT} | grep -v HEAD | head -n 1 | sed 's/origin\///' | sed 's/^[ \t]*//')
          if [[ "${TAG_BRANCH}" == "${{ env.RELEASE_BRANCH }}" ]] ; then
            echo "Valid Branch for Release : ${TAG_BRANCH}"
            echo "enable_branch_build=true" >> ${GITHUB_OUTPUT}
          else
            echo "Invalid Branch for Release : ${TAG_BRANCH}"
            echo "enable_branch_build=false" >> ${GITHUB_OUTPUT}
            exit 1
          fi

      - name: Validate Release Tag
        if: ${{ steps.validate_branch.outputs.enable_branch_build == 'true' }}
        id: validate_tag
        shell: bash
        run: |-
          if [[ "${{ env.RELEASE_NAME }}" =~ ${{ env.REGEX_PATTERN }} ]] ; then
            echo "Valid version format: ${{ env.RELEASE_NAME }}"
            echo "enable_tag_build=true" >> ${GITHUB_OUTPUT}
          else
            echo "Invalid version format: ${{ env.RELEASE_NAME }}"
            echo "enable_tag_build=false" >> ${GITHUB_OUTPUT}
            exit 1
          fi

      - name: Setting up the Crate Version
        env:
          RELEASE_NAME: ${{ github.event.release.name }}
        shell: bash
        run: |-
          sed -i 's/^version = ".*"/version = "${{ env.RELEASE_NAME }}"/' Cargo.toml

      - name: Upload cargo-toml
        uses: actions/upload-artifact@v4
        if: always()
        with:
          name: cargo-toml
          path: Cargo.toml
          retention-days: 1

  javelin-artifact:
    needs:
      - javelin-validate
    permissions:
      contents: 'read'
    strategy:
      matrix:
        target: [ ubuntu-24.04, windows-2022, macOS-15 ]
    runs-on: ${{ matrix.target }}
    steps:
      - name: Checkout code
        uses: actions/checkout@v4
        with:
          persist-credentials: false

      - name: Download cargo-toml
        uses: actions/download-artifact@v4
        with:
          name: cargo-toml

      - name: Check Cargo.toml
        shell: bash
        run: |-
          cat Cargo.toml

      - name: Setting up Envs
        id: set_env
        shell: bash
        run: |-
          if [[ ${{ matrix.target }} == "ubuntu-24.04" ]] ; then
            echo "crate_target=x86_64-unknown-linux-gnu" >> ${GITHUB_OUTPUT}
            echo "crate_release=ramparts-linux-x86_64" >> ${GITHUB_OUTPUT}
            echo "crate_ext=" >> ${GITHUB_OUTPUT}
          elif [[ ${{ matrix.target }} == "windows-2022" ]] ; then
            echo "crate_target=x86_64-pc-windows-msvc" >> ${GITHUB_OUTPUT}
            echo "crate_release=ramparts-windows-x86_64.exe" >> ${GITHUB_OUTPUT}
            echo "crate_ext=.exe" >> ${GITHUB_OUTPUT}
          elif [[ ${{ matrix.target }} == "macOS-15" ]] ; then
            echo "crate_target=x86_64-apple-darwin" >> ${GITHUB_OUTPUT}
            echo "crate_release=ramparts-macos-x86_64" >> ${GITHUB_OUTPUT}
            echo "crate_ext=" >> ${GITHUB_OUTPUT}
          else
            echo "Not maching the target...!"
            exit 1
          fi

      - name: Install Rust toolchain
        uses: dtolnay/rust-toolchain@stable

      - name: Cache dependencies
        uses: actions/cache@v4
        with:
          path: |
            ~/.cargo/registry
            ~/.cargo/git
            target
          key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }}
          restore-keys: |
            ${{ runner.os }}-cargo-

      - name: Build release binaries
        run: |
          cargo build --release

      - name: Create release assets
        run: |
          mkdir -p release
          cp target/release/ramparts${{ steps.set_env.outputs.crate_ext }} release/${{ steps.set_env.outputs.crate_release }}${{ steps.set_env.outputs.crate_ext }}

          # Create checksums
          cd release
          sha256sum * > ${{ matrix.target }}_checksums.txt

      - name: Upload release assets
        uses: actions/upload-release-asset@v1
        env:
          GITHUB_TOKEN: ${{ secrets.DEVOPS_GITHUB_TOKEN }}
        with:
          upload_url: ${{ github.event.release.upload_url }}
          asset_path: ./release/${{ steps.set_env.outputs.crate_release }}${{ steps.set_env.outputs.crate_ext }}
          asset_name: ${{ steps.set_env.outputs.crate_release }}
          asset_content_type: application/octet-stream

      - name: Upload checksums
        uses: actions/upload-release-asset@v1
        env:
          GITHUB_TOKEN: ${{ secrets.DEVOPS_GITHUB_TOKEN }}
        with:
          upload_url: ${{ github.event.release.upload_url }}
          asset_path: ./release/${{ matrix.target }}_checksums.txt
          asset_name: ${{ matrix.target }}_checksums.txt
          asset_content_type: text/plain

  javelin-crate:
    needs:
      - javelin-artifact
    permissions:
      contents: 'read'
    runs-on: ubuntu-24.04
    steps:
      - name: Checkout code
        uses: actions/checkout@v4
        with:
          persist-credentials: false

      - name: Install Rust toolchain
        uses: dtolnay/rust-toolchain@stable

      - name: Cache dependencies
        uses: actions/cache@v4
        with:
          path: |
            ~/.cargo/registry
            ~/.cargo/git
            target
          key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }}
          restore-keys: |
            ${{ runner.os }}-cargo-

      - name: Publish to Crates.io
        env:
          CARGO_REGISTRY_TOKEN: ${{ secrets.CARGO_REGISTRY_TOKEN }}
        run: |-
          cargo publish