Source profileQuality 91/100Review permissions

datarobot-oss/datarobot-agent-skills/skills/datarobot-app-framework-cicd/SKILL.md

datarobot-app-framework-cicd

Guidance for setting up CI/CD pipelines for DataRobot application templates using GitLab, GitHub Actions, and Pulumi for infrastructure as code. Use when setting up CI/CD pipelines, configuring deployments, or managing infrastructure for DataRobot application templates.

Source repository stars
24
Declared platforms
0
Static risk flags
3
Last source update
2026-08-20
Source checked
2026-08-25

Decision brief

What it does: where it fits

This skill provides comprehensive guidance for setting up production-grade CI/CD pipelines for DataRobot application templates, including automated testing, review deployments, and continuous delivery.

Best for

  • Use when setting up CI/CD pipelines, configuring deployments, or managing infrastructure for DataRobot application templates.

Not for

  • Ensure only one deployment runs at a time per stack
  • Use unique stack names for concurrent deployments

Compatibility matrix

Platform support, with evidence labels

PlatformStatusEvidenceWhat to check
CodexNot declaredNo explicit evidencePortability before use
Claude CodeNot declaredNo explicit evidencePortability before use
CursorNot declaredNo explicit evidencePortability before use
Gemini CLINot declaredNo explicit evidencePortability before use
Open the compatibility checker

Installation

Inspect first. Install second.

The source command is displayed only when detected. A safe inspection prompt is always available so your agent can explain every action before execution.

Source-detected install commandSource
npx skills add https://github.com/datarobot-oss/datarobot-agent-skills --skill "skills/datarobot-app-framework-cicd"
Safe inspection promptEditorial

Inspect the Agent Skill "datarobot-app-framework-cicd" from https://github.com/datarobot-oss/datarobot-agent-skills/blob/b901f1c491c1742ebf9282820cd2d5c00d7db2bf/skills/datarobot-app-framework-cicd/SKILL.md at commit b901f1c491c1742ebf9282820cd2d5c00d7db2bf. List every install step, command, network request, credential, file read/write, external action, and rollback step. Explain whether it fits my task. Do not install or execute anything until I approve.

Workflow

What the source asks the agent to do

  1. 01

    Quick Start

    Default behavior: When a user asks to "set up CI/CD" without specifying a platform or backend, always use the Simple Path below — three workflow files, two GitHub Secrets, done. Do not create infra/scripts/, do not add CI/CD tasks to infra/Taskfile.yaml, do not involve GPG encry…

    A specific Pulumi state backend (Azure Blob, S3, GCS) → use scripts/ and see Implementation PatternGitLab CI/CD → see GitLab CI/CD ConfigurationMany secrets to manage → consider GPG approach in scripts/
  2. 02

    Implementation Pattern

    When implementing CI/CD for an application template, follow this structure:

    ⚠️ ALWAYS generate infra/README.md tailored to the chosen platform and backend — see "Generating infra/README.md" belowAll CI/CD scripts go in infra/scripts/ directory⚠️ CRITICAL: All CI/CD tasks go in infra/Taskfile.yaml — NEVER add CI/CD tasks directly to the root Taskfile.yml
  3. 03

    Tasks are then run as: task infra:encrypt-secrets, task infra:setup-github-secrets, etc.

    Review the “Tasks are then run as: task infra:encrypt-secrets, task infra:setup-github-secrets, etc.” section in the pinned source before continuing.

    Review and apply the “Tasks are then run as: task infra:encrypt-secrets, task infra:setup-github-secrets, etc.” source section.
  4. 04

    Workflow examples

    See references/workflow-examples.md for step-by-step examples covering GitLab CI/CD, GitHub Actions with GPG secrets, and continuous delivery setup.

    See references/workflow-examples.md for step-by-step examples covering GitLab CI/CD, GitHub Actions with GPG secrets, and continuous delivery setup.
  5. 05

    Using Task for workflow management

    Application templates use Task to simplify local development and CI/CD workflows. Task provides a unified interface for Python and TypeScript/React components.

    Application templates use Task to simplify local development and CI/CD workflows. Task provides a unified interface for Python and TypeScript/React components.See references/example-taskfile.yaml for a complete example.

