Setup buildx only if needed (#1012) #972
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: 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 '[email protected]' | |
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" | |
RELEASE_NOTES="$(git log --format='- %s' --no-merges --reverse "refs/tags/$VERSIONTAG_PREVIOUS...refs/tags/$VERSIONTAG_THIS" -- ./install-php-extensions ./Dockerfile | grep -vE '^- \[minor\]')" | |
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: Set up docker buildx | |
if: env.VERSIONTAG_THIS != '' | |
uses: docker/setup-buildx-action@v2 | |
with: | |
install: true | |
- | |
name: Build and push docker image | |
if: env.VERSIONTAG_THIS != '' | |
uses: docker/build-push-action@v5 | |
with: | |
push: true | |
tags: | | |
mlocati/php-extension-installer:$VERSIONTAG_THIS | |
mlocati/php-extension-installer:${VERSIONTAG_THIS%.*} | |
mlocati/php-extension-installer:${VERSIONTAG_THIS%%.*} | |
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 |