Skip to content

new_hub_images_requested #14

new_hub_images_requested

new_hub_images_requested #14

name: New Windows Hub Version ⚙
on:
repository_dispatch:
types:
- new_hub_images_requested
- new_windows_hub_image_requested
workflow_dispatch:
inputs:
jobId:
description: "Job ID"
required: true
default: "dryRun"
repoVersionFull:
description: "All digits of the latest tag of this repository, e.g. `1.23.45`"
required: true
repoVersionMinor:
description: "Minor digit of that tag, e.g. `23`"
required: true
repoVersionMajor:
description: "Major digit of that tag, e.g. `1`"
required: true
# Further reading:
# https://docs.github.com/en/free-pro-team@latest/actions/reference/events-that-trigger-workflows#repository_dispatch
# https://docs.github.com/en/free-pro-team@latest/rest/reference/repos#create-a-repository-dispatch-event
# https://developer.github.com/webhooks/event-payloads/#repository_dispatch
jobs:
build:
name: "🛠 Build unityci/hub"
runs-on: windows-2022
steps:
- name: Checkout
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Checkout latest release tag
run: |
LATEST_TAG=$(git describe --tags `git rev-list --tags --max-count=1`)
git checkout $LATEST_TAG
shell: bash
#################
# Variables #
#################
- name: Setup Build Parameters
id: buildParameters
run: |
if ("${{ github.event.inputs.jobId }}")
{
# Workflow Dispatch
echo "jobId={{ github.event.inputs.jobId }}" >> $Env:GITHUB_OUTPUT
echo "repoVersionFull={{ github.event.inputs.repoVersionFull }}" >> $Env:GITHUB_OUTPUT
echo "repoVersionMinor={{ github.event.inputs.repoVersionMinor }}" >> $Env:GITHUB_OUTPUT
echo "repoVersionMajor={{ github.event.inputs.repoVersionMajor }}" >> $Env:GITHUB_OUTPUT
} else
{
# Repo Dispatch
echo "jobId=${{ github.event.client_payload.jobId }}" >> $Env:GITHUB_OUTPUT
echo "repoVersionFull=${{ github.event.client_payload.repoVersionFull }}" >> $Env:GITHUB_OUTPUT
echo "repoVersionMinor=${{ github.event.client_payload.repoVersionMinor }}" >> $Env:GITHUB_OUTPUT
echo "repoVersionMajor=${{ github.event.client_payload.repoVersionMajor }}" >> $Env:GITHUB_OUTPUT
}
- name: Show hook input
run: |
echo "Event ${{ github.event.event_type }}"
echo "jobId: ${{ steps.buildParameters.outputs.jobId }}"
echo "repoVersion (full): ${{ steps.buildParameters.outputs.repoVersionFull }}"
echo "repoVersion (only minor and major): ${{ steps.buildParameters.outputs.repoVersionMinor }}"
echo "repoVersion (only major): ${{ steps.buildParameters.outputs.repoVersionMajor }}"
- name: Report new build
uses: ./.github/workflows/actions/report-to-backend
with:
token: ${{ secrets.VERSIONING_TOKEN }}
jobId: ${{ steps.buildParameters.outputs.jobId }}
status: started
# Build info
imageType: hub
baseOs: windows
repoVersion: ${{ steps.buildParameters.outputs.repoVersionFull }}
#############
# Setup #
#############
- name: Login to DockerHub
env:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
run: docker login --username $Env:username --password $Env:password
- name: Check if image does not already exist
run: |
# Source: https://gist.github.com/webbertakken/1789a4683a99e2a62b975ff436a85382
function Docker-Tag-Exists {
[CmdletBinding()]
param([string] $Repository, [string] $Tag)
Try {
Invoke-RestMethod "https://index.docker.io/v1/repositories/$Repository/tags/$Tag"
} Catch {} # Assume image does not exist on erroneous response
return $?
}
if (Docker-Tag-Exists -Repository "unityci/hub" -Tag "windows-${{ steps.buildParameters.outputs.repoVersionFull }}") {
echo "Image already exists. Exiting."
exit 1
}
# TODO: Cache layers, currently not supported on windows
############################
# Pull previous images #
############################
- name: Pull base image (must exist)
run: docker pull unityci/base:windows-${{ steps.buildParameters.outputs.repoVersionFull }}
#################
# Hub image #
#################
- name: Build and Publish Windows Hub Image
id: build_windows_hub_image
run: |
docker build ./images/windows/hub/ `
--tag unityci/hub:windows-${{ steps.buildParameters.outputs.repoVersionFull }} `
--tag unityci/hub:windows-${{ steps.buildParameters.outputs.repoVersionMinor }} `
--tag unityci/hub:windows-${{ steps.buildParameters.outputs.repoVersionMajor }} `
--tag unityci/hub:windows-latest
docker push unityci/hub:windows-${{ steps.buildParameters.outputs.repoVersionFull }}
docker push unityci/hub:windows-${{ steps.buildParameters.outputs.repoVersionMinor }}
docker push unityci/hub:windows-${{ steps.buildParameters.outputs.repoVersionMajor }}
docker push unityci/hub:windows-latest
$MetaData = docker inspect unityci/hub:windows-${{ steps.buildParameters.outputs.repoVersionFull }}
$ImageDetails = $MetaData | ConvertFrom-Json
$Digest = $ImageDetails.Config.Image
echo "digest=$Digest" >> $Env:GITHUB_OUTPUT
echo "metadata=$MetaData" >> $Env:GITHUB_OUTPUT
- name: Inspect
run: |
docker inspect unityci/hub:windows-${{ steps.buildParameters.outputs.repoVersionFull }}
- name: Image digest
run: echo ${{ steps.build_windows_hub_image.outputs.digest }}
#################
# reporting #
#################
- name: Report publication
if: ${{ success() }}
uses: ./.github/workflows/actions/report-to-backend
with:
token: ${{ secrets.VERSIONING_TOKEN }}
jobId: ${{ steps.buildParameters.outputs.jobId }}
status: published
# Build info
imageType: hub
baseOs: windows
repoVersion: ${{ steps.buildParameters.outputs.repoVersionFull }}
# Publication info
imageRepo: unityci
imageName: hub
friendlyTag: windows-${{ steps.buildParameters.outputs.repoVersionMinor }}
specificTag: windows-${{ steps.buildParameters.outputs.repoVersionFull }}
digest: ${{ steps.build_windows_hub_image.outputs.digest }}
- name: Report failure
if: ${{ failure() || cancelled() }}
uses: ./.github/workflows/actions/report-to-backend
with:
token: ${{ secrets.VERSIONING_TOKEN }}
jobId: ${{ steps.buildParameters.outputs.jobId }}
status: failed
# Build info
imageType: hub
baseOs: windows
repoVersion: ${{ steps.buildParameters.outputs.repoVersionFull }}
# Failure info
reason: ${{ job.status }} - ${{ steps.build_windows_hub_image.outputs.metadata }}