# This workflow uses actions that are not certified by GitHub. # They are provided by a third-party and are governed by # separate terms of service, privacy policy, and support # documentation. name: Test on: workflow_dispatch: # push: # branches: [ "master" ] # pull_request: # branches: [ "master" ] env: # Path to the solution file relative to the root of the project. SOLUTION_FILE_PATH: . # Configuration type to build. # You can convert this to a build matrix if you need coverage of multiple configuration types. # https://docs.github.com/actions/learn-github-actions/managing-complex-workflows#using-a-build-matrix BUILD_CONFIGURATION: Release permissions: contents: write jobs: build: runs-on: windows-latest steps: - uses: actions/checkout@v4 with: fetch-depth: 0 - name: Extract Version id: get_version working-directory: ${{ github.workspace }} shell: pwsh run: | # Ensure the file exists before proceeding $resourceFile = ".\OptiScaler\resource.h" if (-Not (Test-Path $resourceFile)) { Write-Error "File not found: $resourceFile" exit 1 } # Helper function to extract the first matching line for a version component function Get-Version-Component { param ( [string]$pattern, [string]$replacement ) # Use Select-String and take only the first match $line = Get-Content $resourceFile | Select-String -Pattern $pattern | Select-Object -First 1 if ($line) { return ($line.Line -replace $replacement).Trim() } else { Write-Error "Pattern not found: $pattern" exit 1 } } # Extract version components (only the first match for each pattern) $majorVersion = Get-Version-Component 'VER_MAJOR_VERSION' '#define VER_MAJOR_VERSION\s+' $minorVersion = Get-Version-Component 'VER_MINOR_VERSION' '#define VER_MINOR_VERSION\s+' $hotfixVersion = Get-Version-Component 'VER_HOTFIX_VERSION' '#define VER_HOTFIX_VERSION\s+' $buildVersion = Get-Version-Component 'VER_BUILD_NUMBER' '#define VER_BUILD_NUMBER\s+' # Merge into a single version string $version = "v$majorVersion.$minorVersion.$hotfixVersion-pre$buildVersion" # Get the current date in a specific format (e.g., YYYYMMDD) $date = Get-Date -Format "yyyyMMdd" # Construct the output filename with version and date $outputFileName = "OptiScaler_${version}_${date}" # Output the generated filename Write-Output "Generated Filename: $outputFileName" # Write outputs to GITHUB_OUTPUT "version=$version" | Out-File -FilePath $env:GITHUB_OUTPUT -Append "filename=$outputFileName" | Out-File -FilePath $env:GITHUB_OUTPUT -Append continue-on-error: false - name: Debug Outputs run: | echo "Version: ${{ steps.get_version.outputs.version }}" echo "Filename: ${{ steps.get_version.outputs.filename }}" - name: Create Nightly Release (if not exists) id: create_release if: steps.check_release.outputs.release_exists == 'false' uses: actions/github-script@v6 with: script: | const release = await github.rest.repos.createRelease({ owner: context.repo.owner, repo: context.repo.repo, tag_name: "nightly", name: "Nightly Builds", body: "This is an automated nightly build release.", draft: false, prerelease: true, }); core.setOutput("release_id", release.data.id); core.setOutput("upload_url", release.data.upload_url); - name: Check Existing Release id: check_release uses: actions/github-script@v6 with: script: | const releaseTag = "nightly"; try { const release = await github.rest.repos.getReleaseByTag({ owner: context.repo.owner, repo: context.repo.repo, tag: releaseTag, }); core.setOutput("release_exists", true); core.setOutput("release_id", release.data.id); core.setOutput("upload_url", release.data.upload_url); } catch (error) { if (error.status === 404) { core.setOutput("release_exists", false); } else { throw error; } } - name: Get Commit Messages From Last Day and Update the Release id: commit_messages working-directory: ${{ github.workspace }} env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} shell: powershell run: | Write-Output "Fetching commits from the last 24 hours..." # Get commit messages excluding .yml file commits $commits = git log --since="1 day ago" --pretty=format:"%h %s (%an)" --abbrev-commit --grep=".yml" --invert-grep --no-merges --first-parent $commits = $commits -split "`n" # If no commits are found, cancel the workflow if (-not $commits) { Write-Output "No relevant commits in the last 24 hours. Cancelling workflow." $ReleaseTag = "nightly" Write-Output "Updating existing release: $ReleaseTag" gh release edit $ReleaseTag --notes "### Changes in the Last 24 Hours`n`nNo changes..." } else { # Join commits into a newline-separated string $formattedCommits = $commits -join "`n" Write-Output "Commits: $formattedCommits`n" # Generate release notes $releaseNotes = "### Changes in the Last 24 Hours`n`n$formattedCommits" $ReleaseTag = "nightly" Write-Output "Updating existing release: $ReleaseTag" gh release edit $ReleaseTag --notes "$ReleaseNotes" }