Permission review

Static risk signals and limitations

Writes files

medium · line 18

The documentation asks the agent to create, modify, or delete local files.

*What to create in the user's repository:**

Runs scripts

medium · line 74

The documentation asks the agent to run terminal commands or scripts.

To use `task` in a workflow, add an install step and swap the run command:

Network access

medium · line 235

The documentation includes network, browsing, or remote request actions.

curl -fsSL https://get.pulumi.com | sh

Evidence record

Why each signal appears

EvidenceSourceComputedTestedEditorial
SignalValueEvidence typeMeaning
Quality score91/100ComputedDocumentation, specificity, maintenance, and trust rules
Repository stars24SourceRepository attention, not individual Skill quality
Compatibility0 platformsSourceDeclared in the catalog source record
Usage guideautomated source guideEditorialGenerated or reviewed according to the visible evidence level

Pinned source

Provenance and original SKILL.md

Repository
datarobot-oss/datarobot-agent-skills
Skill path
skills/datarobot-app-framework-cicd/SKILL.md
Commit
b901f1c491c1742ebf9282820cd2d5c00d7db2bf
License
Apache-2.0
Collected
2026-08-25
Default branch
main
View the original SKILL.md

DataRobot Application Templates CI/CD Skill

This skill provides comprehensive guidance for setting up production-grade CI/CD pipelines for DataRobot application templates, including automated testing, review deployments, and continuous delivery.

Quick Start

Default behavior: When a user asks to "set up CI/CD" without specifying a platform or backend, always use the Simple Path below — three workflow files, two GitHub Secrets, done. Do not create infra/scripts/, do not add CI/CD tasks to infra/Taskfile.yaml, do not involve GPG encryption unless the user explicitly asks for it.

Only deviate from the simple path when the user specifies:

Simple Path: Pulumi Cloud + GitHub Secrets

For most data scientists and AI engineers, this is all you need. No GPG encryption, no cloud storage account, no extra scripts.

What to create in the user's repository:

  1. Copy the three workflow files to .github/workflows/:

    SourceDestinationTrigger
    examples/github-cd-pulumi-cloud.yml.github/workflows/cd.ymlAutomatic — every merge to main
    examples/github-deploy-pulumi-cloud.yml.github/workflows/deploy-pr.ymlManual — user picks PR branch + enters stack name (e.g. pr-42)
    examples/github-destroy-pulumi-cloud.yml.github/workflows/destroy.ymlManual — user enters stack name to tear down
  2. Create .github/workflows/README.md from examples/workflows-README.md. This is the setup guide that tells the user exactly what secrets and variables to add and how.

  3. Tell the user to follow the setup guide in .github/workflows/README.md.

That's it. Do not add anything to infra/Taskfile.yaml or create infra/scripts/ for this path.

Required GitHub Secrets (both required — no defaults):

NameKind
DATAROBOT_API_TOKENSecret
PULUMI_ACCESS_TOKENSecret

Optional GitHub Variable (defaults to ci if not set):

NameKindDefault
PULUMI_STACK_CI_NAMEVariableci

When to use the advanced approach (GPG + DIY backends) instead:

  • You have many secrets (GPG encrypts all of .env behind a single passphrase — only one GitHub Secret needed)
  • Your organization prohibits Pulumi Cloud and requires a self-managed backend (Azure Blob / S3 / GCS)
  • You need GitLab CI/CD

The templates and scripts for all of these are in scripts/ in this skill directory. If the skill has already been propagated to the project's infra/ directory (common in downstream templates), look in infra/scripts/ instead. See the Implementation Pattern section below for full setup guidance.

ScenarioKey files in scripts/
Azure Blob / S3 / GCS Pulumi backendpulumi-setup.sh, taskfile-snippets.yaml
GitHub Actions + GPG secretsgithub-deploy.yml, github-cd.yml, encrypt-secrets.sh, setup-github-secrets.sh
GitLab CI/CDgitlab-ci.yml, setup-gitlab-variables.sh

Adapting the deploy command

The example workflows use uv run pulumi up --yes directly. Before copying them, check infra/Taskfile.yaml — the project may already wrap the deploy command in a task:

