name: 'Docker Build and Push' description: 'Log into Harbor, build and push image' inputs: harbor_user: description: 'Harbor Username' required: true harbor_secret: description: 'Harbor Secret' required: true image_repo: description: 'Harbor Image Repository (without tag)' required: true dockerfile: description: 'Path to Dockerfile' required: false default: './Dockerfile' build_context: description: 'Docker Build Context' required: false default: '.' docker_build_args: description: 'Docker Build Args as multiple lines or single line' required: false default: '' harbor_host: description: 'Harbor Host' required: false default: 'harbor.hclife.co' outputs: image_tag: description: 'Generated Image Tag (UTC timestamp)' value: ${{ steps.build_push.outputs.image_tag }} runs: using: 'composite' steps: - name: Build and Push id: build_push shell: bash env: DOCKER_BUILDKIT: 1 HARBOR_USER: ${{ inputs.harbor_user }} HARBOR_SECRET: ${{ inputs.harbor_secret }} COMMIT_SHA: ${{ github.sha }} IMAGE_REPO: ${{ inputs.image_repo }} DOCKERFILE: ${{ inputs.dockerfile }} BUILD_CONTEXT: ${{ inputs.build_context }} DOCKER_BUILD_ARGS: ${{ inputs.docker_build_args }} HARBOR_HOST: ${{ inputs.harbor_host }} run: | set -eu IMAGE_TAG="$(date -u +%Y%m%d-%H%M%S)" echo "image_tag=$IMAGE_TAG" >> "$GITHUB_OUTPUT" test -n "$IMAGE_REPO" test -n "$DOCKERFILE" test -n "$BUILD_CONTEXT" test -f "$DOCKERFILE" test -d "$BUILD_CONTEXT" echo "Logging into $HARBOR_HOST..." echo "$HARBOR_SECRET" | docker login "$HARBOR_HOST" -u "$HARBOR_USER" --password-stdin BUILD_ARG_FLAGS=() if [ -n "$DOCKER_BUILD_ARGS" ]; then while IFS= read -r build_arg_line; do [ -n "$build_arg_line" ] || continue BUILD_ARG_FLAGS+=("--build-arg" "$build_arg_line") done <<< "$DOCKER_BUILD_ARGS" fi echo "Building Image..." if [ ${#BUILD_ARG_FLAGS[@]} -gt 0 ]; then docker build "${BUILD_ARG_FLAGS[@]}" \ -t "$IMAGE_REPO:$IMAGE_TAG" \ -t "$IMAGE_REPO:$COMMIT_SHA" \ -t "$IMAGE_REPO:latest" \ -f "$DOCKERFILE" "$BUILD_CONTEXT" else docker build \ -t "$IMAGE_REPO:$IMAGE_TAG" \ -t "$IMAGE_REPO:$COMMIT_SHA" \ -t "$IMAGE_REPO:latest" \ -f "$DOCKERFILE" "$BUILD_CONTEXT" fi echo "Pushing Image..." docker push "$IMAGE_REPO:$IMAGE_TAG" docker push "$IMAGE_REPO:$COMMIT_SHA" docker push "$IMAGE_REPO:latest"