alpine #2670
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
name: build image | |
on: | |
push: | |
branches: | |
- master | |
- main | |
workflow_dispatch: | |
inputs: | |
buildtype: | |
description: 'Build by "force" or on "change"' | |
required: true | |
default: 'force' | |
repository_dispatch: | |
types: alpine | |
jobs: | |
compare: | |
runs-on: ubuntu-latest | |
outputs: | |
flag: ${{ steps.set-flag.outputs.flag }} | |
strategy: | |
fail-fast: false | |
matrix: | |
arch: [amd64, arm, arm64] | |
steps: | |
- name: checkout repository | |
uses: actions/checkout@v2 | |
- name: container registries | |
run: | | |
docker login ghcr.io -u ${{ github.actor }} -p ${{ secrets.GITHUB_TOKEN }} | |
docker login docker.io -u ${{ secrets.DOCKERUSERNAME }} -p ${{ secrets.DOCKERAPIKEY }} | |
- name: compare image | |
id: set-flag | |
run: | | |
export DOCKER_CLI_EXPERIMENTAL=enabled | |
version="3.12" | |
repo="treehouses/alpine-tags:${{ matrix.arch }}" | |
case ${{ matrix.arch }} in | |
amd64) : "amd64/alpine:$version" ;; | |
arm) : "balenalib/raspberry-pi-alpine:$version" ;; | |
arm64) : "arm64v8/alpine:$version" ;; | |
esac | |
base="$_" | |
docker pull -q $base &>/dev/null | |
docker pull -q $repo &>/dev/null | |
basesha=$(docker image inspect $base | jq --raw-output '.[0].RootFS.Layers|.[]') | |
reposha=$(docker image inspect $repo | jq --raw-output '.[0].RootFS.Layers|.[]') | |
echo "base sha:$basesha repo sha:$reposha" | |
${{ github.event.inputs.buildtype == 'force' }} && echo "::set-output name=flag::true" || echo "building on change" | |
[[ $reposha == *$basesha* ]] && echo "no changes" || echo "::set-output name=flag::true" | |
images: | |
needs: compare | |
runs-on: ubuntu-latest | |
outputs: | |
build: ${{ steps.set-build.outputs.build }} | |
strategy: | |
fail-fast: false | |
matrix: | |
arch: [amd64, arm, arm64] | |
steps: | |
- name: checkout repository | |
uses: actions/checkout@v2 | |
- name: container registries | |
run: | | |
docker login ghcr.io -u ${{ github.actor }} -p ${{ secrets.GITHUB_TOKEN }} | |
docker login docker.io -u ${{ secrets.DOCKERUSERNAME }} -p ${{ secrets.DOCKERAPIKEY }} | |
- name: docker image | |
if: ${{ needs.compare.outputs.flag }} | |
id: set-build | |
run: | | |
export DOCKER_CLI_EXPERIMENTAL=enabled | |
version="3.12" | |
case ${{ matrix.arch }} in | |
amd64) : "amd64/alpine:$version" ;; | |
arm) : "balenalib/raspberry-pi-alpine:$version" ;; | |
arm64) : "arm64v8/alpine:$version" ;; | |
esac | |
image="$_" | |
repo="treehouses/alpine-tags" | |
dest="$repo:${{ matrix.arch }}" | |
date="$(date +%Y%m%d%H%M)" | |
docker build -t ghcr.io/$dest --build-arg IMAGE=$image . | |
docker tag ghcr.io/$dest docker.io/$dest | |
docker tag ghcr.io/$dest ghcr.io/$dest-$date | |
docker tag docker.io/$dest docker.io/$dest-$date | |
docker push --all-tags ghcr.io/$repo | |
docker push --all-tags docker.io/$repo | |
docker images | |
echo "::set-output name=build::true" | |
manifests: | |
needs: images | |
strategy: | |
fail-fast: false | |
matrix: | |
registry: [docker.io, ghcr.io] | |
runs-on: ubuntu-latest | |
outputs: | |
send: ${{ steps.set-send.outputs.send }} | |
steps: | |
- name: container registries | |
run: | | |
docker login ghcr.io -u ${{ github.actor }} -p ${{ secrets.GITHUB_TOKEN }} | |
docker login docker.io -u ${{ secrets.DOCKERUSERNAME }} -p ${{ secrets.DOCKERAPIKEY }} | |
- name: create manifests | |
if: ${{ needs.images.outputs.build }} | |
id: set-send | |
run: | | |
repo="${{ matrix.registry }}/treehouses/alpine" | |
date="$(date +%Y%m%d%H%M)" | |
docker manifest create $repo:latest $repo-tags:amd64 $repo-tags:arm $repo-tags:arm64 | |
docker manifest create $repo:$date $repo-tags:amd64 $repo-tags:arm $repo-tags:arm64 | |
docker manifest annotate $repo:latest $repo-tags:arm --os linux --arch arm | |
docker manifest annotate $repo:$date $repo-tags:arm --os linux --arch arm | |
docker manifest inspect $repo:latest | |
docker manifest push $repo:latest | |
docker manifest push $repo:$date | |
echo "::set-output name=send::true" | |
message: | |
needs: manifests | |
runs-on: ubuntu-latest | |
steps: | |
- name: message chat of new image | |
if: ${{ needs.manifests.outputs.send }} | |
run: | | |
sudo npm install -g @treehouses/cli | |
export gitter_channel="${{ secrets.CHANNEL }}" | |
echo "https://hub.docker.com/r/treehouses/alpine/tags" | |
echo "https://github.com/treehouses/alpine/pkgs/container/alpine" | |
treehouses feedback "new treehouses/alpine check https://hub.docker.com/r/treehouses/alpine/tags or https://github.com/treehouses/alpine/pkgs/container/alpine" |