cat infra/Taskfile.yaml   # look for 'up-yes', 'deploy', or similar tasks
What you findWhat to use in CI
up-yes tasktask up-yes — non-interactive, purpose-built for CI; prefer this over raw Pulumi
deploy task (alias for up)Avoid — typically runs pulumi up interactively; only safe in CI if you confirm it passes -y internally
No Taskfile or no relevant taskKeep uv run pulumi up --yes as-is

To use task in a workflow, add an install step and swap the run command:

- name: Install Task
  run: pip install go-task-bin

- name: Deploy
  working-directory: infra
  env:
    DATAROBOT_API_TOKEN: ${{ secrets.DATAROBOT_API_TOKEN }}
    PULUMI_ACCESS_TOKEN: ${{ secrets.PULUMI_ACCESS_TOKEN }}
  run: |
    uv sync --all-extras
    task up-yes

DataRobot API token (service account)

DATAROBOT_API_TOKEN should come from a DataRobot service account — a DataRobot user created for automation, not tied to anyone's personal login. This prevents CI/CD from breaking when the engineer who originally set it up leaves the team.

To set one up: ask your DataRobot admin to create a dedicated user (e.g. [email protected]). Under that account, go to Developer Tools → API Key and generate a token. Store it as the DATAROBOT_API_TOKEN secret in GitHub.

Note: This is purely a DataRobot concept — it has no relation to Pulumi state management or backend configuration. "Service account" here just means a non-personal DataRobot user.

Implementation Pattern

When implementing CI/CD for an application template, follow this structure:

Project Structure:

application-template-root/
├── infra/
│   ├── README.md                   # ⚠️ GENERATE THIS — tailored to the chosen CI/CD platform and Pulumi backend
│   ├── Taskfile.yaml               # ⚠️ CI/CD tasks go HERE — copy from infra/scripts/taskfile-snippets.yaml
│   └── scripts/                    # Copy entire scripts/ directory here
│       ├── README.md               # Copy from scripts/infra-README.md
│       ├── setup-github-secrets.sh
│       ├── setup-gitlab-variables.sh
│       ├── encrypt-secrets.sh
│       ├── decrypt-secrets.sh
│       ├── pulumi-setup.sh
│       ├── gitlab-ci.yml
│       ├── github-deploy.yml
│       ├── github-cd.yml
│       ├── github-destroy.yml
│       └── taskfile-snippets.yaml
├── .env                            # User's secrets (never commit!)
├── .env.gpg                        # Encrypted secrets (commit for GitHub)
├── .gitlab-ci.yml                  # Copy from infra/scripts/gitlab-ci.yml
├── .github/
│   └── workflows/
│       ├── deploy.yml              # Copy from infra/scripts/github-deploy.yml (PR review deploys)
│       ├── cd.yml                  # Copy from infra/scripts/github-cd.yml (push-to-main CD)
│       └── destroy.yml             # Copy from infra/scripts/github-destroy.yml
└── Taskfile.yml                    # Root Taskfile — ADD ONLY one `includes` entry (see below). DO NOT add tasks here.

Key Points:

  • ⚠️ ALWAYS generate infra/README.md tailored to the chosen platform and backend — see "Generating infra/README.md" below
  • All CI/CD scripts go in infra/scripts/ directory
  • ⚠️ CRITICAL: All CI/CD tasks go in infra/Taskfile.yaml — NEVER add CI/CD tasks directly to the root Taskfile.yml
  • .env and .env.gpg stay in project root
  • Scripts in infra/scripts/ reference ../../.env (two levels up)
  • Root Taskfile.yml gets exactly ONE addition: an includes entry pointing to ./infra/Taskfile.yaml
  • CI/CD configs (.gitlab-ci.yml, .github/workflows/) are copied to standard locations

Root Taskfile.yml — the only change needed:

# Add this includes block to the existing root Taskfile.yml:
includes:
  infra:
    taskfile: ./infra/Taskfile.yaml
    dir: infra
# Tasks are then run as: task infra:encrypt-secrets, task infra:setup-github-secrets, etc.

Generating infra/README.md

