feat: dev env (#1)
All checks were successful
continuous-integration/drone/push Build is passing
All checks were successful
continuous-integration/drone/push Build is passing
Reviewed-on: #1
This commit is contained in:
parent
efe1b268bd
commit
e9fe9748b7
3
Makefile
3
Makefile
|
@ -14,3 +14,6 @@ install-tools: install-golangci-lint
|
|||
|
||||
.PHONY: install
|
||||
install: install-tools install-git-hooks
|
||||
|
||||
generate:
|
||||
go generate ./...
|
18
build/docker/dcbot/dev/Dockerfile
Normal file
18
build/docker/dcbot/dev/Dockerfile
Normal file
|
@ -0,0 +1,18 @@
|
|||
FROM golang:1.19 as builder
|
||||
WORKDIR /app
|
||||
COPY go.mod go.sum ./
|
||||
RUN go mod download
|
||||
COPY . .
|
||||
# `skaffold debug` sets SKAFFOLD_GO_GCFLAGS to disable compiler optimizations
|
||||
ARG SKAFFOLD_GO_GCFLAGS
|
||||
RUN go build -gcflags="${SKAFFOLD_GO_GCFLAGS}" -o dcbot ./cmd/dcbot/main.go
|
||||
|
||||
FROM ubuntu:22.04
|
||||
# Define GOTRACEBACK to mark this container as using the Go language runtime
|
||||
# for `skaffold debug` (https://skaffold.dev/docs/workflows/debug/).
|
||||
WORKDIR /root
|
||||
ENV GOTRACEBACK=single
|
||||
RUN apt update
|
||||
RUN apt install -y ca-certificates tzdata
|
||||
COPY --from=builder /app/dcbot .
|
||||
ENTRYPOINT ["./dcbot"]
|
70
cmd/dcbot/internal/run/run.go
Normal file
70
cmd/dcbot/internal/run/run.go
Normal file
|
@ -0,0 +1,70 @@
|
|||
package run
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"os"
|
||||
"os/signal"
|
||||
"syscall"
|
||||
|
||||
"gitea.dwysokinski.me/twhelp/dcbot/internal/discord"
|
||||
"github.com/kelseyhightower/envconfig"
|
||||
"github.com/urfave/cli/v2"
|
||||
"go.uber.org/zap"
|
||||
)
|
||||
|
||||
const (
|
||||
healthyFilePath = "/tmp/healthy"
|
||||
healthyFilePerm = 0644
|
||||
)
|
||||
|
||||
func New() *cli.Command {
|
||||
return &cli.Command{
|
||||
Name: "run",
|
||||
Usage: "Runs the dc bot",
|
||||
Action: func(c *cli.Context) error {
|
||||
logger := zap.L()
|
||||
|
||||
cfg, err := newBotConfig()
|
||||
if err != nil {
|
||||
return fmt.Errorf("newBotConfig: %w", err)
|
||||
}
|
||||
|
||||
bot, err := discord.NewBot(cfg.Token)
|
||||
if err != nil {
|
||||
return fmt.Errorf("discord.NewBot: %w", err)
|
||||
}
|
||||
defer func() {
|
||||
_ = bot.Close()
|
||||
}()
|
||||
|
||||
if err := os.WriteFile(healthyFilePath, []byte("healthy"), healthyFilePerm); err != nil {
|
||||
return fmt.Errorf("couldn't create file (path=%s): %w", healthyFilePath, err)
|
||||
}
|
||||
|
||||
logger.Info("Bot is up and running")
|
||||
|
||||
waitForSignal(c.Context)
|
||||
|
||||
return nil
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
type botConfig struct {
|
||||
Token string `envconfig:"TOKEN" required:"true"`
|
||||
}
|
||||
|
||||
func newBotConfig() (botConfig, error) {
|
||||
var cfg botConfig
|
||||
if err := envconfig.Process("BOT", &cfg); err != nil {
|
||||
return botConfig{}, fmt.Errorf("envconfig.Process: %w", err)
|
||||
}
|
||||
return cfg, nil
|
||||
}
|
||||
|
||||
func waitForSignal(ctx context.Context) {
|
||||
ctx, stop := signal.NotifyContext(ctx, os.Interrupt, syscall.SIGTERM)
|
||||
defer stop()
|
||||
<-ctx.Done()
|
||||
}
|
|
@ -7,6 +7,7 @@ import (
|
|||
"gitea.dwysokinski.me/twhelp/dcbot/cmd/dcbot/internal"
|
||||
"gitea.dwysokinski.me/twhelp/dcbot/cmd/dcbot/internal/appmode"
|
||||
"gitea.dwysokinski.me/twhelp/dcbot/cmd/dcbot/internal/db"
|
||||
"gitea.dwysokinski.me/twhelp/dcbot/cmd/dcbot/internal/run"
|
||||
"github.com/urfave/cli/v2"
|
||||
)
|
||||
|
||||
|
@ -50,6 +51,7 @@ func newApp(mode string) *cli.App {
|
|||
}
|
||||
app.Commands = []*cli.Command{
|
||||
db.New(),
|
||||
run.New(),
|
||||
}
|
||||
return app
|
||||
}
|
||||
|
|
2
go.mod
2
go.mod
|
@ -3,6 +3,7 @@ module gitea.dwysokinski.me/twhelp/dcbot
|
|||
go 1.19
|
||||
|
||||
require (
|
||||
github.com/bwmarrin/discordgo v0.26.1
|
||||
github.com/kelseyhightower/envconfig v1.4.0
|
||||
github.com/stretchr/testify v1.8.0
|
||||
github.com/uptrace/bun v1.1.8
|
||||
|
@ -18,6 +19,7 @@ require (
|
|||
github.com/davecgh/go-spew v1.1.1 // indirect
|
||||
github.com/go-logr/logr v1.2.3 // indirect
|
||||
github.com/go-logr/stdr v1.2.2 // indirect
|
||||
github.com/gorilla/websocket v1.4.2 // indirect
|
||||
github.com/jinzhu/inflection v1.0.0 // indirect
|
||||
github.com/pmezard/go-difflib v1.0.0 // indirect
|
||||
github.com/russross/blackfriday/v2 v2.1.0 // indirect
|
||||
|
|
10
go.sum
10
go.sum
|
@ -1,4 +1,6 @@
|
|||
github.com/benbjohnson/clock v1.1.0 h1:Q92kusRqC1XV2MjkWETPvjJVqKetz1OzxZB7mHJLju8=
|
||||
github.com/bwmarrin/discordgo v0.26.1 h1:AIrM+g3cl+iYBr4yBxCBp9tD9jR3K7upEjl0d89FRkE=
|
||||
github.com/bwmarrin/discordgo v0.26.1/go.mod h1:NJZpH+1AfhIcyQsPeuBKsUtYrRnjkyu0kIVMCHkZtRY=
|
||||
github.com/cpuguy83/go-md2man/v2 v2.0.2 h1:p1EgwI/C7NhT0JmVkwCD2ZBK8j4aeHQX2pMHHBfMQ6w=
|
||||
github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o=
|
||||
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||
|
@ -10,6 +12,8 @@ github.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbV
|
|||
github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=
|
||||
github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=
|
||||
github.com/google/go-cmp v0.5.8 h1:e6P7q2lk1O+qJJb4BtCQXlK8vWEO8V1ZeuEdJNOqZyg=
|
||||
github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc=
|
||||
github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
|
||||
github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E=
|
||||
github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc=
|
||||
github.com/kelseyhightower/envconfig v1.4.0 h1:Im6hONhd3pLkfDFsbRgu68RDNkGF1r3dvMUtDTo2cv8=
|
||||
|
@ -59,10 +63,16 @@ go.uber.org/multierr v1.6.0 h1:y6IPFStTAIT5Ytl7/XYmHvzXQ7S3g/IeZW9hyZ5thw4=
|
|||
go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU=
|
||||
go.uber.org/zap v1.23.0 h1:OjGQ5KQDEUawVHxNwQgPpiypGHOxo2mNZsOqTak4fFY=
|
||||
go.uber.org/zap v1.23.0/go.mod h1:D+nX8jyLsMHMYrln8A0rJjFt/T/9/bGgIhAqxv5URuY=
|
||||
golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4=
|
||||
golang.org/x/crypto v0.0.0-20220826181053-bd7e27e6170d h1:3qF+Z8Hkrw9sOhrFHti9TlB1Hkac1x+DNRkv0XQiFjo=
|
||||
golang.org/x/crypto v0.0.0-20220826181053-bd7e27e6170d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
|
||||
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
|
||||
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20220825204002-c680a09ffe64 h1:UiNENfZ8gDvpiWw7IpOMQ27spWmThO1RwwdQVbJahJM=
|
||||
golang.org/x/sys v0.0.0-20220825204002-c680a09ffe64/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
||||
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
|
||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||
|
|
26
internal/discord/bot.go
Normal file
26
internal/discord/bot.go
Normal file
|
@ -0,0 +1,26 @@
|
|||
package discord
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
|
||||
"github.com/bwmarrin/discordgo"
|
||||
)
|
||||
|
||||
type Bot struct {
|
||||
s *discordgo.Session
|
||||
}
|
||||
|
||||
func NewBot(token string) (*Bot, error) {
|
||||
s, err := discordgo.New("Bot " + token)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("discordgo.New: %w", err)
|
||||
}
|
||||
if err = s.Open(); err != nil {
|
||||
return nil, fmt.Errorf("s.Open: %w", err)
|
||||
}
|
||||
return &Bot{s: s}, nil
|
||||
}
|
||||
|
||||
func (b *Bot) Close() error {
|
||||
return b.s.Close()
|
||||
}
|
46
k8s/base/bot.yml
Normal file
46
k8s/base/bot.yml
Normal file
|
@ -0,0 +1,46 @@
|
|||
apiVersion: apps/v1
|
||||
kind: Deployment
|
||||
metadata:
|
||||
name: twhelp-dcbot-deployment
|
||||
spec:
|
||||
selector:
|
||||
matchLabels:
|
||||
app: twhelp-dcbot
|
||||
template:
|
||||
metadata:
|
||||
labels:
|
||||
app: twhelp-dcbot
|
||||
spec:
|
||||
containers:
|
||||
- name: twhelp-dcbot
|
||||
image: dcbot
|
||||
args: ["run"]
|
||||
env:
|
||||
- name: APP_MODE
|
||||
value: development
|
||||
- name: DB_DSN
|
||||
valueFrom:
|
||||
secretKeyRef:
|
||||
name: twhelp-dcbot-secret
|
||||
key: db-dsn
|
||||
- name: DB_MAX_OPEN_CONNECTIONS
|
||||
value: "10"
|
||||
- name: DB_MAX_IDLE_CONNECTIONS
|
||||
value: "2"
|
||||
- name: BOT_TOKEN
|
||||
valueFrom:
|
||||
secretKeyRef:
|
||||
name: twhelp-dcbot-secret
|
||||
key: token
|
||||
livenessProbe:
|
||||
exec:
|
||||
command: [ "cat", "/tmp/healthy" ]
|
||||
initialDelaySeconds: 5
|
||||
periodSeconds: 5
|
||||
resources:
|
||||
requests:
|
||||
cpu: 100m
|
||||
memory: 100Mi
|
||||
limits:
|
||||
cpu: 400m
|
||||
memory: 400Mi
|
8
k8s/base/kustomization.yml
Normal file
8
k8s/base/kustomization.yml
Normal file
|
@ -0,0 +1,8 @@
|
|||
apiVersion: kustomize.config.k8s.io/v1beta1
|
||||
kind: Kustomization
|
||||
resources:
|
||||
- bot.yml
|
||||
images:
|
||||
- name: dcbot
|
||||
newName: dcbot
|
||||
newTag: latest
|
1
k8s/overlays/dev/.gitignore
vendored
Normal file
1
k8s/overlays/dev/.gitignore
vendored
Normal file
|
@ -0,0 +1 @@
|
|||
secret.yml
|
6
k8s/overlays/dev/kustomization.yml
Normal file
6
k8s/overlays/dev/kustomization.yml
Normal file
|
@ -0,0 +1,6 @@
|
|||
apiVersion: kustomize.config.k8s.io/v1beta1
|
||||
kind: Kustomization
|
||||
nameSuffix: -dev
|
||||
resources:
|
||||
- secret.yml
|
||||
- ../../base
|
9
k8s/overlays/dev/secret.example.yml
Normal file
9
k8s/overlays/dev/secret.example.yml
Normal file
|
@ -0,0 +1,9 @@
|
|||
apiVersion: v1
|
||||
kind: Secret
|
||||
metadata:
|
||||
name: twhelp-dcbot-secret
|
||||
type: Opaque
|
||||
data:
|
||||
# postgres://dcbot:dcbot@twdcbotdb-postgresql:5432/dcbot?sslmode=disable
|
||||
db-dsn: cG9zdGdyZXM6Ly9kY2JvdDpkY2JvdEB0d2RjYm90ZGItcG9zdGdyZXNxbDo1NDMyL2RjYm90P3NzbG1vZGU9ZGlzYWJsZQ==
|
||||
token: tokenhere
|
26
skaffold.yml
Normal file
26
skaffold.yml
Normal file
|
@ -0,0 +1,26 @@
|
|||
apiVersion: skaffold/v2beta27
|
||||
kind: Config
|
||||
build:
|
||||
tagPolicy:
|
||||
customTemplate:
|
||||
template: latest
|
||||
artifacts:
|
||||
- image: dcbot
|
||||
context: .
|
||||
docker:
|
||||
dockerfile: ./build/docker/dcbot/dev/Dockerfile
|
||||
deploy:
|
||||
helm:
|
||||
releases:
|
||||
- name: twdcbotdb
|
||||
repo: https://charts.bitnami.com/bitnami
|
||||
remoteChart: postgresql
|
||||
version: 11.6.19
|
||||
wait: true
|
||||
setValues:
|
||||
auth.username: dcbot
|
||||
auth.password: dcbot
|
||||
auth.database: dcbot
|
||||
kustomize:
|
||||
paths:
|
||||
- k8s/overlays/dev
|
Loading…
Reference in New Issue
Block a user