Human approval for Bitbucket Pipelines using World ID verification.
This pipe adds a human verification step to your Bitbucket Pipelines. It requires approval from a verified human (via World ID) before the pipeline can proceed, preventing unauthorized automated deployments.
Add the pipe to your bitbucket-pipelines.yml:
pipelines:
default:
- step:
name: Build
script:
- npm run build
- step:
name: Human Approval
script:
- pipe: docker://pohi-protocol/pohi-approval:latest
variables:
POHI_APPROVAL_URL: 'https://your-approval-server.com'
POHI_WORLD_ID_APP_ID: 'app_xxx'
POHI_WORLD_ID_ACTION: 'approve-deploy'
BITBUCKET_TOKEN: $BITBUCKET_TOKEN
artifacts:
- pohi-approval.env
- step:
name: Deploy
script:
- source pohi-approval.env
- echo "Deploying with attestation: $POHI_ATTESTATION_HASH"| Variable | Description |
|---|---|
POHI_APPROVAL_URL |
Base URL of PoHI approval server |
POHI_WORLD_ID_APP_ID |
World ID Application ID |
POHI_WORLD_ID_ACTION |
World ID Action identifier |
BITBUCKET_TOKEN |
Bitbucket API token (App Password) |
| Variable | Default | Description |
|---|---|---|
POHI_VERIFICATION_LEVEL |
orb |
Verification level: orb or device |
POHI_TIMEOUT_MINUTES |
30 |
Timeout waiting for approval |
POHI_POLL_INTERVAL_SECONDS |
10 |
Polling interval |
BITBUCKET_WORKSPACE- Workspace nameBITBUCKET_REPO_SLUG- Repository slugBITBUCKET_COMMIT- Commit hashBITBUCKET_PR_ID- PR ID (in PR pipelines)
- Go to Personal settings > App passwords
- Click Create app password
- Give it a label (e.g., "PoHI Approval")
- Select these permissions:
repository:readrepository:writepullrequest:readpullrequest:write
- Click Create
- Copy the generated password
- Add it as a repository variable named
BITBUCKET_TOKENin Repository settings > Pipelines > Repository variables
- Pipeline starts - The approval step creates a pending build status
- PR comment posted - If in a PR pipeline, a comment with approval link is added
- Waiting for approval - Pipe polls the approval server
- Human verifies - User scans QR code with World App to approve
- Pipeline continues - On approval, build status updates and step succeeds
- Attestation available - Output variables available for downstream steps
After approval, these variables are written to pohi-approval.env:
| Variable | Description |
|---|---|
POHI_ATTESTATION |
Full attestation JSON |
POHI_ATTESTATION_HASH |
Attestation hash |
POHI_NULLIFIER_HASH |
World ID nullifier hash |
POHI_APPROVED_AT |
Approval timestamp |
Use source pohi-approval.env in subsequent steps to access these variables.
pipelines:
branches:
main:
- step:
name: Build
script:
- npm ci
- npm run build
artifacts:
- dist/**
- step:
name: Human Approval
script:
- pipe: docker://pohi-protocol/pohi-approval:latest
variables:
POHI_APPROVAL_URL: $POHI_SERVER_URL
POHI_WORLD_ID_APP_ID: $WORLD_ID_APP_ID
POHI_WORLD_ID_ACTION: 'deploy-production'
POHI_VERIFICATION_LEVEL: 'orb'
BITBUCKET_TOKEN: $BITBUCKET_TOKEN
artifacts:
- pohi-approval.env
- step:
name: Deploy to Production
deployment: production
script:
- source pohi-approval.env
- echo "Deploying with human attestation"
- echo "Attestation: $POHI_ATTESTATION_HASH"
- ./deploy.shpipelines:
pull-requests:
'**':
- step:
name: Test
script:
- npm test
- step:
name: Human Approval
script:
- pipe: docker://pohi-protocol/pohi-approval:latest
variables:
POHI_APPROVAL_URL: 'https://pohi.example.com'
POHI_WORLD_ID_APP_ID: 'app_staging_xxx'
POHI_WORLD_ID_ACTION: 'approve-pr'
POHI_VERIFICATION_LEVEL: 'device'
BITBUCKET_TOKEN: $BITBUCKET_TOKEN
artifacts:
- pohi-approval.envpipelines:
custom:
deploy-with-approval:
- step:
name: Human Approval
script:
- pipe: docker://pohi-protocol/pohi-approval:latest
variables:
POHI_APPROVAL_URL: $POHI_SERVER_URL
POHI_WORLD_ID_APP_ID: $WORLD_ID_APP_ID
POHI_WORLD_ID_ACTION: 'manual-deploy'
BITBUCKET_TOKEN: $BITBUCKET_TOKEN
artifacts:
- pohi-approval.env
- step:
name: Deploy
script:
- source pohi-approval.env
- ./deploy.shEnsure BITBUCKET_TOKEN has the repository:write permission.
Ensure BITBUCKET_TOKEN has the pullrequest:write permission.
Verify POHI_APPROVAL_URL is accessible from Bitbucket's runners.
Increase POHI_TIMEOUT_MINUTES or verify the approval URL is correct.
cd packages/bitbucket-pipe
npm run build
npm run docker:build
npm run docker:pushApache-2.0