Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
246 changes: 135 additions & 111 deletions .github/workflows/synkronus-cli.yml
Original file line number Diff line number Diff line change
@@ -1,111 +1,135 @@
name: Synkronus CLI Build & Release

on:
push:
branches:
- main
- dev
paths:
- 'synkronus-cli/**'
- '.github/workflows/synkronus-cli.yml'
pull_request:
paths:
- 'synkronus-cli/**'
- '.github/workflows/synkronus-cli.yml'
release:
types: [published]

jobs:
build-cli:
name: Build synkronus-cli (CI)
if: github.event_name != 'release'
runs-on: ubuntu-latest

strategy:
matrix:
include: ${{ fromJSON(
github.event_name == 'pull_request'
&& '[{"goos":"linux","goarch":"amd64"}]'
|| '[{"goos":"linux","goarch":"amd64"},{"goos":"linux","goarch":"arm64"},{"goos":"windows","goarch":"amd64"},{"goos":"windows","goarch":"arm64"},{"goos":"darwin","goarch":"amd64"},{"goos":"darwin","goarch":"arm64"}]'
) }}

env:
CGO_ENABLED: 0

steps:
- name: Checkout repository
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7

- name: Set up Go
uses: actions/setup-go@b7ad1dad31e06c5925ef5d2fc7ad053ef454303e # v7
with:
go-version: '1.25.x'
cache-dependency-path: synkronus-cli/go.sum

- name: Build synkronus-cli
working-directory: synkronus-cli
run: |
mkdir -p dist
FILENAME=synkronus-cli-${{ matrix.goos }}-${{ matrix.goarch }}
EXT=""
if [ "${{ matrix.goos }}" = "windows" ]; then EXT=".exe"; fi

GOOS=${{ matrix.goos }} GOARCH=${{ matrix.goarch }} \
go build -o dist/${FILENAME}${EXT} ./cmd/synkronus

if [ "${{ matrix.goos }}" = "windows" ]; then
(cd dist && zip -r ${FILENAME}.zip ${FILENAME}${EXT})
else
tar -C dist -czf dist/${FILENAME}.tar.gz ${FILENAME}
fi
rm dist/${FILENAME}${EXT}

- name: Upload build artifact
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7
with:
name: synkronus-cli-${{ matrix.goos }}-${{ matrix.goarch }}
path: synkronus-cli/dist/synkronus-cli-${{ matrix.goos }}-${{ matrix.goarch }}*
archive: false

release-cli:
name: Build & attach release assets
if: github.event_name == 'release'
runs-on: ubuntu-latest
permissions:
contents: write

strategy:
matrix:
goos: [linux, windows, darwin]
goarch: [amd64, arm64]

env:
CGO_ENABLED: 0

steps:
- name: Checkout repository
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7

- name: Set up Go
uses: actions/setup-go@b7ad1dad31e06c5925ef5d2fc7ad053ef454303e # v7
with:
go-version: '1.25.x'
cache-dependency-path: synkronus-cli/go.sum

- name: Build synkronus-cli binaries
working-directory: synkronus-cli
run: |
mkdir -p dist
EXT=""
if [ "${{ matrix.goos }}" = "windows" ]; then EXT=".exe"; fi
GOOS=${{ matrix.goos }} GOARCH=${{ matrix.goarch }} \
go build -o dist/synkronus-cli-${{ matrix.goos }}-${{ matrix.goarch }}${EXT} ./cmd/synkronus
ls -R dist

- name: Upload assets to GitHub Release
uses: softprops/action-gh-release@efb35369e0ad2afab669f228072c1b0d510eae64 # v3
with:
files: |
synkronus-cli/dist/synkronus-cli-*
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
name: Synkronus CLI Build & Release

on:
push:
branches:
- main
- dev
paths:
- 'synkronus-cli/**'
- '.github/workflows/synkronus-cli.yml'
pull_request:
paths:
- 'synkronus-cli/**'
- '.github/workflows/synkronus-cli.yml'
release:
types: [published]

jobs:
build-cli:
name: Build synkronus-cli (CI)
if: github.event_name != 'release'
runs-on: ubuntu-latest

strategy:
matrix:
include: ${{ fromJSON(
github.event_name == 'pull_request'
&& '[{"goos":"linux","goarch":"amd64"},{"goos":"windows","goarch":"amd64"},{"goos":"windows","goarch":"arm64"}]'
|| '[{"goos":"linux","goarch":"amd64"},{"goos":"linux","goarch":"arm64"},{"goos":"windows","goarch":"amd64"},{"goos":"windows","goarch":"arm64"},{"goos":"darwin","goarch":"amd64"},{"goos":"darwin","goarch":"arm64"}]'
) }}

env:
CGO_ENABLED: 0

steps:
- name: Checkout repository
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7

- name: Set up Go
uses: actions/setup-go@b7ad1dad31e06c5925ef5d2fc7ad053ef454303e # v7
with:
go-version: '1.25.x'
cache-dependency-path: synkronus-cli/go.sum

- name: Generate Windows resources
if: matrix.goos == 'windows'
working-directory: synkronus-cli
run: |
case "${{ matrix.goarch }}" in
amd64) RESOURCE_FLAGS="-64" ;;
arm64) RESOURCE_FLAGS="-64 -arm" ;;
*) echo "Unsupported Windows architecture" >&2; exit 1 ;;
esac
go run github.com/josephspurrier/goversioninfo/cmd/goversioninfo@v1.5.0 \
${RESOURCE_FLAGS} -o cmd/synkronus/resource_windows_${{ matrix.goarch }}.syso versioninfo.json

