Skip to content

Commit edc1786

Browse files
committed
tarballs for release
1 parent 40ee5fa commit edc1786

1 file changed

Lines changed: 275 additions & 0 deletions

File tree

Lines changed: 275 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,275 @@
1+
# Build and attach GEMC binary tarballs when a GitHub release is published.
2+
name: Release Tarballs
3+
4+
run-name: Release tarballs for ${{ github.event.release.tag_name || inputs.release_tag }}
5+
6+
permissions:
7+
contents: write
8+
packages: read
9+
10+
env:
11+
FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: true
12+
RELEASE_TAG: ${{ github.event.release.tag_name || inputs.release_tag }}
13+
14+
concurrency:
15+
group: gemc-release-tarballs-${{ github.event.release.tag_name || inputs.release_tag }}
16+
cancel-in-progress: true
17+
18+
on:
19+
release:
20+
types: [ published ]
21+
workflow_dispatch:
22+
inputs:
23+
release_tag:
24+
description: "Existing or new release tag to build and attach tarballs to"
25+
required: true
26+
type: string
27+
28+
jobs:
29+
discover:
30+
if: ${{ (github.event.release.tag_name || inputs.release_tag) != 'dev' }}
31+
name: Create Linux Job Matrix
32+
runs-on: ubuntu-latest
33+
outputs:
34+
matrix_build: ${{ steps.scan.outputs.matrix_build }}
35+
steps:
36+
- name: Checkout repository
37+
uses: actions/checkout@v6
38+
with:
39+
ref: ${{ env.RELEASE_TAG }}
40+
fetch-depth: 0
41+
42+
- id: scan
43+
name: Build matrix
44+
run: ci/distros_tags.sh
45+
46+
linux-tarballs:
47+
if: ${{ (github.event.release.tag_name || inputs.release_tag) != 'dev' }}
48+
name: ${{ matrix.image }}:${{ matrix.image_tag }} ${{ matrix.arch }}
49+
needs: [ discover ]
50+
runs-on: ${{ matrix.runner }}
51+
timeout-minutes: 360
52+
strategy:
53+
fail-fast: false
54+
matrix: ${{ fromJSON(needs.discover.outputs.matrix_build) }}
55+
env:
56+
LOGNAME: >-
57+
${{ format('{0}-{1}-{2}-{3}', github.event.release.tag_name || inputs.release_tag,
58+
matrix.image, matrix.image_tag, matrix.arch) }}
59+
DOCKER_BUILD_SUMMARY: false
60+
steps:
61+
- name: Checkout repository
62+
uses: actions/checkout@v6
63+
with:
64+
ref: ${{ env.RELEASE_TAG }}
65+
fetch-depth: 0
66+
67+
- name: Free up disk space
68+
uses: ./.github/actions/free-disk-space
69+
with:
70+
prune_docker: "true"
71+
show_tree: "true"
72+
73+
- name: Set up Buildx
74+
uses: docker/setup-buildx-action@v4
75+
76+
- name: Generate Dockerfile
77+
run: |
78+
python3 ci/dockerfile_creator.py \
79+
-i "${{ matrix.image }}" \
80+
-t "${{ matrix.image_tag }}" \
81+
--gemc-version "${RELEASE_TAG}" \
82+
--geant4-version "${{ matrix.geant4_tag }}" \
83+
--with-package \
84+
--source context \
85+
--package-arch "${{ matrix.arch }}" \
86+
> Dockerfile.generated
87+
cat Dockerfile.generated
88+
89+
- name: Build GEMC tarball
90+
uses: docker/build-push-action@v7
91+
with:
92+
pull: true
93+
no-cache: true
94+
context: .
95+
file: ./Dockerfile.generated
96+
target: package-export
97+
platforms: ${{ matrix.platform }}
98+
push: false
99+
outputs: type=local,dest=${{ runner.temp }}/artifacts/package-${{ env.LOGNAME }}
100+
101+
- id: package
102+
name: Locate tarball
103+
shell: bash
104+
run: |
105+
set -euo pipefail
106+
shopt -s nullglob
107+
tarballs=("${RUNNER_TEMP}/artifacts/package-${LOGNAME}/"*.tar.gz)
108+
shopt -u nullglob
109+
if (( ${#tarballs[@]} != 1 )); then
110+
echo "Expected one GEMC tarball, found ${#tarballs[@]}" >&2
111+
printf ' %s\n' "${tarballs[@]:-}" >&2
112+
exit 1
113+
fi
114+
echo "tarball=${tarballs[0]}" >> "$GITHUB_OUTPUT"
115+
116+
- name: Smoke test the GEMC tarball
117+
shell: bash
118+
run: |
119+
set -euo pipefail
120+
tarball="${{ steps.package.outputs.tarball }}"
121+
work="$(mktemp -d)"
122+
tar -xzf "${tarball}" -C "${work}" --strip-components=1
123+
test -x "${work}/install_geant4_data.sh"
124+
test -f "${work}/gemc.env"
125+
test -x "${work}/bin/gemc"
126+
tar -tzf "${tarball}" >/dev/null
127+
128+
- name: Ensure release exists
129+
env:
130+
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
131+
REPO: ${{ github.repository }}
132+
shell: bash
133+
run: |
134+
set -euo pipefail
135+
if ! gh release view "${RELEASE_TAG}" --repo "${REPO}" >/dev/null 2>&1; then
136+
gh release create "${RELEASE_TAG}" --repo "${REPO}" \
137+
--title "${RELEASE_TAG}" --notes "Automated release ${RELEASE_TAG}" \
138+
|| gh release view "${RELEASE_TAG}" --repo "${REPO}" >/dev/null
139+
fi
140+
141+
- name: Attach tarball to release
142+
env:
143+
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
144+
REPO: ${{ github.repository }}
145+
shell: bash
146+
run: |
147+
set -euo pipefail
148+
gh release upload "${RELEASE_TAG}" \
149+
--repo "${REPO}" \
150+
"${{ steps.package.outputs.tarball }}" \
151+
--clobber
152+
153+
macos-tarball:
154+
if: ${{ (github.event.release.tag_name || inputs.release_tag) != 'dev' }}
155+
name: macos arm64
156+
runs-on: macos-26
157+
timeout-minutes: 360
158+
env:
159+
GEANT4_TARBALL_REPO: gemc/g4install
160+
GEANT4_TARBALL_TAG: dev
161+
steps:
162+
- name: Checkout repository
163+
uses: actions/checkout@v6
164+
with:
165+
ref: ${{ env.RELEASE_TAG }}
166+
fetch-depth: 0
167+
168+
- name: Install build dependencies (Homebrew)
169+
env:
170+
HOMEBREW_NO_REQUIRE_TAP_TRUST: "1"
171+
HOMEBREW_NO_AUTO_UPDATE: "1"
172+
run: |
173+
brew install meson ninja cmake pkg-config qt root sqlite expat zlib tbb
174+
brew install --cask xquartz
175+
176+
- name: Download the Geant4 macOS tarball
177+
env:
178+
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
179+
shell: bash
180+
run: |
181+
set -euo pipefail
182+
dest="${RUNNER_TEMP}/geant4-download"
183+
mkdir -p "${dest}"
184+
gh release download "${GEANT4_TARBALL_TAG}" \
185+
--repo "${GEANT4_TARBALL_REPO}" \
186+
--pattern 'geant4-*-macosx*-arm64.tar.gz' \
187+
--dir "${dest}"
188+
tarball="$(ls "${dest}"/geant4-*-macosx*-arm64.tar.gz | head -1)"
189+
echo "GEANT4_TARBALL=${tarball}" >> "$GITHUB_ENV"
190+
ls -l "${dest}"
191+
192+
- id: build
193+
name: Build, test and package GEMC
194+
shell: zsh {0}
195+
env:
196+
GEMC_INTERACTIVE_TESTS: "false"
197+
run: |
198+
set -e
199+
200+
g4home="${RUNNER_TEMP}/geant4"
201+
mkdir -p "${g4home}"
202+
tar -xzf "${GEANT4_TARBALL}" -C "${g4home}" --strip-components=1
203+
204+
export GEANT4_HOME="${g4home}"
205+
"${g4home}/install_geant4_data.sh"
206+
source "${g4home}/geant4.env"
207+
208+
pkg_config_path="${CLHEP_BASE_DIR}/lib/pkgconfig:${XERCESCROOT}/lib/pkgconfig"
209+
if [[ -n "${PKG_CONFIG_PATH:-}" ]]; then
210+
pkg_config_path="${pkg_config_path}:${PKG_CONFIG_PATH}"
211+
fi
212+
export PKG_CONFIG_PATH="${pkg_config_path}"
213+
for f in qt sqlite expat zlib; do
214+
export PKG_CONFIG_PATH="$(brew --prefix ${f})/lib/pkgconfig:${PKG_CONFIG_PATH}"
215+
done
216+
export PATH="$(brew --prefix qt)/bin:${PATH}"
217+
source "$(brew --prefix root)/bin/thisroot.sh"
218+
219+
echo " > geant4-config: $(command -v geant4-config) ($(geant4-config --version))"
220+
echo " > root-config: $(command -v root-config) ($(root-config --version))"
221+
222+
g4ver="$(geant4-config --version)"
223+
mac_major="$(sw_vers -productVersion | cut -d. -f1)"
224+
clang_major="$(clang --version | sed -nE 's/.*clang version ([0-9]+).*/\1/p' | head -1)"
225+
osrelease="macosx${mac_major}-clang${clang_major}-arm64"
226+
echo "Geant4 version: ${g4ver}"
227+
echo "OSRELEASE: ${osrelease}"
228+
229+
export SIM_HOME="${RUNNER_TEMP}/gemc-sim"
230+
mkdir -p "${SIM_HOME}"
231+
./ci/build.sh
232+
233+
package_name="gemc-${RELEASE_TAG}-geant4-${g4ver}-${osrelease}"
234+
GEANT4_VERSION="${g4ver}" GEMC_PACKAGE_VERSION="${RELEASE_TAG}" \
235+
ci/package_install.sh "${SIM_HOME}/gemc/dev" dist "${package_name}"
236+
237+
echo "package_name=${package_name}" >> "$GITHUB_OUTPUT"
238+
echo "tarball=dist/${package_name}.tar.gz" >> "$GITHUB_OUTPUT"
239+
240+
- name: Smoke test the GEMC tarball
241+
shell: bash
242+
run: |
243+
set -euo pipefail
244+
tarball="${{ steps.build.outputs.tarball }}"
245+
work="$(mktemp -d)"
246+
tar -xzf "${tarball}" -C "${work}" --strip-components=1
247+
test -x "${work}/install_geant4_data.sh"
248+
test -f "${work}/gemc.env"
249+
test -x "${work}/bin/gemc"
250+
otool -L "${work}/bin/gemc"
251+
252+
- name: Ensure release exists
253+
env:
254+
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
255+
REPO: ${{ github.repository }}
256+
shell: bash
257+
run: |
258+
set -euo pipefail
259+
if ! gh release view "${RELEASE_TAG}" --repo "${REPO}" >/dev/null 2>&1; then
260+
gh release create "${RELEASE_TAG}" --repo "${REPO}" \
261+
--title "${RELEASE_TAG}" --notes "Automated release ${RELEASE_TAG}" \
262+
|| gh release view "${RELEASE_TAG}" --repo "${REPO}" >/dev/null
263+
fi
264+
265+
- name: Attach tarball to release
266+
env:
267+
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
268+
REPO: ${{ github.repository }}
269+
shell: bash
270+
run: |
271+
set -euo pipefail
272+
gh release upload "${RELEASE_TAG}" \
273+
--repo "${REPO}" \
274+
"${{ steps.build.outputs.tarball }}" \
275+
--clobber

0 commit comments

Comments
 (0)