Skip to content

Commit

Permalink
initial commit
Browse files Browse the repository at this point in the history
  • Loading branch information
jr200 committed Aug 24, 2024
0 parents commit c6912a4
Show file tree
Hide file tree
Showing 30 changed files with 1,727 additions and 0 deletions.
4 changes: 4 additions & 0 deletions .dockerignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
.venv/
.history/
private/
*.bak
195 changes: 195 additions & 0 deletions .github/workflows/build_docker_image.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,195 @@
name: build-docker-image-multiplatform

on:
push:
tags:
- v*.*.*

workflow_dispatch:
inputs:
tag:
description: docker-image-tag
required: false
type: string
default: dev
platforms:
description: platform-filter-json
required: false
type: string
default: |-
[ "linux/amd64" ]
env:
REGISTRY: ghcr.io
IMAGE_NAME: ${{ github.repository }}
REGISTRY_IMAGE: ghcr.io/${{ github.repository }}
DEFAULT_UNIVERSE: |-
[
{"platform": "linux/amd64", "os": "linux", "build-os": "ubuntu-latest"},
{"platform": "linux/arm64", "os": "linux", "build-os": "ubuntu-latest"}
]
jobs:
setup-matrix:
runs-on: ubuntu-latest
outputs:
matrix: ${{ steps.create-matrix.outputs.matrix }}
steps:
- name: Determine Platforms
id: create-matrix
run: |
platforms='${{ inputs.platforms }}'
default_universe='${{ env.DEFAULT_UNIVERSE }}'
echo "input filtered_platforms: $platforms"
echo "input default_universe: $default_universe"
if [[ "${{ github.event_name }}" == "workflow_dispatch" ]]; then
echo "filtering matrix using workflow_dispatch arguments"
result_matrix=$(echo "$default_universe" | jq -c --argjson platforms "$platforms" '[.[] | select($platforms[] == .platform)]')
else
echo "matrix filtering skipped"
result_matrix=$(echo "$default_universe" | jq -c)
fi
echo set-matrix: $result_matrix
echo "matrix=$result_matrix" >> $GITHUB_OUTPUT
build:
name: Build ${{ matrix.platform }} Image
needs: setup-matrix
runs-on: ${{ matrix.build-os }}
strategy:
fail-fast: false
matrix:
include: ${{ fromJson(needs.setup-matrix.outputs.matrix) }}

permissions:
contents: read
packages: write

steps:
- name: Prepare
run: |
platform=${{ matrix.platform }}
echo "PLATFORM_PAIR=${platform//\//-}" >> $GITHUB_ENV
- uses: actions/checkout@v4
with:
fetch-depth: 0

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

- name: Extract Docker metadata
id: meta
uses: docker/metadata-action@v5
with:
images: ${{ env.REGISTRY_IMAGE }}

- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3

- name: Log into registry ${{ env.REGISTRY }}
uses: docker/login-action@v3
with:
registry: ${{ env.REGISTRY }}
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}

- name: Build and push Docker image
id: build-and-push
uses: docker/build-push-action@v6
with:
platforms: ${{ matrix.platform }}
labels: ${{ steps.meta.outputs.labels }}
outputs: type=image,name=${{ env.REGISTRY_IMAGE }},push-by-digest=true,name-canonical=true,push=true
file: docker/Dockerfile
context: .
provenance: false
cache-from: type=gha
cache-to: type=gha,mode=max

- name: Export digest
run: |
mkdir -p /tmp/digests
digest="${{ steps.build-and-push.outputs.digest }}"
touch "/tmp/digests/${digest#sha256:}"
- name: Upload digest
uses: actions/upload-artifact@v4
with:
name: digests-${{ env.PLATFORM_PAIR }}
path: /tmp/digests/*
if-no-files-found: error
retention-days: 1

merge:
name: Merge platform specific Docker image into multi platform image
runs-on: ubuntu-latest
needs:
- build

permissions:
contents: write
packages: write

steps:
- name: Download digests
uses: actions/download-artifact@v4
with:
path: /tmp/digests
pattern: digests-*
merge-multiple: true

- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3

- name: Docker meta
id: meta
uses: docker/metadata-action@v5
with:
images: ${{ env.REGISTRY_IMAGE }}

- name: Login to Docker Hub
uses: docker/login-action@v3
with:
registry: ${{ env.REGISTRY }}
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}

- name: Set version or sha for Docker tag
id: set-version
run: |
if [ "${{ github.event_name }}" == "workflow_dispatch" ]; then
if [ -z "${{ github.event.inputs.tag }}" ]; then
echo "tag=${GITHUB_SHA}" >> $GITHUB_ENV
else
echo "tag=${{ github.event.inputs.tag }}" >> $GITHUB_ENV
fi
else
echo "tag=${{ steps.meta.outputs.version }}" >> $GITHUB_ENV
fi
- name: Create manifest list and push
working-directory: /tmp/digests
run: |
docker buildx imagetools create -t ${{ env.REGISTRY_IMAGE }}:${{ env.tag }} $(printf '${{ env.REGISTRY_IMAGE }}@sha256:%s ' *)
- name: Inspect image
run: |
docker buildx imagetools inspect ${{ env.REGISTRY_IMAGE }}:${{ env.tag }}
- name: Repository Dispatch
uses: peter-evans/repository-dispatch@v3
if: github.event_name != 'workflow_dispatch'
with:
token: ${{ secrets.GITHUB_TOKEN }}
event-type: build-image-success
client-payload: |-
{
"ref": "${{ github.ref }}",
"sha": "${{ github.sha }}",
"tag": "${{ env.tag }}",
"artifacts": "${{ env.REGISTRY_IMAGE }}:${{ env.tag }}"
}
137 changes: 137 additions & 0 deletions .github/workflows/build_helm_chart.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,137 @@
name: build-helm-chart

on:
repository_dispatch:
types:
- build-image-success

workflow_dispatch:
inputs:
tag:
description: "chart-version"
required: true
type: string
default: "v0.0.1"

jobs:
release:
permissions:
contents: write
env:
CHART_DIR: charts
CHART_REPO: jr200/helm-charts
CHART_REPO_BRANCH: main
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4

- name: Checkout Helm chart repo
uses: actions/checkout@v4
with:
repository: ${{ env.CHART_REPO }}
path: .helm-chart-repo
# create a github fine-grained personal access token
# - for repo: helm-charts
# - with permissions: contents=read+write, metadata=read
# then copy that token into a repository secret: CHARTS_WRITE_TOKEN
token: ${{ secrets.CHARTS_WRITE_TOKEN }}

- name: determine Tag
id: determine-tag
run: |
if [ "${{ github.event_name }}" == "workflow_dispatch" ]; then
echo "tag=${{ github.event.inputs.tag }}" >> $GITHUB_ENV
else
echo "tag=${{ github.event.client_payload.tag }}" >> $GITHUB_ENV
fi
- name: Install yq - portable yaml processor
uses: mikefarah/[email protected]

- name: Collect charts
id: charts
run: |
set -e
find -L charts -mindepth 2 -maxdepth 2 -type f \( -name 'Chart.yaml' -o -name 'Chart.yml' \) -exec dirname "{}" \; \
| sort -u \
| sed -E 's/^/- /' \
| yq --no-colors --indent 0 --output-format json '.' \
| sed -E 's/^/charts=/' >> $GITHUB_OUTPUT
- name: Install chart releaser
run: |
set -e
arch="$(dpkg --print-architecture)"
curl -s https://api.github.com/repos/helm/chart-releaser/releases/latest \
| yq --indent 0 --no-colors --input-format json --unwrapScalar \
".assets[] | select(.name | test("\""^chart-releaser_.+_linux_${arch}\.tar\.gz$"\"")) | .browser_download_url" \
| xargs curl -SsL \
| tar zxf - -C /usr/local/bin
- name: Install Helm
uses: azure/setup-helm@v3

- name: Helm Deps
run: |
set -ex
echo '${{ steps.charts.outputs.charts }}' \
| yq --indent 0 --no-colors --input-format json --unwrapScalar '.[]' \
| while read -r dir; do
helm dependency update $dir;
if [ -f "$dir/Chart.lock" ]; then
yq --indent 0 \
'.dependencies | map(["helm", "repo", "add", .name, .repository] | join(" ")) | .[]' \
"$dir/Chart.lock" \
| sh --;
fi
done
- name: Package charts
id: package
run: |
set -ex
PACKAGES=.cr-release-packages
echo '${{ steps.charts.outputs.charts }}' \
| yq --indent 0 --no-colors --input-format json --unwrapScalar '.[]' \
| xargs -d$'\n' cr package --package-path "$PACKAGES"
echo "dir=${PACKAGES}" >> $GITHUB_OUTPUT
- name: Upload packages
run: |
set -ex
git config --list
owner=$(cut -d '/' -f 1 <<< '${{ github.repository }}')
repo=$(cut -d '/' -f 2 <<< '${{ github.repository }}')
cr upload --commit '${{ github.sha }}' --git-repo "$repo" --owner "$owner" --token '${{ github.token }}' \
--package-path '${{ steps.package.outputs.dir }}' --skip-existing
- name: Update charts index (without --overwrite flag)
working-directory: .helm-chart-repo
run: |
set -ex
git config --local user.name "$GITHUB_ACTOR"
git config --local user.email "[email protected]"
git config --list
mkdir -p .cr-index
owner=$(cut -d '/' -f 1 <<< '${{ github.repository }}')
repo=$(cut -d '/' -f 2 <<< '${{ github.repository }}')
cr index --git-repo "$repo" --owner "$owner" \
--pages-branch '${{ env.CHART_REPO_BRANCH }}' \
--package-path '../${{ steps.package.outputs.dir }}' \
--index-path .cr-index \
--push
- name: Repository Dispatch
uses: peter-evans/repository-dispatch@v3
if: github.event_name != 'workflow_dispatch'
with:
token: ${{ secrets.GITHUB_TOKEN }}
event-type: build-chart-success
client-payload: |-
{
"ref": "${{ github.ref }}",
"sha": "${{ github.sha }}",
"tag": "${{ env.tag }}",
"artifacts": "${{ github.event.client_payload.artifacts }}"
}
26 changes: 26 additions & 0 deletions .github/workflows/create_release.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
name: create-release

on:
repository_dispatch:
types:
- build-image-success

jobs:
build:
runs-on: ubuntu-latest
permissions:
contents: write
steps:
- name: Checkout
uses: actions/checkout@v4

- name: Create Release
uses: ncipollo/release-action@v1
with:
generateReleaseNotes: true
allowUpdates: true
tag: ${{ github.event.client_payload.tag }}
# artifacts: "release-*-*/*.tar.gz"
# bodyFile: release_notes/${{ env.FABRIC_VER }}.md
# bodyFile: "body.md"
# artifacts: '*.pdf'
Loading

0 comments on commit c6912a4

Please sign in to comment.