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- 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
How to use push-to-registry
- 1.Create or obtain HCP service principal credentials (Client ID and Secret) 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.Optionally add bucket_labels (organization metadata) and build_labels (per-build metadata like git SHA)
- 5.Run packer init and packer build to push metadata to the registry
- 6.Query artifacts in Terraform using data.hcp_packer_artifact with bucket_name and channel_name
Use cases
- 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
- 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
Only build metadata (labels, bucket name, build info) is pushed, not the actual image artifacts. This adds minimal overhead (<1 minute per build).
No. Keep bucket_name constant for the same image type. Changing it creates a new bucket and breaks version continuity.
Use the hcp_packer_artifact data source with bucket_name and channel_name to retrieve the artifact ID, then reference it in resource definitions.
The entire Packer build fails immediately, preventing drift between artifacts and the registry. Check network connectivity and HCP credentials.
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
- 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 configurations into reusable, maintainable modules following HashiCorp best practices.

run-acceptance-tests
Run and diagnose Terraform provider acceptance tests with proper environment setup and debugging.

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

terraform-stacks
Orchestrate multi-component infrastructure across environments with HashiCorp 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 configurations without breaking changes.