Skip to content

Commit ed2c3d5

Browse files
committed
Added CI/CD infra
1 parent fe3ab54 commit ed2c3d5

10 files changed

Lines changed: 155 additions & 32 deletions

File tree

.github/workflows/cli.yml

Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
1+
name: Build CLI Commands
2+
3+
on:
4+
push:
5+
tags:
6+
- "v*"
7+
workflow_dispatch:
8+
9+
permissions:
10+
contents: write
11+
12+
jobs:
13+
build:
14+
name: Build llm
15+
runs-on: ${{ matrix.os }}
16+
strategy:
17+
matrix:
18+
include:
19+
- os: macos-latest
20+
arch: arm64
21+
goos: darwin
22+
goarch: arm64
23+
- os: ubuntu-24.04-arm
24+
arch: arm64
25+
goos: linux
26+
goarch: arm64
27+
- os: ubuntu-24.04
28+
arch: amd64
29+
goos: linux
30+
goarch: amd64
31+
- os: windows-latest
32+
arch: amd64
33+
goos: windows
34+
goarch: amd64
35+
36+
steps:
37+
- name: Checkout code
38+
uses: actions/checkout@v4
39+
with:
40+
fetch-depth: 0
41+
42+
- name: Set up Go
43+
uses: actions/setup-go@v5
44+
with:
45+
go-version: "1.25"
46+
47+
- name: Build llm-client (Unix)
48+
if: matrix.goos != 'windows'
49+
env:
50+
GOOS: ${{ matrix.goos }}
51+
GOARCH: ${{ matrix.goarch }}
52+
run: make llm-client
53+
54+
- name: Build llm-client (Windows)
55+
if: matrix.goos == 'windows'
56+
env:
57+
GOOS: ${{ matrix.goos }}
58+
GOARCH: ${{ matrix.goarch }}
59+
shell: bash
60+
run: |
61+
mkdir -p build
62+
go build -ldflags "-s -w" -tags client -o build/llm.exe ./cmd/llm
63+
64+
- name: Rename binary for release
65+
shell: bash
66+
run: |
67+
if [ "${{ matrix.goos }}" = "windows" ]; then
68+
mv build/llm.exe build/llm-${{ matrix.goos }}-${{ matrix.goarch }}.exe
69+
else
70+
mv build/llm build/llm-${{ matrix.goos }}-${{ matrix.goarch }}
71+
fi
72+
73+
- name: Upload artifact
74+
uses: actions/upload-artifact@v4
75+
with:
76+
name: llm-${{ matrix.goos }}-${{ matrix.goarch }}
77+
path: build/llm-${{ matrix.goos }}-${{ matrix.goarch }}*
78+
79+
release:
80+
name: Create Release
81+
needs: build
82+
runs-on: ubuntu-latest
83+
if: startsWith(github.ref, 'refs/tags/')
84+
85+
steps:
86+
- name: Download all artifacts
87+
uses: actions/download-artifact@v4
88+
with:
89+
path: ./artifacts
90+
91+
- name: Create Release
92+
uses: softprops/action-gh-release@v1
93+
with:
94+
files: ./artifacts/**/*
95+
draft: false
96+
prerelease: false
97+
env:
98+
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

.github/workflows/docker.yaml

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -11,25 +11,24 @@ jobs:
1111
name: Build
1212
strategy:
1313
matrix:
14-
arch: [ amd64, arm64 ]
15-
runs-on:
16-
- ${{ matrix.arch == 'amd64' && 'ubuntu-latest' || matrix.arch }}
14+
arch: [amd64, arm64]
15+
runs-on: ${{ matrix.arch == 'amd64' && 'ubuntu-24.04' || matrix.arch == 'arm64' && 'ubuntu-24.04-arm' }}
1716
env:
1817
OS: linux
1918
ARCH: ${{ matrix.arch }}
2019
DOCKER_REPO: ghcr.io/${{ github.repository }}
21-
DOCKER_SOURCE: https://github.com/${{ github.repository }}
20+
DOCKER_SOURCE: github.com/${{ github.repository }}
2221
outputs:
2322
tag: ${{ steps.build.outputs.tag }}
2423
permissions:
2524
contents: read
26-
packages: write
25+
packages: write
2726
steps:
2827
- name: Install build tools
2928
run: |
3029
sudo apt -y update
3130
sudo apt -y install build-essential git
32-
git config --global advice.detachedHead false
31+
git config --global advice.detachedHead false
3332
- name: Checkout
3433
uses: actions/checkout@v4
3534
with:
@@ -41,7 +40,7 @@ jobs:
4140
username: ${{ github.repository_owner }}
4241
password: ${{ secrets.GITHUB_TOKEN }}
4342
- name: Build and Push
44-
id: build
43+
id: build
4544
run: |
4645
make docker && make docker-push && make docker-version >> "$GITHUB_OUTPUT"
4746
manifest:
@@ -54,7 +53,7 @@ jobs:
5453
- "latest"
5554
runs-on: ubuntu-latest
5655
permissions:
57-
packages: write
56+
packages: write
5857
steps:
5958
- name: Login
6059
uses: docker/login-action@v3

Makefile

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ DOCKER_TAG = ${DOCKER_REPO}-${OS}-${ARCH}:${VERSION}
3333
# ALL
3434

3535
.PHONY: all
36-
all: clean build
36+
all: build
3737

3838
###############################################################################
3939
# BUILD
@@ -46,12 +46,19 @@ $(CMD_DIR): go-dep mkdir
4646
@echo Build command $(notdir $@) GOOS=${OS} GOARCH=${ARCH}
4747
@GOOS=${OS} GOARCH=${ARCH} ${GO} build ${BUILD_FLAGS} -o ${BUILD_DIR}/$(notdir $@) ./$@
4848

49+
# Build the client-only CLI (no server or telegram)
50+
.PHONY: llm-client
51+
llm-client: go-dep mkdir
52+
@echo Build llm-client GOOS=${OS} GOARCH=${ARCH}
53+
@GOOS=${OS} GOARCH=${ARCH} ${GO} build ${BUILD_FLAGS} -tags client -o ${BUILD_DIR}/llm ./cmd/llm
54+
4955
# Build the docker image
5056
.PHONY: docker
5157
docker: docker-dep
5258
@echo build docker image ${DOCKER_TAG} OS=${OS} ARCH=${ARCH} SOURCE=${DOCKER_SOURCE} VERSION=${VERSION}
5359
@${DOCKER} build \
5460
--tag ${DOCKER_TAG} \
61+
--provenance=false \
5562
--build-arg ARCH=${ARCH} \
5663
--build-arg OS=${OS} \
5764
--build-arg SOURCE=${DOCKER_SOURCE} \

cmd/llm/server.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
//go:build !client
2+
13
package main
24

