name: 'Push Docker Tags' description: 'Tag and push Docker images based on git context' inputs: registry: description: 'Docker registry URL' required: true registry-username: description: 'Docker registry username' required: true registry-password: description: 'Docker registry password' required: true image-name: description: 'Full image name (e.g., phundrak/my-app)' required: true local-image: description: 'Local image to tag and push' required: true event-name: description: 'GitHub/Gitea event name (pass github.event_name)' required: true ref: description: 'Git ref (pass github.ref)' required: true ref-type: description: 'Git ref type (pass github.ref_type)' required: true ref-name: description: 'Git ref name (pass github.ref_name)' required: true pr-number: description: 'Pull request number (pass github.event.pull_request.number)' required: false default: '' outputs: pushed-tags: description: 'Space-separated list of tags that were pushed' value: ${{ steps.push.outputs.tags }} runs: using: composite steps: - name: Log in to Docker Registry shell: bash run: | echo "${{ inputs.registry-password }}" | docker login ${{ inputs.registry }} -u ${{ inputs.registry-username }} --password-stdin - name: Determine tags and push images id: push shell: bash run: | set -euo pipefail REGISTRY="${{ inputs.registry }}" IMAGE_NAME="${{ inputs.image-name }}" LOCAL_IMAGE="${{ inputs.local-image }}" PUSHED_TAGS="" echo "Event: ${{ inputs.event-name }}" echo "Ref: ${{ inputs.ref }}" echo "Ref type: ${{ inputs.ref-type }}" push_tag() { local tag="$1" echo "Tagging and pushing: ${REGISTRY}/${IMAGE_NAME}:${tag}" docker tag "${LOCAL_IMAGE}" "${REGISTRY}/${IMAGE_NAME}:${tag}" docker push "${REGISTRY}/${IMAGE_NAME}:${tag}" PUSHED_TAGS="${PUSHED_TAGS}${tag} " } if [[ "${{ inputs.event-name }}" == "push" && "${{ inputs.ref-type }}" == "tag" ]]; then TAG_VERSION="${{ inputs.ref-name }}" TAG_VERSION="${TAG_VERSION#v}" push_tag "latest" push_tag "${TAG_VERSION}" elif [[ "${{ inputs.event-name }}" == "push" && "${{ inputs.ref }}" == "refs/heads/develop" ]]; then push_tag "develop" elif [[ "${{ inputs.event-name }}" == "pull_request" ]]; then if [[ -z "${{ inputs.pr-number }}" ]]; then echo "::error::PR number is required for pull_request events" exit 1 fi push_tag "pr${{ inputs.pr-number }}" elif [[ "${{ inputs.event-name }}" == "push" && "${{ inputs.ref }}" == "refs/heads/main" ]]; then push_tag "latest" else echo "::error::Unknown event or ref combination: event=${{ inputs.event-name }}, ref=${{ inputs.ref }}" exit 1 fi echo "tags=${PUSHED_TAGS}" >> "$GITHUB_OUTPUT" - name: Log out from Docker Registry if: always() shell: bash run: docker logout ${{ inputs.registry }}