- name: Build synkronus-cli
working-directory: synkronus-cli
run: |
mkdir -p dist
FILENAME=synkronus-cli-${{ matrix.goos }}-${{ matrix.goarch }}
EXT=""
if [ "${{ matrix.goos }}" = "windows" ]; then EXT=".exe"; fi

GOOS=${{ matrix.goos }} GOARCH=${{ matrix.goarch }} \
go build -o dist/${FILENAME}${EXT} ./cmd/synkronus

if [ "${{ matrix.goos }}" = "windows" ]; then
(cd dist && zip -r ${FILENAME}.zip ${FILENAME}${EXT})
else
tar -C dist -czf dist/${FILENAME}.tar.gz ${FILENAME}
fi
rm dist/${FILENAME}${EXT}

- name: Upload build artifact
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7
with:
name: synkronus-cli-${{ matrix.goos }}-${{ matrix.goarch }}
path: synkronus-cli/dist/synkronus-cli-${{ matrix.goos }}-${{ matrix.goarch }}*
archive: false

release-cli:
name: Build & attach release assets
if: github.event_name == 'release'
runs-on: ubuntu-latest
permissions:
contents: write

strategy:
matrix:
goos: [linux, windows, darwin]
goarch: [amd64, arm64]

env:
CGO_ENABLED: 0

steps:
- name: Checkout repository
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7

- name: Set up Go
uses: actions/setup-go@b7ad1dad31e06c5925ef5d2fc7ad053ef454303e # v7
with:
go-version: '1.25.x'
cache-dependency-path: synkronus-cli/go.sum

- name: Generate Windows resources
if: matrix.goos == 'windows'
working-directory: synkronus-cli
run: |
case "${{ matrix.goarch }}" in
amd64) RESOURCE_FLAGS="-64" ;;
arm64) RESOURCE_FLAGS="-64 -arm" ;;
*) echo "Unsupported Windows architecture" >&2; exit 1 ;;
esac
go run github.com/josephspurrier/goversioninfo/cmd/goversioninfo@v1.5.0 \
${RESOURCE_FLAGS} -o cmd/synkronus/resource_windows_${{ matrix.goarch }}.syso versioninfo.json

- name: Build synkronus-cli binaries
working-directory: synkronus-cli
run: |
mkdir -p dist
EXT=""
if [ "${{ matrix.goos }}" = "windows" ]; then EXT=".exe"; fi
GOOS=${{ matrix.goos }} GOARCH=${{ matrix.goarch }} \
go build -o dist/synkronus-cli-${{ matrix.goos }}-${{ matrix.goarch }}${EXT} ./cmd/synkronus
ls -R dist

- name: Upload assets to GitHub Release
uses: softprops/action-gh-release@efb35369e0ad2afab669f228072c1b0d510eae64 # v3
with:
files: |
synkronus-cli/dist/synkronus-cli-*
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -33,3 +33,6 @@ sbom-dist/

# pnpm store
.pnpm-store/

# Generated Go Windows resource objects
*.syso
25 changes: 24 additions & 1 deletion synkronus-cli/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -209,7 +209,30 @@ ticket-ready summary.
Build with: `go build -o bin/synk.exe ./cmd/synkronus`
Run with: `bin/synk.exe`

Icon: configured in versioninfo.json and built with goversioninfo `goversioninfo -o cmd/synkronus/resource.syso` to create a syso file next to main go file.
### Windows resources

Normal developer builds do not require a resource object. CI and release builds
for Windows generate the icon and file properties from `versioninfo.json` and
`synk.ico` with pinned `goversioninfo v1.5.0` before compiling.

To include these resources locally, run the generator from `synkronus-cli/`
using the flags for your target architecture:

```sh
# Windows AMD64
go run github.com/josephspurrier/goversioninfo/cmd/goversioninfo@v1.5.0 -64 -o cmd/synkronus/resource_windows_amd64.syso versioninfo.json

# Windows ARM64
go run github.com/josephspurrier/goversioninfo/cmd/goversioninfo@v1.5.0 -64 -arm -o cmd/synkronus/resource_windows_arm64.syso versioninfo.json
```

Run the generator on the host before setting `GOOS` / `GOARCH` for a cross-build.
Then build `./cmd/synkronus` for the matching Windows target. The generated objects
must sit beside `main.go`; their `_windows_amd64` and `_windows_arm64` suffixes
make Go include only the matching object and exclude both from Linux/macOS builds.
Do not rename an i386 object to target another architecture. Generated `.syso`
files are ignored and must not be committed. Regenerate them after changing
`versioninfo.json` or the icon.

### Regenerating the OpenAPI client

Expand Down
Binary file not shown.
4 changes: 3 additions & 1 deletion synkronus/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -164,4 +164,6 @@ Run with: `./bin/synkronus.exe` or `go run cmd/synkronus/main.go`
On Windows PowerShell, you can use `./build.ps1` to build with version metadata from git.
Without `-ldflags` version injection, `/health` reports the default fallback version (`1.0.0`).

Icon: configured in versioninfo.json and built with goversioninfo `goversioninfo -o cmd/synkronus/resource.syso` to create a syso file next to main go file.
Windows resource objects are not tracked or generated by the server build.
The CLI has a separate architecture-specific resource generation process; see
[its Windows resource instructions](../synkronus-cli/README.md#windows-resources).
Loading