-
Notifications
You must be signed in to change notification settings - Fork 161
Add native build to CI and MUSL build #2490
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: master
Are you sure you want to change the base?
Changes from 1 commit
75b4c6e
14b11e2
27dcba2
3b16703
211583b
d36f570
b266fc1
90a7e9e
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,99 @@ | ||
name: Build native image | ||
defaults: | ||
run: | ||
shell: bash -euo pipefail -O nullglob {0} | ||
on: | ||
workflow_dispatch: | ||
inputs: | ||
ref: | ||
type: string | ||
description: "Git ref from which to release" | ||
required: true | ||
default: "master" | ||
workflow_call: | ||
inputs: | ||
ref: | ||
type: string | ||
description: "Git ref from which to release" | ||
required: true | ||
default: "master" | ||
env: | ||
INPUT_REF: ${{ github.event.inputs.ref }} | ||
|
||
jobs: | ||
build_native_images: | ||
name: Build native test server | ||
strategy: | ||
fail-fast: false | ||
matrix: | ||
include: | ||
- runner: ubuntu-latest | ||
os_family: linux | ||
arch: amd64 | ||
musl: true | ||
- runner: ubuntu-latest | ||
os_family: linux | ||
arch: amd64 | ||
musl: false | ||
- runner: macos-13 | ||
os_family: macOS | ||
arch: amd64 | ||
- runner: macos-latest | ||
os_family: macOS | ||
arch: arm64 | ||
- runner: ubuntu-24.04-arm | ||
os_family: linux | ||
arch: arm64 | ||
- runner: windows-latest | ||
os_family: windows | ||
arch: amd64 | ||
runs-on: ${{ matrix.runner }} | ||
steps: | ||
- name: Checkout repo | ||
uses: actions/checkout@v4 | ||
with: | ||
fetch-depth: 0 | ||
submodules: recursive | ||
ref: ${{ env.INPUT_REF }} | ||
|
||
- name: Set up Java | ||
if: matrix.os_family != 'Linux' | ||
uses: actions/setup-java@v4 | ||
with: | ||
java-version: "21" | ||
distribution: "graalvm" | ||
|
||
- name: Set up Gradle | ||
if: matrix.os_family != 'Linux' | ||
uses: gradle/actions/setup-gradle@v4 | ||
|
||
- name: Build native test server (non-Docker) | ||
if: matrix.os_family != 'Linux' | ||
run: | | ||
./gradlew -PnativeBuild :temporal-test-server:nativeCompile | ||
|
||
- name: Build native test server (Docker non-musl) | ||
if: matrix.os_family == 'Linux' && matrix.musl == false | ||
run: | | ||
docker run \ | ||
--rm -w /github/workspace -v "$(pwd):/github/workspace" \ | ||
$(docker build -q ./docker/native-image) \ | ||
sh -c "./gradlew -PnativeBuild :temporal-test-server:nativeCompile" | ||
|
||
- name: Build native test server (Docker musl) | ||
if: matrix.os_family == 'Linux' && matrix.musl == true | ||
run: | | ||
docker run \ | ||
--rm -w /github/workspace -v "$(pwd):/github/workspace" \ | ||
$(docker build -q ./docker/native-image-musl) \ | ||
sh -c "./gradlew -PnativeBuild -PnativeBuildMusl :temporal-test-server:nativeCompile" | ||
# path ends in a wildcard because on windows the file ends in '.exe' | ||
- name: Upload executable to workflow | ||
uses: actions/upload-artifact@v4 | ||
with: | ||
name: ${{ matrix.musl && format('{0}_{1}_musl', matrix.os_family, matrix.arch) || format('{0}_{1}', matrix.os_family, matrix.arch)}} | ||
path: | | ||
temporal-test-server/build/native/nativeCompile/temporal-test-server* | ||
if-no-files-found: error | ||
retention-days: 1 | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -188,3 +188,9 @@ jobs: | |
|
||
- name: Run copyright and code format checks | ||
run: ./gradlew --no-daemon checkLicenseMain checkLicenses spotlessCheck | ||
|
||
build_native_images: | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Is it by intention that we are building native images for every CI run now or is this leftover from testing? If it is by intention, I would usually be concerned with unnecessarily using storage for all of these images, though I see we only retain for one day, but I wonder if it's even worth that vs just a workflow call option to not upload the artifacts. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Yes, I do want to build as part of CI so we don't discover issue when trying to cut a release. I would be OK only doing the builds post merge or not including artifacts for CI There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Works for me, especially if it's concurrent and doesn't take longer than the existing jobs (doesn't seem to though that poor macos-arm one in last CI run took a really long time). I do think we should skip uploading the artifact though, but not a big deal. |
||
name: Build native test server | ||
uses: ./.github/workflows/build-native-image.yml | ||
with: | ||
ref: ${{ github.event.pull_request.head.sha }} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,18 @@ | ||
# Use an old version of Ubuntu to build the test server to maintain compatibility with | ||
# older versions of glibc, specifically glib 2.17. | ||
FROM ubuntu:18.04 | ||
ENV JAVA_HOME=/usr/lib64/graalvm/graalvm-community-java21 | ||
COPY --from=ghcr.io/graalvm/native-image-community:21 $JAVA_HOME $JAVA_HOME | ||
ENV PATH="${JAVA_HOME}/bin:${PATH}" | ||
RUN apt-get update | ||
RUN apt-get install -y git build-essential curl | ||
COPY install-musl.sh /opt/install-musl.sh | ||
RUN chmod +x /opt/install-musl.sh | ||
WORKDIR /opt | ||
# We need to build musl and zlibc with musl to for a static build | ||
# See https://www.graalvm.org/21.3/reference-manual/native-image/StaticImages/index.html | ||
RUN ./install-musl.sh | ||
ENV MUSL_HOME=/opt/musl-toolchain | ||
ENV PATH="$MUSL_HOME/bin:$PATH" | ||
# Avoid errors like: "fatal: detected dubious ownership in repository" | ||
RUN git config --global --add safe.directory '*' |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,28 @@ | ||
# Specify an installation directory for musl: | ||
export MUSL_HOME=$PWD/musl-toolchain | ||
|
||
# Download musl and zlib sources: | ||
curl -O https://musl.libc.org/releases/musl-1.2.5.tar.gz | ||
curl -O https://zlib.net/fossils/zlib-1.2.13.tar.gz | ||
|
||
# Build musl from source | ||
tar -xzvf musl-1.2.5.tar.gz | ||
cd musl-1.2.5 | ||
./configure --prefix=$MUSL_HOME --static | ||
# The next operation may require privileged access to system resources, so use sudo | ||
make && make install | ||
cd .. | ||
|
||
# Install a symlink for use by native-image | ||
ln -s $MUSL_HOME/bin/musl-gcc $MUSL_HOME/bin/x86_64-linux-musl-gcc | ||
|
||
# Extend the system path and confirm that musl is available by printing its version | ||
export PATH="$MUSL_HOME/bin:$PATH" | ||
x86_64-linux-musl-gcc --version | ||
|
||
# Build zlib with musl from source and install into the MUSL_HOME directory | ||
tar -xzvf zlib-1.2.13.tar.gz | ||
cd zlib-1.2.13 | ||
CC=musl-gcc ./configure --prefix=$MUSL_HOME --static | ||
make && make install | ||
cd .. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Are the test server artifacts on this PR's CI run much larger than what we've released in the past? For instance, Windows x64 on this PR's CI run is 62.4MB (exe inside about the same size), but the one at https://github.com/temporalio/sdk-java/releases is 18.4MB (exe inside about the same size). I wonder if it's due to Java upgrade or if we're inadvertently not trimming something anymore or what.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
hm good callout, not sure let me check