url-shortener: build configuration files (#72)
* url-shortener: makefile and dockerfile
* makefile: make docker configurable
* makefile: manifest destination
* makefile: empy manifest
---------
Co-authored-by: Giorgi Lekveishvili <lekva@gl-mbp-m1-max.local>
diff --git a/apps/url-shortener/Dockerfile b/apps/url-shortener/Dockerfile
new file mode 100644
index 0000000..2de1afa
--- /dev/null
+++ b/apps/url-shortener/Dockerfile
@@ -0,0 +1,6 @@
+FROM alpine:latest
+
+ARG TARGETARCH
+
+COPY url-shortener_${TARGETARCH} /usr/bin/url-shortener
+RUN chmod +x /usr/bin/url-shortener
diff --git a/apps/url-shortener/Makefile b/apps/url-shortener/Makefile
new file mode 100644
index 0000000..9fbc4c4
--- /dev/null
+++ b/apps/url-shortener/Makefile
@@ -0,0 +1,37 @@
+repo_name ?= giolekva
+podman ?= podman
+manifest_dest =
+ifeq ($(podman), podman)
+manifest_dest=docker://docker.io/$(repo_name)/url-shortener:latest
+endif
+
+
+clean:
+ rm -f url-shortener*
+
+build_arm64: export CGO_ENABLED=0
+build_arm64: export GO111MODULE=on
+build_arm64: export GOOS=linux
+build_arm64: export GOARCH=arm64
+build_arm64:
+ /usr/local/go/bin/go build -o url-shortener_arm64 *.go
+
+build_amd64: export CGO_ENABLED=0
+build_amd64: export GO111MODULE=on
+build_amd64: export GOOS=linux
+build_amd64: export GOARCH=amd64
+build_amd64:
+ /usr/local/go/bin/go build -o url-shortener_amd64 *.go
+
+push_arm64: clean build_arm64
+ $(podman) build --platform linux/arm64 --tag=$(repo_name)/url-shortener:arm64 .
+ $(podman) push $(repo_name)/url-shortener:arm64
+
+push_amd64: clean build_amd64
+ $(podman) build --platform linux/amd64 --tag=$(repo_name)/url-shortener:amd64 .
+ $(podman) push $(repo_name)/url-shortener:amd64
+
+push: push_arm64 push_amd64
+ $(podman) manifest create $(repo_name)/url-shortener:latest $(repo_name)/url-shortener:arm64 $(repo_name)/url-shortener:amd64
+ $(podman) manifest push $(repo_name)/url-shortener:latest $(manifest_dest)
+ $(podman) manifest rm $(repo_name)/url-shortener:latest
diff --git a/apps/url-shortener/go.mod b/apps/url-shortener/go.mod
index faf35a8..a69fb16 100644
--- a/apps/url-shortener/go.mod
+++ b/apps/url-shortener/go.mod
@@ -2,4 +2,10 @@
go 1.21.5
-require github.com/mattn/go-sqlite3 v1.14.19 // indirect
+require github.com/ncruces/go-sqlite3 v0.12.2
+
+require (
+ github.com/ncruces/julianday v1.0.0 // indirect
+ github.com/tetratelabs/wazero v1.6.0 // indirect
+ golang.org/x/sys v0.16.0 // indirect
+)
diff --git a/apps/url-shortener/go.sum b/apps/url-shortener/go.sum
index 3042612..43fb5df 100644
--- a/apps/url-shortener/go.sum
+++ b/apps/url-shortener/go.sum
@@ -1,2 +1,10 @@
-github.com/mattn/go-sqlite3 v1.14.19 h1:fhGleo2h1p8tVChob4I9HpmVFIAkKGpiukdrgQbWfGI=
-github.com/mattn/go-sqlite3 v1.14.19/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg=
+github.com/ncruces/go-sqlite3 v0.12.2 h1:NO8lFyFTA6aUtDWviQX2Rzqi1RX3X52peWq/MLgV1Gc=
+github.com/ncruces/go-sqlite3 v0.12.2/go.mod h1:+8dWcBxb2Yar4EcCwav1a21MpKZbztwOYBLSRYt9bMY=
+github.com/ncruces/julianday v1.0.0 h1:fH0OKwa7NWvniGQtxdJRxAgkBMolni2BjDHaWTxqt7M=
+github.com/ncruces/julianday v1.0.0/go.mod h1:Dusn2KvZrrovOMJuOt0TNXL6tB7U2E8kvza5fFc9G7g=
+github.com/tetratelabs/wazero v1.6.0 h1:z0H1iikCdP8t+q341xqepY4EWvHEw8Es7tlqiVzlP3g=
+github.com/tetratelabs/wazero v1.6.0/go.mod h1:0U0G41+ochRKoPKCJlh0jMg1CHkyfK8kDqiirMmKY8A=
+golang.org/x/sys v0.16.0 h1:xWw16ngr6ZMtmxDyKyIgsE93KNKz5HKmMa3b8ALHidU=
+golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
+golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ=
+golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
diff --git a/apps/url-shortener/main.go b/apps/url-shortener/main.go
index 71cf488..b1db1f9 100644
--- a/apps/url-shortener/main.go
+++ b/apps/url-shortener/main.go
@@ -12,7 +12,9 @@
"net/http"
"strings"
- "github.com/mattn/go-sqlite3"
+ "github.com/ncruces/go-sqlite3"
+ _ "github.com/ncruces/go-sqlite3/driver"
+ _ "github.com/ncruces/go-sqlite3/embed"
)
var port = flag.Int("port", 8080, "Port to listen on")
@@ -87,10 +89,10 @@
VALUES (?, ?, ?, ?)
`, addr.Name, addr.Address, addr.OwnerId, addr.Active)
if err != nil {
- sqliteErr, ok := err.(sqlite3.Error)
+ sqliteErr, ok := err.(*sqlite3.Error)
// sqliteErr.ExtendedCode and sqlite3.ErrConstraintUnique are not the same. probably some lib error.
// had to use actual code of unique const error
- if ok && sqliteErr.ExtendedCode == 1555 {
+ if ok && sqliteErr.ExtendedCode() == 1555 {
return NameAlreadyTaken{Name: addr.Name}
}
return err