diff --git a/.CI/build-installer.ps1 b/.CI/build-installer.ps1 new file mode 100644 index 000000000..1d897e208 --- /dev/null +++ b/.CI/build-installer.ps1 @@ -0,0 +1,47 @@ +if (-not (Test-Path -PathType Container Chatterino2)) { + Write-Error "Couldn't find a folder called 'Chatterino2' in the current directory."; + exit 1 +} + +# Check if we're on a tag +$OldErrorActionPref = $ErrorActionPreference; +$ErrorActionPreference = 'Continue'; +git describe --exact-match --match 'v*' *> $null; +$isTagged = $?; +$ErrorActionPreference = $OldErrorActionPref; + +$defines = $null; +if ($isTagged) { + # This is a release. + # Make sure, any existing `modes` file is overwritten for the user, + # for example when updating from nightly to stable. + Write-Output "" > Chatterino2/modes; + $installerBaseName = "Chatterino.Installer"; +} +else { + Write-Output nightly > Chatterino2/modes; + $defines = "/DIS_NIGHTLY=1"; + $installerBaseName = "Chatterino.Nightly.Installer"; +} + +if ($Env:GITHUB_OUTPUT) { + # This is used in CI when creating the artifact + "C2_INSTALLER_BASE_NAME=$installerBaseName" >> "$Env:GITHUB_OUTPUT" +} + +# Copy vc_redist.x64.exe +if ($null -eq $Env:VCToolsRedistDir) { + Write-Error "VCToolsRedistDir is not set. Forgot to set Visual Studio environment variables?"; + exit 1 +} +Copy-Item "$Env:VCToolsRedistDir\vc_redist.x64.exe" .; + +# Build the installer +ISCC ` + /DWORKING_DIR="$($pwd.Path)\" ` + /DINSTALLER_BASE_NAME="$installerBaseName" ` + $defines ` + /O. ` + "$PSScriptRoot\chatterino-installer.iss"; + +Move-Item "$installerBaseName.exe" "$installerBaseName$($Env:VARIANT_SUFFIX).exe" diff --git a/.CI/chatterino-installer.iss b/.CI/chatterino-installer.iss new file mode 100644 index 000000000..108775536 --- /dev/null +++ b/.CI/chatterino-installer.iss @@ -0,0 +1,87 @@ +; Script generated by the Inno Setup Script Wizard. +; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES! + +#define MyAppName "Chatterino" +#define MyAppVersion "2.4.4" +#define MyAppPublisher "Chatterino Team" +#define MyAppURL "https://www.chatterino.com" +#define MyAppExeName "chatterino.exe" + +; used in build-installer.ps1 +; if set, must end in a backslash +#ifndef WORKING_DIR +#define WORKING_DIR "" +#endif + +[Setup] +; NOTE: The value of AppId uniquely identifies this application. Do not use the same AppId value in installers for other applications. +; (To generate a new GUID, click Tools | Generate GUID inside the IDE.) +AppId={{F5FE6614-04D4-4D32-8600-0ABA0AC113A4} +AppName={#MyAppName} +AppVersion={#MyAppVersion} +VersionInfoVersion={#MyAppVersion} +AppVerName={#MyAppName} {#MyAppVersion} +AppPublisher={#MyAppPublisher} +AppPublisherURL={#MyAppURL} +AppSupportURL={#MyAppURL} +AppUpdatesURL={#MyAppURL} +DefaultDirName={autopf}\{#MyAppName} +DisableProgramGroupPage=yes +ArchitecturesInstallIn64BitMode=x64 +;Uncomment the following line to run in non administrative install mode (install for current user only.) +;PrivilegesRequired=lowest +PrivilegesRequiredOverridesAllowed=dialog +OutputDir=out +; This is defined by the build-installer.ps1 script, +; but kept optional for regular use. +#ifdef INSTALLER_BASE_NAME +OutputBaseFilename={#INSTALLER_BASE_NAME} +#else +OutputBaseFilename=Chatterino.Installer +#endif +Compression=lzma +SolidCompression=yes +WizardStyle=modern +UsePreviousTasks=no +UninstallDisplayIcon={app}\{#MyAppExeName} +RestartIfNeededByRun=no + +[Languages] +Name: "english"; MessagesFile: "compiler:Default.isl" + +#ifdef IS_NIGHTLY +[Messages] +SetupAppTitle=Setup (Nightly) +SetupWindowTitle=Setup - %1 (Nightly) +#endif + +[Tasks] +Name: "vcredist"; Description: "Install the required Visual C++ 2015/2017/2019/2022 Redistributable"; +; GroupDescription: "{cm:AdditionalIcons}"; +Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; Flags: unchecked +Name: "freshinstall"; Description: "Fresh install (delete old settings/logs)"; Flags: unchecked + +[Files] +Source: "{#WORKING_DIR}Chatterino2\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs +Source: "{#WORKING_DIR}vc_redist.x64.exe"; DestDir: "{tmp}"; Tasks: vcredist; +; NOTE: Don't use "Flags: ignoreversion" on any shared system files + +[Icons] +Name: "{autoprograms}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}" +Name: "{autodesktop}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; Tasks: desktopicon + +[Run] +; VC++ redistributable +Filename: {tmp}\vc_redist.x64.exe; Parameters: "/install /passive /norestart"; StatusMsg: "Installing 64-bit Windows Universal Runtime..."; Flags: waituntilterminated; Tasks: vcredist +; Run chatterino +Filename: "{app}\{#MyAppExeName}"; Description: "{cm:LaunchProgram,{#StringChange(MyAppName, '&', '&&')}}"; Flags: nowait postinstall skipifsilent + +[InstallDelete] +; Delete cache on install +Type: filesandordirs; Name: "{userappdata}\Chatterino2\Cache" +; Delete %appdata%\Chatterino2 on freshinstall +Type: filesandordirs; Name: "{userappdata}\Chatterino2"; Tasks: freshinstall + +[UninstallDelete] +; Delete cache on uninstall +Type: filesandordirs; Name: "{userappdata}\Chatterino2\Cache" diff --git a/.github/workflows/create-installer.yml b/.github/workflows/create-installer.yml new file mode 100644 index 000000000..cf7bf19e7 --- /dev/null +++ b/.github/workflows/create-installer.yml @@ -0,0 +1,56 @@ +name: Create installer + +on: + workflow_run: + workflows: ["Build"] + types: [completed] + # make sure this only runs on the default branch + branches: [master] + workflow_dispatch: + +jobs: + create-installer: + runs-on: windows-latest + # Only run manually or when a build succeeds + if: ${{ github.event_name == 'workflow_dispatch' || github.event.workflow_run.conclusion == 'success' }} + strategy: + matrix: + qt-version: [5.15.2, 6.5.0] + env: + VARIANT_SUFFIX: ${{ startsWith(matrix.qt-version, '6.') && '.EXPERIMENTAL-Qt6' || '' }} + steps: + - uses: actions/checkout@v3 + with: + fetch-depth: 0 # allows for tags access + + - name: Download artifact + uses: dawidd6/action-download-artifact@v2 + with: + workflow: build.yml + name: chatterino-windows-x86-64-Qt-${{ matrix.qt-version }}.zip + path: build/ + + - name: Unzip + run: 7z e -spf chatterino-windows-x86-64-Qt-${{ matrix.qt-version }}.zip + working-directory: build + + - name: Install InnoSetup + run: choco install innosetup + + - name: Add InnoSetup to path + run: echo "C:\Program Files (x86)\Inno Setup 6\" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append + + - name: Enable Developer Command Prompt + uses: ilammy/msvc-dev-cmd@v1.12.1 + + - name: Build installer + id: build-installer + working-directory: build + run: ..\.CI\build-installer.ps1 + shell: powershell + + - name: Upload installer + uses: actions/upload-artifact@v3 + with: + path: build/${{ steps.build-installer.outputs.C2_INSTALLER_BASE_NAME }}${{ env.VARIANT_SUFFIX }}.exe + name: ${{ steps.build-installer.outputs.C2_INSTALLER_BASE_NAME }}${{ env.VARIANT_SUFFIX }}.exe diff --git a/CHANGELOG.md b/CHANGELOG.md index dbab15e59..20356cae3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -50,6 +50,7 @@ - Dev: Moved preprocessor Git and date definitions to executables only. (#4681) - Dev: Refactored tests to be able to use `ctest` and run in debug builds. (#4700) - Dev: Added the ability to use an alternate linker using the `-DUSE_ALTERNATE_LINKER=...` CMake parameter. (#4711) +- Dev: The Windows installer is now built in CI. (#4408) - Dev: Removed `getApp` and `getSettings` calls from message rendering. (#4535) ## 2.4.4 diff --git a/docs/make-release.md b/docs/make-release.md index 84cd96c3e..2cea79618 100644 --- a/docs/make-release.md +++ b/docs/make-release.md @@ -5,6 +5,7 @@ This can only be "whole versions", so if you're releasing `2.4.0-beta` you'll need to condense it to `2.4.0` - [ ] Updated version code in `resources/com.chatterino.chatterino.appdata.xml` This cannot use dash to denote a pre-release identifier, you have to use a tilde instead. +- [ ] Updated version code in `.CI/chatterino-installer.iss` - [ ] Update the changelog `## Unreleased` section to the new version `CHANGELOG.md` Make sure to leave the `## Unreleased` line unchanged for easier merges - [ ] Push directly to master :tf: