docker-php-extension-installer/.github/workflows/readme-release.yml

236 lines
9.2 KiB
YAML

name: Update README and create release
on:
push:
branches:
- master
create:
tags:
- "*"
repository_dispatch:
types:
- readme-release
workflow_dispatch:
jobs:
readme-release:
runs-on: ubuntu-latest
env:
VERSIONTAG_THIS: ""
steps:
-
name: Checkout
if: >
(github.event_name == 'push' && github.ref == 'refs/heads/master')
|| (github.event_name == 'create' && github.event.ref_type == 'tag')
|| github.event_name == 'repository_dispatch'
uses: actions/checkout@v4
with:
ref: master
fetch-depth: 0
-
name: Update README
if: >
(github.event_name == 'push' && github.ref == 'refs/heads/master')
|| github.event_name == 'repository_dispatch'
run: |
./scripts/update-readme
if ! git ls-files -m | grep -qE '^README\.md$'; then
echo 'README.md has not been changed'
else
echo 'README.md has been updated'
git config user.name 'Michele Locati'
git config user.email 'michele@locati.it'
git add README.md
git commit -m '[skip ci] Automatically update README.md'
git push
fi
-
name: Look for the recent version tags
if: >
(github.event_name == 'push' && github.ref == 'refs/heads/master')
|| (github.event_name == 'create' && github.event.ref_type == 'tag')
|| github.event_name == 'repository_dispatch'
run: |
TAGS="$(git tag --list --sort=-version:refname)"
VERSIONTAG_LAST=
VERSIONTAG_PENULTIMATE=
for TAG in $(git tag --list --sort=-version:refname); do
if printf '%s' "$TAG" | grep -Eq '^[0-9]+\.[0-9]+\.[0-9]+$'; then
if test -z "$VERSIONTAG_LAST"; then
VERSIONTAG_LAST="$TAG"
else
VERSIONTAG_PENULTIMATE="$TAG"
break
fi
fi
done
if test -z "$VERSIONTAG_LAST"; then
printf 'Most recent version tag: <none>\n'
else
printf 'Most recent version tag: %s\n' "$VERSIONTAG_LAST"
fi
printf 'VERSIONTAG_LAST=%s\n' "$VERSIONTAG_LAST" >> "$GITHUB_ENV"
printf 'VERSIONTAG_PENULTIMATE=%s\n' "$VERSIONTAG_PENULTIMATE" >> "$GITHUB_ENV"
-
name: Check if we need to create a version tag after a push
if: github.event_name == 'push' && github.ref == 'refs/heads/master'
run: |
VERSIONTAG_THIS=
if test -z "$VERSIONTAG_LAST"; then
printf 'We need to create the first version tag\n'
VERSIONTAG_THIS=1.0.0
elif test "$(git rev-parse HEAD)" = "$(git rev-list -n 1 "refs/tags/$VERSIONTAG_LAST")"; then
printf 'Another action should already take care of creating the release\n'
else
CREATE_TAG=n
for CHANGED_FILE in $(git diff --name-only "refs/tags/$VERSIONTAG_LAST" HEAD); do
case "$CHANGED_FILE" in
install-php-extensions | Dockerfile)
CREATE_TAG=y
;;
esac
done
if test "$CREATE_TAG" = 'y'; then
VERSIONTAG_THIS="${VERSIONTAG_LAST%.*}.$((${VERSIONTAG_LAST##*.}+1))"
printf 'We need to create new version tag %s since relevant files changed\n' "$VERSIONTAG_THIS"
else
printf 'We do not need to create a new version tag since no relevant files changed\n'
fi
fi
printf 'VERSIONTAG_THIS=%s\n' "$VERSIONTAG_THIS" >> "$GITHUB_ENV"
printf 'VERSIONTAG_PREVIOUS=%s\n' "$VERSIONTAG_LAST" >> "$GITHUB_ENV"
-
name: Sleep for a while before creating a tag
if: env.VERSIONTAG_THIS != ''
uses: juliangruber/sleep-action@v1
with:
time: 30s
-
name: Create version tag after a push in the local repository
if: env.VERSIONTAG_THIS != ''
run: |
git tag -- "$VERSIONTAG_THIS"
printf 'VERSIONTAG_THIS_SHA=%s\n' "$(git rev-parse HEAD)" >> "$GITHUB_ENV"
-
name: Create version tag after a push in the remote repository
if: env.VERSIONTAG_THIS != ''
uses: actions/github-script@v3
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
script: |
github.git.createRef({
owner: context.repo.owner,
repo: context.repo.repo,
ref: `refs/tags/${process.env.VERSIONTAG_THIS}`,
sha: process.env.VERSIONTAG_THIS_SHA
})
-
name: Check format of received tag
if: github.event_name == 'create' && github.event.ref_type == 'tag'
run: |
VERSIONTAG_THIS="${GITHUB_REF#refs/tags/}"
if test "$VERSIONTAG_THIS" = "$VERSIONTAG_LAST"; then
if printf '%s' "$VERSIONTAG_THIS" | grep -Eq '^[0-9]+\.[0-9]+\.[0-9]+$'; then
printf 'Tag %s is version-like\n' "$VERSIONTAG_THIS"
else
printf 'Tag %s is not version-like\n' "$VERSIONTAG_THIS"
VERSIONTAG_THIS=
fi
else
printf 'Last created tag %s is not %\n' "$VERSIONTAG_THIS" "$VERSIONTAG_LAST"
VERSIONTAG_THIS=
fi
printf 'VERSIONTAG_THIS=%s\n' "$VERSIONTAG_THIS" >> "$GITHUB_ENV"
printf 'VERSIONTAG_PREVIOUS=%s\n' "$VERSIONTAG_PENULTIMATE" >> "$GITHUB_ENV"
-
name: Extract release notes
if: env.VERSIONTAG_THIS != ''
run: |
printf 'Generating release notes for tag %s\n' "$VERSIONTAG_THIS"
if test -z "$VERSIONTAG_PREVIOUS"; then
echo 'No previous tag found'
RELEASE_NOTES='First version'
else
printf 'Generating release notes for commits between %s and %s\n' "$VERSIONTAG_PREVIOUS" "$VERSIONTAG_THIS"
if ! RELEASE_NOTES="$(git log --format='- %s' --no-merges --reverse "refs/tags/$VERSIONTAG_PREVIOUS...refs/tags/$VERSIONTAG_THIS" -- ./install-php-extensions ./Dockerfile | grep -vE '^- \[minor\]')"; then
RELEASE_NOTES=
fi
fi
printf 'Release notes:\n%s\n' "$RELEASE_NOTES"
printf 'RELEASE_NAME=v%s\n' "$VERSIONTAG_THIS" >> "$GITHUB_ENV"
printf 'RELEASE_NOTES<<EOF\n%s\nEOF\n' "$RELEASE_NOTES" >> "$GITHUB_ENV"
-
name: Set script version
if: env.VERSIONTAG_THIS != ''
run: sed -i -E "s/^(IPE_VERSION=)master$/\1$VERSIONTAG_THIS/" install-php-extensions
-
name: Login to Docker Hub
if: env.VERSIONTAG_THIS != ''
uses: docker/login-action@v3
with:
username: mlocati
password: ${{ secrets.DOCKERHUB_TOKEN }}
-
name: Login to GitHub Container Registry
if: env.VERSIONTAG_THIS != ''
uses: docker/login-action@v3
with:
registry: ghcr.io
username: ${{ github.repository_owner }}
password: ${{ secrets.GITHUB_TOKEN }}
-
name: Set up docker buildx
if: env.VERSIONTAG_THIS != ''
uses: docker/setup-buildx-action@v2
with:
install: true
-
name: Define versions
if: env.VERSIONTAG_THIS != ''
id: define-versions
run: |
printf 'mayor-minor-patch=%s\n' "$VERSIONTAG_THIS" >>"$GITHUB_OUTPUT"
printf 'mayor-minor=%s\n' "${VERSIONTAG_THIS%.*}" >>"$GITHUB_OUTPUT"
printf 'mayor=%s\n' "${VERSIONTAG_THIS%%.*}" >>"$GITHUB_OUTPUT"
-
name: Build and push docker image
if: env.VERSIONTAG_THIS != ''
uses: docker/build-push-action@v5
with:
context: .
push: true
tags: |
mlocati/php-extension-installer:${{ steps.define-versions.outputs.mayor-minor-patch }}
ghcr.io/mlocati/php-extension-installer:${{ steps.define-versions.outputs.mayor-minor-patch }}
mlocati/php-extension-installer:${{ steps.define-versions.outputs.mayor-minor }}
ghcr.io/mlocati/php-extension-installer:${{ steps.define-versions.outputs.mayor-minor }}
mlocati/php-extension-installer:${{ steps.define-versions.outputs.mayor }}
ghcr.io/mlocati/php-extension-installer:${{ steps.define-versions.outputs.mayor }}
mlocati/php-extension-installer:latest
ghcr.io/mlocati/php-extension-installer:latest
# Build for all platforms also supported by php images (https://hub.docker.com/_/php/tags)
platforms: |
linux/386
linux/amd64
linux/arm/v5
linux/arm/v7
linux/arm64/v8
linux/mips64le
linux/ppc64le
linux/s390x
-
name: Create release
if: env.VERSIONTAG_THIS != ''
uses: softprops/action-gh-release@v2
with:
tag_name: ${{ env.VERSIONTAG_THIS }}
name: ${{ env.RELEASE_NAME }}
body: ${{ env.RELEASE_NOTES }}
draft: false
prerelease: false
generate_release_notes: false
fail_on_unmatched_files: true
files: |
install-php-extensions