diff --git a/.gitea/workflows/windows-build.yml b/.gitea/workflows/windows-build.yml new file mode 100644 index 0000000..8388b2a --- /dev/null +++ b/.gitea/workflows/windows-build.yml @@ -0,0 +1,94 @@ +name: Build Windows EXE + +on: + push: + branches: + - "**" + +jobs: + build-windows: + runs-on: ubuntu-latest + + steps: + - name: Check out repository + uses: actions/checkout@v4 + with: + submodules: recursive + + - name: Install dependencies + run: | + sudo apt-get update + sudo apt-get install -y mingw-w64 cmake ninja-build curl jq + + - name: Create MinGW toolchain + run: | + cat > mingw-toolchain.cmake <<'EOF' + set(CMAKE_SYSTEM_NAME Windows) + set(CMAKE_SYSTEM_PROCESSOR x86_64) + set(CMAKE_C_COMPILER x86_64-w64-mingw32-gcc) + set(CMAKE_CXX_COMPILER x86_64-w64-mingw32-g++) + set(CMAKE_RC_COMPILER x86_64-w64-mingw32-windres) + set(CMAKE_FIND_ROOT_PATH /usr/x86_64-w64-mingw32) + set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) + set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) + set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) + EOF + + - name: Configure Windows release build + run: | + cmake -S . -B build-win -G Ninja \ + -DCMAKE_TOOLCHAIN_FILE=mingw-toolchain.cmake \ + -DCMAKE_BUILD_TYPE=Release + + - name: Build Windows executable + run: cmake --build build-win --parallel + + - name: Prepare artifact + run: | + mkdir -p dist + cp build-win/bin/gitree.exe dist/Gitree-windows-x64.exe + + - name: Upload Windows build + uses: actions/upload-artifact@v3 + with: + name: Gitree-windows-x64 + path: dist/Gitree-windows-x64.exe + if-no-files-found: error + + - name: Create prod release + if: ${{ gitea.ref_name == 'prod' }} + env: + GITEA_TOKEN: ${{ secrets.GITEA_TOKEN }} + GITEA_SERVER_URL: ${{ gitea.server_url }} + GITEA_REPOSITORY: ${{ gitea.repository }} + GITEA_SHA: ${{ gitea.sha }} + GITEA_RUN_NUMBER: ${{ gitea.run_number }} + run: | + if [ -z "$GITEA_TOKEN" ]; then + echo "The repository secret GITEA_TOKEN is required to publish prod releases." + exit 1 + fi + + short_sha="$(printf '%s' "$GITEA_SHA" | cut -c1-7)" + tag="prod-${GITEA_RUN_NUMBER}-${short_sha}" + api="${GITEA_SERVER_URL%/}/api/v1/repos/${GITEA_REPOSITORY}" + + payload="$(jq -n \ + --arg tag "$tag" \ + --arg sha "$GITEA_SHA" \ + --arg name "Gitree ${tag}" \ + '{tag_name: $tag, target_commitish: $sha, name: $name, body: "Automated Windows release from the prod branch.", draft: false, prerelease: false}')" + + release="$(curl --fail-with-body --silent --show-error \ + -X POST \ + -H "Authorization: token ${GITEA_TOKEN}" \ + -H "Content-Type: application/json" \ + --data "$payload" \ + "${api}/releases")" + release_id="$(printf '%s' "$release" | jq -er '.id')" + + curl --fail-with-body --silent --show-error \ + -X POST \ + -H "Authorization: token ${GITEA_TOKEN}" \ + -F "attachment=@dist/Gitree-windows-x64.exe" \ + "${api}/releases/${release_id}/assets?name=Gitree-windows-x64.exe"