Compare commits

...

4 commits

Author SHA1 Message Date
310ddbc84b [docs] Changed build architecture for docker container ready to use
All checks were successful
ci/woodpecker/pr/0-pre Pipeline was successful
ci/woodpecker/pr/1-build-check Pipeline was successful
2025-04-07 17:42:01 +00:00
24007cab58 Changed layout 2025-04-07 17:42:01 +00:00
a72240e4f2 Changed README for more information 2025-04-07 17:42:01 +00:00
802b93bdaf [CI Workflow] Improvments for next releses and logic (#11)
Some checks failed
ci/woodpecker/push/99-release-bot Pipeline was successful
ci/woodpecker/push/1-build-check unknown status
ci/woodpecker/push/10-build-dev unknown status
ci/woodpecker/push/0-pre Pipeline failed
- [X] Changed latest / dev builds (security)
- [x]  Changed logic behind build and tags (breaking)
- [x]  Make more checks and buildflags (feature)
- [x]  New releases for @renovate-bot (enhancement)

Reviewed-on: #11
2025-04-07 17:41:41 +00:00
13 changed files with 245 additions and 133 deletions

View file

@ -7,10 +7,6 @@ steps:
- go fmt $(go list ./... | grep -v /vendor/) - go fmt $(go list ./... | grep -v /vendor/)
- go vet $(go list ./... | grep -v /vendor/) - go vet $(go list ./... | grep -v /vendor/)
- go test -race $(go list ./... | grep -v /vendor/) - go test -race $(go list ./... | grep -v /vendor/)
when:
- event: [push, cron]
branch: [main, develop]
- event: pull_request
- name: check-sec - name: check-sec
image: golang image: golang
@ -18,7 +14,12 @@ steps:
- go install github.com/securego/gosec/v2/cmd/gosec@latest - go install github.com/securego/gosec/v2/cmd/gosec@latest
- go get -v -d . - go get -v -d .
- gosec ./... - gosec ./...
when:
- event: [push, cron]
branch: [main, develop]
- event: pull_request when:
- event: [push, cron]
branch: [main, develop]
- event: pull_request
- event: tag
branch: main

View file

@ -0,0 +1,48 @@
steps:
- name: test/build-binary/linux-amd64
image: golang:1.24.2
environment:
GOOS: "linux"
GOARCH: "amd64"
I_PACKAGE: "git.hackmi.ch/Phil/goshorly/utils"
CGO_ENABLED: 0
commands:
- go build -a -installsuffix cgo -ldflags=" -X $I_PACKAGE.CI_COMMIT_SHA=$CI_COMMIT_SHA -X $I_PACKAGE.CI_COMMIT_BRANCH=$CI_COMMIT_BRANCH -X $I_PACKAGE.CI_COMMIT_TAG=$CI_COMMIT_TAG" -o app-amd64 .
- name: test/build-binary/linux-arm64
image: golang:1.24.2
environment:
GOOS: "linux"
GOARCH: "arm64"
I_PACKAGE: "git.hackmi.ch/Phil/goshorly/utils"
CGO_ENABLED: 0
commands:
- go build -a -installsuffix cgo -ldflags=" -X $I_PACKAGE.CI_COMMIT_SHA=$CI_COMMIT_SHA -X $I_PACKAGE.CI_COMMIT_BRANCH=$CI_COMMIT_BRANCH -X $I_PACKAGE.CI_COMMIT_TAG=$CI_COMMIT_TAG" -o app-arm64 .
- name: test/build-docker/linux-amd64
image: woodpeckerci/plugin-docker-buildx:5.2.2
settings:
platforms: linux/amd64
dry-run: true
repo: git.hackmi.ch/phil/goshorly
registry: git.hackmi.ch
depends_on:
- test/build-binary/linux-amd64
- name: test/build-docker/linux-arm64
image: woodpeckerci/plugin-docker-buildx:5.2.2
settings:
platforms: linux/arm64
dry-run: true
repo: git.hackmi.ch/phil/goshorly
registry: git.hackmi.ch
depends_on:
- test/build-binary/linux-arm64
when:
- event: [push, cron]
branch: [main, develop]
- event: pull_request
depends_on:
- 0-pre

View file

@ -0,0 +1,42 @@
steps:
- name: dev/build-binary/linux-amd64
image: golang:1.24.2
environment:
GOOS: "linux"
GOARCH: "amd64"
I_PACKAGE: "git.hackmi.ch/Phil/goshorly/utils"
CGO_ENABLED: 0
commands:
- go build -a -installsuffix cgo -ldflags=" -X $I_PACKAGE.CI_COMMIT_SHA=$CI_COMMIT_SHA -X $I_PACKAGE.CI_COMMIT_BRANCH=$CI_COMMIT_BRANCH -X $I_PACKAGE.CI_COMMIT_TAG=$CI_COMMIT_TAG" -o app-linux-amd64 .
- name: dev/build-binary/linux-arm64
image: golang:1.24.2
environment:
GOOS: "linux"
GOARCH: "arm64"
I_PACKAGE: "git.hackmi.ch/Phil/goshorly/utils"
CGO_ENABLED: 0
commands:
- go build -a -installsuffix cgo -ldflags=" -X $I_PACKAGE.CI_COMMIT_SHA=$CI_COMMIT_SHA -X $I_PACKAGE.CI_COMMIT_BRANCH=$CI_COMMIT_BRANCH -X $I_PACKAGE.CI_COMMIT_TAG=$CI_COMMIT_TAG" -o app-linux-arm64 .
- name: dev/build-docker/linux-multiarch
image: woodpeckerci/plugin-docker-buildx:5.2.2
settings:
platforms: linux/amd64,linux/arm64
repo: git.hackmi.ch/phil/goshorly
registry: git.hackmi.ch
tags: dev
username:
from_secret: reg-user
password:
from_secret: reg-pass
depends_on:
- dev/build-binary/linux-amd64
- dev/build-binary/linux-arm64
when:
- event: [push, cron]
branch: main
depends_on:
- 0-pre

View file

@ -1,41 +0,0 @@
steps:
- name: build-binary
image: golang:1.24.2
commands:
- export CI_COMMIT_SHORT_SHA=${CI_COMMIT_SHA:0:10}
- go build -ldflags="-X main.CommitSHA=${CI_COMMIT_SHORT_SHA}" -o linux-amd64 .
when:
- event: [push, cron]
branch: main
- name: build-and-push-docker-dev
image: woodpeckerci/plugin-docker-buildx:5.2.2
settings:
platforms: linux/amd64,linux/arm/v6,linux/arm64/v8
repo: git.hackmi.ch/phil/goshorly
registry: git.hackmi.ch
tags: dev
username:
from_secret: reg-user
password:
from_secret: reg-pass
build_args:
- CI_COMMIT_BRANCH=${CI_COMMIT_BRANCH}
- CI_COMMIT_SHORT_SHA=${CI_COMMIT_SHA:0:10}
depends_on:
- build-binary
when:
- event: [push, cron]
branch: main
services:
docker-daemon:
image: docker:28.0-dind-rootless
commands:
- dockerd --tls=false --host=tcp://0.0.0.0:2376
privileged: true
when:
- event: [push, cron]
depends_on:
- 0-pre

View file

@ -0,0 +1,41 @@
steps:
- name: prod/build-binary/linux-amd64
image: golang:1.24.2
environment:
GOOS: "linux"
GOARCH: "amd64"
I_PACKAGE: "git.hackmi.ch/Phil/goshorly/utils"
CGO_ENABLED: 0
commands:
- go build -a -installsuffix cgo -ldflags=" -X $I_PACKAGE.CI_COMMIT_SHA=$CI_COMMIT_SHA -X $I_PACKAGE.CI_COMMIT_BRANCH=$CI_COMMIT_BRANCH -X $I_PACKAGE.CI_COMMIT_TAG=$CI_COMMIT_TAG" -o app-linux-amd64 .
- name: prod/build-binary/linux-arm64
image: golang:1.24.2
environment:
GOOS: "linux"
GOARCH: "arm64"
I_PACKAGE: "git.hackmi.ch/Phil/goshorly/utils"
CGO_ENABLED: 0
commands:
- go build -a -installsuffix cgo -ldflags=" -X $I_PACKAGE.CI_COMMIT_SHA=$CI_COMMIT_SHA -X $I_PACKAGE.CI_COMMIT_BRANCH=$CI_COMMIT_BRANCH -X $I_PACKAGE.CI_COMMIT_TAG=$CI_COMMIT_TAG" -o app-linux-arm64 .
- name: prod/build-docker/linux-multiarch
image: woodpeckerci/plugin-docker-buildx:5.2.2
settings:
platforms: linux/amd64,linux/arm64
repo: git.hackmi.ch/phil/goshorly
registry: git.hackmi.ch
auto_tag: true
username:
from_secret: reg-user
password:
from_secret: reg-pass
depends_on:
- prod/build-binary/linux-amd64
- prod/build-binary/linux-arm64
when:
- event: tag
depends_on:
- 0-pre

View file

@ -1,26 +1,18 @@
FROM golang:alpine as builder FROM golang:1.24.2-alpine AS builder
RUN apk add --no-cache git make build-base
ARG CI_COMMIT_BRANCH
ARG CI_COMMIT_SHORT_SHA
ARG CI_COMMIT_TAG
ENV CI_COMMIT_BRANCH=$CI_COMMIT_BRANCH
ENV CI_COMMIT_SHORT_SHA=$CI_COMMIT_SHORT_SHA
ENV CI_COMMIT_TAG=$CI_COMMIT_TAG
ENV I_PACKAGE="git.hackmi.ch/Phil/goshorly/utils" ENV I_PACKAGE="git.hackmi.ch/Phil/goshorly/utils"
ENV CGO_ENABLED=0 ENV CGO_ENABLED=0
RUN apk add --no-cache git make build-base
WORKDIR /go/src/git.hackmi.ch/goshorly WORKDIR /go/src/git.hackmi.ch/goshorly
COPY . . COPY . .
RUN go get -d -v ./... RUN go get -d -v ./...
RUN go build -a -installsuffix cgo -ldflags=" -X $I_PACKAGE.CI_COMMIT_SHORT_SHA=$CI_COMMIT_SHORT_SHA -X $I_PACKAGE.CI_COMMIT_BRANCH=$CI_COMMIT_BRANCH -X $I_PACKAGE.CI_COMMIT_TAG=$CI_COMMIT_TAG" -o app . RUN go build -a -installsuffix cgo -ldflags=" -X $I_PACKAGE.CI_COMMIT_SHA=$CI_COMMIT_SHA -X $I_PACKAGE.CI_COMMIT_BRANCH=$CI_COMMIT_BRANCH -X $I_PACKAGE.CI_COMMIT_TAG=$CI_COMMIT_TAG" -o app .
FROM scratch as production FROM scratch AS production
WORKDIR / WORKDIR /
COPY --from=builder /go/src/git.hackmi.ch/goshorly/app /app COPY --from=builder /go/src/git.hackmi.ch/goshorly/app /app
ENTRYPOINT [ "/app" ] ENTRYPOINT [ "/app" ]

View file

@ -1,24 +1,53 @@
[![status-badge](https://ci.hackmi.ch/api/badges/11/status.svg)](https://ci.hackmi.ch/repos/11) [![status-badge](https://ci.hackmi.ch/api/badges/11/status.svg)](https://ci.hackmi.ch/repos/11)
# goshorly
An easy self-hosted Link shortener in Golang with Redis <3 # Goshorly
**Easy-to-use, self-hosted link shortener built with Golang and Redis.**
Lightweight, fast, and Docker-compatible for seamless deployment. ❤️
--- ---
Docker Supported: ### Features
- linux/amd64
- linux/arm/v6
- linux/arm64/v8
See docker-compose.yml as example - Self-hosted: Take control of your link shortening service.
- Built with Golang: High performance and reliability.
- Redis Integration: Efficient data storage.
- Easy Deployment: Docker, Binary, Build it yourself
- Docker Support: ( linux/amd64, linux/arm64 )
--- ---
Live-Demo: ### Installation
- https://2slk.com Hosted by nitmali in Chinese #### Using Docker
(please refer to the example files!)
``` bash
git clone https://github.com/yourusername/goshorly.git
cd goshorly
docker-compose up -d
```
To simplify your deployment, we offer the following Docker tags:
- dev: Latest code from the main branch (experimental).
- latest: Latest stable release (may include breaking changes).
- Versioned Tags (vX, vX.X, vX.X.X): Specific release versions.
#### Using Binary
1. Download the latest binary from the releases.
2. Create an .env file (or use the .env.example)
and change the values for your environment.
3. Run the binary the terminal.
--- ---
**WARNING:** ### Contributing
- goshorly is in an early stage, it is not an Final Version! (Pre-Release Status v0.1.X)
If you have an feature request, please do not hesitate to open an issue or merge request. We welcome contributions!
If you have feature requests, bug reports, or improvements, feel free to:
- Open an issue.
- Fork the repository.
- Create a new branch (feature/awesome-feature).
- Submit a pull request with detailed explanations.
- Submit a review.

View file

@ -8,12 +8,12 @@ import (
func Gethome(c *fiber.Ctx) error { func Gethome(c *fiber.Ctx) error {
return c.Render("views/home", fiber.Map{ return c.Render("views/home", fiber.Map{
"CI_COMMIT_SHORT_SHA": utils.CI_COMMIT_SHORT_SHA, "CI_COMMIT_SHA": utils.CI_COMMIT_SHA,
"CI_COMMIT_BRANCH": utils.CI_COMMIT_BRANCH, "CI_COMMIT_BRANCH": utils.CI_COMMIT_BRANCH,
"CI_COMMIT_TAG": utils.CI_COMMIT_TAG, "CI_COMMIT_TAG": utils.CI_COMMIT_TAG,
"CI_TAGGED": utils.CI_TAGGED, "CI_TAGGED": utils.CI_TAGGED,
"CI_BUILD": utils.CI_BUILD, "CI_BUILD": utils.CI_BUILD,
"TotalLinks": db.GetTotalLinks(), "TotalLinks": db.GetTotalLinks(),
"TotalViews": db.GetTotalViews(), "TotalViews": db.GetTotalViews(),
}) })
} }

View file

@ -28,14 +28,14 @@ func Posthome(c *fiber.Ctx) error {
} }
return c.Status(500).Render("views/home", fiber.Map{ return c.Status(500).Render("views/home", fiber.Map{
"ERR": "Parsing Error", "ERR": "Parsing Error",
"CI_COMMIT_SHORT_SHA": utils.CI_COMMIT_SHORT_SHA, "CI_COMMIT_SHA": utils.CI_COMMIT_SHA,
"CI_COMMIT_BRANCH": utils.CI_COMMIT_BRANCH, "CI_COMMIT_BRANCH": utils.CI_COMMIT_BRANCH,
"CI_COMMIT_TAG": utils.CI_COMMIT_TAG, "CI_COMMIT_TAG": utils.CI_COMMIT_TAG,
"CI_TAGGED": utils.CI_TAGGED, "CI_TAGGED": utils.CI_TAGGED,
"CI_BUILD": utils.CI_BUILD, "CI_BUILD": utils.CI_BUILD,
"TotalLinks": db.GetTotalLinks(), "TotalLinks": db.GetTotalLinks(),
"TotalViews": db.GetTotalViews(), "TotalViews": db.GetTotalViews(),
}) })
} }
@ -49,14 +49,14 @@ func Posthome(c *fiber.Ctx) error {
} }
return c.Status(424).Render("views/home", fiber.Map{ return c.Status(424).Render("views/home", fiber.Map{
"ERR": "Invalid URL, please check and try again.", "ERR": "Invalid URL, please check and try again.",
"CI_COMMIT_SHORT_SHA": utils.CI_COMMIT_SHORT_SHA, "CI_COMMIT_SHA": utils.CI_COMMIT_SHA,
"CI_COMMIT_BRANCH": utils.CI_COMMIT_BRANCH, "CI_COMMIT_BRANCH": utils.CI_COMMIT_BRANCH,
"CI_COMMIT_TAG": utils.CI_COMMIT_TAG, "CI_COMMIT_TAG": utils.CI_COMMIT_TAG,
"CI_TAGGED": utils.CI_TAGGED, "CI_TAGGED": utils.CI_TAGGED,
"CI_BUILD": utils.CI_BUILD, "CI_BUILD": utils.CI_BUILD,
"TotalLinks": db.GetTotalLinks(), "TotalLinks": db.GetTotalLinks(),
"TotalViews": db.GetTotalViews(), "TotalViews": db.GetTotalViews(),
}) })
} }
@ -72,14 +72,14 @@ func Posthome(c *fiber.Ctx) error {
} }
return c.Status(500).Render("views/home", fiber.Map{ return c.Status(500).Render("views/home", fiber.Map{
"ERR": err.Error(), "ERR": err.Error(),
"CI_COMMIT_SHORT_SHA": utils.CI_COMMIT_SHORT_SHA, "CI_COMMIT_SHA": utils.CI_COMMIT_SHA,
"CI_COMMIT_BRANCH": utils.CI_COMMIT_BRANCH, "CI_COMMIT_BRANCH": utils.CI_COMMIT_BRANCH,
"CI_COMMIT_TAG": utils.CI_COMMIT_TAG, "CI_COMMIT_TAG": utils.CI_COMMIT_TAG,
"CI_TAGGED": utils.CI_TAGGED, "CI_TAGGED": utils.CI_TAGGED,
"CI_BUILD": utils.CI_BUILD, "CI_BUILD": utils.CI_BUILD,
"TotalLinks": db.GetTotalLinks(), "TotalLinks": db.GetTotalLinks(),
"TotalViews": db.GetTotalViews(), "TotalViews": db.GetTotalViews(),
}) })
} }
@ -94,14 +94,14 @@ func Posthome(c *fiber.Ctx) error {
} }
return c.Status(500).Render("views/home", fiber.Map{ return c.Status(500).Render("views/home", fiber.Map{
"ERR": err.Error(), "ERR": err.Error(),
"CI_COMMIT_SHORT_SHA": utils.CI_COMMIT_SHORT_SHA, "CI_COMMIT_SHA": utils.CI_COMMIT_SHA,
"CI_COMMIT_BRANCH": utils.CI_COMMIT_BRANCH, "CI_COMMIT_BRANCH": utils.CI_COMMIT_BRANCH,
"CI_COMMIT_TAG": utils.CI_COMMIT_TAG, "CI_COMMIT_TAG": utils.CI_COMMIT_TAG,
"CI_TAGGED": utils.CI_TAGGED, "CI_TAGGED": utils.CI_TAGGED,
"CI_BUILD": utils.CI_BUILD, "CI_BUILD": utils.CI_BUILD,
"TotalLinks": db.GetTotalLinks(), "TotalLinks": db.GetTotalLinks(),
"TotalViews": db.GetTotalViews(), "TotalViews": db.GetTotalViews(),
}) })
} }
@ -122,13 +122,13 @@ func Posthome(c *fiber.Ctx) error {
} }
return c.Status(201).Render("views/home", fiber.Map{ return c.Status(201).Render("views/home", fiber.Map{
"URL": fURL, "URL": fURL,
"CI_COMMIT_SHORT_SHA": utils.CI_COMMIT_SHORT_SHA, "CI_COMMIT_SHA": utils.CI_COMMIT_SHA,
"CI_COMMIT_BRANCH": utils.CI_COMMIT_BRANCH, "CI_COMMIT_BRANCH": utils.CI_COMMIT_BRANCH,
"CI_COMMIT_TAG": utils.CI_COMMIT_TAG, "CI_COMMIT_TAG": utils.CI_COMMIT_TAG,
"CI_TAGGED": utils.CI_TAGGED, "CI_TAGGED": utils.CI_TAGGED,
"CI_BUILD": utils.CI_BUILD, "CI_BUILD": utils.CI_BUILD,
"TotalLinks": db.GetTotalLinks(), "TotalLinks": db.GetTotalLinks(),
"TotalViews": db.GetTotalViews(), "TotalViews": db.GetTotalViews(),
}) })
} }

