Skip to content

Don't accept invalid certificates when signing for production #144

Don't accept invalid certificates when signing for production

Don't accept invalid certificates when signing for production #144

Workflow file for this run

name: Build
on:
pull_request:
paths:
- .github/workflows/build.yml
- build-exe/**
push:
branches:
- main
tags-ignore:
- "**"
paths:
- .github/workflows/build.yml
- build-exe/**
workflow_dispatch:
inputs:
sign:
description: Sign binaries
type: choice
options:
- 'no'
- test
- production
default: test
env:
CLDR_VERSION: 45
ICONV_VERSION: 1.17
# The version slug of libiconv; leave empty to use the latest
# See https://translationproject.org/domain/libiconv.html
ICONV_TP_VERSION: ''
GETTEXT_VERSION: 0.22.5a
# The version slug of gettext; leave empty to use the latest
# See https://translationproject.org/domain/gettext-examples.html
# See https://translationproject.org/domain/gettext-runtime.html
# See https://translationproject.org/domain/gettext-tools.html
GETTEXT_TP_VERSION: ''
# To be used for testing: we'll only build iconv
#BUILD_ONLY_ICONV: y
jobs:
exe:
name: ${{ matrix.bits}}-bit ${{ matrix.link }} executables
runs-on: windows-2022
strategy:
matrix:
bits:
- 32
- 64
link:
- shared
- static
env:
CYGWIN_NOWINPATH: 1
CHERE_INVOKING: 1
defaults:
run:
shell: C:\cygwin\bin\bash.exe --login -o igncr -o errexit -o pipefail {0}
steps:
-
name: Configure git
shell: cmd
run: git config --global core.autocrlf input
-
name: Checkout
uses: actions/checkout@v4
-
name: Restore cache
id: restore-cache
uses: actions/cache/restore@v4
with:
key: build-exe-${{ matrix.link }}-${{ matrix.bits }}
path: |
src\downloads
C:\cygwin-packages
-
name: Set variables
id: vars
shell: pwsh
run: ./build-exe/vars.ps1 -Bits ${{ matrix.bits }} -Link ${{ matrix.link }} -InstalledPath installed -Sign '${{ github.event.inputs.sign }}'
-
name: Download Cygwin installer
shell: pwsh
run: Invoke-WebRequest -Uri https://cygwin.com/setup-x86_64.exe -OutFile C:\CygwinInstaller.exe
-
name: Install Cygwin
shell: cmd
run: >
C:\CygwinInstaller.exe
--root C:\cygwin
--local-package-dir C:\cygwin-packages
--packages ${{ steps.vars.outputs.cygwin-packages }}
--site http://mirrors.kernel.org/sourceware/cygwin/
--only-site
--quiet-mode
--upgrade-also
--no-shortcuts
--no-admin
-
name: Setup Cygwin environment
run: |
PATH='${{ steps.vars.outputs.cygwin-path }}'
cd -- "$(cygpath -ua '${{ github.workspace }}')"
mkdir -p src/downloads
mkdir -p installed/bin
mkdir -p installed/include
mkdir -p installed/lib
mkdir files-unsigned
mkdir files-signed
mkdir installer-unsigned
mkdir installer-signed
cp build-exe/license-for-distribution.txt installed/license.txt
mkdir -p "$HOME"
printf '\nPATH=${{ steps.vars.outputs.cygwin-path }}\nexport PATH\n' >>$HOME/.bash_profile
-
name: Dump Cygwin environment
run: |
printf 'Current working directory: %s\n' "$(pwd)"
echo 'PATH contains:'
IFS=:
for p in $PATH; do
printf -- '- %s\n' "$p"
done
-
name: Install apt-cyg
run: |
wget --output-document=/usr/bin/apt-cyg https://raw.githubusercontent.com/transcode-open/apt-cyg/refs/tags/v1/apt-cyg
chmod +x /usr/bin/apt-cyg
-
name: Download CLDR
if: env.BUILD_ONLY_ICONV != 'y'
working-directory: src\downloads
shell: pwsh
run: |
if (Test-Path -LiteralPath "cldr-$env:CLDR_VERSION.zip" -PathType Leaf) {
Write-Host -Object 'Already downloaded'
} else {
Invoke-WebRequest -Uri "https://unicode.org/Public/cldr/$env:CLDR_VERSION/core.zip" -OutFile "cldr-$env:CLDR_VERSION.zip"
Write-Host -Object 'Downloaded'
}
-
name: Download iconv
working-directory: src\downloads
shell: pwsh
run: |
if (Test-Path -LiteralPath "libiconv-$env:ICONV_VERSION.tar.gz" -PathType Leaf) {
Write-Host -Object 'Already downloaded'
} else {
Invoke-WebRequest -Uri "${{ steps.vars.outputs.iconv-source-url }}" -OutFile "libiconv-$env:ICONV_VERSION.tar.gz"
Write-Host -Object 'Downloaded'
}
-
name: Download gettext
if: env.BUILD_ONLY_ICONV != 'y'
working-directory: src\downloads
shell: pwsh
run: |
if (Test-Path -LiteralPath "gettext-$env:GETTEXT_VERSION.tar.gz" -PathType Leaf) {
Write-Host -Object 'Already downloaded'
} else {
Invoke-WebRequest -Uri "${{ steps.vars.outputs.gettext-source-url }}" -OutFile "gettext-$env:GETTEXT_VERSION.tar.gz"
Write-Host -Object 'Downloaded'
}
-
name: Extract CLDR
if: env.BUILD_ONLY_ICONV != 'y'
run: |
unzip -p src/downloads/cldr-$CLDR_VERSION.zip LICENSE > installed/license-cldr.txt
mkdir -p installed/lib/gettext/common/supplemental
unzip -p src/downloads/cldr-$CLDR_VERSION.zip common/supplemental/plurals.xml >installed/lib/gettext/common/supplemental/plurals.xml
-
name: Extract iconv
run: |
tar x -C src -z -f src/downloads/libiconv-$ICONV_VERSION.tar.gz
cp src/libiconv-$ICONV_VERSION/COPYING installed/license-iconv.txt
-
name: Extract gettext
if: env.BUILD_ONLY_ICONV != 'y'
run: |
tar x -C src -z -f src/downloads/gettext-$GETTEXT_VERSION.tar.gz
cp src/gettext-$GETTEXT_VERSION/COPYING installed/license-gettext.txt
-
name: Install gettext-develop
run: apt-cyg install libgomp1 gettext-devel
-
name: Update iconv translations
working-directory: src\libiconv-${{ env.ICONV_VERSION }}
run: ../../build-exe/update-po-files.sh po po/libiconv.pot libiconv '${{ env.ICONV_TP_VERSION }}'
-
name: Update gettext-examples translations
if: env.BUILD_ONLY_ICONV != 'y'
working-directory: src\gettext-${{ env.GETTEXT_VERSION }}
run: ../../build-exe/update-po-files.sh gettext-tools/examples/po gettext-tools/examples/po/gettext-examples.pot gettext-examples '${{ env.GETTEXT_TP_VERSION }}'
-
name: Update gettext-runtime translations
if: env.BUILD_ONLY_ICONV != 'y'
working-directory: src\gettext-${{ env.GETTEXT_VERSION }}
run: ../../build-exe/update-po-files.sh gettext-runtime/po gettext-runtime/po/gettext-runtime.pot gettext-runtime '${{ env.GETTEXT_TP_VERSION }}'
-
name: Update gettext-tools translations
if: env.BUILD_ONLY_ICONV != 'y'
working-directory: src\gettext-${{ env.GETTEXT_VERSION }}
run: ../../build-exe/update-po-files.sh gettext-tools/po gettext-tools/po/gettext-tools.pot gettext-tools '${{ env.GETTEXT_TP_VERSION }}'
-
name: Uninstall gettext-develop
run: apt-cyg remove gettext-devel libgomp1
-
name: Configure iconv (1st time)
id: iconv-configure
working-directory: src\libiconv-${{ env.ICONV_VERSION }}
run: |
mkdir build
cd build
../configure ${{ steps.vars.outputs.configure-args }}
-
name: Compile iconv (1st time)
working-directory: src\libiconv-${{ env.ICONV_VERSION }}\build
run: make --jobs=$(nproc)
-
name: Check iconv (1st time)
if: env.BUILD_ONLY_ICONV != 'y'
working-directory: src\libiconv-${{ env.ICONV_VERSION }}\build
run: make --jobs=$(nproc) check
-
name: Install iconv (1st time)
working-directory: src\libiconv-${{ env.ICONV_VERSION }}\build
run: make --jobs=$(nproc) install-strip
-
name: Configure gettext
if: env.BUILD_ONLY_ICONV != 'y'
id: gettext-configure
working-directory: src\gettext-${{ env.GETTEXT_VERSION }}
run: |
mkdir build
cd build
../configure ${{ steps.vars.outputs.configure-args }} \
--disable-java \
--disable-native-java \
--disable-csharp \
--disable-openmp \
--disable-curses \
--without-emacs \
--with-included-libxml \
--without-bzip2 \
--without-xz
-
name: Ignore gettext C tests
if: env.BUILD_ONLY_ICONV != 'y' && steps.vars.outputs.gettext-ignore-tests-c
working-directory: src\gettext-${{ env.GETTEXT_VERSION }}
run: for f in ${{ steps.vars.outputs.gettext-ignore-tests-c }}; do echo 'int main() { return 0; }' >$f; done
-
name: Compile gettext/gnulib-local
if: env.BUILD_ONLY_ICONV != 'y'
working-directory: src\gettext-${{ env.GETTEXT_VERSION }}\build\gnulib-local
run: make --jobs=$(nproc)
-
name: Check gettext/gnulib-local
if: env.BUILD_ONLY_ICONV != 'y'
working-directory: src\gettext-${{ env.GETTEXT_VERSION }}\build\gnulib-local
run: make --jobs=$(nproc) check
-
name: Install gettext/gnulib-local
if: env.BUILD_ONLY_ICONV != 'y'
working-directory: src\gettext-${{ env.GETTEXT_VERSION }}\build\gnulib-local
run: make --jobs=$(nproc) install-strip
-
name: Compile gettext/gettext-runtime
if: env.BUILD_ONLY_ICONV != 'y'
working-directory: src\gettext-${{ env.GETTEXT_VERSION }}\build\gettext-runtime
run: make --jobs=$(nproc)
-
name: Check gettext/gettext-runtime
if: env.BUILD_ONLY_ICONV != 'y'
working-directory: src\gettext-${{ env.GETTEXT_VERSION }}\build\gettext-runtime
run: make --jobs=$(nproc) check
-
name: Install gettext/gettext-runtime
if: env.BUILD_ONLY_ICONV != 'y'
working-directory: src\gettext-${{ env.GETTEXT_VERSION }}\build\gettext-runtime
run: make --jobs=$(nproc) install-strip
-
name: Compile gettext/libtextstyle
if: env.BUILD_ONLY_ICONV != 'y'
working-directory: src\gettext-${{ env.GETTEXT_VERSION }}\build\libtextstyle
run: make --jobs=$(nproc)
-
name: Check gettext/libtextstyle
if: env.BUILD_ONLY_ICONV != 'y'
working-directory: src\gettext-${{ env.GETTEXT_VERSION }}\build\libtextstyle
run: make --jobs=$(nproc) check
-
name: Install gettext/libtextstyle
if: env.BUILD_ONLY_ICONV != 'y'
working-directory: src\gettext-${{ env.GETTEXT_VERSION }}\build\libtextstyle
run: make --jobs=$(nproc) install-strip
-
name: Compile gettext/gettext-tools
if: env.BUILD_ONLY_ICONV != 'y'
working-directory: src\gettext-${{ env.GETTEXT_VERSION }}\build\gettext-tools
run: make --jobs=$(nproc)
-
name: Check gettext/gettext-tools
if: env.BUILD_ONLY_ICONV != 'y'
working-directory: src\gettext-${{ env.GETTEXT_VERSION }}\build\gettext-tools
run: XFAIL_TESTS='${{ steps.vars.outputs.gettext-xfail-gettext-tools }}' make --jobs=$(nproc) check
-
name: Install gettext/gettext-tools
if: env.BUILD_ONLY_ICONV != 'y'
working-directory: src\gettext-${{ env.GETTEXT_VERSION }}\build\gettext-tools
run: make --jobs=$(nproc) install-strip
-
# We need to rebuild iconv because it depends on gettext's libintl in order to be localizable
name: Configure iconv (2nd time)
if: env.BUILD_ONLY_ICONV != 'y'
working-directory: src\libiconv-${{ env.ICONV_VERSION }}
run: |
rm -rf build
mkdir build
cd build
../configure ${{ steps.vars.outputs.configure-args }} \
--enable-extra-encodings
-
name: Compile iconv (2nd time)
if: env.BUILD_ONLY_ICONV != 'y'
working-directory: src\libiconv-${{ env.ICONV_VERSION }}\build
run: make --jobs=$(nproc)
-
name: Check iconv (2nd time)
if: env.BUILD_ONLY_ICONV != 'y'
working-directory: src\libiconv-${{ env.ICONV_VERSION }}\build
run: make --jobs=$(nproc) check
-
name: Install iconv (2nd time)
if: env.BUILD_ONLY_ICONV != 'y'
working-directory: src\libiconv-${{ env.ICONV_VERSION }}\build
run: make --jobs=$(nproc) install-strip
-
name: Prepare build log
id: prepare-build-log
if: (success() || failure()) && steps.iconv-configure.outcome == 'success'
run: |
mkdir build-log
if [ -d src/libiconv-$ICONV_VERSION/build ]; then
tar c -J -f build-log/iconv.tar.xz src/libiconv-$ICONV_VERSION/build
fi
if [ -d src/gettext-$GETTEXT_VERSION/build ]; then
tar c -J -f build-log/gettext.tar.xz src/gettext-$GETTEXT_VERSION/build
fi
if find installed -mindepth 1 -maxdepth 1 | read; then
tar c -J -f build-log/installed.tar.xz installed
fi
ls -al build-log
-
name: Copy built assets
run: ./build-exe/create-output.sh installed files-unsigned ${{ steps.vars.outputs.mingw-host }}-strip
-
name: Delete install directory
run: rm -rf installed
-
name: Process dependencies
shell: pwsh
run: >
./build-exe/process-dependencies.ps1
-Bits ${{ matrix.bits }}
-Link ${{ matrix.link }}
-Path files-unsigned
-MinGWPath C:\cygwin\usr\${{ steps.vars.outputs.mingw-host }}
-
name: Check bitness
run: ./build-exe/check-bits.sh ${{ matrix.bits }} files-unsigned
-
name: Check if iconv program load translations correctly
if: env.BUILD_ONLY_ICONV != 'y'
shell: pwsh
run: |
$env:LANGUAGE = 'it'
$stdout = & .\files-unsigned\bin\iconv.exe --help
if (-not($?)) {
throw "iconv.exe failed"
}
$stdout = $stdout -join "`n"
if (!$stdout.Contains('formato di input')) {
throw "iconv.exe didn't load the translations.`nIts output is:`n$stdout"
}
Write-Host "iconv.exe correctly loaded the translations when LANGUAGE=$env:LANGUAGE`nIts localized output is`n$stdout"
-
name: Check if gettext programs load translations correctly
if: env.BUILD_ONLY_ICONV != 'y'
shell: pwsh
run: |
$env:LANGUAGE = 'it'
$stdout = & .\files-unsigned\bin\xgettext.exe --help
if (-not($?)) {
throw "xgettext.exe failed"
}
$stdout = $stdout -join "`n"
if (!$stdout.Contains('impostazione predefinita')) {
throw "xgettext.exe didn't load the translations.`nIts output is:`n$stdout"
}
Write-Host "xgettext.exe correctly loaded the translations when LANGUAGE=$env:LANGUAGE`nIts localized output is`n$stdout"
-
name: Upload unsigned files
if: steps.vars.outputs.signpath-signing-policy
id: upload-files-unsigned
uses: actions/upload-artifact@v4
with:
name: ${{ matrix.link }}-${{ matrix.bits }}-files-unsigned
path: files-unsigned
if-no-files-found: error
retention-days: 1
-
name: Sign files
if: steps.vars.outputs.signpath-signing-policy
id: sign-files
uses: signpath/github-action-submit-signing-request@v1
with:
api-token: '${{ secrets.SIGNPATH_API_TOKEN }}'
organization-id: 98c3accc-92c9-4962-b150-ff1f5c6356b8
project-slug: gettext-iconv-windows
signing-policy-slug: '${{ steps.vars.outputs.signpath-signing-policy }}'
artifact-configuration-slug: gh_sigh_files
github-artifact-id: ${{ steps.upload-files-unsigned.outputs.artifact-id }}
wait-for-completion: true
output-artifact-directory: files-signed
parameters: |
iconvPEVersion: "${{ env.ICONV_VERSION }}"
gettextPEVersion: "${{ env.GETTEXT_VERSION }}"
gettextPEVersionNumeric: "${{ steps.vars.outputs.gettext-peversion-numeric }}"
-
name: Check signatures
if: steps.vars.outputs.signpath-signing-policy
shell: pwsh
run: >
./build-exe/check-signature.ps1
-Path files-signed
-CanBeInvalid ${{ steps.vars.outputs.signatures-canbeinvalid }}
-
name: Create files archive
shell: pwsh
run: |
if ('${{ steps.vars.outputs.signpath-signing-policy }}') {
Set-Location -LiteralPath 'files-signed'
} else {
Set-Location -LiteralPath 'files-unsigned'
}
& 7z.exe a -bd -bt -mx9 -r -sse -tzip ..\gettext${{ env.GETTEXT_VERSION }}-iconv${{ env.ICONV_VERSION }}-${{ matrix.link }}-${{ matrix.bits }}.zip
-
name: Upload files archive
uses: actions/upload-artifact@v4
with:
name: ${{ matrix.link }}-${{ matrix.bits }}-files
path: gettext${{ env.GETTEXT_VERSION }}-iconv${{ env.ICONV_VERSION }}-${{ matrix.link }}-${{ matrix.bits }}.zip
if-no-files-found: error
compression-level: 0
-
name: Prepare installer files
run: |
if [ -n '${{ steps.vars.outputs.signpath-signing-policy }}' ]; then
mv files-signed installer-files
else
mv files-unsigned installer-files
fi
-
name: Create installer
shell: pwsh
run: >
./build-exe/create-installer.ps1
-Bits ${{ matrix.bits }}
-Link ${{ matrix.link }}
-SourceDirectory installer-files
-OutputDirectory installer-unsigned
-
name: Check bitness
run: ./build-exe/check-bits.sh 32 installer-unsigned/gettext${{ env.GETTEXT_VERSION }}-iconv${{ env.ICONV_VERSION }}-${{ matrix.link }}-${{ matrix.bits }}.exe
-
name: Upload unsigned installer
if: steps.vars.outputs.signpath-signing-policy
id: upload-installer-unsigned
uses: actions/upload-artifact@v4
with:
name: ${{ matrix.link }}-${{ matrix.bits }}-installer-unsigned
path: installer-unsigned\gettext${{ env.GETTEXT_VERSION }}-iconv${{ env.ICONV_VERSION }}-${{ matrix.link }}-${{ matrix.bits }}.exe
if-no-files-found: error
compression-level: 0
retention-days: 1
-
name: Sign installer
if: steps.vars.outputs.signpath-signing-policy
id: sign-installer
uses: signpath/github-action-submit-signing-request@v1
with:
api-token: '${{ secrets.SIGNPATH_API_TOKEN }}'
organization-id: 98c3accc-92c9-4962-b150-ff1f5c6356b8
project-slug: gettext-iconv-windows
signing-policy-slug: '${{ steps.vars.outputs.signpath-signing-policy }}'
artifact-configuration-slug: gh_sigh_installer
github-artifact-id: ${{ steps.upload-installer-unsigned.outputs.artifact-id }}
wait-for-completion: true
output-artifact-directory: installer-signed
-
name: Check signature
if: steps.vars.outputs.signpath-signing-policy
shell: pwsh
run: >
./build-exe/check-signature.ps1
-Path installer-signed
-CanBeInvalid ${{ steps.vars.outputs.signatures-canbeinvalid }}
-
name: Move installer
run: |
if [ -n '${{ steps.vars.outputs.signpath-signing-policy }}' ]; then
mv installer-signed/*.exe .
else
mv installer-unsigned/*.exe .
fi
-
name: Upload installer
uses: actions/upload-artifact@v4
with:
name: ${{ matrix.link }}-${{ matrix.bits }}-installer
path: gettext${{ env.GETTEXT_VERSION }}-iconv${{ env.ICONV_VERSION }}-${{ matrix.link }}-${{ matrix.bits }}.exe
if-no-files-found: error
compression-level: 0
-
name: Upload build log
if: always() && steps.prepare-build-log.outcome == 'success'
uses: actions/upload-artifact@v4
with:
name: ${{ matrix.link }}-${{ matrix.bits }}-log
if-no-files-found: ignore
retention-days: 1
include-hidden-files: true
compression-level: 0
path: build-log
-
name: Persist cache
if: always() && steps.restore-cache.outputs.cache-hit != 'true'
uses: actions/cache/save@v4
with:
key: ${{ steps.restore-cache.outputs.cache-primary-key }}
path: |
src\downloads
C:\cygwin-packages