mirror of
https://github.com/ivuorinen/actions.git
synced 2026-02-18 06:49:00 +00:00
feat: add GitHub Actions workflows for code quality and automation (#2)
This commit is contained in:
42
docker-publish/README.md
Normal file
42
docker-publish/README.md
Normal file
@@ -0,0 +1,42 @@
|
||||
# ivuorinen/actions/docker-publish
|
||||
|
||||
## Docker Publish
|
||||
|
||||
### Description
|
||||
|
||||
Publish a Docker image to GitHub Packages and Docker Hub.
|
||||
|
||||
### Inputs
|
||||
|
||||
| name | description | required | default |
|
||||
| ---------- | ----------------------------------------------------------- | -------- | ------- |
|
||||
| `registry` | <p>Registry to publish to (dockerhub, github, or both).</p> | `true` | `both` |
|
||||
| `nightly` | <p>Is this a nightly build? (true or false)</p> | `false` | `false` |
|
||||
|
||||
### Outputs
|
||||
|
||||
| name | description |
|
||||
| ---------- | ----------------------------------------- |
|
||||
| `registry` | <p>Registry where image was published</p> |
|
||||
|
||||
### Runs
|
||||
|
||||
This action is a `composite` action.
|
||||
|
||||
### Usage
|
||||
|
||||
```yaml
|
||||
- uses: ivuorinen/actions/docker-publish@main
|
||||
with:
|
||||
registry:
|
||||
# Registry to publish to (dockerhub, github, or both).
|
||||
#
|
||||
# Required: true
|
||||
# Default: both
|
||||
|
||||
nightly:
|
||||
# Is this a nightly build? (true or false)
|
||||
#
|
||||
# Required: false
|
||||
# Default: false
|
||||
```
|
||||
158
docker-publish/action.yml
Normal file
158
docker-publish/action.yml
Normal file
@@ -0,0 +1,158 @@
|
||||
---
|
||||
# yaml-language-server: $schema=https://json.schemastore.org/github-action.json
|
||||
name: Docker Publish
|
||||
description: Publish a Docker image to GitHub Packages and Docker Hub.
|
||||
author: Ismo Vuorinen
|
||||
|
||||
branding:
|
||||
icon: upload-cloud
|
||||
color: blue
|
||||
|
||||
inputs:
|
||||
registry:
|
||||
description: 'Registry to publish to (dockerhub, github, or both).'
|
||||
required: true
|
||||
default: 'both'
|
||||
nightly:
|
||||
description: 'Is this a nightly build? (true or false)'
|
||||
required: false
|
||||
default: 'false'
|
||||
|
||||
outputs:
|
||||
registry:
|
||||
description: 'Registry where image was published'
|
||||
value: ${{ steps.dest.outputs.reg }}
|
||||
|
||||
runs:
|
||||
using: composite
|
||||
steps:
|
||||
- name: Validate Inputs
|
||||
id: validate
|
||||
shell: bash
|
||||
run: |
|
||||
set -euo pipefail
|
||||
|
||||
# Validate registry input
|
||||
if ! [[ "${{ inputs.registry }}" =~ ^(dockerhub|github|both)$ ]]; then
|
||||
echo "::error::Invalid registry value. Must be 'dockerhub', 'github', or 'both'"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
- name: Determine Tags
|
||||
id: tags
|
||||
shell: bash
|
||||
run: |
|
||||
set -euo pipefail
|
||||
|
||||
# Initialize variables
|
||||
declare -a tag_array
|
||||
|
||||
if [[ "${{ inputs.nightly }}" == "true" ]]; then
|
||||
# Nightly build tags
|
||||
current_date=$(date +'%Y%m%d-%H%M')
|
||||
tag_array+=("nightly")
|
||||
tag_array+=("nightly-${current_date}")
|
||||
else
|
||||
# Release tags
|
||||
if [[ -n "${{ github.event.release.tag_name }}" ]]; then
|
||||
tag_array+=("${{ github.event.release.tag_name }}")
|
||||
tag_array+=("latest")
|
||||
else
|
||||
echo "::error::No release tag found and not a nightly build"
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
|
||||
# Join tags with comma
|
||||
tags=$(IFS=,; echo "${tag_array[*]}")
|
||||
echo "all-tags=${tags}" >> "$GITHUB_OUTPUT"
|
||||
echo "Generated tags: ${tags}"
|
||||
|
||||
- name: Determine Publish Destination
|
||||
id: dest
|
||||
shell: bash
|
||||
run: |
|
||||
set -euo pipefail
|
||||
|
||||
if [[ "${{ inputs.registry }}" == "both" ]]; then
|
||||
echo "reg=github,dockerhub" >> "$GITHUB_OUTPUT"
|
||||
else
|
||||
echo "reg=${{ inputs.registry }}" >> "$GITHUB_OUTPUT"
|
||||
fi
|
||||
|
||||
echo "Publishing to: ${{ inputs.registry }}"
|
||||
|
||||
- name: Build Multi-Arch Docker Image
|
||||
uses: ivuorinen/actions/docker-build@main
|
||||
with:
|
||||
tag: ${{ steps.tags.outputs.all-tags }}
|
||||
|
||||
- name: Publish to Docker Hub
|
||||
if: contains(steps.dest.outputs.reg, 'dockerhub')
|
||||
uses: ivuorinen/actions/docker-publish-hub@main
|
||||
with:
|
||||
tags: ${{ steps.tags.outputs.all-tags }}
|
||||
|
||||
- name: Publish to GitHub Packages
|
||||
if: contains(steps.dest.outputs.reg, 'github')
|
||||
uses: ivuorinen/actions/docker-publish-gh@main
|
||||
with:
|
||||
tags: ${{ steps.tags.outputs.all-tags }}
|
||||
|
||||
- name: Verify Publications
|
||||
id: verify
|
||||
shell: bash
|
||||
run: |
|
||||
set -euo pipefail
|
||||
|
||||
echo "Verifying publications..."
|
||||
success=true
|
||||
|
||||
# Split registry string into array
|
||||
IFS=',' read -ra REGISTRIES <<< "${{ steps.dest.outputs.reg }}"
|
||||
|
||||
for registry in "${REGISTRIES[@]}"; do
|
||||
echo "Checking ${registry} publication..."
|
||||
case "${registry}" in
|
||||
"dockerhub")
|
||||
if ! curl -s "https://hub.docker.com/v2/repositories/${{ github.repository }}/tags/" | grep -q "${{ steps.tags.outputs.all-tags }}"; then
|
||||
echo "::error::Failed to verify Docker Hub publication"
|
||||
success=false
|
||||
fi
|
||||
;;
|
||||
"github")
|
||||
if ! gh api "/packages/container/${github.repository}/versions" | grep -q "${{ steps.tags.outputs.all-tags }}"; then
|
||||
echo "::error::Failed to verify GitHub Packages publication"
|
||||
success=false
|
||||
fi
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
if [[ "${success}" != "true" ]]; then
|
||||
echo "::error::Publication verification failed"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "All publications verified successfully"
|
||||
|
||||
- name: Cleanup
|
||||
if: always()
|
||||
shell: bash
|
||||
run: |
|
||||
set -euo pipefail
|
||||
|
||||
echo "Cleaning up..."
|
||||
|
||||
# Remove any temporary files or caches
|
||||
docker buildx prune -f --keep-storage=10GB
|
||||
|
||||
# Remove any temporary authentication
|
||||
if [[ "${{ steps.dest.outputs.reg }}" =~ "dockerhub" ]]; then
|
||||
docker logout docker.io || true
|
||||
fi
|
||||
if [[ "${{ steps.dest.outputs.reg }}" =~ "github" ]]; then
|
||||
docker logout ghcr.io || true
|
||||
fi
|
||||
|
||||
echo "Cleanup completed"
|
||||
Reference in New Issue
Block a user