After determining the user's CI/CD platform (GitHub/GitLab) and Pulumi backend, always create infra/README.md with content tailored to their choices. It should cover:

  1. Architecture overview — which platform was chosen and why, and which Pulumi backend
  2. First-time setup — the exact sequence of task infra:* commands needed to bootstrap
  3. Day-to-day tasks — a table or list of the task infra:* commands relevant to their platform
  4. How deployments work — short description of each trigger:
    • GitHub: deploy.yml fires on PR open/sync (review stack), cd.yml fires on push to main (CI stack), destroy.yml is manual
    • GitLab: review_app is manual on MR, deploy_ci fires on push to default branch, destroy_review_app is manual
  5. Secrets / credentials — what variables/secrets are needed and where they live (GitHub Secrets, GitLab CI/CD variables, .env.gpg)
  6. Stack migration note — if backend was migrated from a local stack, document what was done so future contributors understand the history

Adjust section titles, task names, and stack-naming strategy to match what was actually configured. The README should be accurate enough that a new contributor can set up CI/CD without referring to any other document.

Workflow examples

See references/workflow-examples.md for step-by-step examples covering GitLab CI/CD, GitHub Actions with GPG secrets, and continuous delivery setup.

Using Task for workflow management

Application templates use Task to simplify local development and CI/CD workflows. Task provides a unified interface for Python and TypeScript/React components.

Example Taskfile.yaml

See references/example-taskfile.yaml for a complete example.

Using Task in CI/CD

# Install Task
pip install go-task-bin

# Install dependencies
task install

# Run linters (with fixes)
task lint

# Run linters (check only)
task lint-check

# Run tests
task test

GitLab CI/CD Configuration

The complete pipeline configuration lives in scripts/gitlab-ci.yml. Copy it to your repository root:

cp infra/scripts/gitlab-ci.yml .gitlab-ci.yml

Key pipeline jobs:

  • lint / test — run on every same-project MR
  • review_app — manual deploy per MR; stack name driven by the PULUMI_STACK_REVIEW_NAME CI/CD variable
  • deploy_ci — automatic deploy on merge to default branch; stack name driven by PULUMI_STACK_CI_NAME
  • destroy_review_app — manual cleanup of review stacks

PULUMI_STACK_REVIEW_NAME and PULUMI_STACK_CI_NAME must be set as plain CI/CD variables in GitLab (Settings → CI/CD → Variables). The pipeline file includes sensible defaults that project-level variables override.

GitHub Actions Configuration

The complete workflow files live in scripts/:

  • scripts/github-deploy.yml → copy to .github/workflows/deploy.yml
  • scripts/github-destroy.yml → copy to .github/workflows/destroy.yml
mkdir -p .github/workflows
cp infra/scripts/github-deploy.yml .github/workflows/deploy.yml
cp infra/scripts/github-destroy.yml .github/workflows/destroy.yml

The deploy workflow triggers on pull requests and derives PULUMI_STACK_NAME from the PULUMI_STACK_REVIEW_NAME Actions variable and the PR number. Set PULUMI_STACK_REVIEW_NAME and PULUMI_STACK_CI_NAME as repository variables (Settings → Secrets and variables → Actions → Variables tab), not secrets.

Pulumi State Management

Pulumi Cloud Backend (Recommended)

The simplest approach for managing Pulumi state:

# Install Pulumi
curl -fsSL https://get.pulumi.com | sh

# Login to Pulumi Cloud
pulumi login

# Create/select stack
pulumi stack select --create dev

# Deploy
pulumi up

CI/CD Setup: Add PULUMI_ACCESS_TOKEN to your CI/CD secrets. Get token from Pulumi Console.

DIY Backend Options

For organizations that cannot use Pulumi Cloud:

Azure Blob Storage

# Login to Azure backend
pulumi login azblob://container-name

# Set Azure credentials
export AZURE_STORAGE_ACCOUNT=myaccount
export AZURE_STORAGE_KEY=mykey

AWS S3

# Login to S3 backend
pulumi login s3://bucket-name

# AWS credentials from environment
export AWS_ACCESS_KEY_ID=...
export AWS_SECRET_ACCESS_KEY=...

Google Cloud Storage

# Login to GCS backend
pulumi login gs://bucket-name

