Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/ednz-cloud/docker-matrix-generator

GitHub Actions to generate a build matrix that's easy to work with. Mirror from https://git.ednz.fr/github-actions/docker-matrix-generator.
https://github.com/ednz-cloud/docker-matrix-generator

automation build container docker github-actions python

Last synced: 5 days ago
JSON representation

GitHub Actions to generate a build matrix that's easy to work with. Mirror from https://git.ednz.fr/github-actions/docker-matrix-generator.

Awesome Lists containing this project

README

        

# Action: generate docker build matrix
> This repository is only a mirror. Development and testing is done on a private gitea server.

This action generates a docker build matrix from a comma-separated list of versions

## Parameters

The following parameters can be used as `step.with` keys:

| Name | Type | Default | Required |Description |
| ------------------ | ------ | ------- |--------- |--------------------------------- |
| `versions` | String | | yes | comma separated list of versions |

## Use case

When building containers for multiple versions (for example, when building images for software developed somewhere else), you often need/want to be able to automatically tag images with `latest`, `major`, and `major.minor` versions automatically.

This action allows you to generate a json object that can be used to build these images, base on a list of versions.

For an input like:

`2.2.8,2.2.7,2.2.4,2.2.3`

It will output:

```json
[
{
"version": "2.2.8",
"is_latest": true,
"is_latest_major": true,
"major_version": "2",
"is_latest_minor": true,
"minor_version": "2.2"
},
{
"version": "2.2.7",
"is_latest": false,
"is_latest_major": false,
"major_version": "2",
"is_latest_minor": false,
"minor_version": "2.2"
},
{
"version": "2.2.4",
"is_latest": false,
"is_latest_major": false,
"major_version": "2",
"is_latest_minor": false,
"minor_version": "2.2"
},
{
"version": "2.2.3",
"is_latest": false,
"is_latest_major": false,
"major_version": "2",
"is_latest_minor": false,
"minor_version": "2.2"
}
]
```

This matrix can then be built to automatically tag your images with the correct tags, using the [docker/metadata-action](https://github.com/docker/metadata-action) action.

```yaml
- name: Prepare container metadata
id: metadata
uses: docker/metadata-action@v5
with:
images: ${{ env.IMAGE_NAME }}
flavor: |
latest=auto
labels: |
org.opencontainers.image.authors=${{ github.repository_owner }}
org.opencontainers.image.created=${{ needs.prepare.outputs.date }}
org.opencontainers.image.url=${{ github.event.repository.html_url }}
org.opencontainers.image.documentation=${{ github.event.repository.html_url }}
org.opencontainers.image.source=${{ github.event.repository.html_url }}
org.opencontainers.image.version=${{ matrix.versions.version }}
tags: |
type=raw,value=${{ matrix.versions.version }},enable=true
type=raw,value=${{ matrix.versions.minor_version }},enable=${{ matrix.versions.is_latest_minor }}
type=raw,value=${{ matrix.versions.major_version }},enable=${{ matrix.versions.is_latest_major }}
type=raw,value=latest,enable=${{ matrix.versions.is_latest }}
```

## Example usage

```yaml
jobs:
define:
outputs:
version_matrix: ${{ steps.docker-build-matrix.outputs.version_matrix }}
- name: Checkout Code
uses: actions/checkout@v4

- id: docker-build-matrix
name: Generate docker build matrix
uses: ednz-cloud/docker-matrix-generator@v1
with:
versions: 2.2.8, 2.2.7, 2.2.4, 2.2.3

publish:
runs-on: ubuntu-latest
needs: define
strategy:
matrix:
versions: ${{ fromJson(needs.define.outputs.version_matrix) }}
steps:
- name: Checkout
uses: actions/checkout@v4

- name: Setup buildx
uses: docker/setup-buildx-action@v3

- name: Setup QEMU
uses: docker/setup-qemu-action@v3

- name: Login to container registry
uses: docker/login-action@v3
with:
username: ${{ secrets.DOCKERHUB_API_USERNAME }}
password: ${{ secrets.DOCKERHUB_API_TOKEN }}

- name: Prepare container metadata
id: metadata
uses: docker/metadata-action@v5
with:
images: ${{ env.IMAGE_NAME }}
flavor: |
latest=auto
labels: |
org.opencontainers.image.authors=${{ github.repository_owner }}
org.opencontainers.image.created=${{ needs.prepare.outputs.date }}
org.opencontainers.image.url=${{ github.event.repository.html_url }}
org.opencontainers.image.documentation=${{ github.event.repository.html_url }}
org.opencontainers.image.source=${{ github.event.repository.html_url }}
org.opencontainers.image.version=${{ matrix.versions.version }}
tags: |
type=raw,value=${{ matrix.versions.version }},enable=true
type=raw,value=${{ matrix.versions.minor_version }},enable=${{ matrix.versions.is_latest_minor }}
type=raw,value=${{ matrix.versions.major_version }},enable=${{ matrix.versions.is_latest_major }}
type=raw,value=latest,enable=${{ matrix.versions.is_latest }}

- name: Build and publish
id: build-and-push
uses: docker/build-push-action@v5
with:
context: .
push: ${{ (github.event_name != 'pull_request') || (env.FORCE_PUBLISH == 'true') }}
tags: ${{ steps.metadata.outputs.tags }}
labels: ${{ steps.metadata.outputs.labels }}
platforms: ${{ env.BUILD_PLATFORMS }}
build-args: KEEPALIVED_VERSION=${{ matrix.versions.version }}
```