name: CI/CD
on:
push:
branches: [master]
tags:
- 'v*'
pull_request:
jobs:
ci:
runs-on: ubuntu-latest
timeout-minutes: 10
strategy:
matrix:
node-version: [lts/*, current]
env:
CI: true
steps:
- name: Checkout ${{ github.sha }}
uses: actions/checkout@v4
- name: Use Node.js ${{ matrix.node-version }}
uses: actions/setup-node@v4
with:
node-version: ${{ matrix.node-version }}
registry-url: https://registry.npmjs.org/
- name: Install dependencies
run: npm ci
- name: Lint
run: npm run lint --if-present
- name: Build
run: npm run build --if-present
- name: Test
run: npm run test --if-present
env:
RUN_MCPB_TEST: TRUE
RUN_DOCKER_TEST: TRUE
- name: Prepare MCP Bundle artifact
if: matrix.node-version == 'lts/*'
run: |
npm run build:mcpb
mkdir -p .github/tmp
unzip airtable-mcp-server.mcpb -d .github/tmp
- name: Upload MCP Bundle artifact
if: matrix.node-version == 'lts/*'
uses: actions/upload-artifact@v4
with:
name: airtable-mcp-server-mcpb
path: .github/tmp/*
deploy:
if: startsWith(github.ref, 'refs/tags/v') && github.event_name == 'push'
needs: ci
runs-on: ubuntu-latest
timeout-minutes: 15
permissions:
contents: write # Required for creating GitHub releases
id-token: write # Required for MCP registry OIDC authentication
env:
CI: true
steps:
- name: Checkout ${{ github.sha }}
uses: actions/checkout@v4
- name: Use Node.js with the npmjs.org registry
uses: actions/setup-node@v4
with:
node-version: lts/*
registry-url: https://registry.npmjs.org/
- name: Install dependencies
run: npm ci
- name: Build
run: npm run build --if-present
- name: Build MCP Bundle
run: npm run build:mcpb
- name: Update server.json version and SHA256
run: |
VERSION=$(node -p "require('./package.json').version")
MCPB_FILE_SHA256=$(sha256sum airtable-mcp-server.mcpb | cut -d' ' -f1)
sed "s/{{VERSION}}/$VERSION/g; s/{{MCPB_FILE_SHA256}}/$MCPB_FILE_SHA256/g" server.json > server.json.tmp
mv server.json.tmp server.json
- name: Publish to NPM
run: npm publish
env:
NODE_AUTH_TOKEN: ${{secrets.NPM_TOKEN}}
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Login to Docker Hub
uses: docker/login-action@v3
with:
username: domdomegg
password: ${{ secrets.DOCKER_ACCESS_TOKEN }}
- name: Extract Docker metadata
id: meta
uses: docker/metadata-action@v5
with:
images: domdomegg/airtable-mcp-server
tags: |
type=semver,pattern={{version}}
type=raw,value=latest,enable={{is_default_branch}}
- name: Build and push Docker image
uses: docker/build-push-action@v5
with:
context: .
push: true
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
platforms: linux/amd64,linux/arm64
- name: Create GitHub Release
uses: softprops/action-gh-release@v2
with:
files: airtable-mcp-server.mcpb
generate_release_notes: true
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Install MCP Publisher
run: |
curl -L "https://github.com/modelcontextprotocol/registry/releases/download/v1.0.0/mcp-publisher_1.0.0_$(uname -s | tr '[:upper:]' '[:lower:]')_$(uname -m | sed 's/x86_64/amd64/;s/aarch64/arm64/').tar.gz" | tar xz mcp-publisher
- name: Login to MCP Registry
run: ./mcp-publisher login github-oidc
- name: Publish to MCP Registry
run: ./mcp-publisher publish