Files
git/.github/workflows/git-artifacts.yml
Johannes Schindelin 7bab8c28d8 Merge pull request #3076 from dennisameling/git-credential-manager-core-arm64
git-artifacts: add workaround for GCM Core on ARM64
2021-06-02 10:13:48 +02:00

519 lines
21 KiB
YAML

name: git-artifacts
on:
# This workflow can be triggered manually in the Actions tab, see
# https://github.blog/changelog/2020-07-06-github-actions-manual-triggers-with-workflow_dispatch/
workflow_dispatch:
inputs:
build_only:
description: 'Optionally restrict what artifacts to build'
required: false
ref:
description: 'Optionally override which branch to build'
required: false
repository:
description: 'Optionally override from where to fetch the specified ref'
required: false
env:
GPG_OPTIONS: "--batch --yes --no-tty --list-options no-show-photos --verify-options no-show-photos --pinentry-mode loopback"
HOME: "${{github.workspace}}\\home"
MSYSTEM: MINGW64
USERPROFILE: "${{github.workspace}}\\home"
BUILD_ONLY: "${{github.event.inputs.build_only}}"
REPOSITORY: "${{github.event.inputs.repository}}"
REF: "${{github.event.inputs.ref}}"
jobs:
bundle-artifacts:
runs-on: windows-latest
outputs:
latest-sdk64-extra-build-id: ${{ steps.determine-latest-sdk64-extra-build-id.outputs.id }}
steps:
- name: Configure user
shell: bash
run:
USER_NAME="${{github.actor}}" &&
USER_EMAIL="${{github.actor}}@users.noreply.github.com" &&
mkdir "$HOME" &&
git config --global user.name "$USER_NAME" &&
git config --global user.email "$USER_EMAIL" &&
echo "PACKAGER=$USER_NAME <$USER_EMAIL>" >>$GITHUB_ENV
- uses: git-for-windows/setup-git-for-windows-sdk@v0
with:
flavor: build-installers
- name: Clone build-extra
shell: bash
run: |
d=/usr/src/build-extra &&
if test ! -d $d/.git
then
git clone --single-branch -b main https://github.com/git-for-windows/build-extra $d
else
git -C $d fetch https://github.com/git-for-windows/build-extra main &&
git -C $d switch -C main FETCH_HEAD
fi
- name: Prepare home directory for GPG signing
if: env.GPGKEY != ''
shell: bash
run: |
echo '${{secrets.PRIVGPGKEY}}' | tr % '\n' | gpg $GPG_OPTIONS --import &&
mkdir -p home &&
git config --global gpg.program "/usr/src/build-extra/gnupg-with-gpgkey.sh" &&
info="$(gpg --list-keys --with-colons "${GPGKEY%% *}" | cut -d : -f 1,10 | sed -n '/^uid/{s|uid:||p;q}')" &&
git config --global user.name "${info% <*}" &&
git config --global user.email "<${info#*<}"
env:
GPGKEY: ${{secrets.GPGKEY}}
- name: Generate bundle artifacts
env:
GPGKEY: ${{secrets.GPGKEY}}
shell: bash
run: |
printf '#!/bin/sh\n\nexec /mingw64/bin/git.exe "$@"\n' >/usr/bin/git &&
mkdir -p bundle-artifacts &&
{ test -n "$REPOSITORY" || REPOSITORY='${{github.repository}}'; } &&
{ test -n "$REF" || REF='${{github.ref}}'; } &&
git -c init.defaultBranch=main init --bare &&
git remote add -f origin https://github.com/git-for-windows/git &&
git fetch "https://github.com/$REPOSITORY" "$REF:$REF" &&
tag_name="$(git describe --match 'v[0-9]*' FETCH_HEAD)-$(date +%Y%m%d%H%M%S)" &&
echo "prerelease-${tag_name#v}" >bundle-artifacts/ver &&
echo "${tag_name#v}" >bundle-artifacts/display_version &&
echo "$tag_name" >bundle-artifacts/next_version &&
git tag $(test -z "$GPGKEY" || echo " -s") -m "Snapshot build" "$tag_name" FETCH_HEAD &&
git bundle create bundle-artifacts/git.bundle origin/main.."$tag_name" &&
sh -x /usr/src/build-extra/please.sh mention feature "Snapshot of $(git show -s --pretty='tformat:%h (%s, %ad)' --date=short FETCH_HEAD)" &&
git -C /usr/src/build-extra bundle create "$PWD/bundle-artifacts/build-extra.bundle" origin/main..main
- name: Clean up temporary files
if: always()
shell: bash
run: rm -rf home
- name: 'Publish Pipeline Artifact: bundle-artifacts'
uses: actions/upload-artifact@v1
with:
name: bundle-artifacts
path: bundle-artifacts
pkg:
runs-on: windows-latest
needs: bundle-artifacts
outputs:
latest-sdk64-extra-build-id: ${{ needs.bundle-artifacts.outputs.latest-sdk64-extra-build-id }}
strategy:
matrix:
arch:
- name: x86_64
bitness: 64
bin: /amd64
- name: i686
bitness: 32
bin: ''
steps:
- name: Determine whether this job should be skipped
shell: bash
run: |
for e in ${BUILD_ONLY:-pkg}
do
case $e in
*-${{matrix.arch.name}}) exit 0;; # build this artifact
*-arm64) test i686 != ${{matrix.arch.name}} || exit 0;; # pkg-i686 is required for the ARM64 version
*-*) ;; # not this build artifact, keep looking
*) exit 0;; # build this artifact
esac
done
echo "SKIP=true" >>$GITHUB_ENV
- name: Configure user
if: env.SKIP != 'true'
shell: bash
run:
USER_NAME="${{github.actor}}" &&
USER_EMAIL="${{github.actor}}@users.noreply.github.com" &&
mkdir "$HOME" &&
git config --global user.name "$USER_NAME" &&
git config --global user.email "$USER_EMAIL" &&
echo "PACKAGER=$USER_NAME <$USER_EMAIL>" >>$GITHUB_ENV
- uses: git-for-windows/setup-git-for-windows-sdk@v0
if: env.SKIP != 'true'
with:
flavor: build-installers
- name: Download bundle-artifacts
if: env.SKIP != 'true'
uses: actions/download-artifact@v1
with:
name: bundle-artifacts
path: bundle-artifacts
- name: Clone and update build-extra
if: env.SKIP != 'true'
shell: bash
run: |
d=/usr/src/build-extra &&
if test ! -d $d/.git
then
git clone --single-branch -b main https://github.com/git-for-windows/build-extra $d
else
git -C $d fetch https://github.com/git-for-windows/build-extra main &&
git -C $d switch -C main FETCH_HEAD
fi &&
git -C $d pull "$PWD"/bundle-artifacts/build-extra.bundle main
- name: Check out git/git
if: env.SKIP != 'true'
shell: bash
run: |
git -c init.defaultBranch=main init &&
git remote add -f origin https://github.com/git-for-windows/git &&
git fetch --tags bundle-artifacts/git.bundle $(cat bundle-artifacts/next_version) &&
git reset --hard $(cat bundle-artifacts/next_version)
- name: Prepare home directory for code-signing
env:
CODESIGN_P12: ${{secrets.CODESIGN_P12}}
CODESIGN_PASS: ${{secrets.CODESIGN_PASS}}
if: env.SKIP != 'true' && env.CODESIGN_P12 != '' && env.CODESIGN_PASS != ''
shell: bash
run: |
cd home &&
mkdir -p .sig &&
echo -n "$CODESIGN_P12" | tr % '\n' | base64 -d >.sig/codesign.p12 &&
echo -n "$CODESIGN_PASS" >.sig/codesign.pass
git config --global alias.signtool '!sh "/usr/src/build-extra/signtool.sh"'
- name: Prepare home directory for GPG signing
if: env.SKIP != 'true' && env.GPGKEY != ''
shell: bash
run: |
echo '${{secrets.PRIVGPGKEY}}' | tr % '\n' | gpg $GPG_OPTIONS --import &&
info="$(gpg --list-keys --with-colons "${GPGKEY%% *}" | cut -d : -f 1,10 | sed -n '/^uid/{s|uid:||p;q}')" &&
git config --global user.name "${info% <*}" &&
git config --global user.email "<${info#*<}"
env:
GPGKEY: ${{secrets.GPGKEY}}
- name: Build mingw-w64-${{matrix.arch.name}}-git
if: env.SKIP != 'true'
env:
GPGKEY: "${{secrets.GPGKEY}}"
shell: bash
run: |
set -x
# Make sure that there is a `/usr/bin/git` that can be used by `makepkg-mingw`
printf '#!/bin/sh\n\nexec /mingw64/bin/git.exe "$@"\n' >/usr/bin/git &&
# Restrict `PATH` to MSYS2 and to Visual Studio (to let `cv2pdb` find the relevant DLLs)
PATH="/mingw64/bin:/usr/bin:/C/Program Files (x86)/Microsoft Visual Studio 14.0/VC/bin${{matrix.arch.bin}}:/C/Windows/system32"
type -p mspdb140.dll || exit 1
sh -x /usr/src/build-extra/please.sh build-mingw-w64-git --only-${{matrix.arch.bitness}}-bit --build-src-pkg -o artifacts HEAD &&
cp bundle-artifacts/ver artifacts/ &&
if test -n "$GPGKEY"
then
for tar in artifacts/*.tar*
do
/usr/src/build-extra/gnupg-with-gpgkey.sh --detach-sign --no-armor $tar
done
fi &&
b=$PWD/artifacts &&
version=$(cat bundle-artifacts/next_version) &&
(cd /usr/src/MINGW-packages/mingw-w64-git &&
cp PKGBUILD.$version PKGBUILD &&
git commit -s -m "mingw-w64-git: new version ($version)" PKGBUILD &&
git bundle create "$b"/MINGW-packages.bundle origin/main..main)
- name: Clean up temporary files
if: always() && env.SKIP != 'true'
shell: bash
run: rm -rf home
- name: Publish mingw-w64-${{matrix.arch.name}}-git
if: env.SKIP != 'true'
uses: actions/upload-artifact@v1
with:
name: pkg-${{matrix.arch.name}}
path: artifacts
build-arm64:
needs: bundle-artifacts
runs-on: windows-latest
steps:
- name: Determine whether this job should be skipped
shell: bash
run: |
for e in ${BUILD_ONLY:-pkg}
do
case $e in
*-arm64) exit 0;; # build this artifact
*-*) ;; # not this build artifact, keep looking
*) exit 0;; # build this artifact
esac
done
echo "SKIP=true" >>$GITHUB_ENV
- name: Configure user
if: env.SKIP != 'true'
shell: bash
run:
USER_NAME="${{github.actor}}" &&
USER_EMAIL="${{github.actor}}@users.noreply.github.com" &&
mkdir -p "$HOME" &&
git config --global user.name "$USER_NAME" &&
git config --global user.email "$USER_EMAIL"
- name: Download bundle-artifacts
if: env.SKIP != 'true'
uses: actions/download-artifact@v1
with:
name: bundle-artifacts
path: bundle-artifacts
- name: Check out git/git
if: env.SKIP != 'true'
shell: bash
run: |
git -c init.defaultBranch=main init &&
git remote add -f origin https://github.com/git-for-windows/git &&
git fetch --tags bundle-artifacts/git.bundle $(cat bundle-artifacts/next_version) &&
git reset --hard $(cat bundle-artifacts/next_version)
- name: initialize vcpkg
if: env.SKIP != 'true'
uses: actions/checkout@v2
with:
repository: 'microsoft/vcpkg'
path: 'compat/vcbuild/vcpkg'
- name: download vcpkg artifacts
if: env.SKIP != 'true'
uses: git-for-windows/get-azure-pipelines-artifact@v0
with:
repository: git/git
definitionId: 9
- name: add msbuild to PATH
if: env.SKIP != 'true'
uses: microsoft/setup-msbuild@v1
- name: copy dlls to root
if: env.SKIP != 'true'
shell: powershell
run: |
& compat\vcbuild\vcpkg_copy_dlls.bat release arm64-windows
if (!$?) { exit(1) }
- name: generate Visual Studio solution
if: env.SKIP != 'true'
shell: bash
run: |
cmake `pwd`/contrib/buildsystems/ -DCMAKE_PREFIX_PATH=`pwd`/compat/vcbuild/vcpkg/installed/arm64-windows \
-DNO_GETTEXT=YesPlease -DPERL_TESTS=OFF -DPYTHON_TESTS=OFF -DCURL_NO_CURL_CMAKE=ON -DCMAKE_GENERATOR_PLATFORM=arm64 -DVCPKG_ARCH=arm64-windows \
-DCMAKE_INSTALL_PREFIX="`pwd`/git-arm64" -DSKIP_DASHED_BUILT_INS=ON
- name: MSBuild
if: env.SKIP != 'true'
run: msbuild git.sln -property:Configuration=Release
- name: Link the Git executables
if: env.SKIP != 'true'
run: msbuild INSTALL.vcxproj -property:Configuration=Release
- name: upload build artifacts
if: env.SKIP != 'true'
uses: actions/upload-artifact@v1
with:
name: arm64-artifacts
path: ./git-arm64
artifacts:
runs-on: windows-latest
needs: [pkg, build-arm64]
strategy:
matrix:
artifact:
- name: installer
fileprefix: Git
fileextension: exe
- name: portable
fileprefix: PortableGit
fileextension: exe
- name: archive
fileprefix: Git
fileextension: tar.bz2
- name: mingit
fileprefix: MinGit
fileextension: zip
- name: mingit-busybox
fileprefix: MinGit
fileextension: zip
arch:
- name: x86_64
bitness: 64
arm64: false
- name: i686
bitness: 32
arm64: false
- name: i686
bitness: 32
arm64: true
fail-fast: false
env:
MSYSTEM: MINGW${{matrix.arch.bitness}}
steps:
- name: Determine whether this job should be skipped
shell: bash
run: |
suffix=${{matrix.arch.name}}
if test true = ${{matrix.arch.arm64}}
then
suffix=arm64
fi
case " $BUILD_ONLY " in
' ') ;; # not set; build all
*" ${{matrix.artifact.name}} "*|*" ${{matrix.artifact.name}}-$suffix "*) ;; # build this artifact
*) echo "SKIP=true" >>$GITHUB_ENV;;
esac
- name: Download pkg-${{matrix.arch.name}}
if: env.SKIP != 'true'
uses: actions/download-artifact@v1
with:
name: pkg-${{matrix.arch.name}}
path: pkg-${{matrix.arch.name}}
- name: Download bundle-artifacts
if: env.SKIP != 'true'
uses: actions/download-artifact@v1
with:
name: bundle-artifacts
path: bundle-artifacts
- uses: git-for-windows/setup-git-for-windows-sdk@v0
if: env.SKIP != 'true' && matrix.arch.bitness == '64'
with:
flavor: build-installers
- uses: git-for-windows/setup-git-for-windows-sdk@v0
if: env.SKIP != 'true' && matrix.arch.bitness == '32'
with:
flavor: build-installers
architecture: i686
- name: Download arm64 artifact
if: env.SKIP != 'true' && matrix.arch.arm64 == true
uses: actions/download-artifact@v1
with:
name: arm64-artifacts
path: ${{github.workspace}}/arm64
# Workaround for Git Credential Manager Core on ARM64: https://github.com/git-for-windows/git/issues/3015
- name: Create git-credential-manager-core wrapper for ARM64
if: env.SKIP != 'true' && matrix.arch.arm64 == true
shell: bash
run: |
printf '%s\n' '#!/bin/sh' 'exec /mingw32/libexec/git-core/git-credential-manager-core.exe "$@"' > arm64/libexec/git-core/git-credential-manager-core
chmod +x arm64/libexec/git-core/git-credential-manager-core
- name: Clone and update build-extra
if: env.SKIP != 'true'
shell: bash
run: |
d=/usr/src/build-extra &&
if test ! -d $d/.git
then
git clone --single-branch -b main https://github.com/git-for-windows/build-extra $d
else
git -C $d fetch https://github.com/git-for-windows/build-extra main &&
git -C $d switch -C main FETCH_HEAD
fi &&
git -C $d pull "$PWD"/bundle-artifacts/build-extra.bundle main
- name: Prepare home directory for code-signing
env:
CODESIGN_P12: ${{secrets.CODESIGN_P12}}
CODESIGN_PASS: ${{secrets.CODESIGN_PASS}}
if: env.SKIP != 'true' && (matrix.artifact.name == 'installer' || matrix.artifact.name == 'portable') && env.CODESIGN_P12 != '' && env.CODESIGN_PASS != ''
shell: bash
run: |
mkdir -p home/.sig &&
echo -n "$CODESIGN_P12" | tr % '\n' | base64 -d >home/.sig/codesign.p12 &&
echo -n "$CODESIGN_PASS" >home/.sig/codesign.pass &&
git config --global alias.signtool '!sh "/usr/src/build-extra/signtool.sh"'
- name: Build ${{matrix.arch.bitness}}-bit ${{matrix.artifact.name}}
if: env.SKIP != 'true'
shell: bash
run: |
set -x
if test "${{matrix.arch.arm64}}" = true
then
ARM64="--include-arm64-artifacts=\"$PWD/arm64\""
else
ARM64=
fi
eval /usr/src/build-extra/please.sh make_installers_from_mingw_w64_git $ARM64 --version=$(cat pkg-${{matrix.arch.name}}/ver) -o artifacts --${{matrix.artifact.name}} --pkg=pkg-${{matrix.arch.name}}/mingw-w64-${{matrix.arch.name}}-git-[0-9]*.tar.xz --pkg=pkg-${{matrix.arch.name}}/mingw-w64-${{matrix.arch.name}}-git-doc-html-[0-9]*.tar.xz &&
if test portable = '${{matrix.artifact.name}}' && test -n "$(git config alias.signtool)"
then
git signtool artifacts/PortableGit-*.exe
fi &&
openssl dgst -sha256 artifacts/${{matrix.artifact.fileprefix}}-*.${{matrix.artifact.fileextension}} | sed "s/.* //" >artifacts/sha-256.txt
- name: Copy package-versions and pdbs
if: env.SKIP != 'true' && matrix.artifact.name == 'installer'
shell: bash
run: |
cp /usr/src/build-extra/installer/package-versions.txt artifacts/ &&
a=$PWD/artifacts &&
p=$PWD/pkg-${{matrix.arch.name}} &&
(cd /usr/src/build-extra &&
mkdir -p cached-source-packages &&
cp "$p"/*-pdb* cached-source-packages/ &&
GIT_CONFIG_PARAMETERS="'windows.sdk${{matrix.arch.bitness}}.path='" ./please.sh bundle_pdbs --arch=${{matrix.arch.name}} --directory="$a" installer/package-versions.txt)
- name: Clean up temporary files
if: always() && env.SKIP != 'true'
shell: bash
run: rm -rf home
- name: Publish ${{matrix.artifact.name}}-${{matrix.arch.name}}
if: env.SKIP != 'true' && matrix.arch.arm64 != true
uses: actions/upload-artifact@v1
with:
name: ${{matrix.artifact.name}}-${{matrix.arch.name}}
path: artifacts
- name: Publish ${{matrix.artifact.name}}-arm64
if: env.SKIP != 'true' && matrix.arch.arm64 == true
uses: actions/upload-artifact@v1
with:
name: ${{matrix.artifact.name}}-arm64
path: artifacts
nuget:
runs-on: windows-latest
needs: pkg
steps:
- name: Determine whether this job should be skipped
shell: bash
run: |
case " $BUILD_ONLY " in
' ') ;; # not set; build all
*" nuget "*) ;; # build this artifact
*) echo "SKIP=true" >>$GITHUB_ENV;;
esac
- name: Download pkg-x86_64
if: env.SKIP != 'true'
uses: actions/download-artifact@v1
with:
name: pkg-x86_64
path: pkg-x86_64
- name: Download bundle-artifacts
if: env.SKIP != 'true'
uses: actions/download-artifact@v1
with:
name: bundle-artifacts
path: bundle-artifacts
- uses: git-for-windows/setup-git-for-windows-sdk@v0
if: env.SKIP != 'true'
with:
flavor: build-installers
- name: Clone and update build-extra
if: env.SKIP != 'true'
shell: bash
run: |
d=/usr/src/build-extra &&
if test ! -d $d/.git
then
git clone --single-branch -b main https://github.com/git-for-windows/build-extra $d
else
git -C $d fetch https://github.com/git-for-windows/build-extra main &&
git -C $d switch -C main FETCH_HEAD
fi &&
git -C $d pull "$PWD"/bundle-artifacts/build-extra.bundle main
- uses: nuget/setup-nuget@v1
if: env.SKIP != 'true'
- name: Build 64-bit NuGet packages
if: env.SKIP != 'true'
shell: bash
run: |
/usr/src/build-extra/please.sh make_installers_from_mingw_w64_git --version=$(cat pkg-x86_64/ver) -o artifacts --nuget --pkg=pkg-x86_64/mingw-w64-x86_64-git-[0-9]*.tar.xz --pkg=pkg-x86_64/mingw-w64-x86_64-git-doc-html-[0-9]*.tar.xz &&
/usr/src/build-extra/please.sh make_installers_from_mingw_w64_git --version=$(cat pkg-x86_64/ver) -o artifacts --nuget-mingit &&
openssl dgst -sha256 artifacts/Git*.nupkg | sed "s/.* //" >artifacts/sha-256.txt
- name: Publish nuget-x86_64
if: env.SKIP != 'true'
uses: actions/upload-artifact@v1
with:
name: nuget-x86_64
path: artifacts