Build git-artifacts (aarch64) #6
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
name: git-artifacts | |
run-name: Build git-artifacts (${{ inputs.architecture }}) | |
on: | |
workflow_dispatch: | |
inputs: | |
artifacts: | |
description: 'Optionally restrict what artifacts to build (portable, installer, etc.). Separate artifacts with spaces' | |
required: false | |
architecture: | |
type: choice | |
description: 'Architecture to build' | |
required: true | |
options: | |
- x86_64 | |
- i686 | |
- aarch64 | |
tag_git_workflow_run_id: | |
description: 'Workflow run ID of the tag-git pipeline' | |
required: false | |
existing_git_tag: | |
description: 'Existing tag to build from. Requires tag_git_workflow_run_id to be empty' | |
required: false | |
build_extra_rev_for_existing_git_tag: | |
description: 'build-extra revision to use if building from an existing Git tag. Required if existing_git_tag is non-empty' | |
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" | |
USERPROFILE: "${{github.workspace}}\\home" | |
ARTIFACTS_TO_BUILD: "${{github.event.inputs.artifacts}}" | |
ARCHITECTURE: "${{github.event.inputs.architecture}}" | |
OWNER: git-for-windows | |
REPO: git | |
TAG_GIT_WORKFLOW_RUN_ID: "${{github.event.inputs.tag_git_workflow_run_id}}" | |
EXISTING_GIT_TAG: "${{github.event.inputs.existing_git_tag}}" | |
BUILD_EXTRA_REV_FOR_EXISTING_GIT_TAG: "${{github.event.inputs.build_extra_rev_for_existing_git_tag}}" | |
defaults: | |
run: | |
shell: bash | |
jobs: | |
pkg: | |
runs-on: ${{ github.event.inputs.architecture == 'aarch64' && fromJSON('["Windows", "ARM64"]') || 'windows-latest' }} | |
outputs: | |
artifact_matrix: ${{steps.artifact-build-matrix.outputs.matrix}} | |
msystem: ${{steps.configure-environment.outputs.MSYSTEM}} | |
mingw_package_prefix: ${{steps.configure-environment.outputs.MINGW_PACKAGE_PREFIX}} | |
sdk_repo_arch: ${{steps.configure-environment.outputs.SDK_REPO_ARCH}} | |
steps: | |
- name: clone git-for-windows-automation | |
uses: actions/checkout@v4 | |
- name: Construct bundle-artifacts from existing tag | |
if: env.EXISTING_GIT_TAG != '' | |
run: | | |
die () { | |
echo "$*" >&2 | |
exit 1 | |
} | |
test -z "$TAG_GIT_WORKFLOW_RUN_ID" || | |
die 'existing_git_tag cannot be used with tag_git_workflow_run_id!' | |
test -n "$BUILD_EXTRA_REV_FOR_EXISTING_GIT_TAG" || | |
die 'existing_git_tag needs build_extra_rev_for_existing_git_tag!' | |
set -o pipefail && | |
mkdir -p bundle-artifacts && | |
echo "$EXISTING_GIT_TAG" >bundle-artifacts/next_version && | |
echo "$EXISTING_GIT_TAG" | | |
sed -n '/^v[0-9]\+\.[0-9]\+\.[0-9]\+\.windows\.[0-9]\+$/{s/^v//;s/\.windows\.1//;s/\.windows\.\(.*\)/(\1)/;p}' \ | |
>bundle-artifacts/display_version && | |
sed 's/(\(.*\))$/.\1/' <bundle-artifacts/display_version >bundle-artifacts/ver && | |
echo "GIT_VERSION=$EXISTING_GIT_TAG" >> $GITHUB_ENV && | |
git fetch --depth 1 --filter blob:none https://github.com/$OWNER/$REPO "refs/tags/$EXISTING_GIT_TAG:refs/tags/$EXISTING_GIT_TAG" && | |
echo "GIT_REV=$(git rev-parse --verify "refs/tags/$EXISTING_GIT_TAG"^0)" >>$GITHUB_ENV | |
- name: wait if workflow run has not finished yet | |
if: env.TAG_GIT_WORKFLOW_RUN_ID != '' | |
uses: actions/github-script@v7 | |
with: | |
script: | | |
const { waitForWorkflowRunToFinish } = require('./workflow-runs') | |
await waitForWorkflowRunToFinish( | |
console, | |
'${{ secrets.GITHUB_TOKEN }}', | |
context.repo.owner, | |
context.repo.repo, | |
process.env.TAG_GIT_WORKFLOW_RUN_ID | |
) | |
- name: Get bundle-artifacts download URL | |
uses: actions/github-script@v7 | |
if: env.TAG_GIT_WORKFLOW_RUN_ID != '' | |
id: get-bundle-artifacts-url | |
with: | |
script: | | |
if (process.env.EXISTING_GIT_TAG || process.env.BUILD_EXTRA_REV_FOR_EXISTING_GIT_TAG) { | |
throw new Error('tag_git_workflow_run_id cannot be used with existing_git_tag or build_extra_rev_for_existing_git_tag!') | |
} | |
const getDownloadURL = require('./get-workflow-run-artifact') | |
const workflowRunId = process.env.TAG_GIT_WORKFLOW_RUN_ID | |
core.info('Getting download URL for bundle-artifacts...') | |
const downloadURL = await getDownloadURL(github, context.repo.owner, context.repo.repo, workflowRunId, 'bundle-artifacts') | |
core.info(`Successfully got download URL. It expires after 1 minute: ${downloadURL}`) | |
core.setOutput('download-url', downloadURL) | |
- name: Download bundle-artifacts zip | |
if: env.TAG_GIT_WORKFLOW_RUN_ID != '' | |
run: | | |
mkdir bundle-artifacts | |
curl -o bundle-artifacts.zip "${{steps.get-bundle-artifacts-url.outputs.download-url}}" | |
unzip bundle-artifacts.zip -d bundle-artifacts | |
echo "GIT_VERSION=$(cat bundle-artifacts/next_version)" >> $GITHUB_ENV | |
echo "GIT_REV=$(cat bundle-artifacts/git-commit-oid)" >>$GITHUB_ENV | |
- name: Re-publish bundle-artifacts so the next job can easily use it | |
uses: actions/upload-artifact@v4 | |
with: | |
name: bundle-artifacts | |
path: bundle-artifacts | |
- name: Configure environment | |
id: configure-environment | |
run: | | |
case "$ARCHITECTURE" in | |
x86_64) | |
MSYSTEM=MINGW64 | |
MINGW_PREFIX=/mingw64 | |
MINGW_PACKAGE_PREFIX=mingw-w64-x86_64 | |
SDK_REPO_ARCH=64 | |
;; | |
i686) | |
MSYSTEM=MINGW32 | |
MINGW_PREFIX=/mingw32 | |
MINGW_PACKAGE_PREFIX=mingw-w64-i686 | |
SDK_REPO_ARCH=32 | |
;; | |
aarch64) | |
MSYSTEM=CLANGARM64 | |
MINGW_PREFIX=/clangarm64 | |
MINGW_PACKAGE_PREFIX=mingw-w64-clang-aarch64 | |
SDK_REPO_ARCH=arm64 | |
;; | |
*) | |
echo "Unhandled architecture: $ARCHITECTURE" | |
exit 1 | |
;; | |
esac | |
echo "MSYSTEM=$MSYSTEM" >> $GITHUB_ENV | |
echo "MSYSTEM=$MSYSTEM" >> $GITHUB_OUTPUT | |
echo "MINGW_PREFIX=$MINGW_PREFIX" >> $GITHUB_ENV | |
echo "MINGW_PACKAGE_PREFIX=$MINGW_PACKAGE_PREFIX" >> $GITHUB_ENV | |
echo "MINGW_PACKAGE_PREFIX=$MINGW_PACKAGE_PREFIX" >> $GITHUB_OUTPUT | |
echo "SDK_REPO_ARCH=$SDK_REPO_ARCH" >> $GITHUB_OUTPUT | |
test -n "$ARTIFACTS_TO_BUILD" || { | |
ARTIFACTS_TO_BUILD="installer portable archive mingit" | |
test "$ARCHITECTURE" = aarch64 || ARTIFACTS_TO_BUILD="$ARTIFACTS_TO_BUILD mingit-busybox" | |
test "$ARCHITECTURE" != x86_64 || ARTIFACTS_TO_BUILD="$ARTIFACTS_TO_BUILD nuget" | |
} | |
echo "ARTIFACTS_TO_BUILD=$ARTIFACTS_TO_BUILD" >> $GITHUB_ENV | |
- name: Configure user | |
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@v1 | |
with: | |
flavor: full | |
architecture: ${{env.architecture}} | |
- name: Create artifact build matrix | |
uses: actions/github-script@v7 | |
id: artifact-build-matrix | |
with: | |
script: | | |
core.info('Preparing artifact build matrix...') | |
const createArtifactsMatrix = require('./create-artifacts-matrix') | |
try { | |
const output = createArtifactsMatrix(process.env.ARTIFACTS_TO_BUILD, process.env.ARCHITECTURE) | |
core.info(`Will be using the following matrix: ${JSON.stringify(output)}`) | |
core.setOutput('matrix', output) | |
} catch (e) { | |
core.setFailed(e.message) | |
} | |
- name: Restore ${{env.MINGW_PACKAGE_PREFIX}}-git, if cached | |
id: restore-cached-git-pkg | |
uses: actions/cache/restore@v4 | |
with: | |
path: artifacts | |
key: pkg-${{env.GIT_VERSION}}-${{env.ARCHITECTURE}}-${{env.TAG_GIT_WORKFLOW_RUN_ID}} | |
- name: Clone and update build-extra | |
if: steps.restore-cached-git-pkg.outputs.cache-hit != 'true' | |
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 && | |
if test -z "$BUILD_EXTRA_REV_FOR_EXISTING_GIT_TAG" | |
then | |
git -C $d -c pull.rebase=false pull "$PWD"/bundle-artifacts/build-extra.bundle main | |
else | |
git -C $d fetch origin "$BUILD_EXTRA_REV_FOR_EXISTING_GIT_TAG" && | |
git -C $d reset --hard "$BUILD_EXTRA_REV_FOR_EXISTING_GIT_TAG" | |
fi | |
- name: Prepare git-for-windows/git clone with the tag | |
if: steps.restore-cached-git-pkg.outputs.cache-hit != 'true' | |
run: | | |
if test ! -d /usr/src/MINGW-packages | |
then | |
git clone --depth 1 --single-branch -b main \ | |
https://github.com/git-for-windows/MINGW-packages /usr/src/MINGW-packages | |
fi && | |
cd /usr/src/MINGW-packages/mingw-w64-git && | |
if test ! -d git | |
then | |
git clone --bare https://github.com/git-for-windows/git.git git | |
fi && | |
if test ! -d src/git | |
then | |
git clone --reference git https://github.com/git-for-windows/git src/git && | |
echo ../../../../git/objects >src/git/.git/objects/info/alternates | |
fi && | |
cd src/git && | |
if test -n "$EXISTING_GIT_TAG" | |
then | |
git fetch origin "refs/tags/$EXISTING_GIT_TAG:refs/tags/$EXISTING_GIT_TAG" | |
else | |
git fetch --tags "$GITHUB_WORKSPACE"/bundle-artifacts/git.bundle \ | |
$(cat "$GITHUB_WORKSPACE"/bundle-artifacts/next_version) | |
fi && | |
git reset --hard $(cat "$GITHUB_WORKSPACE"/bundle-artifacts/next_version) | |
- name: Prepare home directory for code-signing | |
env: | |
CODESIGN_P12: ${{secrets.CODESIGN_P12}} | |
CODESIGN_PASS: ${{secrets.CODESIGN_PASS}} | |
if: env.CODESIGN_P12 != '' && env.CODESIGN_PASS != '' && steps.restore-cached-git-pkg.outputs.cache-hit != 'true' | |
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 | |
timeout-minutes: 5 | |
if: env.GPGKEY != '' && steps.restore-cached-git-pkg.outputs.cache-hit != 'true' | |
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 ${{env.MINGW_PACKAGE_PREFIX}}-git | |
timeout-minutes: 60 | |
if: steps.restore-cached-git-pkg.outputs.cache-hit != 'true' | |
env: | |
GPGKEY: "${{secrets.GPGKEY}}" | |
run: | | |
set -x | |
BUILD_SRC=$(test x86_64 != "$ARCHITECTURE" || echo "--build-src-pkg") | |
# Make sure that there is a `/usr/bin/git` that can be used by `makepkg-mingw` | |
printf '#!/bin/sh\n\nexec '$MINGW_PREFIX'/bin/git.exe "$@"\n' >/usr/bin/git && | |
( | |
cd /usr/src/MINGW-packages/mingw-w64-git/src/git && | |
/usr/src/build-extra/please.sh build-mingw-w64-git --reset-pkgrel --only-$ARCHITECTURE $BUILD_SRC \ | |
-o "$GITHUB_WORKSPACE"/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 && | |
if test -z "$EXISTING_GIT_TAG" | |
then | |
git commit -s -m "mingw-w64-git: new version ($version)" PKGBUILD && | |
git bundle create "$b"/MINGW-packages.bundle origin/main..main | |
elif ! git update-index --ignore-submodules --refresh || | |
! git diff-files --ignore-submodules || | |
! git diff-index --cached --ignore-submodules HEAD | |
then | |
echo "::warning::Uncommitted changes after build!" >&2 && | |
git diff >&2 && | |
git bundle create "$b"/MINGW-packages.bundle main^..main | |
fi) | |
- name: Cache ${{env.MINGW_PACKAGE_PREFIX}}-git | |
if: steps.restore-cached-git-pkg.outputs.cache-hit != 'true' | |
uses: actions/cache/save@v4 | |
with: | |
path: artifacts | |
key: pkg-${{env.GIT_VERSION}}-${{env.ARCHITECTURE}}-${{env.TAG_GIT_WORKFLOW_RUN_ID}} | |
- name: Publish ${{env.MINGW_PACKAGE_PREFIX}}-git | |
uses: actions/upload-artifact@v4 | |
with: | |
name: pkg-${{env.ARCHITECTURE}} | |
path: artifacts | |
artifacts: | |
runs-on: ${{ github.event.inputs.architecture == 'aarch64' && fromJSON('["Windows", "ARM64"]') || 'windows-latest' }} | |
needs: pkg | |
env: | |
MSYSTEM: ${{ needs.pkg.outputs.msystem }} | |
MINGW_PACKAGE_PREFIX: ${{ needs.pkg.outputs.mingw_package_prefix }} | |
SDK_REPO_ARCH: ${{ needs.pkg.outputs.sdk_repo_arch }} | |
strategy: | |
fail-fast: false | |
matrix: ${{ fromJSON(needs.pkg.outputs.artifact_matrix) }} | |
outputs: | |
sha256sum-installer: ${{ steps.build.outputs.sha256sum-installer }} | |
sha256sum-portable: ${{ steps.build.outputs.sha256sum-portable }} | |
sha256sum-archive: ${{ steps.build.outputs.sha256sum-archive }} | |
sha256sum-mingit: ${{ steps.build.outputs.sha256sum-mingit }} | |
sha256sum-mingit-busybox: ${{ steps.build.outputs.sha256sum-mingit-busybox }} | |
sha256sum-nuget: ${{ steps.build.outputs.sha256sum-nuget }} | |
steps: | |
- name: Download pkg-${{env.ARCHITECTURE}} | |
uses: actions/download-artifact@v4 | |
with: | |
name: pkg-${{env.ARCHITECTURE}} | |
path: pkg-${{env.ARCHITECTURE}} | |
- name: Download bundle-artifacts | |
uses: actions/download-artifact@v4 | |
with: | |
name: bundle-artifacts | |
path: bundle-artifacts | |
- uses: git-for-windows/setup-git-for-windows-sdk@v1 | |
with: | |
flavor: full | |
architecture: ${{env.ARCHITECTURE}} | |
- name: Configure user | |
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" | |
- name: Clone and update build-extra | |
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 && | |
if test -z "$BUILD_EXTRA_REV_FOR_EXISTING_GIT_TAG" | |
then | |
git -C $d -c pull.rebase=false pull "$PWD"/bundle-artifacts/build-extra.bundle main | |
else | |
git -C $d fetch origin "$BUILD_EXTRA_REV_FOR_EXISTING_GIT_TAG" && | |
git -C $d reset --hard "$BUILD_EXTRA_REV_FOR_EXISTING_GIT_TAG" | |
fi | |
- name: Prepare home directory for code-signing | |
env: | |
CODESIGN_P12: ${{secrets.CODESIGN_P12}} | |
CODESIGN_PASS: ${{secrets.CODESIGN_PASS}} | |
if: (matrix.artifact.name == 'installer' || matrix.artifact.name == 'portable') && env.CODESIGN_P12 != '' && env.CODESIGN_PASS != '' | |
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 ${{env.ARCHITECTURE}} ${{matrix.artifact.name}}-mingit | |
if: matrix.artifact.name == 'nuget' | |
run: | | |
set -x | |
eval /usr/src/build-extra/please.sh make_installers_from_mingw_w64_git --version=$(cat pkg-${{env.ARCHITECTURE}}/ver) -o artifacts --${{matrix.artifact.name}}-mingit --pkg=pkg-${{env.ARCHITECTURE}}/${{env.MINGW_PACKAGE_PREFIX}}-git-[0-9]*.tar.xz --pkg=pkg-${{env.ARCHITECTURE}}/${{env.MINGW_PACKAGE_PREFIX}}-git-doc-html-[0-9]*.tar.xz | |
- name: Build ${{env.ARCHITECTURE}} ${{matrix.artifact.name}} | |
id: build | |
run: | | |
set -x | |
version=$(cat pkg-${{env.ARCHITECTURE}}/ver) && | |
if test mingit-busybox = ${{matrix.artifact.name}} | |
then | |
version="${version}-busybox" | |
fi && | |
eval /usr/src/build-extra/please.sh make_installers_from_mingw_w64_git --version=$version -o artifacts --${{matrix.artifact.name}} --pkg=pkg-${{env.ARCHITECTURE}}/${{env.MINGW_PACKAGE_PREFIX}}-git-[0-9]*.tar.xz --pkg=pkg-${{env.ARCHITECTURE}}/${{env.MINGW_PACKAGE_PREFIX}}-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 && | |
( | |
cd artifacts && | |
openssl dgst -sha256 -r ${{matrix.artifact.fileprefix}}*.${{matrix.artifact.fileextension}} >sha256sums.txt | |
) && | |
echo "sha256sum-${{ matrix.artifact.name}}<<EOF" >>$GITHUB_OUTPUT && | |
cat artifacts/sha256sums.txt >>$GITHUB_OUTPUT && | |
echo EOF >>$GITHUB_OUTPUT | |
- name: Copy package-versions and pdbs (installer) | |
if: matrix.artifact.name == 'installer' | |
run: | | |
cp /usr/src/build-extra/installer/package-versions.txt artifacts/ && | |
a=$PWD/artifacts && | |
p=$PWD/pkg-${{env.ARCHITECTURE}} && | |
(cd /usr/src/build-extra && | |
mkdir -p cached-source-packages && | |
cp "$p"/*-pdb* cached-source-packages/ && | |
GIT_CONFIG_PARAMETERS="'windows.sdk${{env.SDK_REPO_ARCH}}.path='" ./please.sh bundle_pdbs --arch=${{env.ARCHITECTURE}} --directory="$a" installer/package-versions.txt) | |
- name: Copy package-versions (MinGit) | |
if: matrix.artifact.name == 'mingit' | |
run: | | |
cp /usr/src/build-extra/mingit/root/etc/package-versions.txt artifacts/ | |
- name: Publish ${{matrix.artifact.name}}-${{env.ARCHITECTURE}} | |
uses: actions/upload-artifact@v4 | |
with: | |
name: ${{matrix.artifact.name}}-${{env.ARCHITECTURE}} | |
path: artifacts | |
sha256sums: | |
runs-on: ubuntu-latest | |
needs: ['pkg', 'artifacts'] | |
steps: | |
- name: gather all SHA-256 checksums | |
uses: actions/github-script@v7 | |
env: | |
SHA256SUMS: ${{ toJSON(needs.artifacts.outputs) }} | |
with: | |
script: | | |
const fs = require('fs') | |
fs.mkdirSync('sha256sums') | |
fs.writeFileSync('sha256sums/sha256sums.txt', Object.values(JSON.parse(process.env.SHA256SUMS)).join('\n')) | |
- name: publish SHA-256 checksums | |
uses: actions/upload-artifact@v4 | |
with: | |
name: sha256sums | |
path: sha256sums |