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