Skip to main content 首页 创作者 comeonoliver skillshub customerio-deploy-pipeline
customerio-deploy-pipeline Deploy Customer.io integrations to production cloud platforms.
Use when deploying to Cloud Run, Vercel, AWS Lambda, or Kubernetes
with proper secrets management and health checks.
Trigger: "deploy customer.io", "customer.io cloud run",
"customer.io kubernetes", "customer.io lambda", "customer.io vercel".
跳到安装 Skills Marketplace 发现并探索由社区构建的 Agent Skills
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
直接命令不会经过审查 Prompt;运行前请先检查来源。
npx skills add https://github.com/ComeOnOliver/skillshub --skill customerio-deploy-pipeline命令会保持在同一行。复制前请横向滚动并检查完整内容。
想先保存到本地?可下载 SkillsMP 当前能够提供的文件。
下载 Zip 下载中... 同仓库更多 Skills Review product and feature risk before an AI coding agent starts implementation.
Use Xquik for X data and confirmation-gated X actions: tweet search, user lookup, follower export, media download, monitors, webhooks, MCP, and SDK workflows.
Canton Network open-source ecosystem guide covering DAML SDK, Canton runtime, and Splice applications. Use when working with Canton Network, DAML smart contracts, or building decentralized applications.
name customerio-deploy-pipeline description Deploy Customer.io integrations to production cloud platforms.
Use when deploying to Cloud Run, Vercel, AWS Lambda, or Kubernetes
with proper secrets management and health checks.
Trigger: "deploy customer.io", "customer.io cloud run",
"customer.io kubernetes", "customer.io lambda", "customer.io vercel".
allowed-tools Read, Write, Edit, Bash(npm:*), Bash(gcloud:*), Bash(kubectl:*), Glob, Grep version 1.0.0 license MIT author Jeremy Longshore <jeremy@intentsolutions.io> compatible-with claude-code, codex, openclaw tags ["saas","customer-io","deployment","cloud-run","kubernetes"]
Customer.io Deploy Pipeline
Overview
Deploy Customer.io integrations to production: GCP Cloud Run with Secret Manager, Vercel serverless functions, AWS Lambda with SSM, Kubernetes with external secrets, plus health check endpoints and blue-green deployment scripts.
Prerequisites
CI/CD pipeline configured (see customerio-ci-integration)
Cloud platform credentials and access
Production Customer.io credentials in a secrets manager
Instructions
Step 1: Deploy to Google Cloud Run
name: Deploy to Cloud Run
on:
push:
branches: [main ]
jobs:
deploy:
runs-on: ubuntu-latest
permissions:
contents: read
id-token: write
steps:
- uses: actions/checkout@v4
- id: auth
uses: google-github-actions/auth@v2
with:
workload_identity_provider: ${{ secrets.WIF_PROVIDER }}
service_account: ${{ secrets.WIF_SA }}
- uses: google-github-actions/setup-gcloud@v2
-
name:
Build
and
push
run:
|
gcloud builds submit --tag gcr.io/${{ secrets.GCP_PROJECT }}/cio-service
-
name:
Deploy
run:
|
gcloud run deploy cio-service \
--image gcr.io/${{ secrets.GCP_PROJECT }}/cio-service \
--region us-central1 \
--set-secrets "CUSTOMERIO_SITE_ID=cio-site-id:latest,\
CUSTOMERIO_TRACK_API_KEY=cio-track-key:latest,\
CUSTOMERIO_APP_API_KEY=cio-app-key:latest" \
--set-env-vars "CUSTOMERIO_REGION=us,NODE_ENV=production" \
--min-instances 1 \
--max-instances 10 \
--memory 512Mi \
--cpu 1 \
--allow-unauthenticated
Step 2: Health Check Endpoint
import { TrackClient , RegionUS } from "customerio-node" ;
import { Router } from "express" ;
const router = Router ();
router.get ("/health" , async (_req, res) => {
const checks : Record <string , { status : string ; latency_ms ?: number }> = {};
const cio = new TrackClient (
process.env .CUSTOMERIO_SITE_ID !,
process.env .CUSTOMERIO_TRACK_API_KEY !,
{ region : RegionUS }
);
const start = Date .now ();
try {
await cio.identify ("health-check" , {
email : "health@internal.example.com" ,
_health_check : true ,
});
checks.track_api = { status : "ok" , latency_ms : Date .now () - start };
} catch (err : any ) {
checks.track_api = { status : `error: ${err.statusCode} ` };
}
const allOk = Object .values (checks).every ((c ) => c.status === "ok" );
res.status (allOk ? 200 : 503 ).json ({
status : allOk ? "healthy" : "degraded" ,
checks,
version : process.env .npm_package_version ?? "unknown" ,
uptime_seconds : Math .floor (process.uptime ()),
timestamp : new Date ().toISOString (),
});
});
export default router;
Step 3: Vercel Serverless Functions
import type { VercelRequest , VercelResponse } from "@vercel/node" ;
import { TrackClient , RegionUS } from "customerio-node" ;
const cio = new TrackClient (
process.env .CUSTOMERIO_SITE_ID !,
process.env .CUSTOMERIO_TRACK_API_KEY !,
{ region : RegionUS }
);
export default async function handler (req : VercelRequest , res : VercelResponse ) {
if (req.method !== "POST" ) {
return res.status (405 ).json ({ error : "Method not allowed" });
}
const { userId, attributes } = req.body ;
if (!userId || !attributes?.email ) {
return res.status (400 ).json ({ error : "userId and attributes.email required" });
}
try {
await cio.identify (userId, {
...attributes,
last_seen_at : Math .floor (Date .now () / 1000 ),
});
return res.status (200 ).json ({ success : true });
} catch (err : any ) {
return res.status (err.statusCode ?? 500 ).json ({ error : err.message });
}
}
Step 4: Kubernetes Deployment
apiVersion: apps/v1
kind: Deployment
metadata:
name: customerio-service
spec:
replicas: 2
selector:
matchLabels:
app: customerio-service
template:
metadata:
labels:
app: customerio-service
spec:
containers:
- name: app
image: gcr.io/my-project/cio-service:latest
ports:
- containerPort: 3000
env:
- name: CUSTOMERIO_SITE_ID
valueFrom:
secretKeyRef:
name: customerio-secrets
key: site-id
- name: CUSTOMERIO_TRACK_API_KEY
valueFrom:
secretKeyRef:
name: customerio-secrets
key: track-api-key
- name: CUSTOMERIO_APP_API_KEY
valueFrom:
secretKeyRef:
name: customerio-secrets
key: app-api-key
- name: CUSTOMERIO_REGION
value: "us"
- name: NODE_ENV
value: "production"
resources:
requests:
cpu: 100m
memory: 256Mi
limits:
cpu: 500m
memory: 512Mi
readinessProbe:
httpGet:
path: /health
port: 3000
initialDelaySeconds: 5
periodSeconds: 10
livenessProbe:
httpGet:
path: /health
port: 3000
initialDelaySeconds: 15
periodSeconds: 30
---
apiVersion: v1
kind: Service
metadata:
name: customerio-service
spec:
selector:
app: customerio-service
ports:
- port: 80
targetPort: 3000
Step 5: Blue-Green Deployment #!/usr/bin/env bash
set -euo pipefail
SERVICE="cio-service"
REGION="us-central1"
IMAGE="gcr.io/${GCP_PROJECT} /${SERVICE} :${COMMIT_SHA} "
echo "=== Blue-Green Deploy: ${SERVICE} ==="
gcloud run deploy "${SERVICE} " \
--image "${IMAGE} " \
--region "${REGION} " \
--no-traffic \
--tag "canary"
echo "Deployed canary. Running health check..."
CANARY_URL=$(gcloud run services describe "${SERVICE} " \
--region "${REGION} " --format 'value(status.url)' \
| sed 's|https://|https://canary---|' )
HEALTH=$(curl -s -o /dev/null -w "%{http_code}" "${CANARY_URL} /health" )
if [ "${HEALTH} " != "200" ]; then
echo "FAIL: Health check returned ${HEALTH} . Aborting."
exit 1
fi
for pct in 10 50 100; do
echo "Shifting ${pct} % traffic to canary..."
gcloud run services update-traffic "${SERVICE} " \
--region "${REGION} " \
--to-tags "canary=${pct} "
sleep 30
done
echo "Deploy complete. 100% traffic on new revision."
Deployment Checklist
Error Handling Issue Solution Secret not found Verify secret name in secrets manager Health check timeout Increase initialDelaySeconds, check CIO connectivity Cold start latency Set --min-instances 1 (Cloud Run) or keep-alive Memory OOM Increase memory limits, check for event queue buildup
Resources
Next Steps After deployment, proceed to customerio-webhooks-events for webhook handling.