From 88aeca57aa4420309bcabe4abb5b88fcc9cffc37 Mon Sep 17 00:00:00 2001 From: cytopia Date: Sat, 12 Dec 2020 13:57:19 +0100 Subject: [PATCH] Prepare GitHub Actions --- .github/workflows/{php-ci.yml => build.yml} | 102 +++++----------- .github/workflows/linting.yml | 37 ++++-- .../{php-nightly.yml => nightly.yml} | 111 ++++++------------ Makefile | 24 +++- README.md | 7 +- 5 files changed, 114 insertions(+), 167 deletions(-) rename .github/workflows/{php-ci.yml => build.yml} (75%) rename .github/workflows/{php-nightly.yml => nightly.yml} (72%) diff --git a/.github/workflows/php-ci.yml b/.github/workflows/build.yml similarity index 75% rename from .github/workflows/php-ci.yml rename to .github/workflows/build.yml index a662eb6..0c7fcfa 100644 --- a/.github/workflows/php-ci.yml +++ b/.github/workflows/build.yml @@ -3,7 +3,7 @@ # ------------------------------------------------------------------------------------------------- # Job Name # ------------------------------------------------------------------------------------------------- -name: PHP-CI +name: build # ------------------------------------------------------------------------------------------------- @@ -12,55 +12,14 @@ name: PHP-CI on: # Runs on Pull Requests pull_request: - - # Runs on master Branch and Tags + # Runs on Push push: - branches: - - master - tags: - - '[0-9]+.[0-9]+*' # ------------------------------------------------------------------------------------------------- # What to run # ------------------------------------------------------------------------------------------------- jobs: - diagnostics: - name: Diagnostics - runs-on: ubuntu-latest - strategy: - fail-fast: False - steps: - - name: Checkout repository - uses: actions/checkout@v2 - - - name: Show environment - run: | - env - - # https://help.github.com/en/github/automating-your-workflow-with-github-actions/contexts-and-expression-syntax-for-github-actions#github-context - - name: Show GitHub variables - run: | - echo "github.actor: ${{ github.actor }}" - echo "github.ref: ${{ github.ref }}" - echo "github.base_ref: ${{ github.base_ref }}" - echo "github.head_ref: ${{ github.head_ref }}" - echo "github.event: ${{ github.event }}" - echo "github.event_name: ${{ github.event_name }}" - echo "github.event.pull_request.base.repo.id: ${{ github.event.pull_request.base.repo.id }}" - echo "github.event.pull_request.head.repo.id: ${{ github.event.pull_request.head.repo.id }}" - - - name: Dump GitHub context - env: - GITHUB_CONTEXT: ${{ toJson(github) }} - run: echo "${GITHUB_CONTEXT}" - - - name: Dump Runner context - env: - RUNNER_CONTEXT: ${{ toJson(runner) }} - run: echo "${RUNNER_CONTEXT}" - - build: name: "[ PHP-${{ matrix.version }} ]" runs-on: ubuntu-latest @@ -83,7 +42,7 @@ jobs: steps: # ------------------------------------------------------------ - # Checkout repository + # Setup repository # ------------------------------------------------------------ - name: Checkout repository uses: actions/checkout@v2 @@ -97,7 +56,7 @@ jobs: # Retrieve git info (tags, etc) git fetch --all - # BRANCH, TAG or COMMIT + # Branch, Tag or Commit GIT_TYPE="$( \ curl -sS https://raw.githubusercontent.com/cytopia/git-tools/master/git-info.sh \ | sh \ @@ -111,15 +70,25 @@ jobs: | grep '^GIT_NAME' \ | sed 's|.*=||g' \ )" + # Docker Tag + if [ "${GIT_TYPE}" = "BRANCH" ] && [ "${GIT_SLUG}" = "master" ]; then + DOCKER_TAG="${VERSION}" + else + DOCKER_TAG="${VERSION}-${GIT_SLUG}" + fi # Output echo "GIT_TYPE=${GIT_TYPE}" echo "GIT_SLUG=${GIT_SLUG}" + echo "DOCKER_TAG=${DOCKER_TAG}" # Export variable # https://docs.github.com/en/free-pro-team@latest/actions/reference/workflow-commands-for-github-actions#environment-files - echo "GIT_TYPE=${GIT_TYPE}" >> $GITHUB_ENV - echo "GIT_SLUG=${GIT_SLUG}" >> $GITHUB_ENV + echo "GIT_TYPE=${GIT_TYPE}" >> ${GITHUB_ENV} + echo "GIT_SLUG=${GIT_SLUG}" >> ${GITHUB_ENV} + echo "DOCKER_TAG=${DOCKER_TAG}" >> ${GITHUB_ENV} + env: + VERSION: ${{ matrix.version }} # ------------------------------------------------------------ @@ -310,9 +279,8 @@ jobs: # ------------------------------------------------------------ - # Push build artifacts + # Deploy # ------------------------------------------------------------ - # Only run this, if the PR was created by the repo owner - name: Publish images (only repo owner) run: | retry() { @@ -328,34 +296,22 @@ jobs: return 1; } - # Info output - echo "Git Type: ${GIT_TYPE}" - echo "Git Slug: ${GIT_SLUG}" + # Output + echo "GIT_TYPE=${GIT_TYPE}" + echo "GIT_SLUG=${GIT_SLUG}" + echo "DOCKER_TAG=${DOCKER_TAG}" + + docker images # Login - echo "retry make login USER= PASS=" + retry make login USER=${{ secrets.DOCKERHUB_USERNAME }} PASS=${{ secrets.DOCKERHUB_PASSWORD }} # Push - if [ "${GIT_TYPE}" = "TAG" ]; then - echo "retry make push-base VERSION=${VERSION}-${GIT_SLUG}" - echo "retry make push-mods VERSION=${VERSION}-${GIT_SLUG}" - echo "retry make push-prod VERSION=${VERSION}-${GIT_SLUG}" - echo "retry make push-work VERSION=${VERSION}-${GIT_SLUG}" - else - if [ "${GIT_SLUG}" = "master" ]; then - echo "retry make push-base VERSION=${VERSION}" - echo "retry make push-mods VERSION=${VERSION}" - echo "retry make push-prod VERSION=${VERSION}" - echo "retry make push-work VERSION=${VERSION}" - else - echo "retry make push-base VERSION=${VERSION}-${GIT_SLUG}" - echo "retry make push-mods VERSION=${VERSION}-${GIT_SLUG}" - echo "retry make push-prod VERSION=${VERSION}-${GIT_SLUG}" - echo "retry make push-work VERSION=${VERSION}-${GIT_SLUG}" - fi - fi + echo "retry make push-base VERSION=${DOCKER_TAG}" + echo "retry make push-mods VERSION=${DOCKER_TAG}" + echo "retry make push-prod VERSION=${DOCKER_TAG}" + echo "retry make push-work VERSION=${DOCKER_TAG}" env: - VERSION: ${{ matrix.version }} RETRIES: 20 PAUSE: 10 # https://help.github.com/en/github/automating-your-workflow-with-github-actions/contexts-and-expression-syntax-for-github-actions#functions @@ -365,5 +321,5 @@ jobs: || (github.event_name == 'push' && (github.ref == 'refs/heads/master' || startsWith(github.ref, 'refs/tags/'))) || - (github.event_name == 'pull_request' && (startsWith(github.head_ref, 'release-'))) + (github.event_name == 'push' && startsWith(github.ref, 'refs/heads/release-')) ) diff --git a/.github/workflows/linting.yml b/.github/workflows/linting.yml index 87ea01d..3c252d5 100644 --- a/.github/workflows/linting.yml +++ b/.github/workflows/linting.yml @@ -1,27 +1,42 @@ --- -### -### Lints all generic and json files in the whole git repository -### +# ------------------------------------------------------------------------------------------------- +# Job Name +# ------------------------------------------------------------------------------------------------- +name: lint -name: Linting + +# ------------------------------------------------------------------------------------------------- +# When to run +# ------------------------------------------------------------------------------------------------- on: + # Runs on Pull Requests pull_request: + +# ------------------------------------------------------------------------------------------------- +# What to run +# ------------------------------------------------------------------------------------------------- jobs: lint: name: "[ ${{ matrix.job }} ]" runs-on: ubuntu-latest - strategy: - fail-fast: False - matrix: - job: [gen-dockerfiles] steps: + # ------------------------------------------------------------ + # Setup repository + # ------------------------------------------------------------ - name: Checkout repository uses: actions/checkout@v2 + + # ------------------------------------------------------------ + # Lint repository + # ------------------------------------------------------------ + - name: Lint workflow + id: vars + run: | + make lint-workflow + - name: Diff generated Docker files run: | - make "${JOB}" + make gen-readme git diff --quiet || { echo "Build Changes"; git diff; git status; false; } - env: - JOB: ${{ matrix.job }} diff --git a/.github/workflows/php-nightly.yml b/.github/workflows/nightly.yml similarity index 72% rename from .github/workflows/php-nightly.yml rename to .github/workflows/nightly.yml index 3e8f8f9..f77f509 100644 --- a/.github/workflows/php-nightly.yml +++ b/.github/workflows/nightly.yml @@ -3,7 +3,7 @@ # ------------------------------------------------------------------------------------------------- # Job Name # ------------------------------------------------------------------------------------------------- -name: PHP-Nightly +name: nightly # ------------------------------------------------------------------------------------------------- @@ -19,50 +19,8 @@ on: # What to run # ------------------------------------------------------------------------------------------------- jobs: - diagnostics: - name: Diagnostics - runs-on: ubuntu-latest - strategy: - fail-fast: False - steps: - - name: Checkout repository - uses: actions/checkout@v2 - - - name: Show environment - run: | - env - - # https://help.github.com/en/github/automating-your-workflow-with-github-actions/contexts-and-expression-syntax-for-github-actions#github-context - - name: Show GitHub variables - run: | - echo "github.actor: ${{ github.actor }}" - echo "github.ref: ${{ github.ref }}" - echo "github.base_ref: ${{ github.base_ref }}" - echo "github.head_ref: ${{ github.head_ref }}" - echo "github.event: ${{ github.event }}" - echo "github.event_name: ${{ github.event_name }}" - echo "github.event.pull_request.base.repo.id: ${{ github.event.pull_request.base.repo.id }}" - echo "github.event.pull_request.head.repo.id: ${{ github.event.pull_request.head.repo.id }}" - - - name: Dump GitHub context - env: - GITHUB_CONTEXT: ${{ toJson(github) }} - run: echo "${GITHUB_CONTEXT}" - - - name: Dump Runner context - env: - RUNNER_CONTEXT: ${{ toJson(runner) }} - run: echo "${RUNNER_CONTEXT}" - - - name: Show git info - env: - RUNNER_CONTEXT: ${{ toJson(runner) }} - run: | - git log | head -20 - - - build: - name: "[ PHP-${{ matrix.version }} (ref: ${{ matrix.refs }}) ]" + nightly: + name: "[ PHP-${{ matrix.version }} ] (ref: ${{ matrix.refs }})" runs-on: ubuntu-latest strategy: fail-fast: False @@ -82,11 +40,11 @@ jobs: - '8.1' refs: - 'master' - - '0.121' + - '0.122' steps: # ------------------------------------------------------------ - # Checkout repository + # Setup repository # ------------------------------------------------------------ - name: Checkout repository uses: actions/checkout@v2 @@ -101,7 +59,7 @@ jobs: # Retrieve git info (tags, etc) git fetch --all - # BRANCH, TAG or COMMIT + # Branch, Tag or Commit GIT_TYPE="$( \ curl -sS https://raw.githubusercontent.com/cytopia/git-tools/master/git-info.sh \ | sh \ @@ -115,15 +73,25 @@ jobs: | grep '^GIT_NAME' \ | sed 's|.*=||g' \ )" + # Docker Tag + if [ "${GIT_TYPE}" = "BRANCH" ] && [ "${GIT_SLUG}" = "master" ]; then + DOCKER_TAG="${VERSION}" + else + DOCKER_TAG="${VERSION}-${GIT_SLUG}" + fi # Output echo "GIT_TYPE=${GIT_TYPE}" echo "GIT_SLUG=${GIT_SLUG}" + echo "DOCKER_TAG=${DOCKER_TAG}" # Export variable # https://docs.github.com/en/free-pro-team@latest/actions/reference/workflow-commands-for-github-actions#environment-files - echo "GIT_TYPE=${GIT_TYPE}" >> $GITHUB_ENV - echo "GIT_SLUG=${GIT_SLUG}" >> $GITHUB_ENV + echo "GIT_TYPE=${GIT_TYPE}" >> ${GITHUB_ENV} + echo "GIT_SLUG=${GIT_SLUG}" >> ${GITHUB_ENV} + echo "DOCKER_TAG=${DOCKER_TAG}" >> ${GITHUB_ENV} + env: + VERSION: ${{ matrix.version }} # ------------------------------------------------------------ @@ -314,9 +282,8 @@ jobs: # ------------------------------------------------------------ - # Push build artifacts + # Deploy # ------------------------------------------------------------ - # Only run this, if the PR was created by the repo owner - name: Publish images (only repo owner) run: | retry() { @@ -332,42 +299,30 @@ jobs: return 1; } - # Info output - echo "Git Type: ${GIT_TYPE}" - echo "Git Slug: ${GIT_SLUG}" + # Output + echo "GIT_TYPE=${GIT_TYPE}" + echo "GIT_SLUG=${GIT_SLUG}" + echo "DOCKER_TAG=${DOCKER_TAG}" + + docker images # Login - echo "retry make login USER= PASS=" + retry make login USER=${{ secrets.DOCKERHUB_USERNAME }} PASS=${{ secrets.DOCKERHUB_PASSWORD }} # Push - if [ "${GIT_TYPE}" = "TAG" ]; then - echo "retry make push-base VERSION=${VERSION}-${GIT_SLUG}" - echo "retry make push-mods VERSION=${VERSION}-${GIT_SLUG}" - echo "retry make push-prod VERSION=${VERSION}-${GIT_SLUG}" - echo "retry make push-work VERSION=${VERSION}-${GIT_SLUG}" - else - if [ "${GIT_SLUG}" = "master" ]; then - echo "retry make push-base VERSION=${VERSION}" - echo "retry make push-mods VERSION=${VERSION}" - echo "retry make push-prod VERSION=${VERSION}" - echo "retry make push-work VERSION=${VERSION}" - else - echo "retry make push-base VERSION=${VERSION}-${GIT_SLUG}" - echo "retry make push-mods VERSION=${VERSION}-${GIT_SLUG}" - echo "retry make push-prod VERSION=${VERSION}-${GIT_SLUG}" - echo "retry make push-work VERSION=${VERSION}-${GIT_SLUG}" - fi - fi + echo "retry make push-base VERSION=${DOCKER_TAG}" + echo "retry make push-mods VERSION=${DOCKER_TAG}" + echo "retry make push-prod VERSION=${DOCKER_TAG}" + echo "retry make push-work VERSION=${DOCKER_TAG}" env: - VERSION: ${{ matrix.version }} RETRIES: 20 PAUSE: 10 # https://help.github.com/en/github/automating-your-workflow-with-github-actions/contexts-and-expression-syntax-for-github-actions#functions if: github.event.pull_request.base.repo.id == github.event.pull_request.head.repo.id && ( - (github.event_name == 'schedule' && (github.ref == 'refs/heads/master' || startsWith(github.ref, 'refs/tags/'))) + (github.event_name == 'schedule' && (github.ref == 'refs/heads/master' || startsWith(github.ref, 'refs/tags/'))) || - (github.event_name == 'push' && (github.ref == 'refs/heads/master' || startsWith(github.ref, 'refs/tags/'))) + (github.event_name == 'push' && (github.ref == 'refs/heads/master' || startsWith(github.ref, 'refs/tags/'))) || - (github.event_name == 'pull_request' && (startsWith(github.head_ref, 'release-'))) + (github.event_name == 'push' && startsWith(github.ref, 'refs/heads/release-')) ) diff --git a/Makefile b/Makefile index 629c917..74f99c6 100644 --- a/Makefile +++ b/Makefile @@ -31,6 +31,8 @@ help: @echo "Targets" @echo "--------------------------------------------------------------------------------" @echo + @echo "lint Lint project files and repository" + @echo @echo "gen-readme [VERSION=] Update README with PHP modules from built images." @echo "gen-dockerfiles [FAIL_FAST=] Generate Dockerfiles from templates." @echo @@ -67,6 +69,27 @@ help: @echo "ARGS Can be added to all build-* and rebuild-* targets" @echo " to supply additional docker build options." + +# ------------------------------------------------------------------------------------------------- +# Lint Targets +# ------------------------------------------------------------------------------------------------- + +lint: lint-workflow + +lint-workflow: + @\ + GIT_CURR_MAJOR="$$( git tag | sort -V | tail -1 | sed 's|\.[0-9]*$$||g' )"; \ + GIT_CURR_MINOR="$$( git tag | sort -V | tail -1 | sed 's|^[0-9]*\.||g' )"; \ + GIT_NEXT_TAG="$${GIT_CURR_MAJOR}.$$(( GIT_CURR_MINOR + 1 ))"; \ + if ! grep 'refs:' -A 100 .github/workflows/nightly.yml \ + | grep " - '$${GIT_NEXT_TAG}'" >/dev/null; then \ + echo "[ERR] New Tag required in .github/workflows/nightly.yml: $${GIT_NEXT_TAG}"; \ + exit 1; \ + else \ + echo "[OK] Git Tag present in .github/workflows/nightly.yml: $${GIT_NEXT_TAG}"; \ + fi + + # ------------------------------------------------------------------------------------------------- # GENERATE TARGETS # ------------------------------------------------------------------------------------------------- @@ -83,7 +106,6 @@ else cd build; ./gen-readme.sh $(VERSION) endif - gen-dockerfiles: docker run --rm \ $$(tty -s && echo "-it" || echo) \ diff --git a/README.md b/README.md index 83a115e..3955109 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,8 @@ # PHP-FPM Docker images -[![Linting](https://github.com/devilbox/docker-php-fpm/workflows/Linting/badge.svg)](https://github.com/devilbox/docker-php-fpm/actions?workflow=Linting) -[![CI](https://github.com/devilbox/docker-php-fpm/workflows/PHP-CI/badge.svg)](https://github.com/devilbox/docker-php-fpm/actions?workflow=PHP-CI) -[![Nightly](https://github.com/devilbox/docker-php-fpm/workflows/PHP-Nightly/badge.svg)](https://github.com/devilbox/docker-php-fpm/actions?workflow=PHP-Nightly) -[![Travis](https://travis-ci.org/devilbox/docker-php-fpm.svg?branch=master)](https://travis-ci.org/devilbox/docker-php-fpm) +[![lint](https://github.com/devilbox/docker-php-fpm/workflows/lint/badge.svg)](https://github.com/devilbox/docker-php-fpm/actions?workflow=lint) +[![build](https://github.com/devilbox/docker-php-fpm/workflows/build/badge.svg)](https://github.com/devilbox/docker-php-fpm/actions?workflow=build) +[![nightly](https://github.com/devilbox/docker-php-fpm/workflows/nightly/badge.svg)](https://github.com/devilbox/docker-php-fpm/actions?workflow=nightly) [![Release](https://img.shields.io/github/release/devilbox/docker-php-fpm.svg?colorB=orange)](https://github.com/devilbox/docker-php-fpm/releases) [![Gitter](https://badges.gitter.im/devilbox/Lobby.svg)](https://gitter.im/devilbox/Lobby?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) [![Discourse](https://img.shields.io/discourse/https/devilbox.discourse.group/status.svg?colorB=%234CB697)](https://devilbox.discourse.group)