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?

Configures Packer templates to automatically push build metadata to HCP Packer registry, enabling version control and image governance. Use this when integrating Packer builds with HCP for centralized artifact management and Terraform consumption.

  • Push build metadata to HCP Packer registry with minimal overhead (<1 minute)
  • Tag images with bucket-level and build-level labels for organization and tracking
  • Query pushed artifacts in Terraform using hcp_packer_artifact data source
  • Integrate with CI/CD pipelines (GitHub Actions example provided)
  • Prevent drift by failing builds if registry push fails
  • Support multi-region and multi-platform artifact management

How to install push-to-registry

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

How to use push-to-registry

  1. 1.Create or obtain HCP service principal credentials (Client ID and Secret) 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.Optionally add bucket_labels (organization metadata) and build_labels (per-build metadata like git SHA)
  5. 5.Run packer init and packer build to push metadata to the registry
  6. 6.Query artifacts in Terraform using data.hcp_packer_artifact with bucket_name and channel_name

Use cases

Good for
  • Automate image builds and registry pushes in GitHub Actions or other CI/CD
  • Track image versions and compliance metadata across teams
  • Query latest production images in Terraform for infrastructure provisioning
  • Maintain consistent image naming and labeling across build pipelines
  • Centralize artifact governance for multiple image types
Who it's for
  • Infrastructure engineers managing Packer-based image builds
  • DevOps teams integrating image builds with Terraform
  • Platform teams implementing image lifecycle governance
  • Organizations using HCP for artifact management

push-to-registry FAQ

What gets pushed to HCP Packer registry?

Only build metadata (labels, bucket name, build info) is pushed, not the actual image artifacts. This adds minimal overhead (<1 minute per build).

Can I change the bucket_name between builds?

No. Keep bucket_name constant for the same image type. Changing it creates a new bucket and breaks version continuity.

How do I use pushed images in Terraform?

Use the hcp_packer_artifact data source with bucket_name and channel_name to retrieve the artifact ID, then reference it in resource definitions.

What happens if the registry push fails?

The entire Packer build fails immediately, preventing drift between artifacts and the registry. Check network connectivity and HCP credentials.

Can I integrate this with GitHub Actions?

Yes. Store HCP credentials as GitHub secrets and pass them as environment variables in your workflow before running packer build.

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. metadata: lifecycle-status: active

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