Skip to content

Update build_and_release_all.yml #40

Update build_and_release_all.yml

Update build_and_release_all.yml #40

name: Build and Release OpenIPC Config App
permissions:
contents: write
actions: read
on:
workflow_dispatch:
push:
tags:
- 'release-v*' # Trigger for tags that start with 'v', e.g., v1.0.0, v2.1.3
# branches:
# - release-notes
jobs:
build:
runs-on: ${{ matrix.os }}
strategy:
matrix:
os: [macos-latest, windows-latest, ubuntu-latest]
arch: [x64, arm64]
# os: [ubuntu-latest]
# arch: [arm64]
# os: [ macos-latest ]
# arch: [arm64]
steps:
- name: Checkout repository
uses: actions/checkout@v3
- name: Setup .NET
uses: actions/setup-dotnet@v3
with:
dotnet-version: '8.0.x'
- name: Read Version from VERSION File
id: get_version
run: |
VERSION=${GITHUB_REF#refs/tags/}
VERSION=${VERSION#release-v} # Remove "release-v" prefix
echo "VERSION=$VERSION" >> $GITHUB_ENV
shell: bash
- name: Restore dependencies
run: dotnet restore OpenIPC_Config.Desktop/OpenIPC_Config.Desktop.csproj
- name: Build project
run: dotnet build OpenIPC_Config.Desktop/OpenIPC_Config.Desktop.csproj --configuration Release
- name: Run Tests
if: matrix.os == 'ubuntu-latest' && matrix.arch == 'x64'
run: dotnet test OpenIPC_Config.Tests/OpenIPC_Config.Tests.csproj --configuration Release --logger "trx;LogFileName=test-results.trx"
- name: Publish Project
run: |
if [[ "${{ runner.os }}" == "Windows" ]]; then
dotnet publish OpenIPC_Config.Desktop/OpenIPC_Config.Desktop.csproj -c Release -r win-x64 --self-contained
dotnet publish OpenIPC_Config.Desktop/OpenIPC_Config.Desktop.csproj -c Release -r win-arm64 --self-contained
elif [[ "${{ runner.os }}" == "macOS" ]]; then
dotnet publish OpenIPC_Config.Desktop/OpenIPC_Config.Desktop.csproj -c Release -r osx-x64 --self-contained
dotnet publish OpenIPC_Config.Desktop/OpenIPC_Config.Desktop.csproj -c Release -r osx-arm64 --self-contained
else
dotnet publish OpenIPC_Config.Desktop/OpenIPC_Config.Desktop.csproj -c Release -r linux-x64 --self-contained
dotnet publish OpenIPC_Config.Desktop/OpenIPC_Config.Desktop.csproj -c Release -r linux-arm64 --self-contained
fi
shell: bash
# Packaging macOS .app bundle
- name: Package macOS .app
if: matrix.os == 'macos-latest'
run: |
APP_NAME="OpenIPC_Config"
PUBLISH_DIR="./OpenIPC_Config.Desktop/bin/Release/net8.0/osx-${{ matrix.arch }}/publish"
APP_DIR="${APP_NAME}.app"
mkdir -p "${APP_DIR}/Contents/MacOS"
mkdir -p "${APP_DIR}/Contents/Resources"
cp -R "${PUBLISH_DIR}/"* "${APP_DIR}/Contents/MacOS/"
cp ./OpenIPC_Config/Assets/Icons/OpenIPC.icns "${APP_DIR}/Contents/Resources/${APP_NAME}.icns"
cat << EOF > "${APP_DIR}/Contents/Info.plist"
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleName</key>
<string>${APP_NAME}</string>
<key>CFBundleExecutable</key>
<string>${APP_NAME}.Desktop</string>
<key>CFBundleIdentifier</key>
<string>com.openipc.${APP_NAME}</string>
<key>CFBundleVersion</key>
<string>${{ env.VERSION }}</string>
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>LSMinimumSystemVersion</key>
<string>10.13</string>
<key>CFBundleIconFile</key>
<string>${APP_NAME}.icns</string>
</dict>
</plist>
EOF
chmod +x "${APP_DIR}/Contents/MacOS/${APP_NAME}.Desktop"
# - name: Debug Signature Before Signing
# if: matrix.os == 'macos-latest'
# run: codesign -dvvv OpenIPC_Config.app || echo "No signature found"
# - name: Import Signing Certificate
# if: matrix.os == 'macos-latest'
# env:
# APPLE_CERTIFICATE_PASSWORD: ${{ secrets.APPLE_CERTIFICATE_PASSWORD }}
# APPLE_CERTIFICATE: ${{ secrets.APPLE_CERTIFICATE }}
# run: |
# echo "$APPLE_CERTIFICATE" | base64 --decode > signing_certificate.p12
# ls -l signing_certificate.p12
# md5 signing_certificate.p12
# security import signing_certificate.p12 -P "$APPLE_CERTIFICATE_PASSWORD" -A
# security find-identity -p codesigning -v
# - name: Code Sign Nested Components
# if: matrix.os == 'macos-latest'
# run: |
# find OpenIPC_Config.app -type f -name "*.dll" -exec codesign --force --options runtime --sign "Developer ID Application: Mike Carr (EQKLR945TW)" {} \;
# codesign --force --options runtime --deep --sign "Developer ID Application: Mike Carr (EQKLR945TW)" OpenIPC_Config.app
# - name: Remove Quarantine Flag (macOS only)
# if: matrix.os == 'macos-latest'
# run: xattr -cr OpenIPC_Config.app
# Linux Icon and Packaging
- name: Set up Icon and .desktop file
if: matrix.os == 'ubuntu-latest'
run: |
APP_NAME="OpenIPC-Config"
PUBLISH_DIR="./OpenIPC_Config.Desktop/bin/Release/net8.0/linux-x64/publish"
ICON_PATH="${PUBLISH_DIR}/Assets/OpenIPC.png"
DESKTOP_FILE="${PUBLISH_DIR}/${APP_NAME}.desktop"
# Ensure the icon is in the publish directory
cp ./OpenIPC_Config/Assets/Icons/OpenIPC.png "$ICON_PATH"
# Create .desktop file
cat << EOF > "$DESKTOP_FILE"
[Desktop Entry]
Name=OpenIPC Config
Exec=$PUBLISH_DIR/OpenIPC-Config.Desktop
Icon=$ICON_PATH
Type=Application
Terminal=false
Categories=Utility;
EOF
# Windows Icon and Packaging
- name: Set Windows Icon and Package
if: matrix.os == 'windows-latest'
shell: pwsh
run: |
$PUBLISH_DIR = "./OpenIPC_Config.Desktop/bin/Release/net8.0/win-${{ matrix.arch }}/publish"
$ICON_PATH = "./OpenIPC_Config/Assets/Icons/OpenIPC.ico"
# Install rcedit to modify the Windows executable icon
choco install rcedit -y
rcedit "$PUBLISH_DIR/OpenIPC_Config.Desktop.exe" --set-icon "$ICON_PATH"
# Zip the Windows build
Compress-Archive -Path "$PUBLISH_DIR\*" -DestinationPath "OpenIPC-Config-windows-${{ matrix.arch }}.zip"
env:
DOTNET_ROOT: C:\Program Files\dotnet
VERSION: 0.0.1
- name: Zip .app Bundle for MacOS and Linux
run: |
echo "Runner OS: ${{ runner.os }}"
if [[ "${{ runner.os }}" == "macOS" ]]; then
DMG_NAME="OpenIPC-Config-macos-${{ matrix.arch }}.dmg"
APP_NAME="OpenIPC_Config.app"
BUILD_DIR="OpenIPC-Config-macos-${{ matrix.arch }}-dmg-build"
# Create a temporary folder for the .dmg contents
mkdir -p "${BUILD_DIR}"
cp -R "${APP_NAME}" "${BUILD_DIR}/"
# Create an alias to the Applications folder
ln -s /Applications "${BUILD_DIR}/Applications"
# Create the .dmg with the Applications alias
hdiutil create -volname "OpenIPC Config" -srcfolder "${BUILD_DIR}" -ov -format UDZO "${DMG_NAME}"
# Clean up the temporary build folder
rm -rf "${BUILD_DIR}"
elif [[ "${{ runner.os }}" == "Linux" ]]; then
mkdir -p OpenIPC-Config-linux-${{ matrix.arch }}
cp -r ./OpenIPC_Config.Desktop/bin/Release/net8.0/linux-${{ matrix.arch }}/publish/* OpenIPC-Config-linux-${{ matrix.arch }}/
zip -r OpenIPC-Config-linux-${{ matrix.arch }}.zip OpenIPC-Config-linux-${{ matrix.arch }}
echo "directory created"
ls -al
# zip -r OpenIPC-Config-linux-${{ matrix.arch }}.zip ./OpenIPC_Config.Desktop/bin/Release/net8.0/linux-${{ matrix.arch }}/publish/*
fi
shell: bash
# Upload Artifacts
- name: Upload macOS Artifact
if: matrix.os == 'macos-latest'
uses: actions/upload-artifact@v4
with:
name: OpenIPC-Config-macos-${{ matrix.arch }}.dmg
path: OpenIPC-Config-macos-${{ matrix.arch }}.dmg
- name: Upload Windows Artifact
if: matrix.os == 'windows-latest'
uses: actions/upload-artifact@v4
with:
name: OpenIPC-Config-windows-${{ matrix.arch }}
path: OpenIPC-Config-windows-${{ matrix.arch }}.zip
- name: Upload Ubuntu Artifact
if: matrix.os == 'ubuntu-latest'
uses: actions/upload-artifact@v4
with:
name: OpenIPC-Config-linux-${{ matrix.arch }}
path: OpenIPC-Config-linux-${{ matrix.arch }}.zip
release:
runs-on: ubuntu-latest
needs: build
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Read Version from VERSION File
id: get_version
run: |
#VERSION=$(cat VERSION)
VERSION=${GITHUB_REF#refs/tags/}
echo "VERSION=$VERSION" >> $GITHUB_ENV
shell: bash
- name: Download All Artifacts
uses: actions/download-artifact@v4
with:
path: .
- name: List Downloaded Files
run: ls -R .
- name: Generate latest.json
run: |
cat << EOF > latest.json
{
"version": "${{ env.VERSION }}",
"release_notes": "This is a dynamically generated release note. Update as needed.",
"download_url": "https://github.com/${{ github.repository }}/releases/"
}
EOF
- name: Create GitHub Release and Upload Assets
uses: softprops/action-gh-release@v1
if: startsWith(github.ref, 'refs/tags/')
with:
draft: true
generate_release_notes: true
files: |
./OpenIPC-Config-*/OpenIPC-Config-*.zip
./OpenIPC-Config-*/OpenIPC-Config-*.dmg
./latest.json