35
import (

cmd/llm/server_client.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
//go:build client
2+
3+
package main
4+
5+
type ServerCommands struct{}

cmd/llm/telegram.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
//go:build !client
2+
13
package main
24

35
import (

cmd/llm/telegram_client.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
//go:build client
2+
3+
package main
4+
5+
type TelegramCommands struct{}

etc/docker/Dockerfile

Lines changed: 13 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,27 @@
11
ARG OS
22
ARG ARCH
33

4-
# Run makefile to build all the commands
5-
FROM --platform=${OS}/${ARCH} golang:latest AS builder
4+
# Build stage
5+
FROM --platform=${OS}/${ARCH} golang:1.25 AS builder
66
ARG OS
77
ARG ARCH
88
WORKDIR /usr/src/app
99
COPY . .
1010

11-
# Build the server
12-
RUN \
13-
apt update -y && apt upgrade -y && \
14-
OS=${OS} ARCH=${ARCH} make build
11+
RUN OS=${OS} ARCH=${ARCH} make build
1512

16-
# Copy binaries to /usr/local/bin
17-
FROM --platform=${OS}/${ARCH} debian:bookworm-slim
18-
ARG OS
19-
ARG ARCH
13+
# Runtime stage
14+
FROM --platform=${OS}/${ARCH} debian:trixie-slim
2015
ARG SOURCE
21-
COPY --from=builder /usr/src/app/build/* /usr/local/bin/
22-
RUN apt update -y && apt install -y ca-certificates
16+
RUN apt-get update -y && apt-get install -y ca-certificates && rm -rf /var/lib/apt/lists/*
17+
COPY --from=builder /usr/src/app/build/llm /usr/local/bin/llm
2318

2419
# Labels
2520
LABEL org.opencontainers.image.source=https://${SOURCE}
2621

27-
# Entrypoint when running the server
28-
ENTRYPOINT [ "/usr/local/bin/llm" ]
22+
# Entrypoint
23+
ENV GOLLM_ADDR=:8085
24+
ENV XDG_CACHE_HOME=/data
25+
VOLUME /data
26+
EXPOSE 8085
27+
ENTRYPOINT ["/usr/local/bin/llm"]

go.mod

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,23 @@ go 1.25.0
44

55
require (
66
github.com/alecthomas/kong v1.14.0
7+
github.com/charmbracelet/bubbles v1.0.0
8+
github.com/charmbracelet/bubbletea v1.3.10
9+
github.com/charmbracelet/glamour v0.10.0
10+
github.com/charmbracelet/lipgloss v1.1.1-0.20250404203927-76690c660834
711
github.com/google/jsonschema-go v0.4.2
812
github.com/google/uuid v1.6.0
13+
github.com/igor-pavlenko/goldmark-telegram v0.2.0
14+
github.com/muesli/reflow v0.3.0
15+
github.com/muesli/termenv v0.16.0
916
github.com/mutablelogic/go-client v1.3.5
1017
github.com/mutablelogic/go-server v1.6.9
1118
github.com/stretchr/testify v1.11.1
19+
github.com/yuin/goldmark v1.7.8
1220
go.opentelemetry.io/otel/trace v1.40.0
1321
golang.org/x/sync v0.19.0
1422
golang.org/x/term v0.40.0
23+
gopkg.in/telebot.v4 v4.0.0-beta.7
1524
)
1625

1726
require (
@@ -21,11 +30,7 @@ require (
2130
github.com/aymerick/douceur v0.2.0 // indirect
2231
github.com/cenkalti/backoff/v5 v5.0.3 // indirect
2332
github.com/cespare/xxhash/v2 v2.3.0 // indirect
24-
github.com/charmbracelet/bubbles v1.0.0 // indirect
25-
github.com/charmbracelet/bubbletea v1.3.10 // indirect
2633
github.com/charmbracelet/colorprofile v0.4.1 // indirect
27-
github.com/charmbracelet/glamour v0.10.0 // indirect
28-
github.com/charmbracelet/lipgloss v1.1.1-0.20250404203927-76690c660834 // indirect
2934
github.com/charmbracelet/x/ansi v0.11.6 // indirect
3035
github.com/charmbracelet/x/cellbuf v0.0.15 // indirect
3136
github.com/charmbracelet/x/exp/slice v0.0.0-20250327172914-2fdc97757edf // indirect
@@ -41,20 +46,16 @@ require (
4146
github.com/go-logr/stdr v1.2.2 // indirect
4247
github.com/gorilla/css v1.0.1 // indirect
4348
github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.8 // indirect
44-
github.com/igor-pavlenko/goldmark-telegram v0.2.0 // indirect
4549
github.com/lucasb-eyer/go-colorful v1.3.0 // indirect
4650
github.com/mattn/go-isatty v0.0.20 // indirect
4751
github.com/mattn/go-localereader v0.0.1 // indirect
4852
github.com/mattn/go-runewidth v0.0.19 // indirect
4953
github.com/microcosm-cc/bluemonday v1.0.27 // indirect
5054
github.com/muesli/ansi v0.0.0-20230316100256-276c6243b2f6 // indirect
5155
github.com/muesli/cancelreader v0.2.2 // indirect
52-
github.com/muesli/reflow v0.3.0 // indirect
53-
github.com/muesli/termenv v0.16.0 // indirect
5456
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect
5557
github.com/rivo/uniseg v0.4.7 // indirect
5658
github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e // indirect
57-
github.com/yuin/goldmark v1.7.8 // indirect
5859
github.com/yuin/goldmark-emoji v1.0.5 // indirect
5960
go.opentelemetry.io/auto/sdk v1.2.1 // indirect
6061
go.opentelemetry.io/otel v1.40.0 // indirect
@@ -71,6 +72,5 @@ require (
7172
google.golang.org/genproto/googleapis/rpc v0.0.0-20260209200024-4cfbd4190f57 // indirect
7273
google.golang.org/grpc v1.79.1 // indirect
7374
google.golang.org/protobuf v1.36.11 // indirect
74-
gopkg.in/telebot.v4 v4.0.0-beta.7 // indirect
7575
gopkg.in/yaml.v3 v3.0.1 // indirect
7676
)

go.sum

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,8 @@ github.com/atotto/clipboard v0.1.4 h1:EH0zSVneZPSuFR11BlR9YppQTVDbh5+16AmcJi4g1z
8181
github.com/atotto/clipboard v0.1.4/go.mod h1:ZY9tmq7sm5xIbd9bOK4onWV4S6X0u6GY7Vn0Yu86PYI=
8282
github.com/aymanbagabas/go-osc52/v2 v2.0.1 h1:HwpRHbFMcZLEVr42D4p7XBqjyuxQH5SMiErDT4WkJ2k=
8383
github.com/aymanbagabas/go-osc52/v2 v2.0.1/go.mod h1:uYgXzlJ7ZpABp8OJ+exZzJJhRNQ2ASbcXHWsFqH8hp8=
84+
github.com/aymanbagabas/go-udiff v0.3.1 h1:LV+qyBQ2pqe0u42ZsUEtPiCaUoqgA9gYRDs3vj1nolY=
85+
github.com/aymanbagabas/go-udiff v0.3.1/go.mod h1:G0fsKmG+P6ylD0r6N/KgQD/nWzgfnl8ZBcNLgcbrw8E=
8486
github.com/aymerick/douceur v0.2.0 h1:Mv+mAeH1Q+n9Fr+oyamOlAkUNPWPlA8PPGR0QAaYuPk=
8587
github.com/aymerick/douceur v0.2.0/go.mod h1:wlT5vV2O3h55X9m7iVYN0TBM0NH/MmbLnd30/FjWUq4=
8688
github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
@@ -108,6 +110,8 @@ github.com/charmbracelet/x/ansi v0.11.6 h1:GhV21SiDz/45W9AnV2R61xZMRri5NlLnl6CVF
108110
github.com/charmbracelet/x/ansi v0.11.6/go.mod h1:2JNYLgQUsyqaiLovhU2Rv/pb8r6ydXKS3NIttu3VGZQ=
109111
github.com/charmbracelet/x/cellbuf v0.0.15 h1:ur3pZy0o6z/R7EylET877CBxaiE1Sp1GMxoFPAIztPI=
110112
github.com/charmbracelet/x/cellbuf v0.0.15/go.mod h1:J1YVbR7MUuEGIFPCaaZ96KDl5NoS0DAWkskup+mOY+Q=
113+
github.com/charmbracelet/x/exp/golden v0.0.0-20241011142426-46044092ad91 h1:payRxjMjKgx2PaCWLZ4p3ro9y97+TVLZNaRZgJwSVDQ=
114+
github.com/charmbracelet/x/exp/golden v0.0.0-20241011142426-46044092ad91/go.mod h1:wDlXFlCrmJ8J+swcL/MnGUuYnqgQdW9rhSD61oNMb6U=
111115
github.com/charmbracelet/x/exp/slice v0.0.0-20250327172914-2fdc97757edf h1:rLG0Yb6MQSDKdB52aGX55JT1oi0P0Kuaj7wi1bLUpnI=
112116
github.com/charmbracelet/x/exp/slice v0.0.0-20250327172914-2fdc97757edf/go.mod h1:B3UgsnsBZS/eX42BlaNiJkD1pPOUa+oF1IYC6Yd2CEU=
113117
github.com/charmbracelet/x/term v0.2.2 h1:xVRT/S2ZcKdhhOuSP4t5cLi5o+JxklsoEObBSgfgZRk=
@@ -529,6 +533,8 @@ golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u0
529533
golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
530534
golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM=
531535
golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU=
536+
golang.org/x/exp v0.0.0-20231006140011-7918f672742d h1:jtJma62tbqLibJ5sFQz8bKtEM8rJBtfilJ2qTU199MI=
537+
golang.org/x/exp v0.0.0-20231006140011-7918f672742d/go.mod h1:ldy0pHrwJyGW56pPQzzkH36rKxoZW1tw7ZJpeKx+hdo=
532538
golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=
533539
golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
534540
golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=

0 commit comments

Comments
 (0)