# GCP credentials from environment
export GOOGLE_CREDENTIALS=...

Migrating Stacks to a Different Backend

When a developer has an existing local stack (a Pulumi.<stackname>.yaml file) that was created against a different backend than the CI/CD destination, the stack state must be exported and re-imported before switching.

pulumi-setup.sh handles this automatically: it checks pulumi whoami --verbose for the Backend URL and compares it with the target URL. If they differ and local stack files exist, it offers to migrate them.

Manual migration steps (if not using the script):

# 1. Confirm current backend and stacks
pulumi whoami --verbose        # note "Backend URL:"
pulumi stack ls -a             # list stacks on current backend

# 2. Export each stack that exists locally (Pulumi.<name>.yaml)
pulumi stack export --stack <stackname> --file <stackname>-backup.json

# 3. Login to the new backend (set any required credentials first)
#    Examples:
pulumi login                           # Pulumi Cloud
pulumi login azblob://my-container     # Azure Blob
pulumi login s3://my-bucket            # AWS S3

# 4. Create the stack in the new backend and import state
pulumi stack select --create <stackname>
pulumi stack import --file <stackname>-backup.json

# 5. Clean up the backup
rm <stackname>-backup.json

Key signals that migration is needed:

  • pulumi whoami --verbose shows Backend URL: file:// (local) but CI/CD uses cloud storage
  • Backend URL domain/scheme differs between developer machine and CI target

Managing Stacks Across Environments

# List all stacks
pulumi stack ls -a

# Output:
# NAME                                 LAST UPDATE   RESOURCE COUNT
# organization/project/prod            1 day ago     15
# organization/project/staging         2 days ago    12
# organization/project/dev             1 hour ago    10
# github-pr-repo-42                    3 hours ago   13

# Select and update a stack
pulumi stack select dev
pulumi up

# View stack outputs
pulumi stack output --json

# Delete a stack
pulumi stack rm review-app-123 --yes

Secrets Management

All credentials (DataRobot API token, Pulumi access token, LLM keys, cloud storage keys) are stored in .env and committed to the repository encrypted as .env.gpg. The only secret that needs to be configured in the CI/CD system directly is CICD_SECRET_PASSPHRASE (the GPG passphrase). Non-sensitive stack name variables (PULUMI_STACK_CI_NAME, PULUMI_STACK_REVIEW_NAME) are set as plain variables, not secrets.

DataRobot API token (service account)

DATAROBOT_API_TOKEN should come from a DataRobot service account — a DataRobot user created for automation, not tied to anyone's personal login. This prevents CI/CD from breaking when the engineer who originally set it up leaves the team.

To set one up: ask your DataRobot admin to create a dedicated user (e.g. [email protected]). Under that account, go to Developer Tools → API Key and generate a token. Store it as the DATAROBOT_API_TOKEN secret in your CI/CD system.

Note: This is purely a DataRobot concept — it has no relation to Pulumi state management or backend configuration. "Service account" here just means a non-personal DataRobot user.

GitHub

Run scripts/setup-github-secrets.sh for interactive setup — it sets CICD_SECRET_PASSPHRASE as a repository secret and PULUMI_STACK_CI_NAME / PULUMI_STACK_REVIEW_NAME as repository variables.

To encrypt .env for CI:

task infra:encrypt-secrets
# or: ./infra/scripts/encrypt-secrets.sh

Add the resulting .env.gpg to git. For local decryption:

task infra:decrypt-secrets
# or: ./infra/scripts/decrypt-secrets.sh

GitLab

Run scripts/setup-gitlab-variables.sh for interactive setup — it sets:

  • CICD_SECRET_PASSPHRASE — masked, for decrypting .env.gpg
  • GITLAB_API_TOKEN — masked, for posting MR comments
  • PULUMI_STACK_CI_NAME / PULUMI_STACK_REVIEW_NAME — plain variables

Alternatively configure in the UI: Project Settings → CI/CD → Variables. Mark CICD_SECRET_PASSPHRASE and GITLAB_API_TOKEN as Masked and Protected.

Best practices

