diff --git a/.github/workflows/build-and-test-binaries.yml b/.github/workflows/build-and-test-binaries.yml new file mode 100644 index 000000000..d70ea218c --- /dev/null +++ b/.github/workflows/build-and-test-binaries.yml @@ -0,0 +1,81 @@ +name: binary builds + +on: + workflow_dispatch: + + repository_dispatch: + types: + - webhook + + push: + paths: + - "apps/**/**" + - "pkg/**" + - "grpc-interfaces/**" + - "common/**" + - "go.*" + - ".github/workflows/**" + +permissions: + contents: read + packages: write + +jobs: + docker-builds: + strategy: + matrix: + app: + - accounts + - auth + - comms + - console + - container-registry + - iam + - infra + - worker-audit-logging + - webhook + - websocket-server + - message-office + - tenant-agent + + runs-on: ubuntu-latest + name: Deploy to Docker Image + steps: + - name: Checkout + uses: actions/checkout@v3 + + - name: Set up QEMU + uses: docker/setup-qemu-action@v2 + + - name: Setup Golang caches + uses: actions/cache@v3 + with: + path: | + ~/.cache/go-build + ~/go/pkg/mod + key: ${{ runner.os }}-golang-${{ hashFiles('**/go.sum') }} + restore-keys: | + ${{ runner.os }}-golang- + + - name: Install Go + uses: actions/setup-go@v5 + with: + go-version: 1.21.5 + + - name: Install Task + uses: arduino/setup-task@v1 + with: + version: 3.x + repo-token: ${{ secrets.GITHUB_TOKEN }} + + - name: Install UPX + run: | + curl -L0 https://github.com/upx/upx/releases/download/v4.2.1/upx-4.2.1-amd64_linux.tar.xz > upx.tar.xz + tar -xf upx.tar.xz + sudo mv upx-4.2.1-amd64_linux/upx /usr/local/bin + + - name: Build Binary + run: | + pushd apps/${{matrix.app}} + task build + popd diff --git a/.github/workflows/build-container.yml b/.github/workflows/build-container.yml deleted file mode 100644 index f0bd62ce5..000000000 --- a/.github/workflows/build-container.yml +++ /dev/null @@ -1,131 +0,0 @@ -name: build-docker-images - -on: - workflow_dispatch: - - repository_dispatch: - types: - - webhook - - push: - paths: - - "apps/**/**" - - "pkg/**" - - "grpc-interfaces/**" - - "common/**" - - "go.*" - - ".github/workflows/**" - - -permissions: - contents: read - packages: write - -jobs: - docker-builds: - strategy: - matrix: - app: - - accounts - - auth - - comms - - console - - container-registry - - iam - - infra - - worker-audit-logging - - webhook - - websocket-server - - message-office - - tenant-agent - runs-on: ubuntu-latest - name: Deploy to Docker Image - steps: - - name: Checkout - uses: actions/checkout@v3 - - - name: Set up QEMU - uses: docker/setup-qemu-action@v2 - - - name: Setup Golang caches - uses: actions/cache@v3 - with: - path: | - ~/.cache/go-build - ~/go/pkg/mod - key: ${{ runner.os }}-golang-${{ hashFiles('**/go.sum') }} - restore-keys: | - ${{ runner.os }}-golang- - - - name: Install Go - uses: actions/setup-go@v5 - with: - go-version: 1.21.5 - - - name: Install Task - uses: arduino/setup-task@v1 - with: - version: 3.x - repo-token: ${{ secrets.GITHUB_TOKEN }} - - - name: Install UPX - run: | - curl -L0 https://github.com/upx/upx/releases/download/v4.2.1/upx-4.2.1-amd64_linux.tar.xz > upx.tar.xz - tar -xf upx.tar.xz - sudo mv upx-4.2.1-amd64_linux/upx /usr/local/bin - - - name: Build Binary - run: | - cd apps/${{matrix.app}} - task build Out=$PWD/../../.github/workflows/container-build/app - - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v2 - - - name: Log in to the Container registry - uses: docker/login-action@v3 - with: - registry: ghcr.io - username: ${{ github.actor }} - password: ${{ secrets.GITHUB_TOKEN }} - - - name: Create Image Tag from branch name - if: startsWith(github.ref, 'refs/heads/release') - run: | - set +e - IMAGE_TAG=$(echo ${GITHUB_REF#refs/heads/} | sed 's/release-//g') - echo "$IMAGE_TAG" | grep -i '\-nightly$' - if [ $? -ne 0 ]; then - IMAGE_TAG="$IMAGE_TAG-nightly" - fi - set -e - - echo "IMAGE_TAG=$IMAGE_TAG" >> $GITHUB_ENV - echo "OVERRIDE_PUSHED_IMAGE=true" >> $GITHUB_ENV - - - name: Create Image Tag from tag - if: startsWith(github.ref, 'refs/tags/') - run: | - IMAGE_TAG=$(echo ${GITHUB_REF#refs/tags/}) - - echo "IMAGE_TAG=$IMAGE_TAG" >> $GITHUB_ENV - echo "OVERRIDE_PUSHED_IMAGE=false" >> $GITHUB_ENV - - - name: Build & Push Image - if: startsWith(github.ref, 'refs/heads/release') || startsWith(github.ref, 'refs/tags/') - run: | - set +e - image_name="ghcr.io/${{ github.repository }}/${{matrix.app}}" - - docker manifest inspect $image_name:$IMAGE_TAG - exit_status=$? - if [ $exit_status -eq 0 ]; then - [ "$OVERRIDE_PUSHED_IMAGE" = "false" ] && echo "image ($image_name:$IMAGE_TAG) already exists, and override image is disable, exiting" && exit 0 - echo "image exists, but override pushed image is set to true. proceeding with building image" - fi - - set -e - - cd .github/workflows/container-build - task go-container-build Image="$image_name:$IMAGE_TAG" - # task go-container-build Image="$image_name:commit-${GITHUB_SHA}" diff --git a/.github/workflows/container-build/Containerfile.local b/.github/workflows/container-build/Containerfile.local deleted file mode 100644 index 6cc1cc9d1..000000000 --- a/.github/workflows/container-build/Containerfile.local +++ /dev/null @@ -1,7 +0,0 @@ -#syntax=docker/dockerfile:1 -FROM gcr.io/distroless/static-debian11:nonroot -LABEL org.opencontainers.image.source https://github.com/kloudlite/api -WORKDIR /app -COPY --chown=1001 ./app ./app -CMD ["./app"] -ENTRYPOINT ["./app"] \ No newline at end of file diff --git a/.github/workflows/container-build/Taskfile.yaml b/.github/workflows/container-build/Taskfile.yaml deleted file mode 100644 index acd9988ae..000000000 --- a/.github/workflows/container-build/Taskfile.yaml +++ /dev/null @@ -1,11 +0,0 @@ -version: 3 - -tasks: - go-container-build: - preconditions: - - sh: '[[ -n "{{.Image}}" ]]' - msg: 'var Image must have a value' - silent: true - cmds: - - | - docker buildx build -f ./Containerfile.local -t {{.Image}} . --push diff --git a/.github/workflows/delete-images-from-ghcr.yml b/.github/workflows/delete-images-from-ghcr.yml deleted file mode 100644 index d018f04b5..000000000 --- a/.github/workflows/delete-images-from-ghcr.yml +++ /dev/null @@ -1,44 +0,0 @@ -name: Delete Container Images from github container registry - -on: - workflow_dispatch: - inputs: - image_tag_to_delete: - type: string - description: "image tag to delete" - required: true - default: "v0.0.0" - -permissions: - contents: read - packages: write - -jobs: - docker-builds: - strategy: - matrix: - app: - - accounts - - auth - - comms - - console - - container-registry - - iam - - infra - - worker-audit-logging - - webhook - - websocket-server - - message-office - - tenant-agent - - name: Delete image from ghcr.io - runs-on: ubuntu-latest - steps: - - name: Delete image - uses: bots-house/ghcr-delete-image-action@v1.1.0 - with: - owner: ${{ github.repository_owner }} - name: ${{ github.event.repository.name }}/${{ matrix.app }} - - token: ${{ secrets.GITHUB_TOKEN }} - tag: ${{ github.event.inputs.image_tag_to_delete }} diff --git a/.github/workflows/gateway-container.yml b/.github/workflows/gateway-container.yml deleted file mode 100644 index 362e3d48e..000000000 --- a/.github/workflows/gateway-container.yml +++ /dev/null @@ -1,80 +0,0 @@ -name: build-gateway-image - -on: - workflow_run: - workflows: ["build-docker-images"] - types: - - completed - - repository_dispatch: - types: - - webhook - push: - paths: - - "apps/gateway/**" - - ".github/workflows/**" - -permissions: - contents: read - packages: write - -jobs: - container-build: - runs-on: ubuntu-latest - name: Deploy to Docker Image - steps: - - name: Checkout - uses: actions/checkout@v3 - - - name: Set up QEMU - uses: docker/setup-qemu-action@v2 - - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v2 - - - name: Log in to the Container registry - uses: docker/login-action@65b78e6e13532edd9afa3aa52ac7964289d1a9c1 - with: - registry: ghcr.io - username: ${{ github.actor }} - password: ${{ secrets.GITHUB_TOKEN }} - - - name: Create Image Tag from branch name - if: startsWith(github.ref, 'refs/heads/release') - run: | - set +e - IMAGE_TAG=$(echo ${GITHUB_REF#refs/heads/} | sed 's/release-//g') - echo "$IMAGE_TAG" | grep -i '\-nightly$' - if [ $? -ne 0 ]; then - IMAGE_TAG="$IMAGE_TAG-nightly" - fi - set -e - - echo "IMAGE_TAG=$IMAGE_TAG" >> $GITHUB_ENV - echo "OVERRIDE_PUSHED_IMAGE=true" >> $GITHUB_ENV - - - name: Create Image Tag from tag - if: startsWith(github.ref, 'refs/tags/') - run: | - IMAGE_TAG=$(echo ${GITHUB_REF#refs/tags/}) - - echo "IMAGE_TAG=$IMAGE_TAG" >> $GITHUB_ENV - echo "OVERRIDE_PUSHED_IMAGE=false" >> $GITHUB_ENV - - - name: Build & Push Image - if: startsWith(github.ref, 'refs/heads/release') || startsWith(github.ref, 'refs/tags/') - run: | - set +e - - image_name=ghcr.io/${{ github.repository }}/gateway - - docker manifest inspect $image_name:$IMAGE_TAG - exit_status=$? - if [ $exit_status -eq 0 ]; then - [ "$OVERRIDE_PUSHED_IMAGE" = "false" ] && echo "image ($image_name:$IMAGE_TAG) already exists, and override image is disable, exiting" && exit 0 - echo "image exists, but override pushed image is set to true. proceeding with building image" - fi - set -e - - cd apps/gateway - docker buildx build -t "$image_name:$IMAGE_TAG" . --push diff --git a/.tools/taskfiles/container-image-builder.yml b/.tools/taskfiles/container-image-builder.yml new file mode 100644 index 000000000..2e91ce4e6 --- /dev/null +++ b/.tools/taskfiles/container-image-builder.yml @@ -0,0 +1,15 @@ +version: 3 + +tasks: + docker: + env: + CGO_ENABLED: 0 + vars: + BuiltAt: + sh: date | sed 's/\s/_/g' + preconditions: + - sh: '[ -n "{{.Out}}" ]' + msg: var Out must have a value + cmds: + - go build -v -ldflags="-s -w -X github.com/kloudlite/api/common.BuiltAt=\"{{.BuiltAt}}\"" -o {{.Out}} + - upx {{.Out}} diff --git a/.tools/taskfiles/docker-builder.yml b/.tools/taskfiles/docker-builder.yml new file mode 100644 index 000000000..7ec48ebd3 --- /dev/null +++ b/.tools/taskfiles/docker-builder.yml @@ -0,0 +1,12 @@ +version: 3 + +tasks: + build: + vars: + Containerfile: ./Containerfile + Dir: ./ + preconditions: + - sh: '[ -n "{{.Image}}" ]' + msg: var Image must have a value + cmds: + - echo docker buildx build -f {{.Containerfile}} -t {{.Image}} {{.Dir}} {{.BuildArgs}} --push diff --git a/.tools/taskfiles/go-build.yml b/.tools/taskfiles/go-build.yml new file mode 100644 index 000000000..110e56b15 --- /dev/null +++ b/.tools/taskfiles/go-build.yml @@ -0,0 +1,16 @@ +version: 3 + +tasks: + build: + env: + CGO_ENABLED: 0 + vars: + BuiltAt: + sh: date | sed 's/\s/_/g' + Dir: "." + preconditions: + - sh: '[ -n "{{.Out}}" ]' + msg: var Out must have a value + cmds: + - go build -v -ldflags="-s -w -X github.com/kloudlite/api/common.BuiltAt=\"{{.BuiltAt}}\"" -o {{.Out}} {{.Dir}} + - upx {{.Out}} diff --git a/apps/accounts/.dockerignore b/apps/accounts/.dockerignore new file mode 100644 index 000000000..d23381b64 --- /dev/null +++ b/apps/accounts/.dockerignore @@ -0,0 +1,2 @@ +** +!bin diff --git a/apps/accounts/Containerfile b/apps/accounts/Containerfile new file mode 100644 index 000000000..74ee10b4f --- /dev/null +++ b/apps/accounts/Containerfile @@ -0,0 +1,5 @@ +# syntax=docker/dockerfile:1.4 +FROM gcr.io/distroless/static:nonroot +ARG BINARY +COPY ./bin/$BINARY ./accounts +ENTRYPOINT [ "./accounts" ] diff --git a/apps/accounts/Containerfile.local b/apps/accounts/Containerfile.local deleted file mode 100644 index cfa21c354..000000000 --- a/apps/accounts/Containerfile.local +++ /dev/null @@ -1,7 +0,0 @@ -# syntax=docker/dockerfile:1.4 -FROM gcr.io/distroless/static:nonroot -WORKDIR /tmp -USER 1001:1001 -ARG APP -COPY --from=builder $APP ./accounts -CMD ["./accounts"] diff --git a/apps/accounts/Taskfile.yml b/apps/accounts/Taskfile.yml index 3da23b8a1..1a36382f3 100644 --- a/apps/accounts/Taskfile.yml +++ b/apps/accounts/Taskfile.yml @@ -1,10 +1,10 @@ version: "3" -dotenv: - - .secrets/env - vars: - ImagePrefix: "ghcr.io/kloudlite/platform/apis" + app: accounts + +includes: + go: ../../.tools/taskfiles/go-build.yml tasks: gql: @@ -13,21 +13,6 @@ tasks: - go run github.com/99designs/gqlgen generate - gofmt -w -d -r '"errors" -> "github.com/kloudlite/api/pkg/errors"' graph/*.resolvers.go - build: - env: - CGO_ENABLED: 0 - GOOS: linux - GOARCH: amd64 - vars: - BuiltAt: - sh: date | sed 's/\s/_/g' - preconditions: - - sh: '[ -n "{{.Out}}" ]' - msg: var Out must have a value - cmds: - - go build -ldflags="-s -w -X github.com/kloudlite/api/common.BuiltAt=\"{{.BuiltAt}}\"" -o {{.Out}} - - upx {{.Out}} - run: dotenv: - .secrets/env @@ -48,34 +33,17 @@ tasks: popd - rm -rf ./internal/app/_struct-to-graphql - docker-build: - vars: - APP: finance - IMAGE: registry.kloudlite.io/kloudlite/{{.EnvName}}/{{.APP}}-api:{{.Tag}} - preconditions: - - sh: '[[ -n "{{.Tag}}" ]]' - msg: 'var Tag must have a value' - - - sh: '[[ "{{.EnvName}}" == "development" ]] || [[ "{{.EnvName}}" == "staging" ]] || [[ "{{.EnvName}}" == "production" ]]' - msg: 'var EnvName must have one of [development, staging, production] as its value' + build: cmds: - - docker buildx build -f ./Dockerfile -t {{.IMAGE}} . --build-arg APP={{.APP}} --platform linux/amd64 --build-context project-root=../.. - - docker push {{.IMAGE}} + - task: go:build + vars: + Out: ./bin/{{.app}} - local-build: + container:build-and-push: preconditions: - - sh: '[ -n "{{.Tag}}" ]' - msg: 'var Tag must have a value' - vars: - Dockerfile: "./Containerfile.local" - APP: accounts - Image: "{{.ImagePrefix}}/{{.APP}}:{{.Tag}}" + - sh: '[[ -n "{{.Image}}" ]]' + msg: "var Image must have a value, of format 'image_repository:image_tag'" cmds: - - |+ - dir=$(mktemp -d) - task build Out=$dir/{{.APP}} - - podman buildx build -t {{.Image}} -f {{.Dockerfile}} . --build-context builder=$dir --build-arg APP={{.APP}} - podman push {{.Image}} - rm -rf $dir + - task: build + - docker buildx build -f ./Containerfile -t {{.Image}} . --build-arg BINARY={{.app}} --push diff --git a/apps/auth/.dockerignore b/apps/auth/.dockerignore index b30fec26f..d23381b64 100644 --- a/apps/auth/.dockerignore +++ b/apps/auth/.dockerignore @@ -1,3 +1,2 @@ ** -!main.go -!internal +!bin diff --git a/apps/auth/Containerfile.local b/apps/auth/Containerfile similarity index 59% rename from apps/auth/Containerfile.local rename to apps/auth/Containerfile index 4a238382c..d97aa02b0 100644 --- a/apps/auth/Containerfile.local +++ b/apps/auth/Containerfile @@ -1,6 +1,5 @@ #syntax=docker/dockerfile:1 FROM gcr.io/distroless/static-debian11:nonroot -WORKDIR /app -ARG APP -COPY --from=builder --chown=1001 $APP ./auth +ARG BINARY +COPY --chown=1001 ./bin/$BINARY ./auth ENTRYPOINT ["./auth"] diff --git a/apps/auth/Dockerfile b/apps/auth/Dockerfile deleted file mode 100644 index 4da1f5202..000000000 --- a/apps/auth/Dockerfile +++ /dev/null @@ -1,30 +0,0 @@ -# syntax=docker/dockerfile:1.4 -FROM golang:1.18.3-alpine3.16 AS base -RUN apk add git -ARG GH_ACCESS_TOKEN -ENV GH_ACCESS_TOKEN=$GH_ACCESS_TOKEN -RUN git config --global url.https://$GH_ACCESS_TOKEN@github.com/.insteadOf https://github.com/ - -ENV GOPATH=/tmp/go -ENV GOCACHE=/tmp/go-cache -ENV GOPRIVATE=github.com/kloudlite/operator,github.com/kloudlite/wg-operator,github.com/kloudlite/cluster-operator -WORKDIR /tmp/app -COPY --chown=1001 --from=project-root ./go.mod ./go.sum ./tools.go ./ -COPY --chown=1001 --from=project-root common ./common -COPY --chown=1001 --from=project-root constants ./constants -COPY --chown=1001 --from=project-root grpc-interfaces ./grpc-interfaces -COPY --chown=1001 --from=project-root pkg ./pkg -RUN go mod download -x -ARG APP -RUN mkdir -p ./apps/$APP -WORKDIR /tmp/app/apps/$APP -COPY ./ ./ -ENV CGO_ENABLED=0 -RUN GOOS=linux GOARCH=amd64 go build -tags musl -o /tmp/bin/$APP ./main.go -RUN chmod +x /tmp/bin/$APP - -FROM gcr.io/distroless/static:nonroot -USER 1001:1001 -ARG APP -COPY --from=base /tmp/bin/$APP /auth -CMD ["/auth"] diff --git a/apps/auth/Taskfile.yml b/apps/auth/Taskfile.yml index 92185c879..18ab1c535 100644 --- a/apps/auth/Taskfile.yml +++ b/apps/auth/Taskfile.yml @@ -1,12 +1,14 @@ version: '3' -dotenv: [".secrets/oauth.env", ".secrets/env"] +includes: + go: ../../.tools/taskfiles/go-build.yml vars: - ImagePrefix: "ghcr.io/kloudlite/api" + app: auth tasks: run: + dotenv: [".secrets/oauth.env", ".secrets/env"] cmds: - go run main.go --dev @@ -19,34 +21,16 @@ tasks: - go run github.com/99designs/gqlgen generate - gofmt -w -d -r '"errors" -> "github.com/kloudlite/api/pkg/errors"' graph/*.resolvers.go - build: - env: - CGO_ENABLED: 0 - GOOS: linux - GOARCH: amd64 - vars: - BuiltAt: - sh: date | sed 's/\s/_/g' - preconditions: - - sh: '[ -n "{{.Out}}" ]' - msg: var Out must have a value cmds: - - go build -v -ldflags="-s -w -X github.com/kloudlite/api/common.BuiltAt=\"{{.BuiltAt}}\"" -o {{.Out}} - - upx {{.Out}} + - task: go:build + vars: + Out: ./bin/{{.app}} - local-build: - vars: - APP: auth - IMAGE: "{{.ImagePrefix}}/{{.APP}}:{{.Tag}}" + container:build-and-push: preconditions: - - sh: '[[ -n "{{.Tag}}" ]]' - msg: 'var Tag must have a value' - silent: true + - sh: '[[ -n "{{.Image}}" ]]' + msg: "var Image must have a value, of format 'image_repository:image_tag' " cmds: - - | - tdir=$(mktemp -d) - task build Out=$tdir/{{.APP}} - podman buildx build -f ./Containerfile.local -t {{.IMAGE}} . --build-context builder=${tdir} --build-arg APP="{{.APP}}" - podman push {{.IMAGE}} - rm -rf $tdir + - task: build + - docker buildx build -f ./Containerfile -t {{.Image}} . --build-arg BINARY={{.app}} --push diff --git a/apps/comms/.dockerignore b/apps/comms/.dockerignore new file mode 100644 index 000000000..d23381b64 --- /dev/null +++ b/apps/comms/.dockerignore @@ -0,0 +1,2 @@ +** +!bin diff --git a/apps/comms/Containerfile b/apps/comms/Containerfile new file mode 100644 index 000000000..86ee22dd3 --- /dev/null +++ b/apps/comms/Containerfile @@ -0,0 +1,5 @@ +#syntax=docker/dockerfile:1.4 +FROM gcr.io/distroless/static:nonroot +ARG BINARY +COPY ./bin/$BINARY ./comms +ENTRYPOINT ["./comms"] diff --git a/apps/comms/Dockerfile b/apps/comms/Dockerfile deleted file mode 100644 index da44277bb..000000000 --- a/apps/comms/Dockerfile +++ /dev/null @@ -1,28 +0,0 @@ -# syntax=docker/dockerfile:1.4 -FROM golang:1.18.3-alpine3.16 AS base -RUN apk add make gcc libc-dev -USER 1001 -ENV GOPATH=/tmp/go -ENV GOCACHE=/tmp/go-cache -WORKDIR /tmp/app -COPY --chown=1001 --from=project-root ./go.mod ./go.sum ./tools.go ./ -COPY --chown=1001 --from=project-root common ./common -COPY --chown=1001 --from=project-root grpc-interfaces ./grpc-interfaces -COPY --chown=1001 --from=project-root pkg ./pkg -COPY --chown=1001 email-templates ./email-templates -RUN go mod download -x -ARG APP -RUN mkdir -p ./apps/$APP -WORKDIR /tmp/app/apps/$APP -COPY ./ ./ -#TODO: remove kafka from messaging, to force enable CGO_ENABLED=0 -ENV CGO_ENABLED=1 -RUN GOOS=linux GOARCH=amd64 go build -tags musl -o /tmp/bin/$APP ./main.go -RUN chmod +x /tmp/bin/$APP - -FROM gcr.io/distroless/static:nonroot -WORKDIR /tmp -USER 1001:1001 -ARG APP -COPY --from=base /tmp/bin/$APP ./comms -CMD ["./comms"] diff --git a/apps/comms/Dockerfile.dev b/apps/comms/Dockerfile.dev deleted file mode 100644 index 0f1b4331f..000000000 --- a/apps/comms/Dockerfile.dev +++ /dev/null @@ -1,6 +0,0 @@ -FROM gcr.io/distroless/static:nonroot -WORKDIR /tmp -USER 1001:1001 -ARG BINARY -COPY --from=builder BINARY ./comms -CMD ["./comms"] diff --git a/apps/comms/Taskfile.yml b/apps/comms/Taskfile.yml index 9cf127727..3c9b15f4b 100644 --- a/apps/comms/Taskfile.yml +++ b/apps/comms/Taskfile.yml @@ -1,12 +1,14 @@ version: "3" -dotenv: [".secrets/env"] +includes: + go: ../../.tools/taskfiles/go-build.yml vars: - ImagePrefix: ghcr.io/kloudlite/platform/apis - + app: comms + tasks: run: + dotenv: [".secrets/env"] env: EMAIL_LINKS_BASE_URL: "https://auth.local.kl.madhouselabs.io" GRPC_PORT: 50051 @@ -15,54 +17,15 @@ tasks: - nodemon -e go --signal SIGKILL --exec 'go run -tags dynamic main.go --dev || exit 1' build: - env: - CGO_ENABLED: 0 - GOOS: linux - GOARCH: amd64 - preconditions: - - sh: '[ -n "{{.Out}}" ]' - msg: var Out must have a value - cmds: - - go build -ldflags="-s -w" -o {{.Out}} - - upx {{.Out}} - - docker-build: - vars: - APP: comms - IMAGE: "{{.ImagePrefix}}/{{.APP}}:{{.Tag}}" - preconditions: - - sh: '[[ -n "{{.Tag}}" ]]' - msg: 'var Tag must have a value' cmds: - - docker buildx build -f ./Dockerfile -t {{.IMAGE}} . --build-arg APP={{.APP}} --platform linux/amd64 --build-context project-root=../.. - - docker push {{.IMAGE}} + - task: go:build + vars: + Out: ./bin/{{.app}} - local-build: - vars: - APP: comms - IMAGE: "{{.ImagePrefix}}/{{.APP}}:{{.Tag}}" + container:build-and-push: preconditions: - - sh: '[[ -n "{{.Tag}}" ]]' - msg: 'var Tag must have a value' - silent: true + - sh: '[[ -n "{{.Image}}" ]]' + msg: "var Image must have a value, of format 'image_repository:image_tag'" cmds: - - |+ - lineNumbers=$(cat Dockerfile | grep -i '^FROM' -n | tail +2 | awk -F: '{print $1}') - - startLineNo=$(echo "$lineNumbers" | head -n+1) - finalLineNo=$(echo "$lineNumbers" | tail -1) - - tDir=$(mktemp -d) - - nDockerfile=$(cat Dockerfile | tail --lines=+$startLineNo | grep -i --invert-match 'from=base') - echo "$nDockerfile" | sed "1 i # syntax=docker/dockerfile:1.4" > $tDir/Dockerfile.base - - #lineNo=$(cat Dockerfile | grep -i '^FROM' -n | tail -1 | awk -F: '{print $1}') - task build Out="$tDir/{{.APP}}" - - cat $tDir/Dockerfile.base | sed "5 i COPY --from=local-builder ./{{.APP}} ./{{.APP}}" > $tDir/Dockerfile - cat $tDir/Dockerfile - - docker buildx build -f $tDir/Dockerfile -t {{.IMAGE}} . --build-context local-builder=${tDir} - docker push {{.IMAGE}} - rm -rf $tDir + - task: build + - docker buildx build -f ./Containerfile -t {{.Image}} . --build-arg BINARY={{.app}} --push diff --git a/apps/comms/email-templates/account-invite/email.html b/apps/comms/email-templates/account-invite/email.html index 8aff7a9eb..5f1da98c8 100644 --- a/apps/comms/email-templates/account-invite/email.html +++ b/apps/comms/email-templates/account-invite/email.html @@ -1,6 +1,6 @@ - + @@ -105,13 +105,14 @@ <div class="mj-column-per-100 mj-outlook-group-fix" style="font-size:0px;text-align:left;direction:ltr;display:inline-block;vertical-align:top;width:100%;"> <table border="0" cellpadding="0" cellspacing="0" role="presentation" style="vertical-align:top;" width="100%"> <tbody> + <!-- image-ref: https://github.com/kloudlite/oss/issues/37 --> <tr> <td align="left" style="font-size:0px;padding:10px 25px;word-break:break-word;"> <table border="0" cellpadding="0" cellspacing="0" role="presentation" style="border-collapse:collapse;border-spacing:0px;"> <tbody> <tr> - <td style="width:100px;"> - <img alt="kloudlite logo" height="auto" src="https://ik.imagekit.io/kloudlite/logo-scalable_c56EcJLdd.png?ik-sdk-version=javascript-1.4.3&updatedAt=1651786453856" style="border:0;display:block;outline:none;text-decoration:none;height:auto;width:100%;font-size:13px;" width="100" /> + <td style="width:120px;"> + <img height="auto" src="https://camo.githubusercontent.com/c4a6852ff03b8113b8196046536c6c1235c8ca03fb8ee68ba09c28033d07651e/68747470733a2f2f75706c6f6164732e6c696e6561722e6170702f38636434353562632d326237622d346664662d383964302d3334316138353134396563332f32356331653933622d313432342d343932662d396536632d3662373438383238663065642f31333064663661312d626631642d343837662d626638302d3063633264316535633633373f7369676e61747572653d65794a68624763694f694a49557a49314e694973496e523563434936496b705856434a392e65794a775958526f496a6f694c7a686a5a4451314e574a6a4c544a694e3249744e475a6b5a6930344f5751774c544d304d5745344e5445304f57566a4d7938794e574d785a546b7a596930784e4449304c5451354d6d59744f57553259793032596a63304f4467794f4759775a5751764d544d775a47593259544574596d59785a4330304f44646d4c574a6d4f4441744d474e6a4d6d51785a54566a4e6a4d334969776961574630496a6f784e7a41344d546b324d4445794c434a6c654841694f6a45334d4467794f4449304d544a392e485566784a67646b6f365761364153356841766c64474b7762386d6c5674445170527330714c4539715673" style="border:0;display:block;outline:none;text-decoration:none;height:auto;width:100%;font-size:13px;" width="120" /> </td> </tr> </tbody> diff --git a/apps/comms/email-templates/account-invite/email.mjml b/apps/comms/email-templates/account-invite/email.mjml index 8e73ae372..4c2d291a7 100644 --- a/apps/comms/email-templates/account-invite/email.mjml +++ b/apps/comms/email-templates/account-invite/email.mjml @@ -3,7 +3,8 @@ <mj-body background-color="#f7f7f7"> <mj-section padding="20px 0"> <mj-column width="100%"> - <mj-image align="left" width="100px" src="https://ik.imagekit.io/kloudlite/logo-scalable_c56EcJLdd.png?ik-sdk-version=javascript-1.4.3&updatedAt=1651786453856" alt="kloudlite logo"></mj-image> + <!-- image-ref: https://github.com/kloudlite/oss/issues/37 --> + <mj-image align="left" width="120px" src="https://camo.githubusercontent.com/c4a6852ff03b8113b8196046536c6c1235c8ca03fb8ee68ba09c28033d07651e/68747470733a2f2f75706c6f6164732e6c696e6561722e6170702f38636434353562632d326237622d346664662d383964302d3334316138353134396563332f32356331653933622d313432342d343932662d396536632d3662373438383238663065642f31333064663661312d626631642d343837662d626638302d3063633264316535633633373f7369676e61747572653d65794a68624763694f694a49557a49314e694973496e523563434936496b705856434a392e65794a775958526f496a6f694c7a686a5a4451314e574a6a4c544a694e3249744e475a6b5a6930344f5751774c544d304d5745344e5445304f57566a4d7938794e574d785a546b7a596930784e4449304c5451354d6d59744f57553259793032596a63304f4467794f4759775a5751764d544d775a47593259544574596d59785a4330304f44646d4c574a6d4f4441744d474e6a4d6d51785a54566a4e6a4d334969776961574630496a6f784e7a41344d546b324d4445794c434a6c654841694f6a45334d4467794f4449304d544a392e485566784a67646b6f365761364153356841766c64474b7762386d6c5674445170527330714c4539715673"></mj-image> <mj-divider border-color="#ddd" border-width="1px"></mj-divider> <mj-text font-family="Open Sans, Arial" font-size="18px" color="#333" line-height="1.5"> Hello {{.Name}}, diff --git a/apps/comms/email-templates/project-invite/email.html b/apps/comms/email-templates/project-invite/email.html index caf64ad1a..4fd6afbd1 100644 --- a/apps/comms/email-templates/project-invite/email.html +++ b/apps/comms/email-templates/project-invite/email.html @@ -1,6 +1,6 @@ <!-- DO NOT EDIT: generated with `email.mjml` in their online editor --> <!doctype html> -<html xmlns="http://www.w3.org/1999/xhtml"> +<html xmlns="http://www.w3.org/1999/xhtml" xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office"> <head> <title> @@ -105,13 +105,14 @@ <div class="mj-column-per-100 mj-outlook-group-fix" style="font-size:0px;text-align:left;direction:ltr;display:inline-block;vertical-align:top;width:100%;"> <table border="0" cellpadding="0" cellspacing="0" role="presentation" style="vertical-align:top;" width="100%"> <tbody> + <!-- image-ref: https://github.com/kloudlite/oss/issues/37 --> <tr> <td align="left" style="font-size:0px;padding:10px 25px;word-break:break-word;"> <table border="0" cellpadding="0" cellspacing="0" role="presentation" style="border-collapse:collapse;border-spacing:0px;"> <tbody> <tr> - <td style="width:100px;"> - <img height="auto" src="https://ik.imagekit.io/kloudlite/logo-scalable_c56EcJLdd.png?ik-sdk-version=javascript-1.4.3&updatedAt=1651786453856" style="border:0;display:block;outline:none;text-decoration:none;height:auto;width:100%;font-size:13px;" width="100" /> + <td style="width:120px;"> + <img height="auto" src="https://camo.githubusercontent.com/c4a6852ff03b8113b8196046536c6c1235c8ca03fb8ee68ba09c28033d07651e/68747470733a2f2f75706c6f6164732e6c696e6561722e6170702f38636434353562632d326237622d346664662d383964302d3334316138353134396563332f32356331653933622d313432342d343932662d396536632d3662373438383238663065642f31333064663661312d626631642d343837662d626638302d3063633264316535633633373f7369676e61747572653d65794a68624763694f694a49557a49314e694973496e523563434936496b705856434a392e65794a775958526f496a6f694c7a686a5a4451314e574a6a4c544a694e3249744e475a6b5a6930344f5751774c544d304d5745344e5445304f57566a4d7938794e574d785a546b7a596930784e4449304c5451354d6d59744f57553259793032596a63304f4467794f4759775a5751764d544d775a47593259544574596d59785a4330304f44646d4c574a6d4f4441744d474e6a4d6d51785a54566a4e6a4d334969776961574630496a6f784e7a41344d546b324d4445794c434a6c654841694f6a45334d4467794f4449304d544a392e485566784a67646b6f365761364153356841766c64474b7762386d6c5674445170527330714c4539715673" style="border:0;display:block;outline:none;text-decoration:none;height:auto;width:100%;font-size:13px;" width="120" /> </td> </tr> </tbody> diff --git a/apps/comms/email-templates/project-invite/email.mjml b/apps/comms/email-templates/project-invite/email.mjml index c88446d1b..5883d4b93 100644 --- a/apps/comms/email-templates/project-invite/email.mjml +++ b/apps/comms/email-templates/project-invite/email.mjml @@ -3,7 +3,9 @@ <mj-body background-color="#f7f7f7"> <mj-section padding="20px 0"> <mj-column width="100%"> - <mj-image align="left" width="100px" src="https://ik.imagekit.io/kloudlite/logo-scalable_c56EcJLdd.png?ik-sdk-version=javascript-1.4.3&updatedAt=1651786453856"></mj-image> + <!-- image-ref: https://github.com/kloudlite/oss/issues/37 --> + <mj-image align="left" width="120px" src="https://camo.githubusercontent.com/c4a6852ff03b8113b8196046536c6c1235c8ca03fb8ee68ba09c28033d07651e/68747470733a2f2f75706c6f6164732e6c696e6561722e6170702f38636434353562632d326237622d346664662d383964302d3334316138353134396563332f32356331653933622d313432342d343932662d396536632d3662373438383238663065642f31333064663661312d626631642d343837662d626638302d3063633264316535633633373f7369676e61747572653d65794a68624763694f694a49557a49314e694973496e523563434936496b705856434a392e65794a775958526f496a6f694c7a686a5a4451314e574a6a4c544a694e3249744e475a6b5a6930344f5751774c544d304d5745344e5445304f57566a4d7938794e574d785a546b7a596930784e4449304c5451354d6d59744f57553259793032596a63304f4467794f4759775a5751764d544d775a47593259544574596d59785a4330304f44646d4c574a6d4f4441744d474e6a4d6d51785a54566a4e6a4d334969776961574630496a6f784e7a41344d546b324d4445794c434a6c654841694f6a45334d4467794f4449304d544a392e485566784a67646b6f365761364153356841766c64474b7762386d6c5674445170527330714c4539715673"></mj-image> + <mj-divider border-color="#ddd" border-width="1px"></mj-divider> <mj-text font-family="Open Sans, Arial" font-size="18px" color="#333" line-height="1.5"> Hello {{.Name}}, diff --git a/apps/comms/email-templates/reset-password/email.html b/apps/comms/email-templates/reset-password/email.html index 89d522fe3..dea71cb51 100644 --- a/apps/comms/email-templates/reset-password/email.html +++ b/apps/comms/email-templates/reset-password/email.html @@ -1,6 +1,6 @@ <!-- DO NOT EDIT: generated with `email.mjml` in their online editor --> <!doctype html> -<html xmlns="http://www.w3.org/1999/xhtml"> +<html xmlns="http://www.w3.org/1999/xhtml" xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office"> <head> <title> @@ -105,13 +105,14 @@ <div class="mj-column-per-100 mj-outlook-group-fix" style="font-size:0px;text-align:left;direction:ltr;display:inline-block;vertical-align:top;width:100%;"> <table border="0" cellpadding="0" cellspacing="0" role="presentation" style="vertical-align:top;" width="100%"> <tbody> + <!-- image-ref: https://github.com/kloudlite/oss/issues/37 --> <tr> <td align="left" style="font-size:0px;padding:10px 25px;word-break:break-word;"> <table border="0" cellpadding="0" cellspacing="0" role="presentation" style="border-collapse:collapse;border-spacing:0px;"> <tbody> <tr> - <td style="width:100px;"> - <img height="auto" src="https://ik.imagekit.io/kloudlite/logo-scalable_c56EcJLdd.png?ik-sdk-version=javascript-1.4.3&updatedAt=1651786453856" style="border:0;display:block;outline:none;text-decoration:none;height:auto;width:100%;font-size:13px;" width="100" /> + <td style="width:120px;"> + <img height="auto" src="https://camo.githubusercontent.com/c4a6852ff03b8113b8196046536c6c1235c8ca03fb8ee68ba09c28033d07651e/68747470733a2f2f75706c6f6164732e6c696e6561722e6170702f38636434353562632d326237622d346664662d383964302d3334316138353134396563332f32356331653933622d313432342d343932662d396536632d3662373438383238663065642f31333064663661312d626631642d343837662d626638302d3063633264316535633633373f7369676e61747572653d65794a68624763694f694a49557a49314e694973496e523563434936496b705856434a392e65794a775958526f496a6f694c7a686a5a4451314e574a6a4c544a694e3249744e475a6b5a6930344f5751774c544d304d5745344e5445304f57566a4d7938794e574d785a546b7a596930784e4449304c5451354d6d59744f57553259793032596a63304f4467794f4759775a5751764d544d775a47593259544574596d59785a4330304f44646d4c574a6d4f4441744d474e6a4d6d51785a54566a4e6a4d334969776961574630496a6f784e7a41344d546b324d4445794c434a6c654841694f6a45334d4467794f4449304d544a392e485566784a67646b6f365761364153356841766c64474b7762386d6c5674445170527330714c4539715673" style="border:0;display:block;outline:none;text-decoration:none;height:auto;width:100%;font-size:13px;" width="120" /> </td> </tr> </tbody> diff --git a/apps/comms/email-templates/reset-password/email.mjml b/apps/comms/email-templates/reset-password/email.mjml index 39d284973..751f61e86 100644 --- a/apps/comms/email-templates/reset-password/email.mjml +++ b/apps/comms/email-templates/reset-password/email.mjml @@ -3,7 +3,9 @@ <mj-body background-color="#f7f7f7"> <mj-section padding="20px 0"> <mj-column width="100%"> - <mj-image align="left" width="100px" src="https://ik.imagekit.io/kloudlite/logo-scalable_c56EcJLdd.png?ik-sdk-version=javascript-1.4.3&updatedAt=1651786453856"></mj-image> + <!-- image-ref: https://github.com/kloudlite/oss/issues/37 --> + <mj-image align="left" width="120px" src="https://camo.githubusercontent.com/c4a6852ff03b8113b8196046536c6c1235c8ca03fb8ee68ba09c28033d07651e/68747470733a2f2f75706c6f6164732e6c696e6561722e6170702f38636434353562632d326237622d346664662d383964302d3334316138353134396563332f32356331653933622d313432342d343932662d396536632d3662373438383238663065642f31333064663661312d626631642d343837662d626638302d3063633264316535633633373f7369676e61747572653d65794a68624763694f694a49557a49314e694973496e523563434936496b705856434a392e65794a775958526f496a6f694c7a686a5a4451314e574a6a4c544a694e3249744e475a6b5a6930344f5751774c544d304d5745344e5445304f57566a4d7938794e574d785a546b7a596930784e4449304c5451354d6d59744f57553259793032596a63304f4467794f4759775a5751764d544d775a47593259544574596d59785a4330304f44646d4c574a6d4f4441744d474e6a4d6d51785a54566a4e6a4d334969776961574630496a6f784e7a41344d546b324d4445794c434a6c654841694f6a45334d4467794f4449304d544a392e485566784a67646b6f365761364153356841766c64474b7762386d6c5674445170527330714c4539715673"></mj-image> + <mj-divider border-color="#ddd" border-width="1px"></mj-divider> <mj-text font-family="Open Sans, Arial" font-size="18px" color="#333" line-height="1.5"> Hello {{.Name}}, diff --git a/apps/comms/email-templates/user-verification/email.html b/apps/comms/email-templates/user-verification/email.html index 5ec94ff21..ec932259b 100644 --- a/apps/comms/email-templates/user-verification/email.html +++ b/apps/comms/email-templates/user-verification/email.html @@ -1,6 +1,6 @@ <!-- DO NOT EDIT: generated with `email.mjml` in their online editor --> <!doctype html> -<html xmlns="http://www.w3.org/1999/xhtml"> +<html xmlns="http://www.w3.org/1999/xhtml" xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office"> <head> <title> @@ -105,13 +105,14 @@ <div class="mj-column-per-100 mj-outlook-group-fix" style="font-size:0px;text-align:left;direction:ltr;display:inline-block;vertical-align:top;width:100%;"> <table border="0" cellpadding="0" cellspacing="0" role="presentation" style="vertical-align:top;" width="100%"> <tbody> + <!-- image-ref: https://github.com/kloudlite/oss/issues/37 --> <tr> <td align="left" style="font-size:0px;padding:10px 25px;word-break:break-word;"> <table border="0" cellpadding="0" cellspacing="0" role="presentation" style="border-collapse:collapse;border-spacing:0px;"> <tbody> <tr> <td style="width:120px;"> - <img height="auto" src="https://ik.imagekit.io/kloudlite/logo-scalable_c56EcJLdd.png?ik-sdk-version=javascript-1.4.3&updatedAt=1651786453856" style="border:0;display:block;outline:none;text-decoration:none;height:auto;width:100%;font-size:13px;" width="120" /> + <img height="auto" src="https://camo.githubusercontent.com/c4a6852ff03b8113b8196046536c6c1235c8ca03fb8ee68ba09c28033d07651e/68747470733a2f2f75706c6f6164732e6c696e6561722e6170702f38636434353562632d326237622d346664662d383964302d3334316138353134396563332f32356331653933622d313432342d343932662d396536632d3662373438383238663065642f31333064663661312d626631642d343837662d626638302d3063633264316535633633373f7369676e61747572653d65794a68624763694f694a49557a49314e694973496e523563434936496b705856434a392e65794a775958526f496a6f694c7a686a5a4451314e574a6a4c544a694e3249744e475a6b5a6930344f5751774c544d304d5745344e5445304f57566a4d7938794e574d785a546b7a596930784e4449304c5451354d6d59744f57553259793032596a63304f4467794f4759775a5751764d544d775a47593259544574596d59785a4330304f44646d4c574a6d4f4441744d474e6a4d6d51785a54566a4e6a4d334969776961574630496a6f784e7a41344d546b324d4445794c434a6c654841694f6a45334d4467794f4449304d544a392e485566784a67646b6f365761364153356841766c64474b7762386d6c5674445170527330714c4539715673" style="border:0;display:block;outline:none;text-decoration:none;height:auto;width:100%;font-size:13px;" width="120" /> </td> </tr> </tbody> diff --git a/apps/comms/email-templates/user-verification/email.mjml b/apps/comms/email-templates/user-verification/email.mjml index aed5fdb6f..67b47a77d 100644 --- a/apps/comms/email-templates/user-verification/email.mjml +++ b/apps/comms/email-templates/user-verification/email.mjml @@ -1,9 +1,11 @@ <!-- vim: set ft=html: --> +<!-- DO NOT EDIT: copy this file, and edit in MJML online editor @ https://mjml.io/try-it-live --> <mjml> <mj-body background-color="#f7f7f7"> <mj-section padding="20px 0"> <mj-column width="100%"> - <mj-image align="left" width="120px" src="https://ik.imagekit.io/kloudlite/logo-scalable_c56EcJLdd.png?ik-sdk-version=javascript-1.4.3&updatedAt=1651786453856"></mj-image> + <!-- image-ref: https://github.com/kloudlite/oss/issues/37 --> + <mj-image align="left" width="120px" src="https://camo.githubusercontent.com/c4a6852ff03b8113b8196046536c6c1235c8ca03fb8ee68ba09c28033d07651e/68747470733a2f2f75706c6f6164732e6c696e6561722e6170702f38636434353562632d326237622d346664662d383964302d3334316138353134396563332f32356331653933622d313432342d343932662d396536632d3662373438383238663065642f31333064663661312d626631642d343837662d626638302d3063633264316535633633373f7369676e61747572653d65794a68624763694f694a49557a49314e694973496e523563434936496b705856434a392e65794a775958526f496a6f694c7a686a5a4451314e574a6a4c544a694e3249744e475a6b5a6930344f5751774c544d304d5745344e5445304f57566a4d7938794e574d785a546b7a596930784e4449304c5451354d6d59744f57553259793032596a63304f4467794f4759775a5751764d544d775a47593259544574596d59785a4330304f44646d4c574a6d4f4441744d474e6a4d6d51785a54566a4e6a4d334969776961574630496a6f784e7a41344d546b324d4445794c434a6c654841694f6a45334d4467794f4449304d544a392e485566784a67646b6f365761364153356841766c64474b7762386d6c5674445170527330714c4539715673"></mj-image> </mj-column> </mj-section> <mj-section padding="20px 0"> diff --git a/apps/comms/email-templates/welcome/email.html b/apps/comms/email-templates/welcome/email.html index 5a1b06be8..2d35f312a 100644 --- a/apps/comms/email-templates/welcome/email.html +++ b/apps/comms/email-templates/welcome/email.html @@ -1,5 +1,6 @@ +<!-- DO NOT EDIT: generated with `email.mjml` in their online editor --> <!doctype html> -<html xmlns="http://www.w3.org/1999/xhtml"> +<html xmlns="http://www.w3.org/1999/xhtml" xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office"> <head> <title> @@ -102,13 +103,14 @@ <div class="mj-column-per-100 mj-outlook-group-fix" style="font-size:0px;text-align:left;direction:ltr;display:inline-block;vertical-align:top;width:100%;"> <table border="0" cellpadding="0" cellspacing="0" role="presentation" style="vertical-align:top;" width="100%"> <tbody> + <!-- image-ref: https://github.com/kloudlite/oss/issues/37 --> <tr> <td align="left" style="font-size:0px;padding:10px 25px;word-break:break-word;"> <table border="0" cellpadding="0" cellspacing="0" role="presentation" style="border-collapse:collapse;border-spacing:0px;"> <tbody> <tr> - <td style="width:100px;"> - <img height="auto" src="https://ik.imagekit.io/kloudlite/logo-scalable_c56EcJLdd.png?ik-sdk-version=javascript-1.4.3&updatedAt=1651786453856" style="border:0;display:block;outline:none;text-decoration:none;height:auto;width:100%;font-size:13px;" width="100" /> + <td style="width:120px;"> + <img height="auto" src="https://camo.githubusercontent.com/c4a6852ff03b8113b8196046536c6c1235c8ca03fb8ee68ba09c28033d07651e/68747470733a2f2f75706c6f6164732e6c696e6561722e6170702f38636434353562632d326237622d346664662d383964302d3334316138353134396563332f32356331653933622d313432342d343932662d396536632d3662373438383238663065642f31333064663661312d626631642d343837662d626638302d3063633264316535633633373f7369676e61747572653d65794a68624763694f694a49557a49314e694973496e523563434936496b705856434a392e65794a775958526f496a6f694c7a686a5a4451314e574a6a4c544a694e3249744e475a6b5a6930344f5751774c544d304d5745344e5445304f57566a4d7938794e574d785a546b7a596930784e4449304c5451354d6d59744f57553259793032596a63304f4467794f4759775a5751764d544d775a47593259544574596d59785a4330304f44646d4c574a6d4f4441744d474e6a4d6d51785a54566a4e6a4d334969776961574630496a6f784e7a41344d546b324d4445794c434a6c654841694f6a45334d4467794f4449304d544a392e485566784a67646b6f365761364153356841766c64474b7762386d6c5674445170527330714c4539715673" style="border:0;display:block;outline:none;text-decoration:none;height:auto;width:100%;font-size:13px;" width="120" /> </td> </tr> </tbody> diff --git a/apps/comms/email-templates/welcome/email.mjml b/apps/comms/email-templates/welcome/email.mjml index 9b1739f1f..06e1f11da 100644 --- a/apps/comms/email-templates/welcome/email.mjml +++ b/apps/comms/email-templates/welcome/email.mjml @@ -1,9 +1,11 @@ <!-- vim: set ft=html: --> +<!-- DO NOT EDIT: copy this file, and edit in MJML online editor @ https://mjml.io/try-it-live --> <mjml> <mj-body background-color="#f7f7f7"> <mj-section padding="20px 0"> <mj-column width="100%"> - <mj-image align="left" width="100px" src="https://ik.imagekit.io/kloudlite/logo-scalable_c56EcJLdd.png?ik-sdk-version=javascript-1.4.3&updatedAt=1651786453856"></mj-image> + <!-- image-ref: https://github.com/kloudlite/oss/issues/37 --> + <mj-image align="left" width="120px" src="https://camo.githubusercontent.com/c4a6852ff03b8113b8196046536c6c1235c8ca03fb8ee68ba09c28033d07651e/68747470733a2f2f75706c6f6164732e6c696e6561722e6170702f38636434353562632d326237622d346664662d383964302d3334316138353134396563332f32356331653933622d313432342d343932662d396536632d3662373438383238663065642f31333064663661312d626631642d343837662d626638302d3063633264316535633633373f7369676e61747572653d65794a68624763694f694a49557a49314e694973496e523563434936496b705856434a392e65794a775958526f496a6f694c7a686a5a4451314e574a6a4c544a694e3249744e475a6b5a6930344f5751774c544d304d5745344e5445304f57566a4d7938794e574d785a546b7a596930784e4449304c5451354d6d59744f57553259793032596a63304f4467794f4759775a5751764d544d775a47593259544574596d59785a4330304f44646d4c574a6d4f4441744d474e6a4d6d51785a54566a4e6a4d334969776961574630496a6f784e7a41344d546b324d4445794c434a6c654841694f6a45334d4467794f4449304d544a392e485566784a67646b6f365761364153356841766c64474b7762386d6c5674445170527330714c4539715673"></mj-image> </mj-column> </mj-section> <mj-section padding="20px 0"> diff --git a/apps/console/.dockerignore b/apps/console/.dockerignore index b30fec26f..d23381b64 100644 --- a/apps/console/.dockerignore +++ b/apps/console/.dockerignore @@ -1,3 +1,2 @@ ** -!main.go -!internal +!bin diff --git a/apps/console/Containerfile.local b/apps/console/Containerfile similarity index 57% rename from apps/console/Containerfile.local rename to apps/console/Containerfile index f989f68fd..fd35b0c8e 100644 --- a/apps/console/Containerfile.local +++ b/apps/console/Containerfile @@ -1,6 +1,5 @@ #syntax=docker/dockerfile:1 FROM gcr.io/distroless/static-debian11:nonroot -WORKDIR /app -ARG APP -COPY --from=local-builder --chown=1001 $APP ./console +ARG BINARY +COPY --chown=1001 ./bin/$BINARY ./console ENTRYPOINT ["./console"] diff --git a/apps/console/Dockerfile b/apps/console/Dockerfile deleted file mode 100644 index f9e277e55..000000000 --- a/apps/console/Dockerfile +++ /dev/null @@ -1,22 +0,0 @@ -# syntax=docker/dockerfile:1.4 -FROM golang:1.18.3-alpine3.16 AS base -USER 1001 -ENV GOPATH=/tmp/go -ENV GOCACHE=/tmp/go-cache -WORKDIR /tmp/app -COPY --chown=1001 --from=project-root ./go.mod ./go.sum ./tools.go ./ -RUN go mod download -x -COPY --chown=1001 --from=project-root common ./common -COPY --chown=1001 --from=project-root grpc-interfaces ./grpc-interfaces -COPY --chown=1001 --from=project-root pkg ./pkg -ARG APP -RUN mkdir -p ./apps/$APP -WORKDIR /tmp/app/apps/$APP -COPY --chown=1001 ./ ./ -RUN CGO_ENABLED=0 go build -o /tmp/bin/$APP ./main.go -RUN chmod +x /tmp/bin/$APP - -FROM gcr.io/distroless/static-debian11:nonroot -ARG APP -COPY --from=base --chown=1001 /tmp/bin/$APP ./console -CMD ["./console"] diff --git a/apps/console/Taskfile.yml b/apps/console/Taskfile.yml index c2c668b7c..81ce07b47 100644 --- a/apps/console/Taskfile.yml +++ b/apps/console/Taskfile.yml @@ -1,10 +1,10 @@ version: "3" -dotenv: - - .secrets/env - vars: - ImagePrefix: "ghcr.io/kloudlite/api" + app: console + +includes: + go: ../../.tools/taskfiles/go-build.yml tasks: gql: @@ -13,23 +13,6 @@ tasks: - go run github.com/99designs/gqlgen generate - gofmt -w -d -r '"errors" -> "github.com/kloudlite/api/pkg/errors"' graph/*.resolvers.go - - build: - env: - CGO_ENABLED: 0 - GOOS: linux - GOARCH: amd64 - vars: - BuiltAt: - sh: date | sed 's/\s/_/g' - preconditions: - - sh: '[ -n "{{.Out}}" ]' - msg: var Out must have a value - cmds: - - go generate ./internal/entities/field-constants/ - - go build -ldflags="-s -w -X github.com/kloudlite/api/common.BuiltAt=\"{{.BuiltAt}}\"" -o {{.Out}} - - upx {{.Out}} - k8s-schema: cmds: - mkdir -p "./internal/app/_struct-to-graphql" @@ -60,40 +43,25 @@ tasks: popd - rm -rf ./internal/app/_struct-to-graphql - docker-build: - vars: - APP: console - IMAGE: "{{.ImagePrefix}}/{{.APP}}:{{.Tag}}" - preconditions: - - sh: '[[ -n "{{.Tag}}" ]]' - msg: 'var Tag must have a value' - cmds: - - docker buildx build -f ./Dockerfile -t {{.IMAGE}} . --build-arg APP={{.APP}} --platform linux/amd64 --build-context project-root=../.. - - docker push {{.IMAGE}} - - local-build: - vars: - APP: console - IMAGE: "{{.ImagePrefix}}/{{.APP}}:{{.Tag}}" - preconditions: - - sh: '[[ -n "{{.Tag}}" ]]' - msg: 'var Tag must have a value' - silent: true - cmds: - - |+ - tdir=$(mktemp -d) - task build Out=$tdir/{{.APP}} - - podman buildx build -f ./Containerfile.local -t {{.IMAGE}} . --build-context local-builder=${tdir} --build-arg APP="{{.APP}}" - podman push {{.IMAGE}} - rm -rf $tdir - run: - vars: - Name: console dotenv: - .secrets/env env: CGO_ENABLED: 0 cmds: - go run ./main.go --dev + + build: + cmds: + - task: go:build + vars: + Out: ./bin/{{.app}} + + container:build-and-push: + preconditions: + - sh: '[[ -n "{{.Image}}" ]]' + msg: "var Image must have a value, of format 'image_repository:image_tag'" + cmds: + - task: build + - docker buildx build -f ./Containerfile -t {{.Image}} . --build-arg BINARY={{.app}} --push + diff --git a/apps/container-registry/.dockerignore b/apps/container-registry/.dockerignore index c33b5ad2b..d23381b64 100644 --- a/apps/container-registry/.dockerignore +++ b/apps/container-registry/.dockerignore @@ -1,4 +1,2 @@ ** -!main.go -!internal -!templates +!bin diff --git a/apps/container-registry/Containerfile b/apps/container-registry/Containerfile new file mode 100644 index 000000000..159536c02 --- /dev/null +++ b/apps/container-registry/Containerfile @@ -0,0 +1,4 @@ +FROM gcr.io/distroless/static-debian12:nonroot +ARG BINARY +COPY ./bin/${BINARY} ./container-registry +ENTRYPOINT ["./container-registry"] diff --git a/apps/container-registry/Containerfile.local b/apps/container-registry/Containerfile.local deleted file mode 100644 index 95e620786..000000000 --- a/apps/container-registry/Containerfile.local +++ /dev/null @@ -1,5 +0,0 @@ -FROM gcr.io/distroless/static-debian12:nonroot -ARG binpath -COPY --from=local-builder ${binpath} /container-registry -COPY templates /templates -CMD ["/container-registry"] diff --git a/apps/container-registry/Dockerfile b/apps/container-registry/Dockerfile deleted file mode 100644 index 90ecb5ac7..000000000 --- a/apps/container-registry/Dockerfile +++ /dev/null @@ -1,23 +0,0 @@ -# syntax=docker/dockerfile:1.4 -FROM golang:1.18.3-alpine3.16 AS base -USER 1001 -ENV GOPATH=/tmp/go -ENV GOCACHE=/tmp/go-cache -WORKDIR /tmp/app -COPY --chown=1001 --from=project-root ./go.mod ./go.sum ./tools.go ./ -RUN go mod download -x -COPY --chown=1001 --from=project-root common ./common -COPY --chown=1001 --from=project-root grpc-interfaces ./grpc-interfaces -COPY --chown=1001 --from=project-root pkg ./pkg -ARG APP -RUN mkdir -p ./apps/$APP -WORKDIR /tmp/app/apps/$APP -COPY --chown=1001 ./ ./ -RUN CGO_ENABLED=0 go build -tags musl -o /tmp/bin/$APP ./main.go -RUN chmod +x /tmp/bin/$APP - -FROM gcr.io/distroless/static-debian11 -ARG APP -COPY --from=base --chown=1001 /tmp/bin/$APP /container-registry -COPY templates /templates -CMD ["/container-registry"] diff --git a/apps/container-registry/Taskfile.yml b/apps/container-registry/Taskfile.yml index 5e97bdea2..78f713a25 100644 --- a/apps/container-registry/Taskfile.yml +++ b/apps/container-registry/Taskfile.yml @@ -1,10 +1,10 @@ version: "3" -dotenv: - - .secrets/env - vars: - ImagePrefix: "ghcr.io/kloudlite/platform/apis" + app: container-registry + +includes: + go: ../../.tools/taskfiles/go-build.yml tasks: gql: @@ -13,21 +13,6 @@ tasks: - go run -tags dynamic github.com/99designs/gqlgen generate - gofmt -w -d -r '"errors" -> "github.com/kloudlite/api/pkg/errors"' graph/*.resolvers.go - build: - env: - CGO_ENABLED: 0 - GOOS: linux - GOARCH: amd64 - vars: - BuiltAt: - sh: date | sed 's/\s/_/g' - preconditions: - - sh: '[ -n "{{.Out}}" ]' - msg: var Out must have a value - cmds: - - go build -v -ldflags="-s -w -X github.com/kloudlite/api/common.BuiltAt=\"{{.BuiltAt}}\"" -o {{.Out}} - - upx {{.Out}} - k8s-schema: cmds: - mkdir -p "./internal/app/_struct-to-graphql" @@ -54,47 +39,25 @@ tasks: popd - rm -rf ./internal/app/_struct-to-graphql - docker-build: - vars: - APP: container-registry - IMAGE: registry.kloudlite.io/kloudlite/{{.EnvName}}/{{.APP}}-api:{{.Tag}} - preconditions: - - sh: '[[ -n "{{.Tag}}" ]]' - msg: 'var Tag must have a value' - - - sh: '[[ "{{.EnvName}}" == "development" ]] || [[ "{{.EnvName}}" == "staging" ]] || [[ "{{.EnvName}}" == "production" ]]' - msg: 'var EnvName must have one of [development, staging, production] as its value' - cmds: - - docker buildx build -f ./Dockerfile -t {{.IMAGE}} . --build-arg APP={{.APP}} --platform linux/amd64 --build-context project-root=../.. - - docker push {{.IMAGE}} - - - local-build: - preconditions: - - sh: '[ -n "{{.Tag}}" ]' - msg: 'var Tag must have a value' - vars: - APP: container-registry - IMAGE: "{{.ImagePrefix}}/{{.APP}}:{{.Tag}}" - BUILDER: podman - silent: true - cmds: - - |+ - tDir=$(mktemp -d) - - echo "building application ..." - task build Out=$tDir/{{.APP}} - - {{.BUILDER}} buildx build -f Containerfile.local -t {{.IMAGE}} . --build-context local-builder=${tDir} --build-arg binpath={{.APP}} - {{.BUILDER}} push {{.IMAGE}} - rm -rf $tDir - run: - vars: - Name: console dotenv: - .secrets/env env: CGO_ENABLED: 0 cmds: - go run ./main.go --dev + + build: + cmds: + - task: go:build + vars: + Out: ./bin/{{.app}} + + container:build-and-push: + preconditions: + - sh: '[[ -n "{{.Image}}" ]]' + msg: "var Image must have a value, of format 'image_repository:image_tag'" + cmds: + - task: build + - docker buildx build -f ./Containerfile -t {{.Image}} . --build-arg BINARY={{.app}} --push + diff --git a/apps/gateway/Dockerfile b/apps/gateway/Containerfile similarity index 100% rename from apps/gateway/Dockerfile rename to apps/gateway/Containerfile diff --git a/apps/gateway/Taskfile.yml b/apps/gateway/Taskfile.yml index 4e6d678e3..531927b91 100644 --- a/apps/gateway/Taskfile.yml +++ b/apps/gateway/Taskfile.yml @@ -1,23 +1,21 @@ version: 3 -dotenv: -- "./.secrets/env" - vars: - ImagePrefix: ghcr.io/kloudlite/platform/apis + app: gateway tasks: dev: + dotenv: + - "./.secrets/env" interactive: true cmds: - npm start - docker-build: - vars: - Image: "{{.ImagePrefix}}/gateway:{{.Tag}}" + + container:build-and-push: preconditions: - - sh: test -n '{{.Tag}}' - msg: 'var Tag must be defined' + - sh: '[[ -n "{{.Image}}" ]]' + msg: "var Image must have a value, of format 'image_repository:image_tag'" cmds: - - podman build . -t {{.Image}} - - podman push {{.Image}} + - docker buildx build -f ./Containerfile -t {{.Image}} . --push + diff --git a/apps/iam/.dockerignore b/apps/iam/.dockerignore new file mode 100644 index 000000000..d23381b64 --- /dev/null +++ b/apps/iam/.dockerignore @@ -0,0 +1,2 @@ +** +!bin diff --git a/apps/iam/Containerfile.local b/apps/iam/Containerfile similarity index 59% rename from apps/iam/Containerfile.local rename to apps/iam/Containerfile index 5b9fcdec2..8dd8b0e5e 100644 --- a/apps/iam/Containerfile.local +++ b/apps/iam/Containerfile @@ -1,6 +1,5 @@ # syntax=docker/dockerfile:1 FROM gcr.io/distroless/static-debian11:nonroot -WORKDIR /app -ARG APP -COPY --from=builder --chown=1001 $APP ./iam +ARG BINARY +COPY --chown=1001 ./bin/$BINARY ./iam ENTRYPOINT ["./iam"] diff --git a/apps/iam/Taskfile.yml b/apps/iam/Taskfile.yml index 2df616a24..c2f9e4fd4 100644 --- a/apps/iam/Taskfile.yml +++ b/apps/iam/Taskfile.yml @@ -1,55 +1,36 @@ version: 3 -dotenv: - - .secrets/.env - includes: grpc: taskfile: ../../grpc-interfaces/Taskfile.yml dir: ../../grpc-interfaces/ + go: ../../.tools/taskfiles/go-build.yml vars: - ImagePrefix: "ghcr.io/kloudlite/api" + app: iam tasks: proto: cmds: - task: grpc:build - build: - env: - CGO_ENABLED: 0 - GOOS: linux - GOARCH: amd64 - vars: - BuiltAt: - sh: date | sed 's/\s/_/g' - preconditions: - - sh: '[ -n "{{.Out}}" ]' - msg: var Out must have a value - cmds: - - go build -ldflags="-s -w -X kloudlite.io/common.BuiltAt=\"{{.BuiltAt}}\"" -o {{.Out}} - - upx {{.Out}} - run: dotenv: - .secrets/env cmds: - go run ./main.go - local-build: - vars: - APP: iam - IMAGE: "{{.ImagePrefix}}/{{.APP}}:{{.Tag}}" + build: + cmds: + - task: go:build + vars: + Out: ./bin/{{.app}} + + container:build-and-push: preconditions: - - sh: '[[ -n "{{.Tag}}" ]]' - msg: 'var Tag must have a value' - silent: true + - sh: '[[ -n "{{.Image}}" ]]' + msg: "var Image must have a value, of format 'image_repository:image_tag'" cmds: - - |+ - tdir=$(mktemp -d) - task build Out=$tdir/{{.APP}} + - task: build + - docker buildx build -f ./Containerfile -t {{.Image}} . --build-arg BINARY={{.app}} --push - podman buildx build -f ./Containerfile.local -t {{.IMAGE}} . --build-context builder=${tdir} --build-arg APP="{{.APP}}" - podman push {{.IMAGE}} - rm -rf $tdir diff --git a/apps/infra/.dockerignore b/apps/infra/.dockerignore index b30fec26f..d23381b64 100644 --- a/apps/infra/.dockerignore +++ b/apps/infra/.dockerignore @@ -1,3 +1,2 @@ ** -!main.go -!internal +!bin diff --git a/apps/infra/Containerfile.local b/apps/infra/Containerfile similarity index 59% rename from apps/infra/Containerfile.local rename to apps/infra/Containerfile index 67ad05bb3..99ccca23a 100644 --- a/apps/infra/Containerfile.local +++ b/apps/infra/Containerfile @@ -1,6 +1,5 @@ #syntax=docker/dockerfile:1 FROM gcr.io/distroless/static-debian11:nonroot -WORKDIR /app -ARG APP -COPY --from=builder --chown=1001 $APP ./infra +ARG BINARY +COPY --chown=1001 ./bin/${BINARY} ./infra ENTRYPOINT ["./infra"] diff --git a/apps/infra/Dockerfile b/apps/infra/Dockerfile deleted file mode 100644 index 555bd1798..000000000 --- a/apps/infra/Dockerfile +++ /dev/null @@ -1,23 +0,0 @@ -# syntax=docker/dockerfile:1.4 -FROM golang:1.18.3-alpine3.16 AS base -USER 1001 -ENV GOPATH=/tmp/go -ENV GOCACHE=/tmp/go-cache -WORKDIR /tmp/app -COPY --chown=1001 --from=project-root ./go.mod ./go.sum ./tools.go ./ -RUN go mod download -x -COPY --chown=1001 --from=project-root common ./common -COPY --chown=1001 --from=project-root grpc-interfaces ./grpc-interfaces -COPY --chown=1001 --from=project-root pkg ./pkg -ARG APP -RUN mkdir -p ./apps/$APP -WORKDIR /tmp/app/apps/$APP -COPY --chown=1001 ./ ./ -RUN CGO_ENABLED=0 go build -tags musl -o /tmp/bin/$APP ./main.go -RUN chmod +x /tmp/bin/$APP - -FROM gcr.io/distroless/static-debian11:nonroot -LABEL org.opencontainers.image.source=https://github.com/kloudlite/api -ARG APP -COPY --from=base /tmp/bin/${APP} ./infra -CMD ["./infra"] diff --git a/apps/infra/Taskfile.yml b/apps/infra/Taskfile.yml index 7e6be6c01..e082db48d 100644 --- a/apps/infra/Taskfile.yml +++ b/apps/infra/Taskfile.yml @@ -1,10 +1,10 @@ version: "3" -dotenv: - - .secrets/env - vars: - ImagePrefix: "ghcr.io/kloudlite/api" + app: infra + +includes: + go: ../../.tools/taskfiles/go-build.yml tasks: gql: @@ -13,21 +13,6 @@ tasks: - go run github.com/99designs/gqlgen generate - gofmt -w -d -r '"errors" -> "github.com/kloudlite/api/pkg/errors"' graph/*.resolvers.go - build: - env: - CGO_ENABLED: 0 - GOOS: linux - GOARCH: amd64 - vars: - BuiltAt: - sh: date | sed 's/\s/_/g' - preconditions: - - sh: '[ -n "{{.Out}}" ]' - msg: var Out must have a value - cmds: - - go build -ldflags="-s -w -X github.com/kloudlite/api/common.BuiltAt=\"{{.BuiltAt}}\"" -o {{.Out}} - - upx {{.Out}} - k8s-schema: cmds: - mkdir -p "./internal/app/_struct-to-graphql" @@ -54,37 +39,25 @@ tasks: - rm -rf ./internal/app/_struct-to-graphql run: + dotenv: + - .secrets/env cmds: - go run main.go --dev # - go build -o bin/infra . && ./bin/infra --dev - docker-build: - vars: - APP: infra - IMAGE: registry.kloudlite.io/kloudlite/{{.EnvName}}/{{.APP}}:{{.Tag}} - preconditions: - - sh: '[[ -n "{{.Tag}}" ]]' - msg: 'var Tag must have a value' - cmds: - - docker buildx build -f ./Dockerfile -t {{.IMAGE}} . --build-arg APP={{.APP}} --platform linux/amd64 --build-context project-root=../.. - - docker push {{.IMAGE}} + build: + cmds: + - task: go:build + vars: + Out: ./bin/{{.app}} - local-build: + container:build-and-push: preconditions: - - sh: '[ -n "{{.Tag}}" ]' - msg: 'var Tag must have a value' - vars: - APP: infra - IMAGE: "{{.ImagePrefix}}/{{.APP}}:{{.Tag}}" - silent: true + - sh: '[[ -n "{{.Image}}" ]]' + msg: "var Image must have a value, of format 'image_repository:image_tag'" cmds: - - |+ - tdir=$(mktemp -d) - task build Out=$tdir/{{.APP}} - - podman buildx build -f ./Containerfile.local -t {{.IMAGE}} . --build-context builder=${tdir} --build-arg APP="{{.APP}}" - podman push {{.IMAGE}} - rm -rf $tdir + - task: build + - docker buildx build -f ./Containerfile -t {{.Image}} . --build-arg BINARY={{.app}} --push test: cmds: diff --git a/apps/message-office/.dockerignore b/apps/message-office/.dockerignore new file mode 100644 index 000000000..d23381b64 --- /dev/null +++ b/apps/message-office/.dockerignore @@ -0,0 +1,2 @@ +** +!bin diff --git a/apps/message-office/Containerfile b/apps/message-office/Containerfile new file mode 100644 index 000000000..bf12a9b7c --- /dev/null +++ b/apps/message-office/Containerfile @@ -0,0 +1,5 @@ +# syntax=docker/dockerfile:1.4 +FROM gcr.io/distroless/static-debian11:nonroot +ARG BINARY +COPY --chown=1001 $BINARY ./message-office +ENTRYPOINT ["./message-office"] diff --git a/apps/message-office/Containerfile.local b/apps/message-office/Containerfile.local deleted file mode 100644 index 139e421fc..000000000 --- a/apps/message-office/Containerfile.local +++ /dev/null @@ -1,6 +0,0 @@ -# syntax=docker/dockerfile:1.4 -FROM scratch -WORKDIR /app -ARG binpath -COPY --from=local-builder --chown=1001 $binpath ./message-office -ENTRYPOINT ["./message-office"] diff --git a/apps/message-office/Dockerfile b/apps/message-office/Dockerfile deleted file mode 100644 index 2537f0aca..000000000 --- a/apps/message-office/Dockerfile +++ /dev/null @@ -1,22 +0,0 @@ -# syntax=docker/dockerfile:1.4 -FROM golang:1.18.3-alpine3.16 AS base -USER 1001 -ENV GOPATH=/tmp/go -ENV GOCACHE=/tmp/go-cache -WORKDIR /tmp/app -COPY --chown=1001 --from=project-root ./go.mod ./go.sum ./tools.go ./ -RUN go mod download -x -COPY --chown=1001 --from=project-root common ./common -COPY --chown=1001 --from=project-root grpc-interfaces ./grpc-interfaces -COPY --chown=1001 --from=project-root pkg ./pkg -ARG APP -RUN mkdir -p ./apps/$APP -WORKDIR /tmp/app/apps/$APP -COPY --chown=1001 ./ ./ -RUN CGO_ENABLED=0 go build -tags musl -o /tmp/bin/$APP ./main.go -RUN chmod +x /tmp/bin/$APP - -FROM gcr.io/distroless/static-debian11:nonroot -ARG APP -COPY --from=base --chown=1001 /tmp/bin/$APP ./message-office -CMD ["./message-office"] diff --git a/apps/message-office/Taskfile.yml b/apps/message-office/Taskfile.yml index 09c55a45e..906fa47c2 100644 --- a/apps/message-office/Taskfile.yml +++ b/apps/message-office/Taskfile.yml @@ -1,7 +1,10 @@ version: 3 vars: - ImagePrefix: "ghcr.io/kloudlite/api" + app: message-office + +includes: + go: ../../.tools/taskfiles/go-build.yml tasks: run: @@ -14,42 +17,22 @@ tasks: cmds: - protoc --go_out=. --go-grpc_out=. --go_opt=paths=import --go-grpc_opt=paths=import ./internal/app/proto/*.proto - - build: - env: - CGO_ENABLED: 0 - GOOS: linux - GOARCH: amd64 - vars: - BuiltAt: - sh: date | sed 's/\s/_/g' - preconditions: - - sh: '[ -n "{{.Out}}" ]' - msg: var Out must have a value - cmds: - - go build -ldflags="-s -w -X 'kloudlite.io/common.BuiltAt={{.BuiltAt}}'" -o {{.Out}} - - upx {{.Out}} - gql: dir: internal/app cmds: - go run github.com/99designs/gqlgen generate - local-build: + build: + cmds: + - task: go:build + vars: + Out: ./bin/{{.app}} + + container:build-and-push: preconditions: - - sh: '[ -n "{{.Tag}}" ]' - msg: 'var Tag must have a value' - vars: - APP: message-office - IMAGE: "{{.ImagePrefix}}/{{.APP}}:{{.Tag}}" - silent: true + - sh: '[[ -n "{{.Image}}" ]]' + msg: "var Image must have a value, of format 'image_repository:image_tag'" cmds: - - |+ - tDir=$(mktemp -d) - binpath="{{.APP}}" - task build Out=$tDir/$binpath - - echo "[#] building container image" - podman buildx build -f ./Containerfile.local -t {{.IMAGE}} . --build-arg binpath="$binpath" --build-context local-builder=${tDir} - echo "[#] pushing container image" - podman push {{.IMAGE}} + - task: build + - docker buildx build -f ./Containerfile -t {{.Image}} . --build-arg BINARY={{.app}} --push + diff --git a/apps/tenant-agent/.dockerignore b/apps/tenant-agent/.dockerignore index bebf98b4b..d23381b64 100644 --- a/apps/tenant-agent/.dockerignore +++ b/apps/tenant-agent/.dockerignore @@ -1,4 +1,2 @@ ** -!internal -!main.go -!types +!bin diff --git a/apps/tenant-agent/Containerfile.local b/apps/tenant-agent/Containerfile similarity index 56% rename from apps/tenant-agent/Containerfile.local rename to apps/tenant-agent/Containerfile index aed8da8e5..af0a61714 100644 --- a/apps/tenant-agent/Containerfile.local +++ b/apps/tenant-agent/Containerfile @@ -1,6 +1,5 @@ # syntax=docker/dockerfile:1.4 FROM gcr.io/distroless/static:nonroot -WORKDIR /app -ARG binpath -COPY --from=local-builder ${binpath} ./kloudlite-agent +ARG BINARY +COPY ./bin/${BINARY} ./kloudlite-agent ENTRYPOINT ["./kloudlite-agent"] diff --git a/apps/tenant-agent/Taskfile.yml b/apps/tenant-agent/Taskfile.yml index 8a1862e15..98165d2b4 100644 --- a/apps/tenant-agent/Taskfile.yml +++ b/apps/tenant-agent/Taskfile.yml @@ -1,48 +1,33 @@ version: 3 +vars: + app: tenant-agent + +includes: + go: ../../.tools/taskfiles/go-build.yml + tasks: vector:proto: cmds: - protoc --go_out=. --go-grpc_out=. --go_opt=paths=import --go-grpc_opt=paths=import ./internal/proto/*.proto - build: - env: - GOOS: linux - GOARCH: amd64 - CGO_ENABLED: 0 - vars: - BuiltAt: - sh: date | sed 's/\s/_/g' - - preconditions: - - sh: '[ -n "{{.Out}}" ]' - msg: var Out must have a value - cmds: - - go build -ldflags="-s -w -X 'github.com/kloudlite/api/common.BuiltAt={{.BuiltAt}}'" -o {{.Out}} - run: dotenv: - .secrets/env cmds: - go run . --dev - local-build: + build: + cmds: + - task: go:build + vars: + Out: ./bin/{{.app}} + + container:build-and-push: preconditions: - - sh: '[ -n "{{.Tag}}" ]' - msg: 'var Tag must have a value' - vars: - Name: tenant-agent - Image: ghcr.io/kloudlite/api/{{.Name}}:{{.Tag}} - env: - CGO_ENABLED: 0 - GOOS: linux - GOARCH: amd64 - silent: true + - sh: '[[ -n "{{.Image}}" ]]' + msg: "var Image must have a value, of format 'image_repository:image_tag'" cmds: - - |+ - task build Out=bin/{{.Name}} - echo "[#] building container image {{.Image}}" - podman buildx build -f ./Containerfile.local --build-context local-builder=bin --build-arg binpath=./{{.Name}} -t {{.Image}} . - echo "[#] pushing container image {{.Image}}" - podman push {{.Image}} + - task: build + - docker buildx build -f ./Containerfile -t {{.Image}} . --build-arg BINARY={{.app}} --push diff --git a/apps/webhook/.dockerignore b/apps/webhook/.dockerignore index b30fec26f..d23381b64 100644 --- a/apps/webhook/.dockerignore +++ b/apps/webhook/.dockerignore @@ -1,3 +1,2 @@ ** -!main.go -!internal +!bin diff --git a/apps/webhook/Containerfile b/apps/webhook/Containerfile new file mode 100644 index 000000000..449115d4b --- /dev/null +++ b/apps/webhook/Containerfile @@ -0,0 +1,5 @@ +#syntax=docker/dockerfile:1 +FROM gcr.io/distroless/static-debian11:nonroot +ARG BINARY +COPY --chown=1001 ./bin/$BINARY ./webhook +ENTRYPOINT ["./webhook"] diff --git a/apps/webhook/Dockerfile b/apps/webhook/Dockerfile deleted file mode 100644 index 8d38cb2a4..000000000 --- a/apps/webhook/Dockerfile +++ /dev/null @@ -1,22 +0,0 @@ -# syntax=docker/dockerfile:1.4 -FROM golang:1.18.3-alpine3.16 AS base -USER 1001 -ENV GOPATH=/tmp/go -ENV GOCACHE=/tmp/go-cache -WORKDIR /tmp/app -COPY --chown=1001 --from=project-root ./go.mod ./go.sum ./tools.go ./ -RUN go mod download -x -COPY --chown=1001 --from=project-root common ./common -COPY --chown=1001 --from=project-root grpc-interfaces ./grpc-interfaces -COPY --chown=1001 --from=project-root pkg ./pkg -ARG APP -RUN mkdir -p ./apps/$APP -WORKDIR /tmp/app/apps/$APP -COPY --chown=1001 ./ ./ -RUN CGO_ENABLED=0 go build -tags musl -o /tmp/bin/$APP ./main.go -RUN chmod +x /tmp/bin/$APP - -FROM gcr.io/distroless/static-debian11 -ARG APP -COPY --from=base --chown=1001 /tmp/bin/$APP /webhook -CMD ["/webhook"] diff --git a/apps/webhook/Taskfile.yml b/apps/webhook/Taskfile.yml index 708068697..38c46d5f9 100644 --- a/apps/webhook/Taskfile.yml +++ b/apps/webhook/Taskfile.yml @@ -1,83 +1,31 @@ version: "3" -dotenv: - - .secrets/env - vars: - ImagePrefix: "ghcr.io/kloudlite/platform/apis" + app: webhook + +includes: + go: ../../.tools/taskfiles/go-build.yml tasks: - gql: - dir: ./internal/app + run: + dotenv: + - .secrets/env cmds: - - go run -tags dynamic github.com/99designs/gqlgen generate - # - rm "./graph/scalars.resolvers.go" + - task: build + # - dlv exec -l 127.0.0.1:31117 --headless /tmp/webhook -- --dev + - ./bin/{{.app}} --dev build: - env: - CGO_ENABLED: 0 - GOOS: linux - GOARCH: amd64 - preconditions: - - sh: '[ -n "{{.Out}}" ]' - msg: var Out must have a value - cmds: - - go build -ldflags="-s -w" -o {{.Out}} - - upx {{.Out}} - - docker-build: - vars: - APP: webhook - IMAGE: registry.kloudlite.io/kloudlite/{{.EnvName}}/{{.APP}}-api:{{.Tag}} - preconditions: - - sh: '[[ -n "{{.Tag}}" ]]' - msg: 'var Tag must have a value' - - - sh: '[[ "{{.EnvName}}" == "development" ]] || [[ "{{.EnvName}}" == "staging" ]] || [[ "{{.EnvName}}" == "production" ]]' - msg: 'var EnvName must have one of [development, staging, production] as its value' cmds: - - docker buildx build -f ./Dockerfile -t {{.IMAGE}} . --build-arg APP={{.APP}} --platform linux/amd64 --build-context project-root=../.. - - docker push {{.IMAGE}} - + - task: go:build + vars: + Out: ./bin/{{.app}} - local-build: + container:build-and-push: preconditions: - - sh: '[ -n "{{.Tag}}" ]' - msg: 'var Tag must have a value' - vars: - APP: webhook - IMAGE: "{{.ImagePrefix}}/{{.APP}}:{{.Tag}}" - silent: true + - sh: '[[ -n "{{.Image}}" ]]' + msg: "var Image must have a value, of format 'image_repository:image_tag'" cmds: - - |+ - lineNumbers=$(cat Dockerfile | grep -i '^FROM' -n | tail +2 | awk -F: '{print $1}') + - task: build + - docker buildx build -f ./Containerfile -t {{.Image}} . --build-arg BINARY={{.app}} --push - startLineNo=$(echo "$lineNumbers" | head -n+1) - finalLineNo=$(echo "$lineNumbers" | tail -1) - - tDir=$(mktemp -d) - - nDockerfile=$(cat Dockerfile | tail --lines=+$startLineNo | grep -i --invert-match 'from=base') - echo "$nDockerfile" | sed "1 i # syntax=docker/dockerfile:1.4" > $tDir/Dockerfile.base - - cat $tDir/Dockerfile.base | sed "4 i COPY --from=local-builder ./{{.APP}} /{{.APP}}" > $tDir/Dockerfile - cat $tDir/Dockerfile - echo "building application ..." - - task build Out=$tDir/{{.APP}} - - docker buildx build -f $tDir/Dockerfile -t {{.IMAGE}} . --build-context local-builder=${tDir} - docker push {{.IMAGE}} - rm -rf $tDir - - run: - vars: - Name: webhook - dotenv: - - .secrets/env - env: - CGO_ENABLED: 0 - cmds: - - go build -o /tmp/{{.Name}} ./main.go - # - dlv exec -l 127.0.0.1:31117 --headless /tmp/webhook -- --dev - - /tmp/{{.Name}} --dev diff --git a/apps/websocket-server/.dockerignore b/apps/websocket-server/.dockerignore new file mode 100644 index 000000000..d23381b64 --- /dev/null +++ b/apps/websocket-server/.dockerignore @@ -0,0 +1,2 @@ +** +!bin diff --git a/apps/websocket-server/Containerfile b/apps/websocket-server/Containerfile new file mode 100644 index 000000000..238f6688d --- /dev/null +++ b/apps/websocket-server/Containerfile @@ -0,0 +1,5 @@ +# syntax=docker/dockerfile:1.4 +FROM gcr.io/distroless/static:nonroot +ARG BINARY +COPY ./bin/$BINARY ./websocket-server +ENTRYPOINT [ "./websocket-server" ] diff --git a/apps/websocket-server/Containerfile.local b/apps/websocket-server/Containerfile.local deleted file mode 100644 index 07e5e5250..000000000 --- a/apps/websocket-server/Containerfile.local +++ /dev/null @@ -1,7 +0,0 @@ -# syntax=docker/dockerfile:1.4 -FROM gcr.io/distroless/static:nonroot -WORKDIR /tmp -USER 1001:1001 -ARG APP -COPY --from=builder $APP ./websocket-server -CMD ["./websocket-server"] diff --git a/apps/websocket-server/Taskfile.yml b/apps/websocket-server/Taskfile.yml index 5fe7a3b0b..2ecdbd9b0 100644 --- a/apps/websocket-server/Taskfile.yml +++ b/apps/websocket-server/Taskfile.yml @@ -1,61 +1,29 @@ version: "3" -dotenv: - - .secrets/env - vars: - ImagePrefix: "ghcr.io/kloudlite/api" + app: websocket-server -tasks: - build: - env: - CGO_ENABLED: 0 - GOOS: linux - GOARCH: amd64 - vars: - BuiltAt: - sh: date | sed 's/\s/_/g' - preconditions: - - sh: '[ -n "{{.Out}}" ]' - msg: var Out must have a value - cmds: - - go build -ldflags="-s -w -X kloudlite.io/common.BuiltAt=\"{{.BuiltAt}}\"" -o {{.Out}} - - upx {{.Out}} +includes: + go: ../../.tools/taskfiles/go-build.yml +tasks: run: dotenv: - .secrets/env cmds: - go run main.go --dev - docker-build: - vars: - APP: finance - IMAGE: registry.kloudlite.io/kloudlite/{{.EnvName}}/{{.APP}}-api:{{.Tag}} - preconditions: - - sh: '[[ -n "{{.Tag}}" ]]' - msg: 'var Tag must have a value' - - - sh: '[[ "{{.EnvName}}" == "development" ]] || [[ "{{.EnvName}}" == "staging" ]] || [[ "{{.EnvName}}" == "production" ]]' - msg: 'var EnvName must have one of [development, staging, production] as its value' + build: cmds: - - docker buildx build -f ./Dockerfile -t {{.IMAGE}} . --build-arg APP={{.APP}} --platform linux/amd64 --build-context project-root=../.. - - docker push {{.IMAGE}} + - task: go:build + vars: + Out: ./bin/{{.app}} - local-build: + container:build-and-push: preconditions: - - sh: '[ -n "{{.Tag}}" ]' - msg: 'var Tag must have a value' - vars: - Dockerfile: "./Containerfile.local" - APP: websocket-server - Image: "{{.ImagePrefix}}/{{.APP}}:{{.Tag}}" + - sh: '[[ -n "{{.Image}}" ]]' + msg: "var Image must have a value, of format 'image_repository:image_tag'" cmds: - - |+ - dir=$(mktemp -d) - task build Out=$dir/{{.APP}} - - podman buildx build -t {{.Image}} -f {{.Dockerfile}} . --build-context builder=$dir --build-arg APP={{.APP}} - podman push {{.Image}} - rm -rf $dir + - task: build + - docker buildx build -f ./Containerfile -t {{.Image}} . --build-arg BINARY={{.app}} --push diff --git a/apps/worker-audit-logging/Containerfile b/apps/worker-audit-logging/Containerfile new file mode 100644 index 000000000..75e4a3737 --- /dev/null +++ b/apps/worker-audit-logging/Containerfile @@ -0,0 +1,5 @@ +# syntax=docker/dockerfile:1.4 +FROM gcr.io/distroless/static-debian11:nonroot +ARG BINARY +COPY ./bin/$BINARY ./worker-audit-logging +ENTRYPOINT [ "./worker-audit-logging" ] diff --git a/apps/worker-audit-logging/Dockerfile b/apps/worker-audit-logging/Dockerfile deleted file mode 100644 index b26e97835..000000000 --- a/apps/worker-audit-logging/Dockerfile +++ /dev/null @@ -1,23 +0,0 @@ -# syntax=docker/dockerfile:1.4 -FROM golang:1.19.4-alpine3.16 AS base -USER 1001 -ENV GOPATH=/tmp/go -ENV GOCACHE=/tmp/go-cache -WORKDIR /tmp/app -COPY --chown=1001 --from=project-root ./go.mod ./go.sum ./tools.go ./ -RUN go mod download -x -COPY --chown=1001 --from=project-root common ./common -COPY --chown=1001 --from=project-root grpc-interfaces ./grpc-interfaces -COPY --chown=1001 --from=project-root pkg ./pkg -ARG APP -RUN mkdir -p ./apps/$APP -WORKDIR /tmp/app/apps/$APP -COPY --chown=1001 ./ ./ -RUN CGO_ENABLED=0 go build -tags musl -o /tmp/bin/$APP ./main.go -RUN chmod +x /tmp/bin/$APP - -FROM gcr.io/distroless/static-debian11 -USER 1001 -ARG APP -COPY --from=base --chown=1001 /tmp/bin/$APP ./worker-audit-logging -CMD ["./worker-audit-logging"] diff --git a/apps/worker-audit-logging/Taskfile.yml b/apps/worker-audit-logging/Taskfile.yml index fd84e5391..d159bc602 100644 --- a/apps/worker-audit-logging/Taskfile.yml +++ b/apps/worker-audit-logging/Taskfile.yml @@ -1,49 +1,22 @@ version: 3 +vars: + app: worker-audit-logging + +includes: + go: ../../.tools/taskfiles/go-build.yml + tasks: build: - env: - CGO_ENABLED: 0 - GOOS: linux - GOARCH: amd64 - preconditions: - - sh: '[ -n "{{.Out}}" ]' - msg: var Out must have a value cmds: - - go build -ldflags="-s -w" -o {{.Out}} - - upx {{.Out}} + - task: go:build + vars: + Out: ./bin/{{.app}} - local-build: + container:build-and-push: preconditions: - - sh: '[ -n "{{.EnvName}}" ]' - msg: 'var EnvName must have a value' - - sh: '[ -n "{{.Tag}}" ]' - msg: 'var Tag must have a value' - vars: - APP: worker-audit-logging - IMAGE: registry.kloudlite.io/kloudlite/{{.EnvName}}/{{.APP}}:{{.Tag}} - env: - CGO_ENABLED: 0 - GOOS: linux - GOARCH: amd64 - silent: true + - sh: '[[ -n "{{.Image}}" ]]' + msg: "var Image must have a value, of format 'image_repository:image_tag'" cmds: - - |+ - lineNumbers=$(cat Dockerfile | grep -i '^FROM' -n | tail +2 | awk -F: '{print $1}') - - startLineNo=$(echo "$lineNumbers" | head -n+1) - finalLineNo=$(echo "$lineNumbers" | tail -1) - - tDir=$(mktemp -d) - - nDockerfile=$(cat Dockerfile | tail --lines=+$startLineNo | grep -i --invert-match 'from=base') - echo "$nDockerfile" | sed "1 i # syntax=docker/dockerfile:1.4" > $tDir/Dockerfile.base - - CGO_ENABLED=0 go build -o $tDir/{{.APP}} . - - cat $tDir/Dockerfile.base | sed "4 i COPY --from=local-builder --chown=1001 ./{{.APP}} ./{{.APP}}" > $tDir/Dockerfile - cat $tDir/Dockerfile - - docker buildx build -f $tDir/Dockerfile -t {{.IMAGE}} . --build-context local-builder=${tDir} - docker push {{.IMAGE}} - rm -rf $tDir + - task: build + - docker buildx build -f ./Containerfile -t {{.Image}} . --build-arg BINARY={{.app}} --push