Nightly Prerelease build on Main #145
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: Nightly Prerelease build on Main | |
on: | |
schedule: | |
- cron: '0 23 * * 1-5' # This is 1:00 AM Berlin time from Monday to Friday | |
workflow_dispatch: # Allows manual triggering | |
env: | |
BRANCH_SUFFIX: latest | |
VERSION_SUFFIX: alpha | |
jobs: | |
check-for-changes: | |
runs-on: windows-latest | |
name: Check for changes between HEAD and last created tag | |
if: github.event_name != 'schedule' || github.repository == 'eclipse-aaspe/server' | |
outputs: | |
branch_changed: ${{ steps.check_changes.outputs.changes_detected }} | |
steps: | |
- name: Checkout repository | |
uses: actions/checkout@v4 | |
with: | |
fetch-depth: 0 | |
- name: Check changes since last tag | |
id: check_changes | |
run: | | |
git fetch --tags | |
$tags = git tag --sort=-creatordate | |
Write-Host "Tags: $tags" | |
$branchSuffix = "${{ env.BRANCH_SUFFIX }}" | |
$potentialTags = @() | |
foreach ($tag in $tags) | |
{ | |
if ($tag -match ".*-$branchSuffix$") | |
{ | |
$potentialTags += $tag | |
} | |
} | |
if ($potentialTags.Count -gt 0) | |
{ | |
$latestTag = $potentialTags[0] | |
Write-Host "Latest found matching tag is $latestTag" | |
} | |
else | |
{ | |
Write-Host "No matching tags found, fetching the latest tag." | |
$latestTag = $tags | Select-Object -First 1 | |
if ($latestTag) | |
{ | |
echo "from_tag=$latestTag" >> $env:GITHUB_OUTPUT | |
Write-Host "Latest found tag is $latestTag" | |
} | |
else | |
{ | |
Write-Host "No tags found at all." | |
exit 1 | |
} | |
} | |
Write-Host "Checking changes since tag: $latestTag" | |
$range = "$latestTag..@" | |
Write-Host "Check for changes in range: $range" | |
$changes = git log $range --oneline | |
Write-Host "Found changes: $changes" | |
if (-not [string]::IsNullOrEmpty($changes)) | |
{ | |
Write-Host "Changes detected since $latestTag" | |
Write-Host "$changes" | |
echo "changes_detected=true" >> $env:GITHUB_OUTPUT | |
} | |
else | |
{ | |
Write-Host "No changes detected since $latestTag." | |
echo "changes_detected=false" >> $env:GITHUB_OUTPUT | |
} | |
shell: pwsh | |
create-new-prerelease: | |
runs-on: windows-latest | |
name: Create a new prerelease build and attach built packages to release | |
needs: check-for-changes | |
permissions: | |
contents: write | |
pull-requests: write | |
if: needs.check-for-changes.outputs.branch_changed == 'true' | |
outputs: | |
VERSION_NUMBER: ${{ steps.generate_version_number.outputs.version }} | |
steps: | |
- name: Checkout repository | |
uses: actions/checkout@v4 | |
with: | |
fetch-depth: 0 | |
- name: Set execution policy | |
run: Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope Process | |
shell: pwsh | |
- name: Extract branch name | |
id: extract_branch | |
run: | | |
$branch = '${{ github.ref }}' -replace 'refs/heads/', '' | |
echo "branch=$branch" >> $env:GITHUB_OUTPUT | |
Write-Host "The current branch is: $branch" | |
shell: pwsh | |
- name: Get the newest tag | |
id: get_latest_tag | |
run: | | |
git fetch --tags | |
$tags = git tag --sort=-creatordate | |
$branchSuffix = "${{ env.BRANCH_SUFFIX }}" | |
$potentialTags = @() | |
foreach ($tag in $tags) { | |
if ($tag -match ".*-$branchSuffix$") { | |
$potentialTags += $tag | |
} | |
} | |
if ($potentialTags.Count -gt 0) { | |
$newestStableTag = $potentialTags[0] | |
echo "from_tag=$newestStableTag" >> $env:GITHUB_OUTPUT | |
Write-Host "Latest found tag is $newestStableTag" | |
} else { | |
Write-Host "No matching tags found, fetching the latest tag." | |
$latestTag = $tags | Select-Object -First 1 | |
if ($latestTag) { | |
echo "from_tag=$latestTag" >> $env:GITHUB_OUTPUT | |
Write-Host "Latest found tag is $latestTag" | |
} else { | |
Write-Host "No tags found at all." | |
exit 1 | |
} | |
} | |
shell: pwsh | |
- name: Generate Version Number | |
working-directory: src | |
id: generate_version_number | |
run: | | |
$branch = '${{ steps.extract_branch.outputs.branch }}' | |
$version = .\BuildVersionNumber.ps1 -suffix $VERSION_SUFFIX -branch $branch -githubRunNumber ${{ github.run_number }} | |
echo "version=$version" >> $env:GITHUB_OUTPUT | |
Write-Host "The version name to build is: $version" | |
shell: pwsh | |
- name: Update version numbers in project | |
working-directory: src | |
run: | | |
$version = '${{ steps.generate_version_number.outputs.version }}' | |
Write-Host "Updating project versions to: $version" | |
.\UpdateProjectVersions.ps1 -version $version | |
shell: pwsh | |
- name: Setup .NET Core | |
uses: actions/setup-dotnet@v4 | |
with: | |
dotnet-version: '8.0.x' | |
- name: Build release | |
working-directory: src | |
run: .\BuildForRelease.ps1 | |
shell: pwsh | |
- name: Package release | |
working-directory: src | |
run: | | |
$version = 'v${{ steps.generate_version_number.outputs.version }}' | |
mkdir -p artefacts/release/$version | |
Write-Host "Packaging for the release version: $version" | |
.\PackageRelease.ps1 -version $version | |
shell: pwsh | |
- name: Rename the release assets | |
working-directory: . | |
run: | | |
$version = 'v${{ steps.generate_version_number.outputs.version }}' | |
$releaseDir = Join-Path $(Get-Location) "artefacts/release/$version" | |
Write-Host "Release directory: $releaseDir" | |
if (!(Test-Path $releaseDir)) { | |
throw "The release directory does not exist: $releaseDir" | |
} | |
$archives = Get-ChildItem $releaseDir -Filter *.zip | |
foreach($archive in $archives) { | |
$path = $archive.FullName | |
Write-Host "The path to the archive is: $path" | |
$nameWoExt = [io.path]::GetFileNameWithoutExtension($path) | |
Write-Host "The name without extension is: $nameWoExt" | |
$target = Join-Path $releaseDir ($nameWoExt + "." + $version + ".zip") | |
Write-Host "Moving: $path -> $target" | |
Move-Item -Path $path -Destination $target | |
} | |
shell: pwsh | |
- name: Create Git tag | |
run: | | |
git config --global user.name "github-actions[bot]" | |
git config --global user.email "github-actions[bot]@users.noreply.github.com" | |
git tag v${{ steps.generate_version_number.outputs.version }} | |
git push origin v${{ steps.generate_version_number.outputs.version }} | |
env: | |
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
- name: Generate release notes | |
id: generate_release_notes | |
uses: mikepenz/release-changelog-builder-action@v4 | |
with: | |
configuration: ".github/changelog_configuration.json" | |
token: ${{ secrets.GITHUB_TOKEN }} | |
fromTag: "${{ steps.get_latest_tag.outputs.from_tag }}" | |
toTag: "v${{ steps.generate_version_number.outputs.version }}" | |
fetchViaCommits: "true" | |
ignorePreReleases: "false" | |
fetchReleaseInformation: "true" | |
failOnError: "true" | |
env: | |
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
- name: Create GitHub release | |
id: create_release | |
uses: softprops/action-gh-release@v2 | |
env: | |
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
with: | |
tag_name: "v${{ steps.generate_version_number.outputs.version }}" | |
name: "v${{ steps.generate_version_number.outputs.version }}" | |
draft: false | |
prerelease: true | |
body: ${{ steps.generate_release_notes.outputs.changelog }} | |
token: ${{ secrets.GITHUB_TOKEN }} | |
- name: Upload the release assets | |
uses: AButler/upload-release-assets@v3.0 | |
with: | |
files: "artefacts/release/v${{ steps.generate_version_number.outputs.version }}/*.zip" | |
repo-token: ${{ secrets.GITHUB_TOKEN }} | |
release-tag: "v${{ steps.generate_version_number.outputs.version }}" | |
build-and-publish-docker-release-images: | |
runs-on: ubuntu-latest | |
name: Create new docker builds with latest prerelease and upload to DockerHub | |
needs: create-new-prerelease | |
if: github.repository == 'eclipse-aaspe/server' | |
steps: | |
- name: Checkout | |
uses: actions/checkout@v4 | |
- name: Set up QEMU | |
uses: docker/setup-qemu-action@v3 | |
- name: Set up Docker Buildx | |
uses: docker/setup-buildx-action@v3 | |
with: | |
platforms: linux/amd64,linux/arm64,linux/arm32 | |
- name: Login to Docker Hub | |
uses: docker/login-action@v3 | |
with: | |
username: adminshellio | |
password: ${{ secrets.DOCKERHUB_PASSWORD }} | |
- name: Set version number | |
id: set-version | |
run: echo "VERSION_NUMBER=$(echo ${{ needs.create-new-prerelease.outputs.VERSION_NUMBER }} | tr '[:upper:]' '[:lower:]')" >> $GITHUB_ENV | |
- name: Determine Docker tag | |
id: set-docker-tag | |
run: | | |
if [ "${{ github.ref }}" == "refs/heads/main" ]; then | |
echo "tag=main" >> $GITHUB_OUTPUT | |
else | |
echo "tag=develop" >> $GITHUB_OUTPUT | |
fi | |
- name: Build and publish multi-architecture Docker image for AASX Server Blazor | |
uses: docker/build-push-action@v6 | |
with: | |
push: true | |
file: ./src/docker/Dockerfile-AasxServerBlazor | |
platforms: | | |
linux/amd64 | |
linux/arm/v6 | |
linux/arm/v7 | |
linux/arm64 | |
tags: | | |
adminshellio/aasx-server-blazor-for-demo:${{ steps.set-docker-tag.outputs.tag }} | |
adminshellio/aasx-server-blazor-for-demo:${{ env.VERSION_NUMBER }} | |
github-token: ${{ secrets.GITHUB_TOKEN }} | |
labels: "version=${{ env.VERSION_NUMBER }}" | |
- name: Build and publish multi-architecture Docker image for AasxServerCore | |
uses: docker/build-push-action@v6 | |
with: | |
push: true | |
file: ./src/docker/Dockerfile-AasxServerAspNetCore | |
platforms: | | |
linux/amd64 | |
linux/arm/v6 | |
linux/arm/v7 | |
linux/arm64 | |
tags: | | |
adminshellio/aasx-server-aspnetcore-for-demo:${{ steps.set-docker-tag.outputs.tag }} | |
adminshellio/aasx-server-aspnetcore-for-demo:${{ env.VERSION_NUMBER }} | |
github-token: ${{ secrets.GITHUB_TOKEN }} | |
labels: "version=${{ env.VERSION_NUMBER }}" | |
# -------------------------------------------------------------------------------------------------- | |
# These are the old specific docker image builds. We need to decide, if we want to delete them | |
# and only use the multi-platform builds | |
# -------------------------------------------------------------------------------------------------- | |
- name: Build and publish AasxServerBlazor-arm32 | |
uses: docker/build-push-action@v6 | |
with: | |
push: true | |
load: true | |
file: ./src/docker/Dockerfile-AasxServerBlazor | |
platforms: linux/arm/v7 | |
tags: adminshellio/aasx-server-blazor-for-demo-arm32:${{ steps.set-docker-tag.outputs.tag }} | |
github-token: ${{ secrets.GITHUB_TOKEN }} | |
labels: "version =${{ env.VERSION_NUMBER }}" | |
- name: Build and publish AasxServerBlazor-arm64 | |
uses: docker/build-push-action@v6 | |
with: | |
push: true | |
load: true | |
file: ./src/docker/Dockerfile-AasxServerBlazor | |
platforms: linux/arm64 | |
tags: adminshellio/aasx-server-blazor-for-demo-arm64:${{ steps.set-docker-tag.outputs.tag }} | |
github-token: ${{ secrets.GITHUB_TOKEN }} | |
labels: "version =${{ env.VERSION_NUMBER }}" | |
- name: Build and publish AasxServerCore-arm32 | |
uses: docker/build-push-action@v6 | |
with: | |
push: true | |
load: true | |
file: ./src/docker/Dockerfile-AasxServerAspNetCore | |
platforms: linux/arm/v7 | |
tags: adminshellio/aasx-server-aspnetcore-for-demo-arm32:${{ steps.set-docker-tag.outputs.tag }} | |
github-token: ${{ secrets.GITHUB_TOKEN }} | |
labels: "version =${{ env.VERSION_NUMBER }}" | |
- name: Build and publish AasxServerCore-arm64 | |
uses: docker/build-push-action@v6 | |
with: | |
push: true | |
load: true | |
file: ./src/docker/Dockerfile-AasxServerAspNetCore | |
platforms: linux/arm64 | |
tags: adminshellio/aasx-server-aspnetcore-for-demo-arm64:${{ steps.set-docker-tag.outputs.tag }} | |
github-token: ${{ secrets.GITHUB_TOKEN }} | |
labels: "version =${{ env.VERSION_NUMBER }}" |