PluginBench
Skill
Official
Review
Audit score 70

push-to-registry

hashicorp/agent-skills

Push Packer build metadata to HCP Packer registry for image lifecycle tracking and governance.

What is push-to-registry?

This skill configures Packer templates to automatically push build metadata to HCP Packer registry, enabling version control and image governance. Use it when you need to track image builds, manage versions across environments, and query artifacts in Terraform.

  • Configure hcp_packer_registry block in Packer templates to push metadata with minimal overhead
  • Set bucket and build labels for organizing and tracking image versions
  • Authenticate via HCP service principal credentials (client ID and secret)
  • Query pushed artifacts in Terraform using hcp_packer_artifact data source
  • Integrate image builds into CI/CD pipelines (GitHub Actions example provided)
  • Prevent drift between artifacts and registry by failing builds if metadata push fails

How to install push-to-registry

npx skills add https://github.com/hashicorp/agent-skills --skill push-to-registry
Prerequisites
  • HCP account with organization and project
  • HCP service principal with Contributor role on the project
  • HCP_CLIENT_ID, HCP_CLIENT_SECRET, HCP_ORGANIZATION_ID, and HCP_PROJECT_ID environment variables configured
  • Packer >= 1.7.7
Claude Code
Cursor
Windsurf
Cline

How to use push-to-registry

  1. 1.Create or obtain HCP service principal credentials with Contributor role
  2. 2.Set HCP authentication environment variables (HCP_CLIENT_ID, HCP_CLIENT_SECRET, HCP_ORGANIZATION_ID, HCP_PROJECT_ID)
  3. 3.Add hcp_packer_registry block to your Packer build configuration with a consistent bucket_name
  4. 4.Define bucket_labels for static metadata (OS, team, component) and build_labels for per-build data (git commit, timestamp)
  5. 5.Run packer init and packer build to push metadata to HCP Packer registry
  6. 6.Query artifacts in Terraform using hcp_packer_artifact data source to reference built images

Use cases

Good for
  • Automating image builds in CI/CD with centralized version tracking in HCP Packer
  • Querying the latest production-ready AMI in Terraform for infrastructure provisioning
  • Organizing multi-team image builds with bucket and build labels for compliance and governance
  • Tracking image lineage with git commits and build timestamps across environments
  • Managing image lifecycle from development through production with immutable build metadata
Who it's for
  • Infrastructure engineers managing Packer-based image builds
  • DevOps teams integrating image builds with Terraform and CI/CD pipelines
  • Platform teams implementing image governance and version control
  • Organizations using HCP for centralized infrastructure artifact management

push-to-registry FAQ

What gets pushed to HCP Packer registry?

Only build metadata (bucket name, labels, artifact references) is pushed, not the actual image files. This adds minimal overhead (<1 minute) and is free for basic use.

Can I change the bucket_name between builds?

No. Keep bucket_name consistent across builds for the same image type. Changing it creates a new bucket and breaks version tracking. Use build_labels for per-build variation instead.

How do I authenticate with HCP Packer?

Create a service principal in HCP IAM with Contributor role, generate a client secret, then export HCP_CLIENT_ID, HCP_CLIENT_SECRET, HCP_ORGANIZATION_ID, and HCP_PROJECT_ID as environment variables before running packer build.

What happens if the registry push fails?

Packer fails the entire build immediately to prevent drift between artifacts and the registry. Check network connectivity to HCP API and verify credentials.

How do I use pushed images in Terraform?

Use the hcp_packer_artifact data source with bucket_name, channel_name, platform, and region to query the artifact, then reference its external_identifier (AMI ID) in aws_instance or other resources.

Full instructions (SKILL.md)

Source of truth, from hashicorp/agent-skills.


name: push-to-registry description: Push Packer build metadata to HCP Packer registry for tracking and managing image lifecycle. Use when integrating Packer builds with HCP Packer for version control and governance.

Push to HCP Packer Registry

Configure Packer templates to push build metadata to HCP Packer registry.

Reference: HCP Packer Registry

Note: HCP Packer is free for basic use. Builds push metadata only (not actual images), adding minimal overhead (<1 minute).

