Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Implement secure secrets management for CI/CD pipelines using Vault, AWS Secrets Manager, or native platform solutions. Use when handling sensitive credentials, rotating secrets, or securing CI/CD environments.
.claude/skills/microck-secrets-management/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-13 | ✗→✓ | ▲ Improved | 65% | 0% |
| case-17 | ✗→✓ | ▲ Improved | 262% | 0% |
| case-19 | ✗→✓ | ▲ Improved | 174% | 0% |
| case-01 | ✓→✗ | ▼ Worse | 232% | 0% |
| case-02 | ✓→✓ | = Same ✓ | 319% | 0% |
Secure secrets management practices for CI/CD pipelines using Vault, AWS Secrets Manager, and other tools.
Implement secure secrets management in CI/CD pipelines without hardcoding sensitive information.
bash# Start Vault dev server vault server -dev # Set environment export VAULT_ADDR='http://127.0.0.1:8200' export VAULT_TOKEN='root' # Enable secrets engine vault secrets enable -path=secret kv-v2 # Store secret vault kv put secret/database/config username=admin password=secret
yamlname: Deploy with Vault Secrets on: [push] jobs: deploy: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Import Secrets from Vault uses: hashicorp/vault-action@v2 with: url: https://vault.example.com:8200 token: ${{ secrets.VAULT_TOKEN }} secrets: | secret/data/database username | DB_USERNAME ; secret/data/database password | DB_PASSWORD ; secret/data/api key | API_KEY - name: Use secrets run: | echo "Connecting to database as $DB_USERNAME" # Use $DB_PASSWORD, $API_KEY
yamldeploy: image: vault:latest before_script: - export VAULT_ADDR=https://vault.example.com:8200 - export VAULT_TOKEN=$VAULT_TOKEN - apk add curl jq script: - | DB_PASSWORD=$(vault kv get -field=password secret/database/config) API_KEY=$(vault kv get -field=key secret/api/credentials) echo "Deploying with secrets..." # Use $DB_PASSWORD, $API_KEY
Reference: See references/vault-setup.md
bashaws secretsmanager create-secret \ --name production/database/password \ --secret-string "super-secret-password"
yaml- name: Configure AWS credentials uses: aws-actions/configure-aws-credentials@v4 with: aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }} aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} aws-region: us-west-2 - name: Get secret from AWS run: | SECRET=$(aws secretsmanager get-secret-value \ --secret-id production/database/password \ --query SecretString \ --output text) echo "::add-mask::$SECRET" echo "DB_PASSWORD=$SECRET" >> $GITHUB_ENV - name: Use secret run: | # Use $DB_PASSWORD ./deploy.sh
hcldata "aws_secretsmanager_secret_version" "db_password" { secret_id = "production/database/password" } resource "aws_db_instance" "main" { allocated_storage = 100 engine = "postgres" instance_class = "db.t3.large" username = "admin" password = jsondecode(data.aws_secretsmanager_secret_version.db_password.secret_string)["password"] }
yaml- name: Use GitHub secret run: | echo "API Key: ${{ secrets.API_KEY }}" echo "Database URL: ${{ secrets.DATABASE_URL }}"
yamldeploy: runs-on: ubuntu-latest environment: production steps: - name: Deploy run: | echo "Deploying with ${{ secrets.PROD_API_KEY }}"
Reference: See references/github-secrets.md
yamldeploy: script: - echo "Deploying with $API_KEY" - echo "Database: $DATABASE_URL"
pythonimport boto3 import json def lambda_handler(event, context): client = boto3.client('secretsmanager') # Get current secret response = client.get_secret_value(SecretId='my-secret') current_secret = json.loads(response['SecretString']) # Generate new password new_password = generate_strong_password() # Update database password update_database_password(new_password) # Update secret client.put_secret_value( SecretId='my-secret', SecretString=json.dumps({ 'username': current_secret['username'], 'password': new_password }) ) return {'statusCode': 200}
yamlapiVersion: external-secrets.io/v1beta1 kind: SecretStore metadata: name: vault-backend namespace: production spec: provider: vault: server: "https://vault.example.com:8200" path: "secret" version: "v2" auth: kubernetes: mountPath: "kubernetes" role: "production" --- apiVersion: external-secrets.io/v1beta1 kind: ExternalSecret metadata: name: database-credentials namespace: production spec: refreshInterval: 1h secretStoreRef: name: vault-backend kind: SecretStore target: name: database-credentials creationPolicy: Owner data: - secretKey: username remoteRef: key: database/config property: username - secretKey: password remoteRef: key: database/config property: password
bash#!/bin/bash # .git/hooks/pre-commit # Check for secrets with TruffleHog docker run --rm -v "$(pwd):/repo" \ trufflesecurity/trufflehog:latest \ filesystem --directory=/repo if [ $? -ne 0 ]; then echo "❌ Secret detected! Commit blocked." exit 1 fi
yamlsecret-scan: stage: security image: trufflesecurity/trufflehog:latest script: - trufflehog filesystem . allow_failure: false
references/vault-setup.md - HashiCorp Vault configurationreferences/github-secrets.md - GitHub Secrets best practicesgithub-actions-templates - For GitHub Actions integrationgitlab-ci-patterns - For GitLab CI integrationdeployment-pipeline-design - For pipeline architecture| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | pass→fail | 4,268 | 2,976 | -30% | 1 | 1 | 0% | 799 | 2,652 | +232% | 0 | 0 | — |
case-02 | pass→pass | 4,053 | 4,507 | +11% | 1 | 1 | 0% | 684 | 2,863 | +319% | 0 | 0 | — |
case-03 | fail→fail | 2,616 | 2,384 | -9% | 1 | 1 | 0% | 473 | 2,387 | +405% | 0 | 0 | — |
case-04 | pass→pass | 3,091 | 3,408 | +10% | 1 | 1 | 0% | 536 | 2,545 | +375% | 0 | 0 | — |
case-09 | fail→fail | 3,267 | 3,372 | +3% | 1 | 1 | 0% | 568 | 2,497 | +340% | 0 | 0 | — |
case-05 | pass→pass | 5,291 | 3,319 | -37% | 1 | 1 | 0% | 873 | 2,628 | +201% | 0 | 0 | — |
case-06 | pass→pass | 4,200 | 3,674 | -13% | 1 | 1 | 0% | 722 | 2,718 | +276% | 0 | 0 | — |
case-07 | pass→pass | 3,129 | 3,910 | +25% | 1 | 1 | 0% | 531 | 2,778 | +423% | 0 | 0 | — |
case-08 | pass→pass | 6,490 | 4,611 | -29% | 1 | 1 | 0% | 1,301 | 2,951 | +127% | 0 | 0 | — |
case-10 | pass→pass | 4,427 | 3,657 | -17% | 1 | 1 | 0% | 733 | 2,642 | +260% | 0 | 0 | — |
case-11 | pass→pass | 4,076 | 3,824 | -6% | 1 | 1 | 0% | 701 | 2,672 | +281% | 0 | 0 | — |
case-12 | pass→pass | 11,904 | 6,674 | -44% | 1 | 1 | 0% | 2,173 | 2,620 | +21% | 0 | 0 | — |
case-13 | fail→pass | 13,504 | 9,950 | -26% | 1 | 1 | 0% | 2,299 | 3,795 | +65% | 0 | 0 | — |
case-14 | pass→pass | 5,242 | 5,608 | +7% | 1 | 1 | 0% | 962 | 3,086 | +221% | 0 | 0 | — |
case-15 | pass→pass | 2,758 | 3,206 | +16% | 1 | 1 | 0% | 354 | 2,351 | +564% | 0 | 0 | — |
case-16 | pass→pass | 9,234 | 7,319 | -21% | 1 | 1 | 0% | 1,524 | 3,367 | +121% | 0 | 0 | — |
case-17 | fail→pass | 32,890 | 13,773 | -58% | 1 | 1 | 0% | 1,179 | 4,270 | +262% | 0 | 0 | — |
case-18 | pass→pass | 9,970 | 11,273 | +13% | 1 | 1 | 0% | 1,655 | 3,690 | +123% | 0 | 0 | — |
case-19 | fail→pass | 7,953 | 4,316 | -46% | 1 | 1 | 0% | 1,015 | 2,784 | +174% | 0 | 0 | — |
case-20 | pass→pass | 7,356 | 5,005 | -32% | 1 | 1 | 0% | 1,281 | 2,925 | +128% | 0 | 0 | — |
case-21 | pass→pass | 15,839 | 17,154 | +8% | 1 | 1 | 0% | 2,682 | 4,876 | +82% | 0 | 0 | — |
case-22 | pass→pass | 9,963 | 9,760 | -2% | 1 | 1 | 0% | 1,946 | 3,824 | +97% | 0 | 0 | — |
case-23 | pass→pass | 7,483 | 10,089 | +35% | 1 | 1 | 0% | 1,371 | 3,843 | +180% | 0 | 0 | — |
case-24 | pass→pass | 6,833 | 6,054 | -11% | 1 | 1 | 0% | 1,343 | 3,225 | +140% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 24 cases were attempted, and 23 counted toward the lift figure. The other 1 produced results that are not comparable between the two arms, so they are excluded from the headline rather than averaged into it. The headline lift of +8 percentage points is the difference between those two pass rates over the 23 comparable cases. 1 case got worse with the skill loaded, and it is included in that figure.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.