123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161 |
- name: Build and Publish
- on:
- workflow_call:
- inputs:
- authenticate_with_ghcr:
- default: true
- type: boolean
- description: 'Whether to authenticate with DockerHub.'
- tag-prefix:
- required: true
- type: string
- description: 'The prefix to use for the Docker image tags.'
- php-versions-file:
- type: string
- default: 'scripts/conf/php-versions.yml'
- description: 'The path to the PHP versions file.'
- default-image-variation:
- type: string
- default: 'cli'
- description: 'The default PHP variation to use for the Docker image.'
- registry-repositories:
- type: string
- required: true
- description: 'The Docker registry repositories to push the images to. Separate multiple repositories with a comma (example: docker.io/serversideup/php,ghcr.io/serversideup/php)'
- release-type:
- type: string
- default: 'testing'
- description: 'The type of release to create. Options: testing, latest'
- jobs:
- setup-matrix:
- runs-on: ubuntu-22.04
- outputs:
- php-version-map-json: ${{ steps.get-php-versions.outputs.php-version-map-json }}
- steps:
- - name: Check out code
- uses: actions/checkout@v4
-
- - name: Prepare PHP versions for the matrix. 😎
- run: |
- chmod +x ./scripts/get-php-versions.sh
- ./scripts/get-php-versions.sh
- env:
- SKIP_DOWNLOAD: false
-
- - name: Ensure our PHP Versions file exists.
- run: |
- if [ ! -f "${{ inputs.php-versions-file }}" ]; then
- echo "PHP Versions file does not exist. Exiting."
- exit 1
- else
- cat ${{ inputs.php-versions-file }}
- fi
- - name: Assemble PHP versions into the matrix. 😎
- id: get-php-versions
- run: |
- MATRIX_JSON=$(yq -o=json scripts/conf/php-versions.yml | jq -c '{include: [(.php_variations[] | {name, supported_os: (.supported_os // ["alpine", "bullseye", "bookworm"])} ) as $variation | .php_versions[] | .minor_versions[] | .patch_versions[] as $patch | .base_os[] as $os | select($variation.supported_os | if length == 0 then . else . | index($os.name) end) | {patch_version: $patch, base_os: $os.name, php_variation: $variation.name}]} | {include: (.include | sort_by(.patch_version | split(".") | map(tonumber) | . as $nums | ($nums[0]*10000 + $nums[1]*100 + $nums[2])) | reverse)}')
- echo "php-version-map-json=${MATRIX_JSON}" >> $GITHUB_OUTPUT
- echo "${MATRIX_JSON}" | jq '.'
-
- - name: Upload the php-versions.yml file
- uses: actions/upload-artifact@v4
- with:
- name: php-versions.yml
- path: ${{ inputs.php-versions-file }}
- docker-publish:
- needs: setup-matrix
- runs-on:
- - runs-on
- - runner=4cpu-linux-x64
- - run-id=${{ github.run_id }}
- strategy:
- matrix: ${{fromJson(needs.setup-matrix.outputs.php-version-map-json)}}
- steps:
- - name: Check out code.
- uses: actions/checkout@v4
-
- - name: Download PHP Versions file
- uses: actions/download-artifact@v4
- with:
- name: php-versions.yml
- path: ./artifacts
-
- - name: Move PHP Versions file
- run: mv ./artifacts/php-versions.yml ${{ inputs.php-versions-file }}
-
- ##
- # Docker build & publish
- ##
- - name: Login to DockerHub
- uses: docker/login-action@v3
- with:
- username: ${{ secrets.DOCKER_HUB_USERNAME }}
- password: ${{ secrets.DOCKER_HUB_ACCESS_TOKEN }}
- - name: Login to GitHub Container Registry
- uses: docker/login-action@v3
- if: ${{ inputs.authenticate_with_ghcr }}
- with:
- registry: ghcr.io
- username: ${{ github.actor }}
- password: ${{ secrets.GITHUB_TOKEN }}
- - name: Set up QEMU
- uses: docker/setup-qemu-action@v3
- - name: Set up Docker Buildx
- uses: docker/setup-buildx-action@v3
- - name: "📦 Assemble the Docker Tags"
- run: |
- chmod +x ./scripts/assemble-docker-tags.sh
- ./scripts/assemble-docker-tags.sh
- env:
- PHP_VERSIONS_FILE: "${{ inputs.php-versions-file }}"
- DEFAULT_IMAGE_VARIATION: ${{ inputs.default-image-variation }}
- PHP_BUILD_VERSION: ${{ matrix.patch_version }}
- PHP_BUILD_VARIATION: ${{ matrix.php_variation }}
- PHP_BUILD_BASE_OS: ${{ matrix.base_os }}
- DOCKER_TAG_PREFIX: ${{ inputs.tag-prefix }}
- DOCKER_REGISTRY_REPOSITORIES: ${{ inputs.registry-repositories }}
- RELEASE_TYPE: ${{ inputs.release-type }}
- GITHUB_RELEASE_TAG: ${{ github.ref_name }}
- GITHUB_REF_TYPE: ${{ github.ref_type }}
- - name: Set REPOSITORY_BUILD_VERSION
- id: set_version
- run: |
- if [ "${{ github.ref_type }}" == "tag" ]; then
- echo "🚀 Setting REPOSITORY_BUILD_VERSION to Tag"
- echo "REPOSITORY_BUILD_VERSION=${{ github.ref_name }}" >> $GITHUB_ENV
- else
- echo "👨🔬 Setting REPOSITORY_BUILD_VERSION to GIT Short SHA and GitHub Run ID"
- SHORT_SHA=$(echo ${{ github.sha }} | cut -c1-7)
- echo "REPOSITORY_BUILD_VERSION=git-${SHORT_SHA}-${{ github.run_id }}" >> $GITHUB_ENV
- fi
- - name: Build and push
- uses: docker/build-push-action@v6
- with:
- file: src/variations/${{ matrix.php_variation }}/Dockerfile
- cache-from: type=s3,blobs_prefix=cache/${{ github.repository }}/,manifests_prefix=cache/${{ github.repository }}/,region=${{ env.RUNS_ON_AWS_REGION }},bucket=${{ env.RUNS_ON_S3_BUCKET_CACHE }}
- cache-to: type=s3,blobs_prefix=cache/${{ github.repository }}/,manifests_prefix=cache/${{ github.repository }}/,region=${{ env.RUNS_ON_AWS_REGION }},bucket=${{ env.RUNS_ON_S3_BUCKET_CACHE }},mode=max
- build-args: |
- BASE_OS_VERSION=${{ matrix.base_os }}
- PHP_VERSION=${{ matrix.patch_version }}
- PHP_VARIATION=${{ matrix.php_variation }}
- REPOSITORY_BUILD_VERSION=${{ env.REPOSITORY_BUILD_VERSION }}
- platforms: |
- linux/amd64
- linux/arm/v7
- linux/arm64/v8
- pull: true
- push: true
- tags: ${{ env.DOCKER_TAGS }}
- outputs: type=image,name=target,annotation-index.org.opencontainers.image.description=Supercharge your PHP experience with Docker images that are based off the official PHP images but are optimized to be run in production environments for Laravel and WordPress and more
|