Check for Update and Build Parallel #1334
This file contains hidden or 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: Check for Update and Build Parallel | |
| on: | |
| workflow_dispatch: | |
| inputs: | |
| force_rebuild: | |
| description: 'Force rebuild all images regardless of version checks' | |
| required: false | |
| type: boolean | |
| default: false | |
| schedule: | |
| - cron: "18 */12 * * *" | |
| jobs: | |
| check_updates: | |
| runs-on: ubuntu-latest | |
| outputs: | |
| latest_tag: ${{ steps.latest_tag.outputs.tag_name }} | |
| latest_public: ${{ steps.latest_versions.outputs.public }} | |
| latest_sixtyfour: ${{ steps.latest_versions.outputs.sixtyfour }} | |
| latest_dev: ${{ steps.latest_versions.outputs.dev }} | |
| latest_prerelease: ${{ steps.latest_versions.outputs.prerelease }} | |
| needs_update_public: ${{ steps.needs_update.outputs.public }} | |
| needs_update_sixtyfour: ${{ steps.needs_update.outputs.sixtyfour }} | |
| needs_update_dev: ${{ steps.needs_update.outputs.dev }} | |
| needs_update_prerelease: ${{ steps.needs_update.outputs.prerelease }} | |
| any_update_needed: ${{ steps.needs_update.outputs.any }} | |
| steps: | |
| - name: Checkout Full Repo | |
| uses: actions/checkout@v4 | |
| with: | |
| fetch-depth: 0 | |
| path: full_repo | |
| - name: Get Latest Tag | |
| id: latest_tag | |
| run: | | |
| cd "$GITHUB_WORKSPACE/full_repo" | |
| # Robust tag matching for semver-like tags | |
| latest_tag=$(git tag --list --sort=-v:refname '[0-9]*.[0-9]*' '[0-9]*.[0-9]*.[0-9]*' | grep -v '[^0-9.]' | head -n 1) | |
| if [ -z "$latest_tag" ]; then | |
| echo "Could not find a suitable latest tag." | |
| exit 1 | |
| fi | |
| echo "Latest tag: $latest_tag" | |
| echo "tag_name=$latest_tag" >> $GITHUB_OUTPUT | |
| - name: Pull the steamcmd image | |
| run: | | |
| docker pull ghcr.io/cfc-servers/steamcmd-slim:latest | |
| - name: Lookup latest build IDs | |
| id: latest_versions | |
| run: | | |
| # Ensure workspace directory exists if needed later | |
| mkdir -p "$GITHUB_WORKSPACE" | |
| docker run \ | |
| --rm \ | |
| --name version_checker \ | |
| ghcr.io/cfc-servers/steamcmd-slim:latest \ | |
| /home/steam/steamcmd/steamcmd.sh +login anonymous +app_info_request 4020 +login anonymous +app_info_print 4020 +exit \ | |
| > "$GITHUB_WORKSPACE/raw_output.txt" | |
| # Extract just the part we care about | |
| struct="$GITHUB_WORKSPACE/struct.txt" | |
| sed -e '1,/"4020"$/ d' "$GITHUB_WORKSPACE/raw_output.txt" > "$struct" | |
| # Get the latest build IDs | |
| public=$(grep -A 2 '"public"' "$struct" | grep '"buildid"' | awk '{print $2}' | sed 's/"//g') | |
| sixtyfour=$(grep -A 2 '"x86-64"' "$struct" | grep '"buildid"' | awk '{print $2}' | sed 's/"//g') | |
| dev=$(grep -A 2 '"dev"' "$struct" | grep '"buildid"' | awk '{print $2}' | sed 's/"//g') | |
| prerelease=$(grep -A 2 '"prerelease"' "$struct" | grep '"buildid"' | awk '{print $2}' | sed 's/"//g') | |
| echo "Latest Public ID: '$public'" | |
| echo "Latest 64bit ID: '$sixtyfour'" | |
| echo "Latest Dev ID: '$dev'" | |
| echo "Latest prerelease ID: '$prerelease'" | |
| if [ -z "$public" ] || [ -z "$sixtyfour" ] || [ -z "$dev" ] || [ -z "$prerelease" ]; then | |
| echo "Failed to get one or more latest build IDs" | |
| echo "Raw Output from SteamCMD:" | |
| cat "$GITHUB_WORKSPACE/raw_output.txt" | |
| exit 1 | |
| fi | |
| # Set the output | |
| echo "public=$public" >> $GITHUB_OUTPUT | |
| echo "sixtyfour=$sixtyfour" >> $GITHUB_OUTPUT | |
| echo "dev=$dev" >> $GITHUB_OUTPUT | |
| echo "prerelease=$prerelease" >> $GITHUB_OUTPUT | |
| - name: Checkout last build branch | |
| uses: actions/checkout@v4 | |
| with: | |
| ref: build/last-build-versions | |
| path: build_versions | |
| - name: Read last build IDs | |
| id: last_versions | |
| run: | | |
| public=$(cat $GITHUB_WORKSPACE/build_versions/last_public_build.txt 2>/dev/null || echo "0") | |
| sixtyfour=$(cat $GITHUB_WORKSPACE/build_versions/last_64bit_build.txt 2>/dev/null || echo "0") | |
| dev=$(cat $GITHUB_WORKSPACE/build_versions/last_dev_build.txt 2>/dev/null || echo "0") | |
| prerelease=$(cat $GITHUB_WORKSPACE/build_versions/last_prerelease_build.txt 2>/dev/null || echo "0") | |
| echo "Last Public ID built: '$public'" | |
| echo "Last 64bit ID built: '$sixtyfour'" | |
| echo "Last Dev ID built: '$dev'" | |
| echo "Last prerelease ID built: '$prerelease'" | |
| echo "public=$public" >> $GITHUB_OUTPUT | |
| echo "sixtyfour=$sixtyfour" >> $GITHUB_OUTPUT | |
| echo "dev=$dev" >> $GITHUB_OUTPUT | |
| echo "prerelease=$prerelease" >> $GITHUB_OUTPUT | |
| - name: Identify pending updates | |
| id: needs_update | |
| run: | | |
| # Compare versions and set boolean flags (as strings 'true'/'false') | |
| needs_public=$([[ "${{ steps.latest_versions.outputs.public }}" != "${{ steps.last_versions.outputs.public }}" ]] && echo "true" || echo "false") | |
| needs_sixtyfour=$([[ "${{ steps.latest_versions.outputs.sixtyfour }}" != "${{ steps.last_versions.outputs.sixtyfour }}" ]] && echo "true" || echo "false") | |
| needs_dev=$([[ "${{ steps.latest_versions.outputs.dev }}" != "${{ steps.last_versions.outputs.dev }}" ]] && echo "true" || echo "false") | |
| needs_prerelease=$([[ "${{ steps.latest_versions.outputs.prerelease }}" != "${{ steps.last_versions.outputs.prerelease }}" ]] && echo "true" || echo "false") | |
| # If this was a manual run with the "force_rebuild" option, update them all regardless of if they're outdated | |
| if [[ "${{ github.event_name }}" == "workflow_dispatch" && "${{ github.event.inputs.force_rebuild }}" == "true" ]]; then | |
| echo "Force rebuild requested via workflow_dispatch input. Overriding version checks." | |
| needs_public="true" | |
| needs_sixtyfour="true" | |
| needs_dev="true" | |
| needs_prerelease="true" | |
| fi | |
| echo "Should build Public: '$needs_public'" | |
| echo "Should build 64bit: '$needs_sixtyfour'" | |
| echo "Should build Dev: '$needs_dev'" | |
| echo "Should build Prerelease: '$needs_prerelease'" | |
| echo "public=$needs_public" >> $GITHUB_OUTPUT | |
| echo "sixtyfour=$needs_sixtyfour" >> $GITHUB_OUTPUT | |
| echo "dev=$needs_dev" >> $GITHUB_OUTPUT | |
| echo "prerelease=$needs_prerelease" >> $GITHUB_OUTPUT | |
| # Determine if any update is needed for the final commit step | |
| any_update="false" | |
| if [[ "$needs_public" == "true" || "$needs_sixtyfour" == "true" || "$needs_dev" == "true" || "$needs_prerelease" == "true" ]]; then | |
| any_update="true" | |
| fi | |
| echo "Any update needed: $any_update" | |
| echo "any=$any_update" >> $GITHUB_OUTPUT | |
| trigger_builds: | |
| needs: check_updates | |
| runs-on: ubuntu-latest | |
| if: needs.check_updates.outputs.any_update_needed == 'true' | |
| strategy: | |
| fail-fast: false | |
| matrix: | |
| branch: [public, x86-64, dev, prerelease] | |
| include: | |
| - branch: public | |
| needs_update_flag: ${{ needs.check_updates.outputs.needs_update_public }} | |
| game_version: ${{ needs.check_updates.outputs.latest_public }} | |
| - branch: x86-64 | |
| needs_update_flag: ${{ needs.check_updates.outputs.needs_update_sixtyfour }} | |
| game_version: ${{ needs.check_updates.outputs.latest_sixtyfour }} | |
| - branch: dev | |
| needs_update_flag: ${{ needs.check_updates.outputs.needs_update_dev }} | |
| game_version: ${{ needs.check_updates.outputs.latest_dev }} | |
| - branch: prerelease | |
| needs_update_flag: ${{ needs.check_updates.outputs.needs_update_prerelease }} | |
| game_version: ${{ needs.check_updates.outputs.latest_prerelease }} | |
| steps: | |
| - name: Checkout Full Repo | |
| uses: actions/checkout@v4 | |
| with: | |
| path: full_repo | |
| - name: Update ${{ matrix.branch }} Build | |
| if: matrix.needs_update_flag == 'true' | |
| uses: ./full_repo/.github/actions/build_and_push | |
| with: | |
| gmod_branch: ${{ matrix.branch }} | |
| game_version: ${{ matrix.game_version }} | |
| tag_name: ${{ needs.check_updates.outputs.latest_tag }} | |
| release: true | |
| github_token: ${{ secrets.GITHUB_TOKEN }} | |
| path: $GITHUB_WORKSPACE/full_repo | |
| update_last_versions: | |
| runs-on: ubuntu-latest | |
| needs: [check_updates, trigger_builds] | |
| if: always() && needs.check_updates.outputs.any_update_needed == 'true' | |
| steps: | |
| - name: Checkout last build branch | |
| uses: actions/checkout@v4 | |
| with: | |
| ref: build/last-build-versions | |
| path: build_versions | |
| - name: Update last version files | |
| run: | | |
| cd $GITHUB_WORKSPACE/build_versions | |
| # Update files with the latest versions fetched in the check_updates job | |
| echo "${{ needs.check_updates.outputs.latest_public }}" > ./last_public_build.txt | |
| echo "${{ needs.check_updates.outputs.latest_sixtyfour }}" > ./last_64bit_build.txt | |
| echo "${{ needs.check_updates.outputs.latest_dev }}" > ./last_dev_build.txt | |
| echo "${{ needs.check_updates.outputs.latest_prerelease }}" > ./last_prerelease_build.txt | |
| git config user.name "github-actions" | |
| git config user.email "github-actions@github.com" | |
| if [[ -z $(git status --porcelain) ]]; then | |
| echo "No changes detected in last build version files." | |
| exit 0 | |
| else | |
| echo "Changes detected. Committing and pushing..." | |
| git add . | |
| git commit -m "Update last build versions after check [skip ci]" | |
| git push origin build/last-build-versions | |
| fi | |
| env: | |
| GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} |