Basic Registry Configuration

packer {
  required_version = ">= 1.7.7"
}

variable "image_name" {
  type    = string
  default = "web-server"
}

locals {
  timestamp = regex_replace(timestamp(), "[- TZ:]", "")
}

source "amazon-ebs" "ubuntu" {
  region        = "us-west-2"
  instance_type = "t3.micro"

  source_ami_filter {
    filters = {
      name = "ubuntu/images/*ubuntu-jammy-22.04-amd64-server-*"
    }
    most_recent = true
    owners      = ["099720109477"]
  }

  ssh_username = "ubuntu"
  ami_name     = "${var.image_name}-${local.timestamp}"
}

build {
  sources = ["source.amazon-ebs.ubuntu"]

  hcp_packer_registry {
    bucket_name = var.image_name
    description = "Ubuntu 22.04 base image for web servers"

    bucket_labels = {
      "os"   = "ubuntu"
      "team" = "platform"
    }

    build_labels = {
      "build-time" = local.timestamp
    }
  }

  provisioner "shell" {
    inline = [
      "sudo apt-get update",
      "sudo apt-get upgrade -y",
    ]
  }
}

Authentication

Set environment variables before building:

export HCP_CLIENT_ID="your-service-principal-client-id"
export HCP_CLIENT_SECRET="your-service-principal-secret"
export HCP_ORGANIZATION_ID="your-org-id"
export HCP_PROJECT_ID="your-project-id"

packer build .

Create HCP Service Principal

  1. Navigate to HCP → Access Control (IAM)
  2. Create Service Principal
  3. Grant "Contributor" role on project
  4. Generate client secret
  5. Save client ID and secret

Registry Configuration Options

bucket_name (required)

The image identifier. Must stay consistent across builds!

bucket_name = "web-server"  # Keep this constant

bucket_labels (optional)

Metadata at bucket level. Updates with each build.

bucket_labels = {
  "os"        = "ubuntu"
  "team"      = "platform"
  "component" = "web"
}

build_labels (optional)

Metadata for each iteration. Immutable after build completes.

build_labels = {
  "build-time" = local.timestamp
  "git-commit" = var.git_commit
}

CI/CD Integration

GitHub Actions

name: Build and Push to HCP Packer

on:
  push:
    branches: [main]

env:
  HCP_CLIENT_ID: ${{ secrets.HCP_CLIENT_ID }}
  HCP_CLIENT_SECRET: ${{ secrets.HCP_CLIENT_SECRET }}
  HCP_ORGANIZATION_ID: ${{ secrets.HCP_ORGANIZATION_ID }}
  HCP_PROJECT_ID: ${{ secrets.HCP_PROJECT_ID }}

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: hashicorp/setup-packer@main

      - name: Build and push
        run: |
          packer init .
          packer build \
            -var "git_commit=${{ github.sha }}" \
            .

Querying in Terraform

data "hcp_packer_artifact" "ubuntu" {
  bucket_name  = "web-server"
  channel_name = "production"
  platform     = "aws"
  region       = "us-west-2"
}

resource "aws_instance" "web" {
  ami           = data.hcp_packer_artifact.ubuntu.external_identifier
  instance_type = "t3.micro"

  tags = {
    PackerBucket = data.hcp_packer_artifact.ubuntu.bucket_name
  }
}

Common Issues

Authentication Failed

  • Verify HCP_CLIENT_ID and HCP_CLIENT_SECRET
  • Ensure service principal has Contributor role
  • Check organization and project IDs

Bucket Name Mismatch

  • Keep bucket_name consistent across builds
  • Don't include timestamps in bucket_name
  • Creates new bucket if name changes

Build Fails

  • Packer fails immediately if can't push metadata
  • Prevents drift between artifacts and registry
  • Check network connectivity to HCP API

Best Practices

  • Consistent bucket names - Never change for same image type
  • Meaningful labels - Use for versions, teams, compliance
  • CI/CD automation - Automate builds and registry pushes
  • Immutable build labels - Put changing data (git SHA, date) in build_labels

References