README ¶
A Porter Mixin Skeleton
This repository contains the skeleton structure of a Porter Mixin. You can clone this repository and use it as a starting point to build new mixins. The structure of this project matches closely with existing Porter Mixins.
- Create a new repository in GitHub using this repository as a template.
- Go 1.13 or higher is required. You can choose to clone into the GOPATH or not according to preference.
- Rename the
cmd/pac
andpkg/pac
directories tocmd/YOURMIXIN
andpkg/YOURMIXIN
. - Find the text
github.com/squillace/porter-pac
in the repository and change it togithub.com/YOURNAME/YOURREPO
. - Find
PKG = github.com/squillace/porter-pac
in the Makefile and change it toPKG = github.com/YOURNAME/YOURREPO
. - Find any remaining
pac
text in the repository and replace it withYOURMIXIN
. - In
pkg/YOURMIXIN/version.go
replaceYOURNAME
with the name you would like displayed as the mixin author. This value is displayed as the author of your mixin whenporter mixins list
is run. - Replace the
YOURNAME
instances inpkg/YOURMIXIN/version_test.go
with the name used above. - Run
make clean build test-unit xbuild-all test-integration
to try out all the make targets and verify that everything executes without failing. You may need to fix a test string or two. - Run
make install
to install your mixin into the Porter home directory. If you don't already have Porter installed, install it first. - Now your mixin is installed, you are ready start customizing and iterating on your mixin!
Customize your mixin
This mixin is ready to wrap an existing command-line tool. The shortest path
would be to edit build.go
to add the instructions to download the tool
and you are all set. It will look and feel like the gcloud
or aws mixins, both of which are built on top of the exec mixin.
Edit the Build
function in pkg/pac/build.go
.
Here you can add any Dockerfile lines that you require to download and install
additional tools, configuration files, etc necessary for your mixin. The Build
function should write the Dockerfile lines to m.Out
which is a pipe from the
mixin back to porter.
You will also find the basic logic supporting mixin configuration. Support for clientVersion
is ready to go, which enables users to specify the version of the underlying tool/utility provided by the mixin, if applicable.
Search for TODO
in the code and follow the instructions to customize the mixin.
Here is an example from the aws mixin, where it downloads the latest version of of the aws binary and installs it:
This is enough to have a working mixin. Run make build install
and then test
it out with a bundle.
That will get you started but make sure to read the mixin developer documentation for how to create a full featured mixin:
Once ready for primetime, don't forget to revisit this README.md
and update/replace it with details on your mixin.
Project Structure
In the cmd/pac
directory, you will find a cli built using spf13/cobra. The CLI contains a go file for each basic capability a Mixin should implement:
- build
- schema
- version
- install
- upgrade
- invoke
- uninstall
Each of these command implementations have a corresponding Mixin implementation in the pkg/pac
directory. Each of the commands above is wired into an empty implementation in pkg/pac
that needs to be completed. In order to build a new Mixin, you need to complete these implementations with the relevant technology. For example, to build a Cloud Formation mixin, you might implement the methods in pkg/pac
using the AWS Go SDK.
Provided capabilities
This skeleton mixin project brings some free capabilities:
File System Access and Context
Porter provides a Context package that has helpful mechanisms for accessing the File System using spf13/afero. This makes it easy to provide mock File System implementations during testing. The Context package also provides a mechanism to encapsualte stdin, stdout and stderr so that they can easily be passed from cmd/pac
code to implementing pkg/pac
code.
Template and Static Asset Handling
The project already includes Packr V2 for dealing with static files, such as templates or other content that is best modeled outside of a Go file. You can see an example of this in pkg/pac/schema.go
.
Basic Schema
The project provides an implementation of the pac schema
command that is mostly functional. To fully implement this for your mixin, you simply need to provide a valid JSON schema. For reference, consult pkg/pac/schema/schema.json
.
Basic Tests
The project provides some very basic test skeletons that you can use as a starting point for building tests for your mixin.
Makefile
The project also includes a Makefile that will can be used to both build and install the mixin. The Makefile also includes a TODO publish
target that shows how you might publish the mixin and generate an mixin feed for easily sharing your mixin.