diff --git a/.gitea/workflows/build.yaml b/.gitea/workflows/build.yaml index 9ec10a2..7a3f23a 100644 --- a/.gitea/workflows/build.yaml +++ b/.gitea/workflows/build.yaml @@ -3,75 +3,75 @@ run-name: ${{ gitea.actor }} build 🚀 on: [push] jobs: - Metadata: - runs-on: arm64 - outputs: - version: ${{ steps.meta.outputs.version }} - git_commit: ${{ steps.meta.outputs.git_commit }} - build_date: ${{ steps.meta.outputs.build_date }} - steps: - - name: Checkout - uses: actions/checkout@v4 - - id: meta - name: Derive build metadata - run: | - GIT_COMMIT=$(git rev-parse HEAD) - if git describe --tags --exact-match >/dev/null 2>&1; then - VERSION=$(git describe --tags --exact-match) - else - VERSION=$(git rev-parse --short=12 HEAD) - fi - BUILD_DATE=$(date -u +"%Y-%m-%dT%H:%M:%SZ") - echo "git_commit=$GIT_COMMIT" >> $GITHUB_OUTPUT - echo "version=$VERSION" >> $GITHUB_OUTPUT - echo "build_date=$BUILD_DATE" >> $GITHUB_OUTPUT + Metadata: + runs-on: arm64 + outputs: + version: ${{ steps.meta.outputs.version }} + git_commit: ${{ steps.meta.outputs.git_commit }} + build_date: ${{ steps.meta.outputs.build_date }} + steps: + - name: Checkout + uses: actions/checkout@v4 + - id: meta + name: Derive build metadata + run: | + GIT_COMMIT=$(git rev-parse HEAD) + if git describe --tags --exact-match >/dev/null 2>&1; then + VERSION=$(git describe --tags --exact-match) + else + VERSION=$(git rev-parse --short=12 HEAD) + fi + BUILD_DATE=$(date -u +"%Y-%m-%dT%H:%M:%SZ") + echo "git_commit=$GIT_COMMIT" >> $GITHUB_OUTPUT + echo "version=$VERSION" >> $GITHUB_OUTPUT + echo "build_date=$BUILD_DATE" >> $GITHUB_OUTPUT - BuildAndDeployAmd64: - needs: Metadata - runs-on: amd64 - steps: - - uses: actions/checkout@v4 - - name: Build amd64 image - run: | - docker build \ - --build-arg VERSION=${{ needs.Metadata.outputs.version }} \ - --build-arg GIT_COMMIT=${{ needs.Metadata.outputs.git_commit }} \ - --build-arg BUILD_DATE=${{ needs.Metadata.outputs.build_date }} \ - --progress=plain \ - -t registry.knatofs.se/go-cart-actor-amd64:latest \ - -t registry.knatofs.se/go-cart-actor-amd64:${{ needs.Metadata.outputs.version }} \ - . - - name: Push amd64 images - run: | - docker push registry.knatofs.se/go-cart-actor-amd64:latest - docker push registry.knatofs.se/go-cart-actor-amd64:${{ needs.Metadata.outputs.version }} - - name: Apply deployment manifests - run: kubectl apply -f deployment/deployment.yaml -n cart - - name: Rollout amd64 deployment (pin to version) - run: | - kubectl set image deployment/cart-actor-x86 -n cart cart-actor-amd64=registry.knatofs.se/go-cart-actor-amd64:${{ needs.Metadata.outputs.version }} - kubectl rollout status deployment/cart-actor-x86 -n cart + BuildAndDeployAmd64: + needs: Metadata + runs-on: amd64 + steps: + - uses: actions/checkout@v4 + - name: Build amd64 image + run: | + docker build \ + --build-arg VERSION=${{ needs.Metadata.outputs.version }} \ + --build-arg GIT_COMMIT=${{ needs.Metadata.outputs.git_commit }} \ + --build-arg BUILD_DATE=${{ needs.Metadata.outputs.build_date }} \ + --progress=plain \ + -t registry.knatofs.se/go-cart-actor-amd64:latest \ + -t registry.knatofs.se/go-cart-actor-amd64:${{ needs.Metadata.outputs.version }} \ + . + - name: Push amd64 images + run: | + docker push registry.knatofs.se/go-cart-actor-amd64:latest + docker push registry.knatofs.se/go-cart-actor-amd64:${{ needs.Metadata.outputs.version }} + - name: Apply deployment manifests + run: kubectl apply -f deployment/deployment.yaml -n cart + - name: Rollout amd64 deployment (pin to version) + run: | + kubectl set image deployment/cart-actor-x86 -n cart cart-actor-amd64=registry.knatofs.se/go-cart-actor-amd64:${{ needs.Metadata.outputs.version }} + kubectl rollout status deployment/cart-actor-x86 -n cart - BuildAndDeployArm64: - needs: Metadata - runs-on: arm64 - steps: - - uses: actions/checkout@v4 - - name: Build arm64 image - run: | - docker build \ - --build-arg VERSION=${{ needs.Metadata.outputs.version }} \ - --build-arg GIT_COMMIT=${{ needs.Metadata.outputs.git_commit }} \ - --build-arg BUILD_DATE=${{ needs.Metadata.outputs.build_date }} \ - --progress=plain \ - -t registry.knatofs.se/go-cart-actor:latest \ - -t registry.knatofs.se/go-cart-actor:${{ needs.Metadata.outputs.version }} \ - . - - name: Push arm64 images - run: | - docker push registry.knatofs.se/go-cart-actor:latest - docker push registry.knatofs.se/go-cart-actor:${{ needs.Metadata.outputs.version }} - - name: Rollout arm64 deployment (pin to version) - run: | - kubectl set image deployment/cart-actor-arm64 -n cart cart-actor-arm64=registry.knatofs.se/go-cart-actor:${{ needs.Metadata.outputs.version }} - kubectl rollout status deployment/cart-actor-arm64 -n cart + BuildAndDeployArm64: + needs: Metadata + runs-on: arm64 + steps: + - uses: actions/checkout@v4 + - name: Build arm64 image + run: | + docker build \ + --build-arg VERSION=${{ needs.Metadata.outputs.version }} \ + --build-arg GIT_COMMIT=${{ needs.Metadata.outputs.git_commit }} \ + --build-arg BUILD_DATE=${{ needs.Metadata.outputs.build_date }} \ + --progress=plain \ + -t registry.knatofs.se/go-cart-actor:latest \ + -t registry.knatofs.se/go-cart-actor:${{ needs.Metadata.outputs.version }} \ + . + - name: Push arm64 images + run: | + docker push registry.knatofs.se/go-cart-actor:latest + docker push registry.knatofs.se/go-cart-actor:${{ needs.Metadata.outputs.version }} + - name: Rollout arm64 deployment (pin to version) + run: | + kubectl set image deployment/cart-actor-arm64 -n cart cart-actor-arm64=registry.knatofs.se/go-cart-actor:${{ needs.Metadata.outputs.version }} + kubectl rollout status deployment/cart-actor-arm64 -n cart diff --git a/deployment/deployment.yaml b/deployment/deployment.yaml index a6bd2ec..8f63485 100644 --- a/deployment/deployment.yaml +++ b/deployment/deployment.yaml @@ -1,252 +1,252 @@ apiVersion: v1 kind: Secret metadata: - name: klarna-api-credentials + name: klarna-api-credentials data: - username: ZjQzZDY3YjEtNzA2Yy00NTk2LTliNTgtYjg1YjU2NDEwZTUw - password: a2xhcm5hX3Rlc3RfYXBpX0trUWhWVE5yYVZsV2FsTnhTRVp3Y1ZSSFF5UkVNRmxyY25Kd1AxSndQMGdzWmpRelpEWTNZakV0TnpBMll5MDBOVGsyTFRsaU5UZ3RZamcxWWpVMk5ERXdaVFV3TERFc2JUUkNjRFpWU1RsTllsSk1aMlEyVEc4MmRVODNZMkozUlRaaFdEZDViV3AwYkhGV1JqTjVNQzlaYXow + username: ZjQzZDY3YjEtNzA2Yy00NTk2LTliNTgtYjg1YjU2NDEwZTUw + password: a2xhcm5hX3Rlc3RfYXBpX0trUWhWVE5yYVZsV2FsTnhTRVp3Y1ZSSFF5UkVNRmxyY25Kd1AxSndQMGdzWmpRelpEWTNZakV0TnpBMll5MDBOVGsyTFRsaU5UZ3RZamcxWWpVMk5ERXdaVFV3TERFc2JUUkNjRFpWU1RsTllsSk1aMlEyVEc4MmRVODNZMkozUlRaaFdEZDViV3AwYkhGV1JqTjVNQzlaYXow type: Opaque --- apiVersion: apps/v1 kind: Deployment metadata: - labels: - app: cart-actor - arch: amd64 - name: cart-actor-x86 + labels: + app: cart-actor + arch: amd64 + name: cart-actor-x86 spec: - replicas: 0 - selector: - matchLabels: - app: cart-actor - arch: amd64 - template: - metadata: - labels: - app: cart-actor - actor-pool: cart - arch: amd64 - spec: - affinity: - nodeAffinity: - requiredDuringSchedulingIgnoredDuringExecution: - nodeSelectorTerms: - - matchExpressions: - - key: kubernetes.io/arch - operator: NotIn - values: - - arm64 - volumes: - - name: data - nfs: - path: /i-data/7a8af061/nfs/cart-actor - server: 10.10.1.10 - imagePullSecrets: - - name: regcred - serviceAccountName: default - containers: - - image: registry.knatofs.se/go-cart-actor-amd64:latest - name: cart-actor-amd64 - imagePullPolicy: Always - lifecycle: - preStop: - exec: - command: ["sleep", "15"] - ports: - - containerPort: 8080 - name: web - - containerPort: 1337 - name: rpc - livenessProbe: - httpGet: - path: /livez - port: web - failureThreshold: 1 - periodSeconds: 10 - readinessProbe: - httpGet: - path: /readyz - port: web - failureThreshold: 2 - initialDelaySeconds: 2 - periodSeconds: 10 - volumeMounts: - - mountPath: "/data" - name: data - resources: - limits: - memory: "768Mi" - requests: - memory: "70Mi" - cpu: "1200m" - env: - - name: TZ - value: "Europe/Stockholm" - - name: KLARNA_API_USERNAME - valueFrom: - secretKeyRef: - name: klarna-api-credentials - key: username - - name: KLARNA_API_PASSWORD - valueFrom: - secretKeyRef: - name: klarna-api-credentials - key: password - - name: POD_IP - valueFrom: - fieldRef: - fieldPath: status.podIP - - name: AMQP_URL - value: "amqp://admin:12bananer@rabbitmq.dev:5672/" - # - name: BASE_URL - # value: "https://s10n-no.tornberg.me" - - name: POD_NAME - valueFrom: - fieldRef: - fieldPath: metadata.name + replicas: 3 + selector: + matchLabels: + app: cart-actor + arch: amd64 + template: + metadata: + labels: + app: cart-actor + actor-pool: cart + arch: amd64 + spec: + affinity: + nodeAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + nodeSelectorTerms: + - matchExpressions: + - key: kubernetes.io/arch + operator: NotIn + values: + - arm64 + volumes: + - name: data + nfs: + path: /i-data/7a8af061/nfs/cart-actor + server: 10.10.1.10 + imagePullSecrets: + - name: regcred + serviceAccountName: default + containers: + - image: registry.knatofs.se/go-cart-actor-amd64:latest + name: cart-actor-amd64 + imagePullPolicy: Always + lifecycle: + preStop: + exec: + command: ["sleep", "15"] + ports: + - containerPort: 8080 + name: web + - containerPort: 1337 + name: rpc + livenessProbe: + httpGet: + path: /livez + port: web + failureThreshold: 1 + periodSeconds: 10 + readinessProbe: + httpGet: + path: /readyz + port: web + failureThreshold: 2 + initialDelaySeconds: 2 + periodSeconds: 10 + volumeMounts: + - mountPath: "/data" + name: data + resources: + limits: + memory: "768Mi" + requests: + memory: "70Mi" + cpu: "1200m" + env: + - name: TZ + value: "Europe/Stockholm" + - name: KLARNA_API_USERNAME + valueFrom: + secretKeyRef: + name: klarna-api-credentials + key: username + - name: KLARNA_API_PASSWORD + valueFrom: + secretKeyRef: + name: klarna-api-credentials + key: password + - name: POD_IP + valueFrom: + fieldRef: + fieldPath: status.podIP + - name: AMQP_URL + value: "amqp://admin:12bananer@rabbitmq.dev:5672/" + # - name: BASE_URL + # value: "https://s10n-no.tornberg.me" + - name: POD_NAME + valueFrom: + fieldRef: + fieldPath: metadata.name --- apiVersion: apps/v1 kind: Deployment metadata: - labels: - app: cart-actor - arch: arm64 - name: cart-actor-arm64 + labels: + app: cart-actor + arch: arm64 + name: cart-actor-arm64 spec: - replicas: 3 - selector: - matchLabels: - app: cart-actor - arch: arm64 - template: - metadata: - labels: - app: cart-actor - actor-pool: cart - arch: arm64 - spec: - affinity: - nodeAffinity: - requiredDuringSchedulingIgnoredDuringExecution: - nodeSelectorTerms: - - matchExpressions: - - key: kubernetes.io/hostname - operator: NotIn - values: - - masterpi - - key: kubernetes.io/arch - operator: In - values: - - arm64 - volumes: - - name: data - nfs: - path: /i-data/7a8af061/nfs/cart-actor - server: 10.10.1.10 - imagePullSecrets: - - name: regcred - serviceAccountName: default - containers: - - image: registry.knatofs.se/go-cart-actor:latest - name: cart-actor-arm64 - imagePullPolicy: Always - lifecycle: - preStop: - exec: - command: ["sleep", "15"] - ports: - - containerPort: 8080 - name: web - - containerPort: 1337 - name: rpc - livenessProbe: - httpGet: - path: /livez - port: web - failureThreshold: 1 - periodSeconds: 10 - readinessProbe: - httpGet: - path: /readyz - port: web - failureThreshold: 2 - initialDelaySeconds: 2 - periodSeconds: 10 - volumeMounts: - - mountPath: "/data" - name: data - resources: - limits: - memory: "768Mi" - requests: - memory: "70Mi" - cpu: "1200m" - env: - - name: TZ - value: "Europe/Stockholm" - - name: KLARNA_API_USERNAME - valueFrom: - secretKeyRef: - name: klarna-api-credentials - key: username - - name: KLARNA_API_PASSWORD - valueFrom: - secretKeyRef: - name: klarna-api-credentials - key: password - - name: POD_IP - valueFrom: - fieldRef: - fieldPath: status.podIP - - name: AMQP_URL - value: "amqp://admin:12bananer@rabbitmq.dev:5672/" - # - name: BASE_URL - # value: "https://s10n-no.tornberg.me" - - name: POD_NAME - valueFrom: - fieldRef: - fieldPath: metadata.name + replicas: 0 + selector: + matchLabels: + app: cart-actor + arch: arm64 + template: + metadata: + labels: + app: cart-actor + actor-pool: cart + arch: arm64 + spec: + affinity: + nodeAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + nodeSelectorTerms: + - matchExpressions: + - key: kubernetes.io/hostname + operator: NotIn + values: + - masterpi + - key: kubernetes.io/arch + operator: In + values: + - arm64 + volumes: + - name: data + nfs: + path: /i-data/7a8af061/nfs/cart-actor + server: 10.10.1.10 + imagePullSecrets: + - name: regcred + serviceAccountName: default + containers: + - image: registry.knatofs.se/go-cart-actor:latest + name: cart-actor-arm64 + imagePullPolicy: Always + lifecycle: + preStop: + exec: + command: ["sleep", "15"] + ports: + - containerPort: 8080 + name: web + - containerPort: 1337 + name: rpc + livenessProbe: + httpGet: + path: /livez + port: web + failureThreshold: 1 + periodSeconds: 10 + readinessProbe: + httpGet: + path: /readyz + port: web + failureThreshold: 2 + initialDelaySeconds: 2 + periodSeconds: 10 + volumeMounts: + - mountPath: "/data" + name: data + resources: + limits: + memory: "768Mi" + requests: + memory: "70Mi" + cpu: "1200m" + env: + - name: TZ + value: "Europe/Stockholm" + - name: KLARNA_API_USERNAME + valueFrom: + secretKeyRef: + name: klarna-api-credentials + key: username + - name: KLARNA_API_PASSWORD + valueFrom: + secretKeyRef: + name: klarna-api-credentials + key: password + - name: POD_IP + valueFrom: + fieldRef: + fieldPath: status.podIP + - name: AMQP_URL + value: "amqp://admin:12bananer@rabbitmq.dev:5672/" + # - name: BASE_URL + # value: "https://s10n-no.tornberg.me" + - name: POD_NAME + valueFrom: + fieldRef: + fieldPath: metadata.name --- kind: Service apiVersion: v1 metadata: - name: cart-actor - annotations: - prometheus.io/port: "8080" - prometheus.io/scrape: "true" - prometheus.io/path: "/metrics" + name: cart-actor + annotations: + prometheus.io/port: "8080" + prometheus.io/scrape: "true" + prometheus.io/path: "/metrics" spec: - selector: - app: cart-actor - ports: - - name: web - port: 8080 + selector: + app: cart-actor + ports: + - name: web + port: 8080 --- apiVersion: networking.k8s.io/v1 kind: Ingress metadata: - name: cart-ingress - annotations: - cert-manager.io/cluster-issuer: letsencrypt-prod - nginx.ingress.kubernetes.io/affinity: "cookie" - nginx.ingress.kubernetes.io/session-cookie-name: "cart-affinity" - nginx.ingress.kubernetes.io/session-cookie-expires: "172800" - nginx.ingress.kubernetes.io/session-cookie-max-age: "172800" - nginx.ingress.kubernetes.io/proxy-body-size: 4m + name: cart-ingress + annotations: + cert-manager.io/cluster-issuer: letsencrypt-prod + nginx.ingress.kubernetes.io/affinity: "cookie" + nginx.ingress.kubernetes.io/session-cookie-name: "cart-affinity" + nginx.ingress.kubernetes.io/session-cookie-expires: "172800" + nginx.ingress.kubernetes.io/session-cookie-max-age: "172800" + nginx.ingress.kubernetes.io/proxy-body-size: 4m spec: - ingressClassName: nginx - tls: - - hosts: - - cart.tornberg.me - secretName: cart-actor-tls-secret - rules: - - host: cart.tornberg.me - http: - paths: - - path: / - pathType: Prefix - backend: - service: - name: cart-actor - port: - number: 8080 + ingressClassName: nginx + tls: + - hosts: + - cart.tornberg.me + secretName: cart-actor-tls-secret + rules: + - host: cart.tornberg.me + http: + paths: + - path: / + pathType: Prefix + backend: + service: + name: cart-actor + port: + number: 8080