client
Clone or download
Modified Files
name: Build
name: Build
on:
on:
workflow_run:
workflow_run:
workflows: ["Init"]
workflows: ["Init"]
types:
types:
- completed
- completed
jobs:
jobs:
build-linux-and-android:
build-linux-and-android:
runs-on: ubuntu-20.04
runs-on: ubuntu-20.04
steps:
steps:
- name: Install packages
- name: Install packages
run: sudo apt install axel libasound2-dev libavcodec-dev libavformat-dev libavutil-dev libgl-dev libgtk-3-dev libpango1.0-dev libxtst-dev xdg-utils libc6 xdg-utils zlib1g libpng16-16 libasound2 libbsd-dev zip libblkid1 libdbus-1-3 libexpat1 libgpg-error0 liblzma5 libmount1 libpcre3 libselinux1 libsystemd0 libuuid1
run: sudo apt install axel libasound2-dev libavcodec-dev libavformat-dev libavutil-dev libgl-dev libgtk-3-dev libpango1.0-dev libxtst-dev xdg-utils libc6 xdg-utils zlib1g libpng16-16 libasound2 libbsd-dev zip libblkid1 libdbus-1-3 libexpat1 libgpg-error0 liblzma5 libmount1 libpcre3 libselinux1 libsystemd0 libuuid1
- uses: actions/checkout@v2
- uses: actions/checkout@v2
- name: Setup java
- name: Setup java
uses: joschi/setup-jdk@v2
uses: joschi/setup-jdk@v2
with:
with:
java-version: 16
java-version: 16
- name: Setup JavaFX
- name: Setup JavaFX
run: |
run: |
cd /tmp
cd /tmp
axel -n 8 https://download2.gluonhq.com/openjfx/17/openjfx-17-ea+11_linux-x64_bin-jmods.zip
axel -n 8 https://download2.gluonhq.com/openjfx/17/openjfx-17-ea+11_linux-x64_bin-jmods.zip
unzip /tmp/openjfx-17-ea+11_linux-x64_bin-jmods.zip -d /tmp
unzip /tmp/openjfx-17-ea+11_linux-x64_bin-jmods.zip -d /tmp
- name: Download GraalVM 21.1.0
- name: Download GraalVM 21.1.0
run: |
run: |
cd /tmp
cd /tmp
axel -n 8 https://github.com/graalvm/graalvm-ce-builds/releases/download/vm-21.1.0/graalvm-ce-java11-linux-amd64-21.1.0.tar.gz
axel -n 8 https://github.com/graalvm/graalvm-ce-builds/releases/download/vm-21.1.0/graalvm-ce-java11-linux-amd64-21.1.0.tar.gz
tar -xvzf *.gz
tar -xvzf *.gz
- name: Install native-image
- name: Install native-image
run: |
run: |
cd /tmp/graalvm-ce-java11-21.1.0/bin
cd /tmp/graalvm-ce-java11-21.1.0/bin
./gu install native-image
./gu install native-image
- name: Download built jars
- name: Download built jars
uses: dawidd6/action-download-artifact@v2
uses: dawidd6/action-download-artifact@v2
with:
with:
workflow: init.yml
workflow: init.yml
name: built-jars
name: built-jars
path: target/lib/
path: target/lib/
- name: Download REQ_MODULES
- name: Download REQ_MODULES
uses: dawidd6/action-download-artifact@v2
uses: dawidd6/action-download-artifact@v2
with:
with:
workflow: init.yml
workflow: init.yml
name: req_modules
name: req_modules
- name: Download VERSION
- name: Download VERSION
uses: dawidd6/action-download-artifact@v2
uses: dawidd6/action-download-artifact@v2
with:
with:
workflow: init.yml
workflow: init.yml
name: version
name: version
- name: Add VERSION to environment
- name: Add VERSION to environment
run: |
run: |
echo "VERSION=$(<version.txt)" >> $GITHUB_ENV
echo "VERSION=$(<version.txt)" >> $GITHUB_ENV
- name: Add REQ_MODULES to environment
- name: Add REQ_MODULES to environment
run: |
run: |
echo "REQ_MODULES=$(<req_modules.txt)" >> $GITHUB_ENV
echo "REQ_MODULES=$(<req_modules.txt)" >> $GITHUB_ENV
- name: Download build-date
- name: Download build-date
uses: dawidd6/action-download-artifact@v2
uses: dawidd6/action-download-artifact@v2
with:
with:
workflow: init.yml
workflow: init.yml
name: build-date
name: build-date
path: src/main/resources/com/stream_pi/client/build-date
path: src/main/resources/com/stream_pi/client/
- name: Create Linux x64 DEB, Linux x64 APP IMAGE, Android aarch64 APK, Linux Arm32 ZIP
- name: Create Linux x64 DEB, Linux x64 APP IMAGE, Android aarch64 APK, Linux Arm32 ZIP
run: |
run: |
# Create DEB
# Create DEB
.github/scripts/jpackage.sh \
.github/scripts/jpackage.sh \
--icon assets/linux-icon.png \
--icon assets/linux-icon.png \
--app-version ${{ env.VERSION }} \
--app-version ${{ env.VERSION }} \
--linux-menu-group "Stream-Pi" \
--linux-menu-group "Stream-Pi" \
--license-file LICENSE.txt \
--license-file LICENSE.txt \
--type deb
--type deb
# Create App Image
# Create App Image
.github/scripts/jpackage.sh \
.github/scripts/jpackage.sh \
--icon assets/linux-icon.png \
--icon assets/linux-icon.png \
--app-version ${{ env.VERSION }} \
--app-version ${{ env.VERSION }} \
--type app-image
--type app-image
export GRAALVM_HOME=/tmp/graalvm-ce-java11-21.1.0/
export GRAALVM_HOME=/tmp/graalvm-ce-java11-21.1.0/
mvn -Pandroid gluonfx:build gluonfx:package
mvn -Pandroid gluonfx:build gluonfx:package
mv target/gluonfx/aarch64-android/gvm/*.apk ${{ env.INSTALL_DIR }}/stream-pi-client-android-aarch64-${{ env.VERSION }}.apk
mv target/gluonfx/aarch64-android/gvm/*.apk ${{ env.INSTALL_DIR }}/stream-pi-client-android-aarch64-${{ env.VERSION }}.apk
cd $INSTALL_DIR
cd $INSTALL_DIR
mv *.deb stream-pi-client-linux-x64-${{ env.VERSION }}-debian.deb
mv *.deb stream-pi-client-linux-x64-${{ env.VERSION }}-debian.deb
mv 'Stream-Pi Client' stream-pi-client-${{ env.VERSION }}
mv 'Stream-Pi Client' stream-pi-client-${{ env.VERSION }}
zip -r stream-pi-client-linux-x64-${{ env.VERSION }}-executable.zip stream-pi-client-${{ env.VERSION }}
zip -r stream-pi-client-linux-x64-${{ env.VERSION }}-executable.zip stream-pi-client-${{ env.VERSION }}
rm -r stream-pi-client-${{ env.VERSION }}
rm -r stream-pi-client-${{ env.VERSION }}
env:
env:
MAIN_CLASS: com.stream_pi.client.Main
MAIN_CLASS: com.stream_pi.client.Main
JAVAFX_JMODS: /tmp/javafx-jmods-17/
JAVAFX_JMODS: /tmp/javafx-jmods-17/
JPACKAGE_HOME: ${{ env.JAVA_HOME }}
JPACKAGE_HOME: ${{ env.JAVA_HOME }}
INSTALL_DIR: target/install
INSTALL_DIR: target/install
- name: Saving Linux x64 DEB
- name: Saving Linux x64 DEB
uses: actions/upload-artifact@v2
uses: actions/upload-artifact@v2
with:
with:
name: linux-deb
name: linux-deb
path: target/install/stream-pi-client-linux-x64-${{ env.VERSION }}-debian.deb
path: target/install/stream-pi-client-linux-x64-${{ env.VERSION }}-debian.deb
- name: Saving Linux x64 ZIP
- name: Saving Linux x64 ZIP
uses: actions/upload-artifact@v2
uses: actions/upload-artifact@v2
with:
with:
name: linux-zip
name: linux-zip
path: target/install/stream-pi-client-linux-x64-${{ env.VERSION }}-executable.zip
path: target/install/stream-pi-client-linux-x64-${{ env.VERSION }}-executable.zip
- name: Saving Android aarch64 APK
- name: Saving Android aarch64 APK
uses: actions/upload-artifact@v2
uses: actions/upload-artifact@v2
with:
with:
name: android-apk
name: android-apk
path: target/install/*.apk
path: target/install/*.apk
build-macos:
build-macos:
runs-on: macos-10.15
runs-on: macos-10.15
steps:
steps:
- uses: actions/checkout@v2
- uses: actions/checkout@v2
- name: Setup java
- name: Setup java
uses: joschi/setup-jdk@v2
uses: joschi/setup-jdk@v2
with:
with:
java-version: 16
java-version: 16
- name: Setup JavaFX
- name: Setup JavaFX
run: |
run: |
wget -P /tmp https://download2.gluonhq.com/openjfx/17/openjfx-17-ea+11_linux-x64_bin-jmods.zip
wget -P /tmp https://download2.gluonhq.com/openjfx/17/openjfx-17-ea+11_linux-x64_bin-jmods.zip
unzip /tmp/openjfx-17-ea+11_linux-x64_bin-jmods.zip -d /tmp
unzip /tmp/openjfx-17-ea+11_linux-x64_bin-jmods.zip -d /tmp
- name: Download built jars
- name: Download built jars
uses: dawidd6/action-download-artifact@v2
uses: dawidd6/action-download-artifact@v2
with:
with:
workflow: init.yml
workflow: init.yml
name: built-jars
name: built-jars
path: target/lib/
path: target/lib/
- name: Download REQ_MODULES
- name: Download REQ_MODULES
uses: dawidd6/action-download-artifact@v2
uses: dawidd6/action-download-artifact@v2
with:
with:
workflow: init.yml
workflow: init.yml
name: req_modules
name: req_modules
- name: Download VERSION
- name: Download VERSION
uses: dawidd6/action-download-artifact@v2
uses: dawidd6/action-download-artifact@v2
with:
with:
workflow: init.yml
workflow: init.yml
name: version
name: version
- name: Add VERSION to environment
- name: Add VERSION to environment
run: |
run: |
echo "VERSION=$(<version.txt)" >> $GITHUB_ENV
echo "VERSION=$(<version.txt)" >> $GITHUB_ENV
- name: Add REQ_MODULES to environment
- name: Add REQ_MODULES to environment
run: |
run: |
echo "REQ_MODULES=$(<req_modules.txt)" >> $GITHUB_ENV
echo "REQ_MODULES=$(<req_modules.txt)" >> $GITHUB_ENV
- name: Create DMG
- name: Create DMG
run: |
run: |
# Create DMG
# Create DMG
.github/scripts/jpackage.sh \
.github/scripts/jpackage.sh \
--icon assets/macos-icon.icns \
--icon assets/macos-icon.icns \
--license-file LICENSE.txt \
--license-file LICENSE.txt \
--type dmg
--type dmg
cd $INSTALL_DIR
cd $INSTALL_DIR
mv *.dmg stream-pi-client-macos-x64-${{ env.VERSION }}.dmg
mv *.dmg stream-pi-client-macos-x64-${{ env.VERSION }}.dmg
env:
env:
MAIN_CLASS: com.stream_pi.client.Main
MAIN_CLASS: com.stream_pi.client.Main
JAVAFX_JMODS: /tmp/javafx-jmods-17/
JAVAFX_JMODS: /tmp/javafx-jmods-17/
JPACKAGE_HOME: ${{ env.JAVA_HOME }}
JPACKAGE_HOME: ${{ env.JAVA_HOME }}
INSTALL_DIR: target/install
INSTALL_DIR: target/install
- name: Saving MacOS x64 DMG
- name: Saving MacOS x64 DMG
uses: actions/upload-artifact@v2
uses: actions/upload-artifact@v2
with:
with:
name: macos-dmg
name: macos-dmg
path: target/install/stream-pi-client-macos-x64-${{ env.VERSION }}.dmg
path: target/install/stream-pi-client-macos-x64-${{ env.VERSION }}.dmg
build-windows:
build-windows:
runs-on: windows-2019
runs-on: windows-2019
steps:
steps:
- uses: actions/checkout@v2
- uses: actions/checkout@v2
- name: Setup java
- name: Setup java
uses: joschi/setup-jdk@v2
uses: joschi/setup-jdk@v2
with:
with:
java-version: 16
java-version: 16
- name: Download REQ_MODULES
- name: Download REQ_MODULES
uses: dawidd6/action-download-artifact@v2
uses: dawidd6/action-download-artifact@v2
with:
with:
workflow: init.yml
workflow: init.yml
name: req_modules
name: req_modules
- name: Download VERSION
- name: Download VERSION
uses: dawidd6/action-download-artifact@v2
uses: dawidd6/action-download-artifact@v2
with:
with:
workflow: init.yml
workflow: init.yml
name: version
name: version
- name: Setup JavaFX
- name: Setup JavaFX
run: |
run: |
bitsadmin /Transfer DownloadJavaFX https://download2.gluonhq.com/openjfx/17/openjfx-17-ea+11_windows-x64_bin-jmods.zip D:\openjfx-17-ea+11_windows-x64_bin-jmods.zip
bitsadmin /Transfer DownloadJavaFX https://download2.gluonhq.com/openjfx/17/openjfx-17-ea+11_windows-x64_bin-jmods.zip D:\openjfx-17-ea+11_windows-x64_bin-jmods.zip
Expand-Archive -Force D:\openjfx-17-ea+11_windows-x64_bin-jmods.zip D:\
Expand-Archive -Force D:\openjfx-17-ea+11_windows-x64_bin-jmods.zip D:\
- name: Download built jars
- name: Download built jars
uses: dawidd6/action-download-artifact@v2
uses: dawidd6/action-download-artifact@v2
with:
with:
workflow: init.yml
workflow: init.yml
name: built-jars
name: built-jars
path: target/lib/
path: target/lib/
- name: Create Bundle using JPackage
- name: Create Bundle using JPackage
id: project
id: project
shell: cmd
shell: cmd
run: |
run: |
call .github\scripts\jpackage.bat
call .github\scripts\jpackage.bat
env:
env:
MAIN_CLASS: com.stream_pi.client.Main
MAIN_CLASS: com.stream_pi.client.Main
JAVAFX_JMODS: D:\javafx-jmods-17\
JAVAFX_JMODS: D:\javafx-jmods-17\
JPACKAGE_HOME: ${{ env.JAVA_HOME }}
JPACKAGE_HOME: ${{ env.JAVA_HOME }}
INSTALL_DIR: target/install
INSTALL_DIR: target/install
- name: Saving Windows x64 EXE
- name: Saving Windows x64 EXE
uses: actions/upload-artifact@v2
uses: actions/upload-artifact@v2
with:
with:
name: windows-msi
name: windows-msi
path: target/install/*.msi
path: target/install/*.msi
armv32_job:
armv32_job:
runs-on: ubuntu-18.04
runs-on: ubuntu-18.04
steps:
steps:
- uses: actions/checkout@v2.1.0
- uses: actions/checkout@v2.1.0
- name: Download VERSION
- name: Download VERSION
uses: dawidd6/action-download-artifact@v2
uses: dawidd6/action-download-artifact@v2
with:
with:
workflow: init.yml
workflow: init.yml
name: version
name: version
- name: Add VERSION to environment
- name: Add VERSION to environment
run: |
run: |
echo "VERSION=$(<version.txt)" >> $GITHUB_ENV
echo "VERSION=$(<version.txt)" >> $GITHUB_ENV
- name: Download built jars
- name: Download built jars
uses: dawidd6/action-download-artifact@v2
uses: dawidd6/action-download-artifact@v2
with:
with:
workflow: init.yml
workflow: init.yml
name: built-jars
name: built-jars
path: target/lib/
path: target/lib/
- uses: uraimo/run-on-arch-action@v2.0.5
- uses: uraimo/run-on-arch-action@v2.0.5
name: Build & save Linux ARM32 ZIP
name: Build & save Linux ARM32 ZIP
with:
with:
arch: armv6
arch: armv6
distro: buster
distro: buster
run: |
run: |
sudo apt update
sudo apt update
sudo apt install axel unzip zip
sudo apt install axel unzip zip
VERSION=$(<version.txt)
VERSION=$(<version.txt)
INSTALL_DIR=target/install
INSTALL_DIR=target/install
mkdir -p $INSTALL_DIR
mkdir -p $INSTALL_DIR
mv target/lib/* $INSTALL_DIR
mv target/lib/* $INSTALL_DIR
axel -n 8 https://download2.gluonhq.com/openjfx/17/openjfx-17-ea+11_linux-arm32_bin-sdk.zip
axel -n 8 https://download2.gluonhq.com/openjfx/17/openjfx-17-ea+11_linux-arm32_bin-sdk.zip
unzip openjfx-17-ea+11_linux-arm32_bin-sdk.zip -d javafx-sdk-arm32
unzip openjfx-17-ea+11_linux-arm32_bin-sdk.zip -d javafx-sdk-arm32
mv javafx-sdk-arm32/javafx-sdk-17/legal javafx-sdk-arm32/javafx-sdk-17/javafx-legal
mv javafx-sdk-arm32/javafx-sdk-17/legal javafx-sdk-arm32/javafx-sdk-17/javafx-legal
mv javafx-sdk-arm32/javafx-sdk-17/lib/libgluon_drm* javafx-sdk-arm32/javafx-sdk-17/lib/libgluon_drm.so
mv javafx-sdk-arm32/javafx-sdk-17/lib/libgluon_drm* javafx-sdk-arm32/javafx-sdk-17/lib/libgluon_drm.so
mv javafx-sdk-arm32/javafx-sdk-17/lib/* $INSTALL_DIR/
mv javafx-sdk-arm32/javafx-sdk-17/lib/* $INSTALL_DIR/
cp assets/arm32-launchers/run_console $INSTALL_DIR/run_console
cp assets/arm32-launchers/run_console $INSTALL_DIR/run_console
cp assets/arm32-launchers/run_desktop $INSTALL_DIR/run_desktop
cp assets/arm32-launchers/run_desktop $INSTALL_DIR/run_desktop
chmod +x $INSTALL_DIR/run_desktop
chmod +x $INSTALL_DIR/run_desktop
chmod +x $INSTALL_DIR/run_console
chmod +x $INSTALL_DIR/run_console
#Download jdk
#Download jdk
axel -n 8 https://cdn.azul.com/zulu-embedded/bin/zulu11.48.21-ca-jdk11.0.11-linux_aarch32hf.tar.gz
axel -n 8 https://cdn.azul.com/zulu-embedded/bin/zulu11.48.21-ca-jdk11.0.11-linux_aarch32hf.tar.gz
tar -xvzf zulu11.48.21-ca-jdk11.0.11-linux_aarch32hf.tar.gz
tar -xvzf zulu11.48.21-ca-jdk11.0.11-linux_aarch32hf.tar.gz
#Run jpackage
#Run jpackage
zulu11.48.21-ca-jdk11.0.11-linux_aarch32hf/bin/jlink --no-header-files --no-man-pages --add-modules java.base,java.logging,java.net.http,java.scripting,jdk.jsobject,jdk.unsupported,jdk.unsupported.desktop,jdk.xml.dom,java.xml,java.management,jdk.localedata,java.sql,jdk.crypto.ec --output $INSTALL_DIR/jre
zulu11.48.21-ca-jdk11.0.11-linux_aarch32hf/bin/jlink --no-header-files --no-man-pages --add-modules java.base,java.logging,java.net.http,java.scripting,jdk.jsobject,jdk.unsupported,jdk.unsupported.desktop,jdk.xml.dom,java.xml,java.management,jdk.localedata,java.sql,jdk.crypto.ec --output $INSTALL_DIR/jre
cd $INSTALL_DIR
cd $INSTALL_DIR
zip -r stream-pi-client-linux-arm32-$VERSION-executable.zip *
zip -r stream-pi-client-linux-arm32-$VERSION-executable.zip *
- name: Saving Linux ARM32 ZIP
- name: Saving Linux ARM32 ZIP
uses: actions/upload-artifact@v2
uses: actions/upload-artifact@v2
with:
with:
name: linux-arm32-zip
name: linux-arm32-zip
path: target/install/stream-pi-client-linux-arm32-${{ env.VERSION }}-executable.zip
path: target/install/stream-pi-client-linux-arm32-${{ env.VERSION }}-executable.zip
name: Init
name: Init
on: [push]
on: [push]
jobs:
jobs:
init:
init:
runs-on: ubuntu-20.04
runs-on: ubuntu-20.04
steps:
steps:
- name: Install packages
- name: Install packages
run: sudo apt install unzip axel
run: sudo apt install unzip axel
- uses: actions/checkout@v2
- uses: actions/checkout@v2
- name: Setup java
- name: Setup java
uses: joschi/setup-jdk@v2
uses: joschi/setup-jdk@v2
with:
with:
java-version: 16
java-version: 16
- name: Setup JavaFX
- name: Setup JavaFX
run: |
run: |
cd /tmp
cd /tmp
axel -n 8 https://download2.gluonhq.com/openjfx/17/openjfx-17-ea+11_linux-x64_bin-sdk.zip
axel -n 8 https://download2.gluonhq.com/openjfx/17/openjfx-17-ea+11_linux-x64_bin-sdk.zip
unzip /tmp/openjfx-17-ea+11_linux-x64_bin-sdk.zip -d /tmp
unzip /tmp/openjfx-17-ea+11_linux-x64_bin-sdk.zip -d /tmp
- name: Set Timezone
- name: Set Timezone
uses: szenius/set-timezone@v1.0
uses: szenius/set-timezone@v1.0
with:
with:
timezoneLinux: "Asia/Kolkata"
timezoneLinux: "Asia/Kolkata"
- name: Build Jars
- name: Build Jars
run: |
run: |
echo $(date +'%d-%m-%Y %H:%M:%S %Z') > src/main/resources/com/stream_pi/client/build-date
echo $(date +'%d-%m-%Y %H:%M:%S %Z') > src/main/resources/com/stream_pi/client/build-date
echo Build Date/Time: cat src/main/resources/com/stream_pi/client/build-date
echo Build Date/Time: cat src/main/resources/com/stream_pi/client/build-date
mvn -X package
mvn -X package
- name: Save built jars
- name: Save built jars
uses: actions/upload-artifact@v2
uses: actions/upload-artifact@v2
with:
with:
name: built-jars
name: built-jars
path: target/lib/*
path: target/lib/*
- name: Set Version
- name: Set Version
run: |
run: |
echo "VERSION=$(mvn help:evaluate -Dexpression=project.version -q -DforceStdout)" >> $GITHUB_ENV
echo "VERSION=$(mvn help:evaluate -Dexpression=project.version -q -DforceStdout)" >> $GITHUB_ENV
- name: Calculate required modules
- name: Calculate required modules
run: |
run: |
JDEPS_MODULES=$(jdeps --module-path $JAVAFX_SDK/:target/lib/ --print-module-deps --ignore-missing-deps target/lib/client-$VERSION.jar)
JDEPS_MODULES=$(jdeps --module-path $JAVAFX_SDK/:target/lib/ --print-module-deps --ignore-missing-deps target/lib/client-$VERSION.jar)
JAVAFX_MODULES=javafx.fxml,javafx.media,javafx.swing,javafx.web
JAVAFX_MODULES=javafx.fxml,javafx.media,javafx.swing,javafx.web
echo "REQ_MODULES=$JDEPS_MODULES,$JAVAFX_MODULES" >> $GITHUB_ENV
echo "REQ_MODULES=$JDEPS_MODULES,$JAVAFX_MODULES" >> $GITHUB_ENV
env:
env:
JAVAFX_SDK: /tmp/javafx-sdk-17/lib/
JAVAFX_SDK: /tmp/javafx-sdk-17/lib/
- name: Saving REQ_MODULES
- name: Saving REQ_MODULES
run: |
run: |
echo $REQ_MODULES > req_modules.txt
echo $REQ_MODULES > req_modules.txt
- name: Uploading REQ_MODULES
- name: Uploading REQ_MODULES
uses: actions/upload-artifact@v2
uses: actions/upload-artifact@v2
with:
with:
name: req_modules
name: req_modules
path: req_modules.txt
path: req_modules.txt
- name: Saving VERSION
- name: Saving VERSION
run: |
run: |
echo $VERSION > version.txt
echo $VERSION > version.txt
- name: Uploading VERSION
- name: Uploading VERSION
uses: actions/upload-artifact@v2
uses: actions/upload-artifact@v2
with:
with:
name: version
name: version
path: version.txt
path: version.txt
- name: Uploading build-date
- name: Uploading build-date
uses: actions/upload-artifact@v2
uses: actions/upload-artifact@v2
with:
with:
name: build-date
name: build-date
path: src/main/resources/com/stream_pi/client/
path: src/main/resources/com/stream_pi/client/build-date