Skip to content

visibility

visibility #878

name: Build For Windows x86_64
on:
push:
branches: ["main"]
workflow_dispatch:
inputs:
publish:
description: 'Publish engine'
required: true
default: 'no'
type: choice
options:
- 'no'
- 'yes'
jobs:
build:
if: (!endsWith(github.event.head_commit.message, '--norun'))
runs-on: ubuntu-latest
environment: Windows
env:
CARGO_TERM_COLOR: always
WORKSPACE: ${{ github.workspace }}
RUST_BACKTRACE: full
steps:
# Setup Build Environment
- name: 🎉 The job was automatically triggered by a ${{ github.event_name }} event.
run: echo "🎉 The job was automatically triggered by a ${{ github.event_name }} event."
- name: 🐧 This job is now running on a ${{ runner.os }} server hosted by GitHub!
run: echo "🐧 This job is now running on a ${{ runner.os }} server hosted by GitHub!"
- name: 🔎 The name of your branch is ${{ github.ref }} and your repository is ${{ github.repository }}.
run: echo "🔎 The name of your branch is ${{ github.ref }} and your repository is ${{ github.repository }}."
- name: Check out repository code
uses: actions/checkout@v4
with:
lfs: true
submodules: recursive
- name: 💡 The ${{ github.repository }} repository has been cloned to the runner.
run: echo "💡 The ${{ github.repository }} repository has been cloned to the runner."
# Install Dependencies
- name: Install and Cache APT Packages
uses: awalsh128/cache-apt-pkgs-action@latest
with:
packages: gcc-mingw-w64-x86-64-posix g++-mingw-w64-x86-64-posix wine64 # mingw-w64
version: 1.0
execute_install_scripts: true
# Install Rust
- name: Make Tools Directory
run: mkdir -p ${{ github.workspace }}/tools
- name: Download Rust Installer
run: curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs > ${{ github.workspace }}/tools/rust.sh
- name: Make Rust Installer Executable
run: chmod +x ${{ github.workspace }}/tools/rust.sh
- name: Install Rust
run: ${{ github.workspace }}/tools/rust.sh -y
- name: Load Cargo Environment
run: source "$HOME/.cargo/env"
# Toml Files Don't Take Variables, So We Have To Hardcode The File
- name: Setup Config.toml
run: sed "s:\$WORKSPACE:${{ github.workspace }}:g" ${{ github.workspace }}/.cargo/config.toml.sample > ${{ github.workspace }}/.cargo/config.toml
# Ignore Modifying .cargo/config.toml
- name: Ignore Modifying ${{ github.workspace }}/.cargo/config.toml
run: |
cd ${{ github.workspace }}
git update-index --skip-worktree ${{ github.workspace }}/.cargo/config.toml
# Install Rust Stable Toolchains
- name: Set Rust To The Stable Toolchains
run: $HOME/.cargo/bin/rustup default stable
# Setup Rust Build Caching
- uses: Swatinem/rust-cache@v2
with:
shared-key: "windows-rust-gnu-x86_64"
# Add Build Targets
- name: Add x86_64 GNU Windows Build Target
run: $HOME/.cargo/bin/rustup target add x86_64-pc-windows-gnu
# Install Git Pre-Commit Hooks to Enforce Hooks
- name: Install Git Pre-Commit Hooks to Enforce Hooks
run: pip install pre-commit
# Check Pre-Commit Version
- name: Check Pre-Commit Version
run: pre-commit --version
# Install Pre-Commit Hooks
- name: Install Pre-Commit Hooks
run: pre-commit install
# Check Files with Pre-Commit Hooks
- name: Check Files with Pre-Commit Hooks
run: pre-commit run --all-files
# Extract/Import GPG Signing Key
- name: Extract GPG Signing Key
run: |
echo "${{ secrets.GPG_SIGNING_KEY }}" > $HOME/signing.gpg
gpg --import $HOME/signing.gpg
# Compile Program
- name: Build Engine Client/Server
run: |
# Sets the build timestamp to the current commit to make builds reproducible
export SOURCE_DATE_EPOCH="`git --no-pager log -1 --format="%at"`"
$HOME/.cargo/bin/cargo build --verbose --target=x86_64-pc-windows-gnu --release --bin catgirl-engine
# Compile Program
- name: Build Engine Server Only
run: |
# Sets the build timestamp to the current commit to make builds reproducible
export SOURCE_DATE_EPOCH="`git --no-pager log -1 --format="%at"`"
export CARGO_TARGET_DIR="${{ github.workspace }}/.server-target"
$HOME/.cargo/bin/cargo build --verbose --target=x86_64-pc-windows-gnu --release --bin catgirl-engine --no-default-features --features server,logging-subscriber
# Display Export Directory
- name: Display Git Staging
run: |
cd ${{ github.workspace }}
git status -v -s -b
# Display Export Directory
- name: Display Export Directory
run: ls -liallh ${{ github.workspace }}/target/x86_64-pc-windows-gnu/release
# Prepare Artifact Uploads
- name: Prepare Artifact Uploads (Client/Server)
run: |
mkdir -p ${{ github.workspace }}/upload/client-server
cp -a ${{ github.workspace }}/target/x86_64-pc-windows-gnu/release/*.exe ${{ github.workspace }}/upload/client-server
cp -a ${{ github.workspace }}/target/binding ${{ github.workspace }}/upload/client-server
cp -a ${{ github.workspace }}/client/assets ${{ github.workspace }}/upload/client-server
# Prepare Artifact Uploads
- name: Prepare Artifact Uploads (Server)
run: |
mkdir -p ${{ github.workspace }}/upload/server
cp -a ${{ github.workspace }}/.server-target/x86_64-pc-windows-gnu/release/catgirl-engine.exe ${{ github.workspace }}/upload/server/catgirl-engine-server.exe
cp -a ${{ github.workspace }}/.server-target/binding ${{ github.workspace }}/upload/server
# Sign Files
- name: Sign Files (Client/Server)
run: |
cd ${{ github.workspace }}/upload/client-server
find . -type f -not -name "checksums.sha512" -exec shasum -a 512 {} \; > checksums.sha512
gpg --sign checksums.sha512
# Sign Files
- name: Sign Files (Server)
run: |
cd ${{ github.workspace }}/upload/server
find . -type f -not -name "checksums.sha512" -exec shasum -a 512 {} \; > checksums.sha512
gpg --sign checksums.sha512
# Compress Files
- name: Compress Files (Client/Server)
run: |
export XZ_OPT=-e9
cd ${{ github.workspace }}/upload/client-server
tar cvJf ${{ github.workspace }}/upload/CatgirlEngine-Windows-x86_64-GNU.tar.xz .
# Compress Files
- name: Compress Files (Server)
run: |
export XZ_OPT=-e9
cd ${{ github.workspace }}/upload/server
tar cvJf ${{ github.workspace }}/upload/CatgirlEngine-Server-Windows-x86_64-GNU.tar.xz .
# Upload Engine
- name: Upload Engine (Release)
uses: actions/upload-artifact@v4
with:
name: CatgirlEngine-Windows-x86_64-GNU-Tar
path: ${{ github.workspace }}/upload/CatgirlEngine-Windows-x86_64-GNU.tar.xz
include-hidden-files: true
# Upload Engine
- name: Upload Engine (Release Server)
uses: actions/upload-artifact@v4
with:
name: CatgirlEngine-Server-Windows-x86_64-GNU-Tar
path: ${{ github.workspace }}/upload/CatgirlEngine-Server-Windows-x86_64-GNU.tar.xz
include-hidden-files: true
# List Environment
- name: List Environment
run: env
- name: List All Installed Packages
run: |
apt list --installed | wc -l
apt list --installed
- name: List All Files
run: find ${{ github.workspace }}
# Display Build Status
- name: 🍏 This job's status is ${{ job.status }}.
run: echo "🍏 This job's status is ${{ job.status }}."
deploy:
if: ${{ success() && (endsWith(github.event.head_commit.message, '--publish') || inputs.publish == 'yes') }}
needs: [Build]
runs-on: ubuntu-latest
environment: Windows
env:
BUTLER_API_KEY: ${{ secrets.ITCH_IO_API_KEY }}
GH_TOKEN: ${{ github.token }}
permissions:
# See https://docs.github.com/en/actions/using-jobs/assigning-permissions-to-jobs
# See https://docs.github.com/en/rest/overview/permissions-required-for-fine-grained-personal-access-tokens
contents: write
steps:
# Setup Build Environment
- name: 🎉 The job was automatically triggered by a ${{ github.event_name }} event.
run: echo "🎉 The job was automatically triggered by a ${{ github.event_name }} event."
- name: 🐧 This job is now running on a ${{ runner.os }} server hosted by GitHub!
run: echo "🐧 This job is now running on a ${{ runner.os }} server hosted by GitHub!"
- name: 🔎 The name of your branch is ${{ github.ref }} and your repository is ${{ github.repository }}.
run: echo "🔎 The name of your branch is ${{ github.ref }} and your repository is ${{ github.repository }}."
- name: Check out repository code
uses: actions/checkout@v4
with:
lfs: true
submodules: recursive
- name: 💡 The ${{ github.repository }} repository has been cloned to the runner.
run: echo "💡 The ${{ github.repository }} repository has been cloned to the runner."
# Install Dependencies
- name: Install and Cache APT Packages
uses: awalsh128/cache-apt-pkgs-action@latest
with:
packages: jq # coreutils gitsome
version: 1.0
execute_install_scripts: true
# Download Engine
- name: Download Engine (Release Client/Server)
uses: actions/download-artifact@v4
with:
name: CatgirlEngine-Windows-x86_64-GNU-Tar
path: ${{ github.workspace }}/artifacts
# Download Engine
- name: Download Engine (Release Server)
uses: actions/download-artifact@v4
with:
name: CatgirlEngine-Server-Windows-x86_64-GNU-Tar
path: ${{ github.workspace }}/artifacts
# Create Tag and Github Release
- name: 👩‍💻 Create Tag and Github Release
run: |
# TODO: Consider checking for -alpha and -beta to filter onto other packages
export VERSION=`cat ${{ github.workspace }}/Cargo.toml | grep '^version' | head -n1 | cut -d'"' -f2 | tr -d '\n'`
export VERSION_STRING="Catgirl Engine v$VERSION"
export BODY="Autogenerated Release From Github Actions..."
export DRAFT="false"
export PRERELEASE="false"
export LATEST="true"
export GENERATE_RELEASE_NOTES="true"
export BRANCH=`git branch --show-current --format="%s" | tr -d '\n'`
# export COMMIT=`git log -1 --oneline | cut -d' ' -f1 | tr -d '\n'`
gh api --method POST \
-H "Accept: application/vnd.github+json" \
-H "X-GitHub-Api-Version: 2022-11-28" \
/repos/${{ github.repository }}/releases \
-f tag_name="v$VERSION" \
-f target_commitish="$BRANCH" \
-f name="$VERSION_STRING" \
-f body="$BODY" \
-f make_latest="$LATEST" \
-F draft="$DRAFT" \
-F prerelease="$PRERELEASE" \
-F generate_release_notes="$GENERATE_RELEASE_NOTES" || echo "Already Exists"
# Publish to Github Release
- name: 👩‍💻 Publish to Github Release (Client/Server)
run: |
export VERSION=`cat ${{ github.workspace }}/Cargo.toml | grep '^version' | head -n1 | cut -d'"' -f2 | tr -d '\n'`
export ARTIFACT_PATH="${{ github.workspace }}/artifacts/CatgirlEngine-Windows-x86_64-GNU.tar.xz"
export DISPLAY_LABEL="Windows Tar (x86_64)"
gh release upload v$VERSION "$ARTIFACT_PATH"#"$DISPLAY_LABEL" -R ${{ github.repository }}
# Publish to Github Release (Server Only)
- name: 👩‍💻 Publish to Github Release (Server)
run: |
export VERSION=`cat ${{ github.workspace }}/Cargo.toml | grep '^version' | head -n1 | cut -d'"' -f2 | tr -d '\n'`
export ARTIFACT_PATH="${{ github.workspace }}/artifacts/CatgirlEngine-Server-Windows-x86_64-GNU.tar.xz"
export DISPLAY_LABEL="Windows Server Tar GLibc (x86_64)"
gh release upload v$VERSION "$ARTIFACT_PATH"#"$DISPLAY_LABEL" -R ${{ github.repository }}
# Install Butler (For Uploading to Itch.io)
- name: Install Butler (Upload to Itch.io)
run: |
# https://itch.io/docs/butler/pushing.html#channel-names
# Setup For Installation
mkdir -p ${{ github.workspace }}/tools/butler
# Install Butler
wget https://broth.itch.ovh/butler/linux-amd64/LATEST/archive/default -O ${{ github.workspace }}/butler-linux-amd64.zip
unzip ${{ github.workspace }}/butler-linux-amd64.zip -d ${{ github.workspace }}/tools/butler
# Publish to Itch.io
- name: 🎮 Publish to Itch.io
run: |
# Upload App
${{ github.workspace }}/tools/butler/butler push ${{ github.workspace }}/artifacts/CatgirlEngine-Windows-x86_64-GNU.tar.xz fomxgorl/catgirl-engine:windows-x86_64
${{ github.workspace }}/tools/butler/butler push ${{ github.workspace }}/artifacts/CatgirlEngine-Server-Windows-x86_64-GNU.tar.xz fomxgorl/catgirl-engine:windows-x86_64-server