# 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: Scheduled Build on: schedule: - cron: '0 4 * * *' 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 submodules: 'true' - 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: 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: Extract OptiScaler Version id: get_version working-directory: ${{ github.workspace }} shell: powershell 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: Add MSBuild to PATH uses: microsoft/setup-msbuild@v2 - name: Build working-directory: ${{env.GITHUB_WORKSPACE}} # Add additional options to the MSBuild command line here (like platform or verbosity level). # See https://docs.microsoft.com/visualstudio/msbuild/msbuild-command-line-reference run: msbuild /m /p:Configuration=${{env.BUILD_CONFIGURATION}} ${{env.SOLUTION_FILE_PATH}} /verbosity:minimal - name: Compress the artifact run: | $zipName = "${{ steps.get_version.outputs.filename }}.7z" 7z a -r ${{ github.workspace }}\$zipName ${{ github.workspace }}\x64\Release\a\*.* continue-on-error: false - uses: actions/upload-artifact@v4 with: name: ${{ steps.get_version.outputs.filename }} path: ${{ github.workspace }}\${{ steps.get_version.outputs.filename }}.7z compression-level: 0 if-no-files-found: error - name: Remove Previous Artifacts if: steps.check_release.outputs.release_exists == 'true' uses: actions/github-script@v6 with: script: | const releaseId = ${{ steps.check_release.outputs.release_id }}; const assets = await github.rest.repos.listReleaseAssets({ owner: context.repo.owner, repo: context.repo.repo, release_id: releaseId, }); for (const asset of assets.data) { await github.rest.repos.deleteReleaseAsset({ owner: context.repo.owner, repo: context.repo.repo, asset_id: asset.id, }); console.log(`Deleted asset: ${asset.name}`); } - name: Upload Artifact to Release uses: actions/upload-release-asset@v1 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: upload_url: ${{ steps.check_release.outputs.release_exists == 'true' && steps.check_release.outputs.upload_url || steps.create_release.outputs.upload_url }} asset_path: ${{ github.workspace }}\${{ steps.get_version.outputs.filename }}.7z asset_name: ${{ steps.get_version.outputs.filename }}.7z asset_content_type: application/x-7z-compressed - 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 --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" } continue-on-error: false