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- 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
How to use push-to-registry
- 1.Create or obtain HCP service principal credentials with Contributor role
- 2.Set HCP authentication environment variables (HCP_CLIENT_ID, HCP_CLIENT_SECRET, HCP_ORGANIZATION_ID, HCP_PROJECT_ID)
- 3.Add hcp_packer_registry block to your Packer build configuration with a consistent bucket_name
- 4.Define bucket_labels for static metadata (OS, team, component) and build_labels for per-build data (git commit, timestamp)
- 5.Run packer init and packer build to push metadata to HCP Packer registry
- 6.Query artifacts in Terraform using hcp_packer_artifact data source to reference built images
Use cases
- 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
- 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
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.
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.
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.
Packer fails the entire build immediately to prevent drift between artifacts and the registry. Check network connectivity to HCP API and verify credentials.
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
- Navigate to HCP → Access Control (IAM)
- Create Service Principal
- Grant "Contributor" role on project
- Generate client secret
- 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_nameconsistent 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
Related skills
More from hashicorp/agent-skills and the wider catalog.

refactor-module
Transform monolithic Terraform into reusable, maintainable modules following HashiCorp best practices.

run-acceptance-tests
Run acceptance tests for Terraform providers with guided diagnostics.

terraform-search-import
Discover and bulk import existing cloud resources into Terraform using declarative search queries.

terraform-stacks
Orchestrate multi-component infrastructure across environments and regions using Terraform Stacks.

terraform-style-guide
Generate Terraform HCL code following HashiCorp's official style conventions and best practices.

terraform-test
Write and run Terraform tests to validate infrastructure changes without affecting production.