Skip to content

build-installers: adapt to latest Ruby version #1166

build-installers: adapt to latest Ruby version

build-installers: adapt to latest Ruby version #1166

Workflow file for this run

name: ci-artifacts
on:
push:
branches:
- main
pull_request:
# For the continuous `ci-artifacts` release
permissions:
contents: write
env:
LC_CTYPE: C.UTF-8
jobs:
minimal-sdk-artifact:
if: github.event.repository.fork == false
runs-on: windows-latest
steps:
- name: clone git-sdk-64
run: |
git init --bare git-sdk-64.git &&
git --git-dir=git-sdk-64.git remote add origin https://github.com/${{github.repository}} &&
git --git-dir=git-sdk-64.git config remote.origin.promisor true &&
git --git-dir=git-sdk-64.git config remote.origin.partialCloneFilter blob:none &&
git --git-dir=git-sdk-64.git fetch --depth=1 origin ${{github.sha}} &&
git --git-dir=git-sdk-64.git update-ref --no-deref HEAD ${{github.sha}}
- name: clone build-extra
run: git clone --depth=1 --single-branch -b main https://github.com/git-for-windows/build-extra
- name: build git-sdk-64-minimal-sdk
shell: bash
run: |
sh -x ./build-extra/please.sh create-sdk-artifact --sdk=git-sdk-64.git minimal-sdk &&
cygpath -aw minimal-sdk/usr/bin >>$GITHUB_PATH
- name: compress artifact
shell: bash
run: (cd minimal-sdk && tar cvf - * .[0-9A-Za-z]*) | gzip -1 >git-sdk-x86_64-minimal.tar.gz
- name: upload minimal-sdk artifact
uses: actions/upload-artifact@v4
with:
name: minimal-sdk
path: git-sdk-x86_64-minimal.tar.gz
- name: clone git.git's `master`
run: git clone --depth=1 --branch master https://github.com/git/git ..\git
- name: build current `master` of git.git
shell: bash
run: |
set -x
. /etc/profile
test "$(cygpath -aw /)" = "${{github.workspace}}\minimal-sdk" || exit 1
test "$(type -p gcc)" = "/mingw64/bin/gcc" || exit 1
make -C ../git DEVELOPER=1 NO_PERL=1 SKIP_DASHED_BUILT_INS=YesPlease -j8 all strip
- name: compress git artifacts
shell: bash
run: tar -C .. -czf git-artifacts.tar.gz --exclude '*.a' --exclude '*.o' --exclude .git --exclude .depend git
- name: upload git artifacts for testing
uses: actions/upload-artifact@v4
with:
name: git-artifacts
path: git-artifacts.tar.gz
- name: create zip and 7z SFX variants of the minimal SDK
if: github.event_name == 'push' && github.ref == 'refs/heads/main'
shell: bash
run: |
for path in mingw64/bin/7z.exe mingw64/bin/7z.dll mingw64/lib/7zip/7zCon.sfx
do
git --git-dir=git-sdk-64.git show HEAD:$path >${path##*/}
done &&
mkdir minimal-sdk-extra &&
(cd minimal-sdk && ../7z.exe a -mmt=on -mx9 ../minimal-sdk-extra/git-sdk-x86_64-minimal.zip * .?*) &&
(cd minimal-sdk && ../7z.exe a -t7z -mmt=on -m0=lzma -mqs -mlc=8 -mx=9 -md=256M -mfb=273 -ms=256M -sfx../7zCon.sfx \
../minimal-sdk-extra/git-sdk-x86_64-minimal.7z.exe * .?*)
- name: upload minimal-sdk-extra artifacts
if: github.event_name == 'push' && github.ref == 'refs/heads/main'
uses: actions/upload-artifact@v4
with:
name: minimal-sdk-extra
path: minimal-sdk-extra
test-minimal-sdk:
runs-on: windows-latest
needs: [minimal-sdk-artifact]
strategy:
matrix:
# 0..16 permuted according to the matrix builds' timings as of git/git@9fadedd63
nr: [9, 6, 13, 0, 8, 5, 2, 16, 15, 11, 10, 1, 7, 3, 14, 12, 4]
steps:
- name: download minimal-sdk artifact
uses: actions/download-artifact@v4
with:
name: minimal-sdk
path: ${{github.workspace}}
- name: uncompress minimal-sdk
shell: bash
run: |
mkdir -p minimal-sdk &&
tar -C minimal-sdk -xzf git-sdk-x86_64-minimal.tar.gz &&
cygpath -aw minimal-sdk/usr/bin >>$GITHUB_PATH
- name: download git artifacts
uses: actions/download-artifact@v4
with:
name: git-artifacts
path: ${{github.workspace}}
- name: uncompress git-artifacts
shell: bash
run: tar -C .. -xzf git-artifacts.tar.gz
- name: test
shell: bash
run: |
set -x
. /etc/profile
test "$(cygpath -aw /)" = "${{github.workspace}}\minimal-sdk" || exit 1
cd ../git/t &&
make T="$(ls -S t[0-9]*.sh | awk '!((NR+${{matrix.nr}})%17)' | tr '\n' \ )" prove || {
for d in trash*
do
t=${d#trash directory.}
echo ===========================
echo Failed: $t.sh
cat test-results/$t.out
done
exit 1
}
env:
GIT_TEST_OPTS: --verbose-log -x --no-chain-lint
GIT_PROVE_OPTS: --timer --jobs 8
NO_SVN_TESTS: 1
assorted-validations:
runs-on: windows-latest
needs: [minimal-sdk-artifact]
steps:
- name: download minimal-sdk artifact
uses: actions/download-artifact@v4
with:
name: minimal-sdk
path: ${{github.workspace}}
- name: uncompress minimal-sdk
shell: bash
run: |
mkdir -p minimal-sdk &&
tar -C minimal-sdk -xzf git-sdk-x86_64-minimal.tar.gz &&
cygpath -aw minimal-sdk/usr/bin >>$GITHUB_PATH
- name: run some tests
shell: bash
run: |
set -x
. /etc/profile
# cygpath works
test "$(cygpath -aw /)" = "${{github.workspace}}\minimal-sdk" || exit 1
# comes with GCC and can compile a DLL
test "$(type -p gcc)" = "/mingw64/bin/gcc" || exit 1
cat >dll.c <<-\EOF &&
__attribute__((dllexport)) int increment(int i)
{
return i + 1;
}
EOF
gcc -Wall -g -O2 -shared -o sample.dll dll.c || exit 1
ls -la
# stat works
test "stat is /usr/bin/stat" = "$(type stat)" || exit 1
stat /usr/bin/stat.exe || exit 1
# unzip works
test "unzip is /usr/bin/unzip" = "$(type unzip)" || exit 1
git init unzip-test &&
echo TEST >unzip-test/README &&
git -C unzip-test add -A &&
git -C unzip-test -c user.name=A -c [email protected] commit -m 'Testing, testing...' &&
git --git-dir=unzip-test/.git archive -o test.zip HEAD &&
unzip -v test.zip >unzip-test.out &&
cat unzip-test.out &&
test "grep is /usr/bin/grep" = "$(type grep)" || exit 1
grep README unzip-test.out
publish-release-assets:
if: github.event_name == 'push' && github.ref == 'refs/heads/main'
runs-on: ubuntu-latest
needs: [test-minimal-sdk, assorted-validations]
steps:
- name: download minimal-sdk artifact
uses: actions/download-artifact@v4
with:
name: minimal-sdk
path: ${{github.workspace}}
- name: download minimal-sdk artifact
uses: actions/download-artifact@v4
with:
name: minimal-sdk-extra
path: ${{github.workspace}}
- name: publish release asset
uses: actions/github-script@v7
with:
script: |
const req = { owner: context.repo.owner, repo: context.repo.repo }
// find or create the GitHub release named `ci-artifacts`
const release = await (async () => {
try {
return await github.rest.repos.getReleaseByTag({ ...req, tag: 'ci-artifacts' });
} catch (e) {
if (e.status === 404) {
// create the `ci-artifacts` GitHub release based on the current revision
const workflowRunsURL = `${context.serverUrl}/${
process.env.GITHUB_WORKFLOW_REF.replace(/\/\.github\/workflows\/([^@]+).*/, '/actions/workflows/$1')
}`
return await github.rest.repos.createRelease({
... req,
tag_name: 'ci-artifacts',
body: `Continuous release of \`ci-artifacts\`
This release is automatically updated by the [ci-artifacts](${workflowRunsURL}) workflow.
For technical reasons, allow up to a minute for release assets to be missing while they are updated.`,
});
}
throw e;
}
})()
const fs = require('fs')
for (const fileName of [
'git-sdk-x86_64-minimal.tar.gz',
'git-sdk-x86_64-minimal.zip',
'git-sdk-x86_64-minimal.7z.exe',
]) {
console.log(`Uploading ${fileName}`)
const uploadReq = {
...req,
release_id: release.data.id,
name: fileName,
headers: {
'content-length': (await fs.promises.stat(fileName)).size,
},
data: fs.createReadStream(fileName),
}
// if the asset does not yet exist, simply upload it
const originalAsset = release.data.assets.filter(asset => asset.name === fileName).pop()
if (!originalAsset) {
const asset = await github.rest.repos.uploadReleaseAsset(uploadReq)
console.log(`Uploaded to ${asset.data.browser_download_url}`)
continue
}
// otherwise upload it using a temporary file name,
// then delete the old asset
// and then rename the new asset;
// this way, the asset is not missing for a long time
const asset = await github.rest.repos.uploadReleaseAsset({ ...uploadReq, name: `tmp.${fileName}` })
await github.rest.repos.deleteReleaseAsset({ ...req, asset_id: originalAsset.id })
const updatedAsset = await github.rest.repos.updateReleaseAsset({...req,
asset_id: asset.data.id,
name: fileName,
label: fileName,
})
console.log(`Updated ${updatedAsset.data.browser_download_url}`)
}
await github.rest.git.updateRef({
...req,
ref: 'tags/ci-artifacts',
sha: process.env.GITHUB_SHA,
})