diff --git a/.github/workflows/build-test-cross.yml b/.github/workflows/build-test-cross.yml
new file mode 100644
index 0000000..8f7591f
--- /dev/null
+++ b/.github/workflows/build-test-cross.yml
@@ -0,0 +1,134 @@
+name: cross compile dotnet app
+on:
+ # release:
+ # types:
+ # - published
+ workflow_dispatch:
+ push:
+ branches:
+ - "main"
+ pull_request:
+ branches:
+ - "**"
+
+jobs:
+ build:
+ runs-on: ubuntu-latest
+ steps:
+ - name: checkout
+ uses: actions/checkout@v4
+ - uses: actions/setup-dotnet@v4
+ with:
+ dotnet-version: 7.x
+ - name: build dotnet executables
+ run: make build
+ - name: size of executables
+ run: make size
+ - name: file info
+ run: make file
+ - name: prep for distribution
+ run: make dist
+ - uses: actions/upload-artifact@v4
+ with:
+ path: dist/*
+
+ test:
+ defaults:
+ run:
+ shell: sh
+ needs: [build]
+ name: Test ${{ matrix.docker == true && matrix.alpine == true && 'linux-musl' || matrix.docker == true && matrix.alpine == false && 'linux' || matrix.os }}-${{ matrix.arch }}
+ strategy:
+ fail-fast: false
+ matrix:
+ os: [
+ "macos-14",
+ "windows-latest",
+ "ubuntu-latest"
+ ]
+ arch: ["amd64"]
+ alpine: [false]
+ include:
+ - os: "macos-14"
+ arch: "arm64"
+ - os: "ubuntu-latest"
+ arch: "arm64"
+ alpine: true
+ docker: true
+ - os: "ubuntu-latest"
+ arch: "amd64"
+ alpine: true
+ docker: true
+ - os: "ubuntu-latest"
+ arch: "arm64"
+ debian: true
+ docker: true
+ runs-on: ${{ matrix.os }}
+ steps:
+ - name: Download all workflow run artifacts
+ uses: actions/download-artifact@v4
+ - name: list and unpack artifacts
+ run: |
+ ls artifact/*
+ cd artifact && gunzip *.gz && cd ..
+ ls artifact/*
+ - name: Set up QEMU
+ if: matrix.arch == 'arm64' && matrix.docker == true
+ uses: docker/setup-qemu-action@v3
+ - name: test alpine ${{ matrix.arch }} package
+ if: ${{ matrix.alpine == true && matrix.arch == 'arm64' }}
+ run: docker run --platform=linux/${{ matrix.arch }} --rm -v $(pwd):/app alpine /bin/sh -c 'apk add --no-cache gcc icu && chmod +x ./app/artifact/explore-cli-linux-musl-arm64 && ./app/artifact/explore-cli-linux-musl-arm64 --version'
+ - name: test alpine ${{ matrix.arch }} package
+ if: ${{ matrix.alpine == true && matrix.arch == 'amd64' }}
+ run: docker run --platform=linux/${{ matrix.arch }} --rm -v $(pwd):/app alpine /bin/sh -c 'apk add --no-cache gcc icu && chmod +x ./app/artifact/explore-cli-linux-musl-x64 && ./app/artifact/explore-cli-linux-musl-x64 --version'
+ - name: test debian ${{ matrix.arch }} package
+ if: ${{ matrix.debian == true && matrix.arch == 'arm64' }}
+ run: docker run --platform=linux/${{ matrix.arch }} --rm -v $(pwd):/app debian /bin/bash -c 'apt update && apt install -y libicu-dev && chmod +x ./app/artifact/explore-cli-linux-arm64 && ./app/artifact/explore-cli-linux-arm64 --version'
+ - name: test debian ${{ matrix.arch }} package
+ if: ${{ matrix.debian == true && matrix.arch == 'amd64' }}
+ run: docker run --platform=linux/${{ matrix.arch }} --rm -v $(pwd):/app debian /bin/bash -c 'apt update && apt install -y libicu-dev && chmod +x ./app/artifact/explore-cli-linux-x64 && ./app/artifact/explore-cli-linux-x64 --version'
+ - name: test 'macos-14-arm'
+ if: ${{ matrix.os == 'macos-14' && matrix.arch == 'arm64' }}
+ run: chmod +x artifact/explore-cli-osx-arm64 && artifact/explore-cli-osx-arm64 --version
+ - name: test 'macos-14-amd'
+ if: ${{ matrix.os == 'macos-14' && matrix.arch == 'amd64' }}
+ run: chmod +x artifact/explore-cli-osx-x64 && artifact/explore-cli-osx-x64 --version
+ - name: test 'windows-latest'
+ if: ${{ matrix.os == 'windows-latest' }}
+ run: artifact/explore-cli-win-x64.exe --version
+ - name: test 'ubuntu-latest'
+ if: ${{ matrix.os == 'ubuntu-latest' && matrix.docker != true }}
+ run: chmod +x artifact/explore-cli-linux-x64 && artifact/explore-cli-linux-x64 --version
+
+ publish:
+ runs-on: ubuntu-latest
+ if: github.event_name == 'workflow_dispatch'
+ # if: |
+ # startsWith(github.ref, 'refs/tags/v')
+ needs: [build,test]
+
+ steps:
+ - name: Install GitVersion
+ uses: gittools/actions/gitversion/setup@v0.10.2
+ with:
+ versionSpec: '5.x'
+ - name: checkout
+ uses: actions/checkout@v4
+ with:
+ fetch-depth: 0
+ - name: Determine Version
+ id: gitVersion
+ uses: gittools/actions/gitversion/execute@v0.10.2
+ with:
+ useConfigFile: true
+ configFilePath: ./.github/gitversion.yml
+ - name: Download artifacts
+ uses: actions/download-artifact@v4
+
+ - name: Upload Release Assets
+ uses: svenstaro/upload-release-action@v2
+ with:
+ repo_token: ${{ secrets.GITHUB_TOKEN }}
+ file: artifact/*
+ file_glob: true
+ tag: ${{ steps.gitversion.outputs.MajorMinorPatch }}
\ No newline at end of file
diff --git a/.github/workflows/build-test-package.yml b/.github/workflows/build-test-package.yml
index c1fb3ad..43bddbd 100644
--- a/.github/workflows/build-test-package.yml
+++ b/.github/workflows/build-test-package.yml
@@ -30,7 +30,7 @@ jobs:
- name: Install GitVersion
uses: gittools/actions/gitversion/setup@v0.10.2
with:
- versionSpec: '5.x'
+ versionSpec: '5.x'
# check out code
- name: 'Checkout code'
diff --git a/.gitignore b/.gitignore
index 8a30d25..4799469 100644
--- a/.gitignore
+++ b/.gitignore
@@ -396,3 +396,6 @@ FodyWeavers.xsd
# JetBrains Rider
*.sln.iml
+
+# distribution artifacts
+/dist
\ No newline at end of file
diff --git a/Makefile b/Makefile
new file mode 100644
index 0000000..f8c015c
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,64 @@
+all: build
+SHELL:=/bin/bash
+APP_NAME = "explore-cli"
+.PHONY: dist
+
+RIDS = "linux-x64" "linux-arm64" "linux-musl-x64" "linux-musl-arm64" "osx-x64" "osx-arm64" "win-x64" "win-arm64"
+
+build: clean
+ for rid in $(RIDS); do \
+ echo "Building for $$rid..."; \
+ dotnet publish -c Release -p:PublishSingleFile=true -p:SelfContained=true -p:PublishReadyToRun=true -p:PublishTrimmed=true -p:StaticLink=true -r $$rid -o bin/$(APP_NAME)-$$rid; \
+ done || true
+
+# the above true condition is a yak shave,
+# /usr/local/share/dotnet/sdk/7.0.409/Sdks/Microsoft.NET.Sdk/targets/Microsoft.NET.Publish.targets(111,5):
+# error NETSDK1098: Applications published to a single-file are required to use the application host.
+# You must either set PublishSingleFile to false or set UseAppHost to true.
+
+debug: clean
+ @echo "Building in debug mode..."
+ for rid in $(RIDS); do \
+ echo "Building for $$rid..."; \
+ dotnet publish -c Debug -p:PublishSingleFile=true -p:SelfContained=true -p:PublishReadyToRun=true-r $$rid -o bin/$(APP_NAME)-$$rid; \
+ done
+
+size:
+ @echo "Size of the binaries:"
+ for rid in $(RIDS); do \
+ echo "Size of bin/$(APP_NAME)-$$rid:"; \
+ ls -lh bin/$(APP_NAME)-$$rid/; \
+ done
+
+file:
+ @echo "File type of the binaries:"
+ for rid in $(RIDS); do \
+ echo "File type of bin/$(APP_NAME)-$$rid:"; \
+ file bin/$(APP_NAME)-$$rid/*; \
+ done
+
+dist:
+ rm -rf dist
+ mkdir -p dist
+ for rid in $(RIDS); do \
+ rm -f bin/$(APP_NAME)-$$rid/*.pdb; \
+ cd bin/$(APP_NAME)-$$rid; \
+ if [[ "$$rid" == *"win"* ]]; then \
+ gzip --stdout --best *.Cli* > $(APP_NAME)-$$rid.exe.gz; \
+ shasum -a 256 $(APP_NAME)-$$rid.exe.gz > $(APP_NAME)-$$rid.exe.gz.256; \
+ mv $(APP_NAME)-$$rid.exe.gz ../../dist;\
+ mv $(APP_NAME)-$$rid.exe.gz.256 ../../dist;\
+ else \
+ gzip --stdout --best *.Cli* > $(APP_NAME)-$$rid.gz; \
+ shasum -a 256 $(APP_NAME)-$$rid.gz > $(APP_NAME)-$$rid.gz.256; \
+ mv $(APP_NAME)-$$rid.gz ../../dist;\
+ mv $(APP_NAME)-$$rid.gz.256 ../../dist;\
+ fi; \
+ cd ../../; \
+ done
+
+clean:
+ @echo "Cleaning..."
+ @rm -rf bin
+ @rm -rf obj
+ @rm -rf dist
\ No newline at end of file
diff --git a/README.md b/README.md
index d4ca137..ec536c5 100644
--- a/README.md
+++ b/README.md
@@ -36,10 +36,42 @@ You will need the following:
### Install the CLI
+#### Nuget
+
Download and install the CLI tool from Nuget: https://www.nuget.org/packages/Explore.Cli
`dotnet tool install --global Explore.Cli`
+#### GitHub Releases
+
+Standalone releases of the Explore.CLI tool are published to GitHub Releases.
+
+##### Supported Platforms
+
+| OS | Architecture | Supported |
+| ------- | ------------ | --------- |
+| OSX | x86_64 | ✅ |
+| Linux | x86_64 | ✅ |
+| Windows | x86_64 | ✅ |
+| OSX | arm64 | ✅ |
+| Linux | arm64 | ✅ |
+| Windows | arm64 | ✅ |
+| Alpine | x86_64 | ✅ |
+| Alpine | arm64 | ✅ |
+
+###### Pre-requisites
+
+- `libicu` - Linux musl and glibc based systems
+- `gcc` - Linux musl based systems
+
+###### Alpine
+
+`apk add -y gcc icu`
+
+###### Debian
+
+`apt update && apt install -y libicu`
+
### Session Cookies for CLI command
You will need to obtain certain cookies from an active session in SwaggerHub Explore to invoke the `CLI` commands.
diff --git a/src/Explore.Cli/Explore.Cli.csproj b/src/Explore.Cli/Explore.Cli.csproj
index c2c9a81..6e6ab7f 100644
--- a/src/Explore.Cli/Explore.Cli.csproj
+++ b/src/Explore.Cli/Explore.Cli.csproj
@@ -30,6 +30,8 @@
+
+