View file

@ -6,15 +6,15 @@ import (
) )
var ( var (
CI_COMMIT_SHORT_SHA string CI_COMMIT_SHA string
CI_COMMIT_BRANCH string CI_COMMIT_BRANCH string
CI_COMMIT_TAG string CI_COMMIT_TAG string
CI_TAGGED bool CI_TAGGED bool
CI_BUILD bool CI_BUILD bool
) )
func Init_build_vars() { func Init_build_vars() {
CI_BUILD = CI_COMMIT_SHORT_SHA != "" || CI_COMMIT_BRANCH != "" CI_BUILD = CI_COMMIT_SHA != "" || CI_COMMIT_BRANCH != ""
CI_TAGGED = CI_COMMIT_TAG != "" CI_TAGGED = CI_COMMIT_TAG != ""
} }
@ -23,7 +23,7 @@ func Print_Starting_Screen() {
if CI_TAGGED { if CI_TAGGED {
version = CI_COMMIT_TAG version = CI_COMMIT_TAG
} else if CI_BUILD { } else if CI_BUILD {
version = CI_COMMIT_SHORT_SHA version = CI_COMMIT_SHA
} }
fmt.Println("---- Starting goshorly " + version + " ----") fmt.Println("---- Starting goshorly " + version + " ----")
time.Sleep(1 * time.Second) time.Sleep(1 * time.Second)

View file

@ -18,10 +18,10 @@ var ConfigLimiter limiter.Config = limiter.Config{
}) })
} }
return c.Render("views/home", fiber.Map{ return c.Render("views/home", fiber.Map{
"ERR": "You have reached the limit of requests! Please check back later. (1 minute)", "ERR": "You have reached the limit of requests! Please check back later. (1 minute)",
"CI_COMMIT_SHORT_SHA": CI_COMMIT_SHORT_SHA, "CI_COMMIT_SHA": CI_COMMIT_SHA,
"CI_COMMIT_BRANCH": CI_COMMIT_BRANCH, "CI_COMMIT_BRANCH": CI_COMMIT_BRANCH,
"CI_BUILD": CI_BUILD, "CI_BUILD": CI_BUILD,
}) })
}, },
} }

View file

@ -82,7 +82,7 @@
{{ if .CI_COMMIT_TAG }} {{ if .CI_COMMIT_TAG }}
| {{ .CI_COMMIT_TAG }} | {{ .CI_COMMIT_TAG }}
{{ else }} {{ else }}
| {{ .CI_COMMIT_SHORT_SHA }}/{{ .CI_COMMIT_BRANCH }} | {{ .CI_COMMIT_SHA }}/{{ .CI_COMMIT_BRANCH }}
{{ end }} {{ end }}
{{ end }} {{ end }}
</center> </center>