mirror of https://github.com/hashicorp/packer
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
116 lines
5.6 KiB
116 lines
5.6 KiB
---
|
|
description: |
|
|
HCP Packer support allows plugins to manage image metadata that can be stored in a HCP Packer registry.
|
|
page_title: HCP Packer Support
|
|
---
|
|
|
|
# HCP Packer Support
|
|
|
|
~> **Note:** HCP Packer is under active development, and we suggest plugin maintainers to keep up with the SDK changes
|
|
for more on HCP Packer support.
|
|
|
|
This page explains how to update a custom plugin so that it can publish image metadata to the [HCP Packer registry](https://cloud.hashicorp.com/docs/packer). Refer to [Custom Builders](/docs/plugins/creation/custom-builders) and [Custom Post-Processors](/docs/plugins/creation/custom-post-processors) for details about creating an external Packer plugin.
|
|
|
|
Before pushing metadata to the HCP Packer registry, Packer uses the [`par.artifact.metadata` key](https://pkg.go.dev/github.com/hashicorp/packer-plugin-sdk/packer/registry/image#pkg-constants)
|
|
to query a builder artifact for the image metadata that a particular component would like to have stored in the registry.
|
|
|
|
For details and examples of how to manage image metadata, refer to the [HCP Packer GitHub documentation](https://pkg.go.dev/github.com/hashicorp/packer-plugin-sdk/packer/registry/image).
|
|
|
|
## Builder Artifact
|
|
|
|
To support HCP Packer, changes must be made to the plugin's build artifact. The artifact should keep the appropriate
|
|
Image metadata in state under the key `par.artifact.metadata`. The expected key is provided by the [image.ArtifactStateURI](https://pkg.go.dev/github.com/hashicorp/packer-plugin-sdk/packer/registry/image#pkg-constants) constant.
|
|
|
|
To make HCP Packer support easier, we ship an Image package with the [packer-plugin-sdk](https://pkg.go.dev/github.com/hashicorp/packer-plugin-sdk/packer/registry/image#pkg-overview).
|
|
We provide the [`FromArtifact`](https://pkg.go.dev/github.com/hashicorp/packer-plugin-sdk/packer/registry/image#FromArtifact) function
|
|
to easily create an Image with the basic information contained in the Artifact. If customization is necessary, the `FromArtifact` accepts
|
|
override functions as the second argument, and that can be used to set different values for the metadata.
|
|
|
|
The [Image metadata](https://pkg.go.dev/github.com/hashicorp/packer-plugin-sdk/packer/registry/image#Image) must contain every
|
|
metadata HCP Packer should store about this component. The structure is:
|
|
```go
|
|
// Image represents the metadata for some Artifact in the HCP Packer Registry.
|
|
type Image struct {
|
|
// ImageID is a unique reference identifier stored on the HCP Packer registry
|
|
// that can be used to get back the built artifact of a builder or post-processor.
|
|
ImageID string
|
|
// ProviderName represents the name of the top level cloud or service where the built artifact resides.
|
|
// For example "aws, azure, docker, gcp, and vsphere".
|
|
ProviderName string
|
|
// ProviderRegion represents the location of the built artifact.
|
|
// For cloud providers region usually maps to a cloud region or zone, but for things like the file builder,
|
|
// S3 bucket or vsphere cluster region can represent a path on the upstream datastore, or cluster.
|
|
ProviderRegion string
|
|
// Labels represents additional details about an image that a builder or post-processor may with to provide for a given build.
|
|
// Any additional metadata will be made available as build labels within a HCP Packer registry iteration.
|
|
Labels map[string]string
|
|
// SourceImageID is the cloud image ID of the image that was used as the
|
|
// source for this image. If set, the HCP Packer registry will be able
|
|
// link the parent and child images for ancestry visualizations and
|
|
// dependency tracking.
|
|
SourceImageID string
|
|
}
|
|
```
|
|
|
|
Where `ImageID`, `ProviderName`, and `SourceImageID` are mandatory fields.
|
|
|
|
Examples using the `FromArtifact` method:
|
|
|
|
- Simple form:
|
|
```go
|
|
func (a *Artifact) State(name string) interface{} {
|
|
if name == registryimage.ArtifactStateURI {
|
|
img, err := registryimage.FromArtifact(a)
|
|
if err != nil {
|
|
log.Printf("[DEBUG] error encountered when creating a registry image %v", err)
|
|
return nil
|
|
}
|
|
return img
|
|
}
|
|
return a.StateData[name]
|
|
}
|
|
```
|
|
|
|
- Using overrides:
|
|
```go
|
|
func (a *Artifact) State(name string) interface{} {
|
|
if name == registryimage.ArtifactStateURI {
|
|
img, err := registryimage.FromArtifact(a,
|
|
registryimage.WithID(a.Name),
|
|
registryimage.WithRegion(a.Region.Name()),
|
|
registryimage.WithProvider("happy-cloud"),
|
|
registryimage.WithSourceID(a.SourceID),
|
|
registryimage.SetLabels(a.Labels),
|
|
)
|
|
if err != nil {
|
|
log.Printf("[DEBUG] error encountered when creating a registry image %v", err)
|
|
return nil
|
|
}
|
|
return img
|
|
}
|
|
return a.StateData[name]
|
|
}
|
|
```
|
|
|
|
See [packer-plugin-sdk/packer/registry/image](https://pkg.go.dev/github.com/hashicorp/packer-plugin-sdk/packer/registry/image#pkg-examples) for additional examples.
|
|
|
|
### SDK Version
|
|
|
|
- The HCP Packer support is available from packer-plugin-sdk >= v0.2.7
|
|
|
|
## Plugins Example
|
|
|
|
The following plugins currently support HCP Packer and are great references for development:
|
|
|
|
- [packer-plugin-amazon](https://github.com/hashicorp/packer-plugin-amazon)
|
|
- [packer-plugin-azure](https://github.com/hashicorp/packer-plugin-azure)
|
|
- [packer-plugin-vsphere](https://github.com/hashicorp/packer-plugin-vsphere)
|
|
- [packer-plugin-docker](https://github.com/hashicorp/packer-plugin-docker)
|
|
- [packer-plugin-googlecompute](https://github.com/hashicorp/packer-plugin-googlecompute)
|
|
|
|
## HCP Packer
|
|
|
|
To get to know HCP Packer, visit the
|
|
[HCP Packer documentation](https://cloud.hashicorp.com/docs/packer) or try the
|
|
[Get Started with HCP Packer tutorials](https://learn.hashicorp.com/collections/packer/hcp-get-started).
|