This repository has been archived by the owner on Feb 13, 2024. It is now read-only.
Docker Image CI #919
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
name: Docker Image CI | |
on: | |
push: | |
branches: [ main ] | |
schedule: | |
- cron: '0 5 * * *' | |
workflow_dispatch: | |
jobs: | |
get-version-number: | |
runs-on: windows-latest | |
outputs: | |
VERSION: ${{ steps.step1.outputs.VERSION }} | |
GCLOUD_CLI_VERSION: ${{ steps.step1.outputs.GCLOUD_CLI_VERSION }} | |
KUBECTL_MAJOR_MINOR_VERSION: ${{ steps.step1.outputs.KUBECTL_MAJOR_MINOR_VERSION }} | |
CONTINUE: ${{ steps.step1.outputs.Continue }} | |
WIN2022_VERSION: ${{ steps.step1.outputs.WIN2022_VERSION }} | |
steps: | |
- uses: actions/checkout@v3 | |
- id: step1 | |
name: Compare latest version with container | |
run: | | |
Write-Output "Getting GCLOUD CLI version (needed for gke-auth-plugin)" | |
$googleCloudSdkInfo = Invoke-RestMethod "https://registry.hub.docker.com/v2/repositories/google/cloud-sdk/tags?page=1" | |
$otherImages = $googleCloudSdkInfo.results | Where-Object { $_.name -ine "latest" } | |
$latestTag = $googleCloudSdkInfo.results | Where-Object { $_.name -ieq "latest" } | |
if($null -eq $latestTag) { | |
throw "Couldnt find latest tag for Google Cloud SDK version from DockerHub" | |
} | |
$latestTagImage = $latestTag.images | Where-Object {$_.os -ieq "linux" -and $_.architecture -ieq "amd64" -and $_.status -ieq "active"} | Select-Object -First 1 | |
if($null -eq $latestTagImage) { | |
throw "Couldnt find latest tag image for Google Cloud SDK version for linux/amd64" | |
} | |
$latestDigest = $latestTagImage.digest | |
Write-Output "Found latest digest: $latestDigest" | |
$GCLOUD_CLI_VERSION = "" | |
foreach($result in $otherImages) { | |
$matchingImageDigest = $result.images | Where-Object {$_.os -ieq "linux" -and $_.architecture -ieq "amd64" -and $_.status -ieq "active" -and $_.digest -ieq $latestDigest } | Select-Object -First 1 | |
if($null -eq $matchingImageDigest) { | |
continue; | |
} | |
else { | |
$version = $result.name | |
Write-Output "Found version '$version' that matches digest: $latestDigest" | |
$versionSplit = $version.Split(".") | |
$GCLOUD_CLI_VERSION = "$($versionSplit[0]).$($versionSplit[1]).$($versionSplit[2])" | |
break; | |
} | |
} | |
if ([string]::IsNullOrWhiteSpace($GCLOUD_CLI_VERSION)) { | |
throw "No GCLOUD CLI version with digest $latestDigest found" | |
} | |
else { | |
echo "GCLOUD_CLI_VERSION=$GCLOUD_CLI_VERSION" >> $env:GITHUB_OUTPUT | |
} | |
Write-Output "Getting kubectl version" | |
$chocoInformationRaw = choco info kubernetes-cli --limitoutput | |
$versionOutput = ($chocoInformationRaw.Split("|"))[1] | |
[System.Version]$version = $null | |
$versionParsed = [System.Version]::TryParse($versionOutput, [ref]$version) | |
if(-not $versionParsed) { | |
Write-Host "Unable to parse '$versionOutput' as a valid version. Won't continue" | |
echo "CONTINUE=No" >> $env:GITHUB_OUTPUT | |
} | |
else { | |
$versionToCompare = "$($version.Major).$($version.Minor).$($version.Build)" | |
Write-Host "Parsed version as $versionToCompare" | |
# Major/minor version is used for linux dockerfile to install kubectl correctly | |
$majorMinorVersion = "$($version.Major).$($version.Minor)" | |
Write-Host "kubectl Major.Minor: $majorMinorVersion" | |
$workerToolsTags = Invoke-RestMethod "https://registry.hub.docker.com/v2/repositories/octopuslabs/k8s-workertools/tags?page_size=50" | |
$matchingTag = $workerToolsTags.results | Where-Object { $_.name -eq $versionToCompare } | |
echo "VERSION=$versionToCompare" >> $env:GITHUB_OUTPUT | |
echo "KUBECTL_MAJOR_MINOR_VERSION=$majorMinorVersion" >> $env:GITHUB_OUTPUT | |
if ($null -ne $matchingTag) | |
{ | |
Write-Host "Docker container already has latest version" | |
echo "CONTINUE=No" >> $env:GITHUB_OUTPUT | |
} | |
else | |
{ | |
Write-Host "We need to upgrade the container to $versionToCompare" | |
Write-Host "Getting OS versions for windows 2022" | |
$win2022_manifest = (docker manifest inspect --verbose "octopuslabs/workertools:latest-windows.2022" | ConvertFrom-Json) | |
$WIN2022_VERSION = $win2022_manifest.Descriptor.Platform.'os.version' | |
Write-Host "WIN2022_VERSION: $WIN2022_VERSION" | |
if([string]::IsNullOrWhiteSpace($WIN2022_VERSION)) { | |
throw "Could not establish OS versions for windows 2022 needed for docker manifest" | |
} | |
echo "WIN2022_VERSION=$WIN2022_VERSION" >> $env:GITHUB_OUTPUT | |
Write-Host "We have everything we need, continuing." | |
echo "CONTINUE=Yes" >> $env:GITHUB_OUTPUT | |
} | |
} | |
shell: powershell | |
build-ubuntu: | |
needs: [get-version-number] | |
runs-on: ubuntu-latest | |
steps: | |
- uses: actions/checkout@v3 | |
- name: DockerHub Login | |
env: | |
USERNAME: ${{ secrets.DOCKER_HUB_USER }} | |
PASSWORD: ${{ secrets.DOCKER_HUB_PAT }} | |
run: docker login --username $USERNAME --password "$PASSWORD" | |
if: ${{ needs.get-version-number.outputs.CONTINUE == 'Yes' }} | |
- name: Build the ubuntu.2004 image | |
env: | |
VERSION_NUMBER: ${{ needs.get-version-number.outputs.VERSION }} | |
KUBECTL_MAJOR_MINOR_VERSION: ${{ needs.get-version-number.outputs.KUBECTL_MAJOR_MINOR_VERSION }} | |
run: docker build ./ubuntu-2004 --build-arg KUBECTL_MAJOR_MINOR_VERSION=$KUBECTL_MAJOR_MINOR_VERSION --tag octopuslabs/k8s-workertools:$VERSION_NUMBER-ubuntu.2004 --tag octopuslabs/k8s-workertools:latest-ubuntu.2004 | |
if: ${{ needs.get-version-number.outputs.CONTINUE == 'Yes' }} | |
- name: Push the ubuntu.2004 version-specific image | |
env: | |
VERSION_NUMBER: ${{ needs.get-version-number.outputs.VERSION }} | |
run: docker push octopuslabs/k8s-workertools:$VERSION_NUMBER-ubuntu.2004 | |
if: ${{ needs.get-version-number.outputs.CONTINUE == 'Yes' }} | |
- name: Push the ubuntu.2004 latest image | |
run: docker push octopuslabs/k8s-workertools:latest-ubuntu.2004 | |
if: ${{ needs.get-version-number.outputs.CONTINUE == 'Yes' }} | |
- name: Build the ubuntu.2204 image | |
env: | |
VERSION_NUMBER: ${{ needs.get-version-number.outputs.VERSION }} | |
KUBECTL_MAJOR_MINOR_VERSION: ${{ needs.get-version-number.outputs.KUBECTL_MAJOR_MINOR_VERSION }} | |
run: docker build ./ubuntu-2204 --build-arg KUBECTL_MAJOR_MINOR_VERSION=$KUBECTL_MAJOR_MINOR_VERSION --tag octopuslabs/k8s-workertools:$VERSION_NUMBER-ubuntu.2204 --tag octopuslabs/k8s-workertools:latest-ubuntu.2204 | |
if: ${{ needs.get-version-number.outputs.CONTINUE == 'Yes' }} | |
- name: Push the ubuntu.2204 version-specific image | |
env: | |
VERSION_NUMBER: ${{ needs.get-version-number.outputs.VERSION }} | |
run: docker push octopuslabs/k8s-workertools:$VERSION_NUMBER-ubuntu.2204 | |
if: ${{ needs.get-version-number.outputs.CONTINUE == 'Yes' }} | |
- name: Push the ubuntu.2204 latest image | |
run: docker push octopuslabs/k8s-workertools:latest-ubuntu.2204 | |
if: ${{ needs.get-version-number.outputs.CONTINUE == 'Yes' }} | |
build-win-2022: | |
needs: [get-version-number] | |
runs-on: windows-2022 | |
steps: | |
- uses: actions/checkout@v3 | |
- name: DockerHub Login | |
env: | |
USERNAME: ${{ secrets.DOCKER_HUB_USER }} | |
PASSWORD: ${{ secrets.DOCKER_HUB_PAT }} | |
run: docker login --username ${env:USERNAME} --password "${env:PASSWORD}" | |
if: ${{ needs.get-version-number.outputs.CONTINUE == 'Yes' }} | |
- name: Build the win2022 image | |
env: | |
VERSION_NUMBER: ${{ needs.get-version-number.outputs.VERSION }} | |
GCLOUD_CLI_VERSION: ${{ needs.get-version-number.outputs.GCLOUD_CLI_VERSION }} | |
run: docker build ./windows-2022 --build-arg GCLOUD_CLI_VERSION=${env:GCLOUD_CLI_VERSION} --tag octopuslabs/k8s-workertools:${env:VERSION_NUMBER}-windows.2022 --tag octopuslabs/k8s-workertools:latest-windows.2022 | |
if: ${{ needs.get-version-number.outputs.CONTINUE == 'Yes' }} | |
- name: Push the win2022 version-specific image | |
env: | |
VERSION_NUMBER: ${{ needs.get-version-number.outputs.VERSION }} | |
run: docker push octopuslabs/k8s-workertools:${env:VERSION_NUMBER}-windows.2022 | |
if: ${{ needs.get-version-number.outputs.CONTINUE == 'Yes' }} | |
- name: Push the win2022 latest image | |
run: docker push octopuslabs/k8s-workertools:latest-windows.2022 | |
if: ${{ needs.get-version-number.outputs.CONTINUE == 'Yes' }} | |
build-docker-manifest: | |
needs: [get-version-number, build-ubuntu, build-win-2022] | |
runs-on: ubuntu-latest | |
steps: | |
- name: DockerHub Login | |
env: | |
USERNAME: ${{ secrets.DOCKER_HUB_USER }} | |
PASSWORD: ${{ secrets.DOCKER_HUB_PAT }} | |
run: docker login --username $USERNAME --password "$PASSWORD" | |
if: ${{ needs.get-version-number.outputs.CONTINUE == 'Yes' }} | |
- name: Create docker manifest for latest tag | |
run: docker manifest create octopuslabs/k8s-workertools:latest octopuslabs/k8s-workertools:latest-windows.2022 octopuslabs/k8s-workertools:latest-ubuntu.2204 | |
if: ${{ needs.get-version-number.outputs.CONTINUE == 'Yes' }} | |
- name: Annotate docker manifest for latest tag | |
env: | |
WIN2022_VERSION: ${{ needs.get-version-number.outputs.WIN2022_VERSION }} | |
run: | | |
docker manifest annotate --os "windows" --os-version "$WIN2022_VERSION" --arch "amd64" "octopuslabs/k8s-workertools:latest" "octopuslabs/k8s-workertools:latest-windows.2022" | |
if: ${{ needs.get-version-number.outputs.CONTINUE == 'Yes' }} | |
- name: Push docker manifest for latest tag | |
run: docker manifest push octopuslabs/k8s-workertools:latest | |
if: ${{ needs.get-version-number.outputs.CONTINUE == 'Yes' }} | |
- name: Create docker manifest for version-specific tag | |
env: | |
VERSION_NUMBER: ${{ needs.get-version-number.outputs.VERSION }} | |
run: docker manifest create octopuslabs/k8s-workertools:$VERSION_NUMBER octopuslabs/k8s-workertools:$VERSION_NUMBER-windows.2022 octopuslabs/k8s-workertools:$VERSION_NUMBER-ubuntu.2204 | |
if: ${{ needs.get-version-number.outputs.CONTINUE == 'Yes' }} | |
- name: Annotate docker manifest for version-specific tag | |
env: | |
VERSION_NUMBER: ${{ needs.get-version-number.outputs.VERSION }} | |
WIN2022_VERSION: ${{ needs.get-version-number.outputs.WIN2022_VERSION }} | |
run: | | |
docker manifest annotate --os "windows" --os-version "$WIN2022_VERSION" --arch "amd64" "octopuslabs/k8s-workertools:$VERSION_NUMBER" "octopuslabs/k8s-workertools:$VERSION_NUMBER-windows.2022" | |
if: ${{ needs.get-version-number.outputs.CONTINUE == 'Yes' }} | |
- name: Push docker manifest for version-specific tag | |
env: | |
VERSION_NUMBER: ${{ needs.get-version-number.outputs.VERSION }} | |
run: docker manifest push octopuslabs/k8s-workertools:$VERSION_NUMBER | |
if: ${{ needs.get-version-number.outputs.CONTINUE == 'Yes' }} |