name: CodePilot MCP CI/CD
on:
push:
branches: [ main, develop ]
pull_request:
branches: [ main ]
env:
NODE_VERSION: '18'
REGISTRY: gcr.io
PROJECT_ID: ${{ secrets.GCP_PROJECT_ID }}
SERVICE_NAME: codepilot-mcp
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: ${{ env.NODE_VERSION }}
cache: 'npm'
- name: Install dependencies
run: npm ci
- name: Run type check
run: npm run type-check
- name: Run linter
run: npm run lint
- name: Run tests
run: npm test
- name: Test dashboard
run: |
cd dashboard
npm ci
npm run build
npm run type-check
build:
needs: test
runs-on: ubuntu-latest
if: github.ref == 'refs/heads/main'
steps:
- uses: actions/checkout@v4
- name: Setup Google Cloud CLI
uses: google-github-actions/setup-gcloud@v1
with:
project_id: ${{ secrets.GCP_PROJECT_ID }}
service_account_key: ${{ secrets.GCP_SA_KEY }}
export_default_credentials: true
- name: Configure Docker
run: gcloud auth configure-docker
- name: Build Docker image
run: |
docker build -t ${{ env.REGISTRY }}/${{ env.PROJECT_ID }}/${{ env.SERVICE_NAME }}:${{ github.sha }} .
docker tag ${{ env.REGISTRY }}/${{ env.PROJECT_ID }}/${{ env.SERVICE_NAME }}:${{ github.sha }} \
${{ env.REGISTRY }}/${{ env.PROJECT_ID }}/${{ env.SERVICE_NAME }}:latest
- name: Push Docker image
run: |
docker push ${{ env.REGISTRY }}/${{ env.PROJECT_ID }}/${{ env.SERVICE_NAME }}:${{ github.sha }}
docker push ${{ env.REGISTRY }}/${{ env.PROJECT_ID }}/${{ env.SERVICE_NAME }}:latest
deploy:
needs: build
runs-on: ubuntu-latest
if: github.ref == 'refs/heads/main'
steps:
- uses: actions/checkout@v4
- name: Setup Google Cloud CLI
uses: google-github-actions/setup-gcloud@v1
with:
project_id: ${{ secrets.GCP_PROJECT_ID }}
service_account_key: ${{ secrets.GCP_SA_KEY }}
export_default_credentials: true
- name: Create secrets
run: |
echo -n "${{ secrets.DATABASE_URL }}" | gcloud secrets create database-url --data-file=- || true
echo -n "${{ secrets.GITHUB_TOKEN }}" | gcloud secrets create github-token --data-file=- || true
echo -n "${{ secrets.NOTION_TOKEN }}" | gcloud secrets create notion-token --data-file=- || true
echo -n "${{ secrets.GOOGLE_CREDENTIALS }}" | gcloud secrets create google-credentials --data-file=- || true
echo -n "${{ secrets.SLACK_BOT_TOKEN }}" | gcloud secrets create slack-bot-token --data-file=- || true
echo -n "${{ secrets.SLACK_SIGNING_SECRET }}" | gcloud secrets create slack-signing-secret --data-file=- || true
echo -n "${{ secrets.OPENAI_API_KEY }}" | gcloud secrets create openai-api-key --data-file=- || true
- name: Deploy to Cloud Run
run: |
sed "s/PROJECT_ID/${{ env.PROJECT_ID }}/g" cloudrun.yaml > cloudrun-deploy.yaml
gcloud run services replace cloudrun-deploy.yaml --region=us-central1
- name: Update service to latest image
run: |
gcloud run services update ${{ env.SERVICE_NAME }} \
--image=${{ env.REGISTRY }}/${{ env.PROJECT_ID }}/${{ env.SERVICE_NAME }}:${{ github.sha }} \
--region=us-central1
notify:
needs: [test, build, deploy]
runs-on: ubuntu-latest
if: always()
steps:
- name: Notify Slack
if: env.SLACK_WEBHOOK_URL != ''
uses: 8398a7/action-slack@v3
with:
status: ${{ job.status }}
channel: '#deployments'
webhook_url: ${{ secrets.SLACK_WEBHOOK_URL }}
fields: repo,message,commit,author,action,eventName,ref,workflow
env:
SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }}