Skip to content

Docker-2

Docker-2 #111

Workflow file for this run

# target second latest major version
name: Docker-2
on:
push:
tags: ["*"]
branches:
- "main"
- "master"
schedule:
- cron: '0 4 * * *'
pull_request:
branches: ["**"]
env:
# Hostname of your registry
REGISTRY: docker.io
# Image repository, without hostname and tag
IMAGE_NAME: alpine/helm
REPO_NAME: helm/helm
REBUILD: false
SHA: ${{ github.event.pull_request.head.sha || github.event.after }}
jobs:
check_tag:
runs-on: ubuntu-latest
permissions:
pull-requests: write
outputs:
build_required: ${{ steps.curl-version.outputs.build_required }}
version: ${{ steps.curl-version.outputs.version}}
steps:
# Step to fetch the latest version
- name: Get latest version
id: curl-version
run: |
VERSION=$(curl -s https://api.github.com/repos/${REPO_NAME}/releases | jq -r '.[].tag_name | select(test("alpha|beta|rc") | not) ' | sort -rV | awk -F. '!seen[$1]++ { print; if (++count == 2) exit }' |sed 's/v//'|awk 'NR==2')
echo "Latest version is $VERSION"
echo "VERSION=$VERSION" >> $GITHUB_OUTPUT
status=$(curl -sL https://hub.docker.com/v2/repositories/${IMAGE_NAME}/tags/${VERSION})
echo $status
if [[ ( "${status}" =~ "not found" ) ||( ${REBUILD} == "true" ) ]]; then
echo "build image for ${VERSION}"
echo "build_required=true" >> $GITHUB_OUTPUT
else
echo "Tag ${VERSION} is exist, skip"
echo "build_required=false" >> $GITHUB_OUTPUT
fi
build_and_push:
runs-on: ubuntu-latest
needs: check_tag
if: needs.check_tag.outputs.build_required == 'true'
permissions:
pull-requests: write
steps:
- name: Setup Docker buildx
uses: docker/setup-buildx-action@v3
# Authenticate to the container registry
- name: Authenticate to registry ${{ env.REGISTRY }}
uses: docker/login-action@v3
with:
registry: ${{ env.REGISTRY }}
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
# Extract metadata (tags, labels) for Docker
- name: Extract Docker metadata
id: meta
uses: docker/metadata-action@v5
with:
images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
labels: |
org.opencontainers.image.revision=${{ env.SHA }}
tags: |
type=edge,branch=$repo.default_branch
type=semver,pattern=v{{version}}
type=sha,prefix=,suffix=,format=short
# Build and push Docker image with Buildx
# (don't push on PR, load instead)
- name: Build and push Docker image
id: build-and-push
uses: docker/build-push-action@v6
with:
platforms: linux/amd64,linux/arm/v7,linux/arm64/v8,linux/arm/v6,linux/ppc64le,linux/s390x
sbom: ${{ github.event_name != 'pull_request' }}
provenance: ${{ github.event_name != 'pull_request' }}
push: ${{ github.event_name != 'pull_request' }}
load: ${{ github.event_name == 'pull_request' }}
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
cache-from: type=gha
cache-to: type=gha,mode=max
build-args: |
VERSION=${{ needs.check_tag.outputs.version }}
# - name: Checkout code
# uses: actions/checkout@v2
# - name: check the platform in multi-arch images
# run: |
# echo ${{ steps.meta.outputs.tags }}
# bash ./test.sh ${{ steps.meta.outputs.tags }}
- name: set tags
run: |
echo "VERSION=${{ needs.check_tag.outputs.version }}" >> $GITHUB_ENV
echo $VERSION
echo ${{ env.VERSION }}
# install crane
curl -LO https://github.com/google/go-containerregistry/releases/download/v0.20.2/go-containerregistry_Linux_x86_64.tar.gz
tar zxvf go-containerregistry_Linux_x86_64.tar.gz
chmod +x crane
# simple test
docker_version=$(docker run --rm ${{ steps.meta.outputs.tags }} version)
docker_version=$(echo ${docker_version}| awk -F \" '{print $2}' |sed 's/v//')
echo $docker_version
minor=${docker_version%.*}
major=${docker_version%%.*}
if [ "$docker_version" == "${{ needs.check_tag.outputs.version }}" ]; then
./crane auth login -u ${{ secrets.DOCKERHUB_USERNAME }} -p ${{ secrets.DOCKERHUB_TOKEN }} index.docker.io
./crane copy ${{ steps.meta.outputs.tags }} ${{ env.IMAGE_NAME }}:${{ needs.check_tag.outputs.version }}
./crane copy ${{ steps.meta.outputs.tags }} ${{ env.IMAGE_NAME }}:${minor}
./crane copy ${{ steps.meta.outputs.tags }} ${{ env.IMAGE_NAME }}:${major}
rm -f /home/runner/.docker/config.json
else
echo "Versions are different. Skipping..."
fi