CI/CD Pipeline Design

  1. Fast feedback: Run linting and testing in parallel
  2. Manual gates: Make review apps manual to save resources
  3. Automatic cleanup: Provide easy ways to destroy test environments
  4. Stack isolation: Use unique stack names per PR/MR
  5. Idempotent operations: Design deployments to be safely re-runnable

Pulumi State

  1. Use centralized backends: Enable collaboration and CI/CD
  2. Stack naming conventions: Use consistent patterns (e.g., github-pr-{repo}-{number})
  3. Clean up stacks: Remove unused stacks to reduce clutter
  4. State locking: Backends handle this automatically
  5. Backup state: Cloud backends provide automatic backups

Security

  1. Never commit secrets: Use .gitignore for .env files
  2. Encrypt sensitive data: Use GPG for GitHub, CI/CD variables for GitLab
  3. Rotate credentials: Regularly update API tokens and keys
  4. Scope permissions: Use least-privilege access for service accounts
  5. Audit access: Monitor who has access to secrets

Resource Management

  1. Tag resources: Use consistent tagging for tracking
  2. Set TTLs: Consider time-to-live for review environments
  3. Monitor costs: Track resource usage per environment
  4. Auto-cleanup: Implement automatic deletion of old review apps
  5. Resource limits: Set quotas to prevent runaway costs

Troubleshooting

Common Issues

Pulumi state conflicts:

  • Ensure only one deployment runs at a time per stack
  • Use unique stack names for concurrent deployments
  • Check backend connection and credentials

Secret decryption failures:

  • Verify GPG passphrase is correct
  • Check .env.gpg file is in repository
  • Ensure GPG is installed in CI environment

Deployment timeouts:

  • Increase timeout values in workflow
  • Check DataRobot API connectivity
  • Verify resource provisioning isn't blocked

Stack not found:

  • List stacks: pulumi stack ls -a
  • Verify backend connection
  • Check stack name matches pattern

Resource conflicts:

  • Use unique names per stack
  • Check for orphaned resources
  • Review Pulumi state for inconsistencies

Example Repositories

Reference implementations:

Resources

Frequently asked questions

What to verify before installation and use

What does the datarobot-app-framework-cicd source document cover?

This skill provides comprehensive guidance for setting up production-grade CI/CD pipelines for DataRobot application templates, including automated testing, review deployments, and continuous delivery.

How do I install datarobot-app-framework-cicd?

The source record exposes this install command: npx skills add https://github.com/datarobot-oss/datarobot-agent-skills --skill "skills/datarobot-app-framework-cicd". Inspect the command and pinned source before running it.

Which permission-related actions were detected?

Static rules flagged write-files, exec-script, network in the source; the page lists the matching lines and excerpts.

Alternatives

Compare before choosing

Computed 9880

vasilyu1983/AI-Agents-public

research-git

Scans public GitHub repos for agent skills, dev practices, and code patterns. Use when enriching skills, setting team policy, or researching a build domain.

Computed 96156

open-edge-platform/edge-ai-libraries

chatqna-helm-deploy

Deploy Chat Question-and-Answer Core to Kubernetes using Helm (OpenVINO CPU, OpenVINO GPU, or Ollama), including values.yaml configuration, helm install/upgrade, deployment verification, uninstall, and translation from Docker Compose setup_env.sh variables into Helm override values. Use this skill when the user says "deploy chatqna core to kubernetes", "helm install chatqna-core", "configure values.yaml", "convert compose config to helm", or "translate setup_env.sh to chart values".

Computed 9660

almanak-co/sdk

almanak-strategy-builder

Build, test, and deploy DeFi trading strategies using the Almanak SDK. ALWAYS use this skill when the user mentions almanak, DeFi strategy, trading strategy, yield farming, liquidity provision, token swap, borrowing, lending, perpetuals, staking, vault deposit, bridging tokens, backtesting, paper trading, or on-chain execution. Use for writing strategy.py files, composing intents (Swap, LP, Borrow, Supply, Perp, Bridge, Stake, Vault, Prediction), working with config.json strategy parameters, run

Computed 9618

nexus-substrate/nexus-agents

release

Execute a release following project standards. Use when publishing a new version, creating release tags, or deploying. Triggers on "release", "publish", "version bump", "create release".