From 289d3e90b74ea4c3644ef01bb1474fe300a02999 Mon Sep 17 00:00:00 2001 From: JustArchi Date: Wed, 8 Apr 2020 19:32:53 +0200 Subject: [PATCH] Closes #1728 --- .github/workflows/ci.yml | 4 +- .travis.yml | 2 +- ArchiSteamFarm/ArchiSteamFarm.csproj | 2 +- ArchiSteamFarm/SharedInfo.cs | 5 ++ .../linux-arm64/ArchiSteamFarm-Service.sh | 77 +++++++++++++++++++ Dockerfile.Service.arm64 | 32 ++++++++ Dockerfile.arm64 | 32 ++++++++ appveyor.yml | 2 +- 8 files changed, 151 insertions(+), 5 deletions(-) create mode 100644 ArchiSteamFarm/overlay/linux-arm64/ArchiSteamFarm-Service.sh create mode 100644 Dockerfile.Service.arm64 create mode 100644 Dockerfile.arm64 diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 718995467..a7f2a55d8 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -67,7 +67,7 @@ jobs: - name: Publish ArchiSteamFarm on Unix if: startsWith(matrix.os, 'macos-') || startsWith(matrix.os, 'ubuntu-') env: - VARIANTS: generic linux-arm linux-x64 osx-x64 win-x64 # NOTE: When modifying variants, don't forget to update ASF_VARIANT definitions in SharedInfo.cs! + VARIANTS: generic linux-arm linux-arm64 linux-x64 osx-x64 win-x64 # NOTE: When modifying variants, don't forget to update ASF_VARIANT definitions in SharedInfo.cs! shell: sh run: | set -eu @@ -107,7 +107,7 @@ jobs: - name: Publish ArchiSteamFarm on Windows if: startsWith(matrix.os, 'windows-') env: - VARIANTS: generic generic-netf linux-arm linux-x64 osx-x64 win-x64 # NOTE: When modifying variants, don't forget to update ASF_VARIANT definitions in SharedInfo.cs! + VARIANTS: generic generic-netf linux-arm linux-arm64 linux-x64 osx-x64 win-x64 # NOTE: When modifying variants, don't forget to update ASF_VARIANT definitions in SharedInfo.cs! shell: pwsh run: | Set-StrictMode -Version Latest diff --git a/.travis.yml b/.travis.yml index 401ef79fe..ea3ba17a5 100644 --- a/.travis.yml +++ b/.travis.yml @@ -16,7 +16,7 @@ env: - DOTNET_CLI_TELEMETRY_OPTOUT: 1 - DOTNET_SKIP_FIRST_TIME_EXPERIENCE: 1 - NET_CORE_VERSION: netcoreapp3.1 - - VARIANTS="generic linux-arm linux-x64 osx-x64 win-x64" # NOTE: When modifying variants, don't forget to update ASF_VARIANT definitions in SharedInfo.cs! + - VARIANTS="generic linux-arm linux-arm64 linux-x64 osx-x64 win-x64" # NOTE: When modifying variants, don't forget to update ASF_VARIANT definitions in SharedInfo.cs! before_script: - | set -eu diff --git a/ArchiSteamFarm/ArchiSteamFarm.csproj b/ArchiSteamFarm/ArchiSteamFarm.csproj index 14c18a8e9..79983cd49 100644 --- a/ArchiSteamFarm/ArchiSteamFarm.csproj +++ b/ArchiSteamFarm/ArchiSteamFarm.csproj @@ -20,7 +20,7 @@ https://github.com/JustArchiNET/ArchiSteamFarm Git https://github.com/JustArchiNET/ArchiSteamFarm.git - linux-arm;linux-x64;osx-x64;win-x64 + linux-arm;linux-arm64;linux-x64;osx-x64;win-x64 true diff --git a/ArchiSteamFarm/SharedInfo.cs b/ArchiSteamFarm/SharedInfo.cs index eda4e285e..4cb996ed7 100644 --- a/ArchiSteamFarm/SharedInfo.cs +++ b/ArchiSteamFarm/SharedInfo.cs @@ -112,6 +112,11 @@ namespace ArchiSteamFarm { [NotNull] internal static string Variant => "linux-arm"; +#elif ASF_VARIANT_LINUX_ARM64 + internal static bool CanUpdate => true; + + [NotNull] + internal static string Variant => "linux-arm64"; #elif ASF_VARIANT_LINUX_X64 internal static bool CanUpdate => true; diff --git a/ArchiSteamFarm/overlay/linux-arm64/ArchiSteamFarm-Service.sh b/ArchiSteamFarm/overlay/linux-arm64/ArchiSteamFarm-Service.sh new file mode 100644 index 000000000..307365d65 --- /dev/null +++ b/ArchiSteamFarm/overlay/linux-arm64/ArchiSteamFarm-Service.sh @@ -0,0 +1,77 @@ +#!/usr/bin/env sh +set -eu + +CONFIG_PATH="config/ASF.json" + +cd "$(dirname "$(readlink -f "$0")")" + +SCRIPT_DIR="$(pwd)" +SCRIPT_PATH="${SCRIPT_DIR}/${0}" + +BINARY="${SCRIPT_DIR}/ArchiSteamFarm" + +if [ ! -f "$BINARY" ]; then + echo "ERROR: $BINARY could not be found!" + exit 1 +fi + +BINARY_ARGS="" +PATH_NEXT=0 + +PARSE_ARG() { + BINARY_ARGS="$BINARY_ARGS $1" + + case "$1" in + --path) PATH_NEXT=1 ;; + --path=*) + if [ "$PATH_NEXT" -eq 1 ]; then + PATH_NEXT=0 + cd "$1" + else + cd "$(echo "$1" | cut -d '=' -f 2-)" + fi + ;; + *) + if [ "$PATH_NEXT" -eq 1 ]; then + PATH_NEXT=0 + cd "$1" + fi + esac +} + +if [ -n "${ASF_PATH-}" ]; then + cd "$ASF_PATH" +fi + +if [ -n "${ASF_ARGS-}" ]; then + for ARG in $ASF_ARGS; do + if [ -n "$ARG" ]; then + PARSE_ARG "$ARG" + fi + done +fi + +for ARG in "$@"; do + if [ -n "$ARG" ]; then + PARSE_ARG "$ARG" + fi +done + +CONFIG_PATH="$(pwd)/${CONFIG_PATH}" + +# Kill underlying ASF process on shell process exit +trap "trap - TERM && kill -- -$$" INT TERM + +while :; do + if [ -f "$CONFIG_PATH" ] && grep -Eq '"Headless":\s+?true' "$CONFIG_PATH"; then + # We're running ASF in headless mode so we don't need STDIN + "$BINARY" $BINARY_ARGS & # Start ASF in the background, trap will work properly due to non-blocking call + wait $! # This will forward dotnet error code, set -e will abort the script if it's non-zero + else + # We're running ASF in non-headless mode, so we need STDIN to be operative + "$BINARY" $BINARY_ARGS # Start ASF in the foreground, trap sadly won't work until process exit + fi + + chmod +x "$SCRIPT_PATH" # If ASF exited by itself, we need to ensure that our script is still set to +x after auto-update + sleep 1 +done diff --git a/Dockerfile.Service.arm64 b/Dockerfile.Service.arm64 new file mode 100644 index 000000000..589459c4c --- /dev/null +++ b/Dockerfile.Service.arm64 @@ -0,0 +1,32 @@ +FROM node:lts AS build-node +WORKDIR /app +COPY ASF-ui . +RUN echo "node: $(node --version)" && \ + echo "npm: $(npm --version)" && \ + npm ci && \ + npm run deploy + +FROM mcr.microsoft.com/dotnet/core/sdk:3.1 AS build-dotnet +ENV CONFIGURATION Release +ENV NET_CORE_VERSION netcoreapp3.1 +WORKDIR /app +COPY --from=build-node /app/dist ASF-ui/dist +COPY ArchiSteamFarm ArchiSteamFarm +COPY ArchiSteamFarm.Tests ArchiSteamFarm.Tests +RUN dotnet --info && \ + # TODO: Remove workaround for https://github.com/microsoft/msbuild/issues/3897 when it's no longer needed + if [ -f "ArchiSteamFarm/Localization/Strings.zh-CN.resx" ]; then ln -s "Strings.zh-CN.resx" "ArchiSteamFarm/Localization/Strings.zh-Hans.resx"; fi && \ + if [ -f "ArchiSteamFarm/Localization/Strings.zh-TW.resx" ]; then ln -s "Strings.zh-TW.resx" "ArchiSteamFarm/Localization/Strings.zh-Hant.resx"; fi && \ + dotnet build ArchiSteamFarm -c "$CONFIGURATION" -f "$NET_CORE_VERSION" --nologo && \ + dotnet test ArchiSteamFarm.Tests -c "$CONFIGURATION" -f "$NET_CORE_VERSION" --nologo && \ + dotnet clean ArchiSteamFarm -c "$CONFIGURATION" -f "$NET_CORE_VERSION" --nologo && \ + dotnet publish ArchiSteamFarm -c "$CONFIGURATION" -f "$NET_CORE_VERSION" -o 'out' -r 'linux-arm64' --nologo /p:ASFVariant=linux-arm64 /p:PublishTrimmed=true && \ + cp "ArchiSteamFarm/overlay/linux-arm64/ArchiSteamFarm-Service.sh" "out/ArchiSteamFarm-Service.sh" + +FROM mcr.microsoft.com/dotnet/core/runtime-deps:3.1-buster-slim-arm64v8 AS runtime +ENV ASPNETCORE_URLS= +LABEL maintainer="JustArchi " +EXPOSE 1242 +WORKDIR /app +COPY --from=build-dotnet /app/out . +ENTRYPOINT ["./ArchiSteamFarm-Service.sh", "--no-restart", "--process-required", "--system-required"] diff --git a/Dockerfile.arm64 b/Dockerfile.arm64 new file mode 100644 index 000000000..769beda15 --- /dev/null +++ b/Dockerfile.arm64 @@ -0,0 +1,32 @@ +FROM node:lts AS build-node +WORKDIR /app +COPY ASF-ui . +RUN echo "node: $(node --version)" && \ + echo "npm: $(npm --version)" && \ + npm ci && \ + npm run deploy + +FROM mcr.microsoft.com/dotnet/core/sdk:3.1 AS build-dotnet +ENV CONFIGURATION Release +ENV NET_CORE_VERSION netcoreapp3.1 +WORKDIR /app +COPY --from=build-node /app/dist ASF-ui/dist +COPY ArchiSteamFarm ArchiSteamFarm +COPY ArchiSteamFarm.Tests ArchiSteamFarm.Tests +RUN dotnet --info && \ + # TODO: Remove workaround for https://github.com/microsoft/msbuild/issues/3897 when it's no longer needed + if [ -f "ArchiSteamFarm/Localization/Strings.zh-CN.resx" ]; then ln -s "Strings.zh-CN.resx" "ArchiSteamFarm/Localization/Strings.zh-Hans.resx"; fi && \ + if [ -f "ArchiSteamFarm/Localization/Strings.zh-TW.resx" ]; then ln -s "Strings.zh-TW.resx" "ArchiSteamFarm/Localization/Strings.zh-Hant.resx"; fi && \ + dotnet build ArchiSteamFarm -c "$CONFIGURATION" -f "$NET_CORE_VERSION" --nologo && \ + dotnet test ArchiSteamFarm.Tests -c "$CONFIGURATION" -f "$NET_CORE_VERSION" --nologo && \ + dotnet clean ArchiSteamFarm -c "$CONFIGURATION" -f "$NET_CORE_VERSION" --nologo && \ + dotnet publish ArchiSteamFarm -c "$CONFIGURATION" -f "$NET_CORE_VERSION" -o 'out' --nologo /p:ASFVariant=docker /p:UseAppHost=false && \ + cp "ArchiSteamFarm/overlay/generic/ArchiSteamFarm.sh" "out/ArchiSteamFarm.sh" + +FROM mcr.microsoft.com/dotnet/core/aspnet:3.1-buster-slim-arm64v8 AS runtime +ENV ASPNETCORE_URLS= +LABEL maintainer="JustArchi " +EXPOSE 1242 +WORKDIR /app +COPY --from=build-dotnet /app/out . +ENTRYPOINT ["./ArchiSteamFarm.sh", "--no-restart", "--process-required", "--system-required"] diff --git a/appveyor.yml b/appveyor.yml index 2f94ab328..7ab4e00fa 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -15,7 +15,7 @@ environment: DOTNET_SKIP_FIRST_TIME_EXPERIENCE: true NET_CORE_VERSION: netcoreapp3.1 NET_FRAMEWORK_VERSION: net48 - VARIANTS: generic generic-netf linux-arm linux-x64 osx-x64 win-x64 # NOTE: When modifying variants, don't forget to update ASF_VARIANT definitions in SharedInfo.cs! + VARIANTS: generic generic-netf linux-arm linux-arm64 linux-x64 osx-x64 win-x64 # NOTE: When modifying variants, don't forget to update ASF_VARIANT definitions in SharedInfo.cs! matrix: allow_failures: - image: Visual Studio 2019 Preview