feat: V1 ?
This commit is contained in:
parent
1840bf771c
commit
90238e000a
33
Dockerfile
Normal file
33
Dockerfile
Normal file
@ -0,0 +1,33 @@
|
||||
FROM rust:latest AS builder
|
||||
|
||||
WORKDIR /app
|
||||
|
||||
# Copy the Cargo.toml and build the project to cache dependencies
|
||||
COPY Cargo.toml .
|
||||
RUN mkdir src &&\
|
||||
echo "fn main() {}" > src/main.rs
|
||||
RUN cargo build --release
|
||||
|
||||
# Copy the rest of the source code then build the project
|
||||
COPY src src
|
||||
RUN touch src/main.rs
|
||||
RUN cargo build --release
|
||||
|
||||
# Strip the binaries to reduce size
|
||||
RUN strip target/release/botdiscord
|
||||
#FROM alpine:latest as release
|
||||
FROM gcr.io/distroless/cc-debian12
|
||||
|
||||
WORKDIR /app
|
||||
|
||||
# Copy each binary from the builder stage, all needed for different stages
|
||||
COPY --from=builder /app/target/release/server .
|
||||
|
||||
# Copy the resource folder that containt default configuration files
|
||||
COPY ./resource ./resource
|
||||
|
||||
ENV PORT 5437
|
||||
|
||||
EXPOSE 5437
|
||||
|
||||
CMD ["./botdiscord"]
|
24
chart/Chart.yaml
Normal file
24
chart/Chart.yaml
Normal file
@ -0,0 +1,24 @@
|
||||
apiVersion: v2
|
||||
name: bu-teammaker
|
||||
description: A helm to deploy the app
|
||||
|
||||
# A chart can be either an 'application' or a 'library' chart.
|
||||
#
|
||||
# Application charts are a collection of templates that can be packaged into versioned archives
|
||||
# to be deployed.
|
||||
#
|
||||
# Library charts provide useful utilities or functions for the chart developer. They're included as
|
||||
# a dependency of application charts to inject those utilities and functions into the rendering
|
||||
# pipeline. Library charts do not define any templates and therefore cannot be deployed.
|
||||
type: application
|
||||
|
||||
# This is the chart version. This version number should be incremented each time you make changes
|
||||
# to the chart and its templates, including the app version.
|
||||
# Versions are expected to follow Semantic Versioning (https://semver.org/)
|
||||
version: 0.1.2
|
||||
|
||||
# This is the version number of the application being deployed. This version number should be
|
||||
# incremented each time you make changes to the application. Versions are not expected to
|
||||
# follow Semantic Versioning. They should reflect the version the application is using.
|
||||
# It is recommended to use it with quotes.
|
||||
appVersion: "1.16.1"
|
82
chart/templates/Deployment.surreal.yaml
Normal file
82
chart/templates/Deployment.surreal.yaml
Normal file
@ -0,0 +1,82 @@
|
||||
{{- $host_dev := printf "%s-bu-teammaker.dev.%s" .Values.image.tag .Values.ingress.host -}}
|
||||
{{- $host_prod := printf "%s.%s" "bu-teammaker" .Values.ingress.host -}}
|
||||
{{- $host := regexMatch "^v[0-9]+\\.[0-9]+\\.[0-9]+$" .Values.image.tag | ternary $host_prod $host_dev -}}
|
||||
---
|
||||
apiVersion: apps/v1
|
||||
kind: Deployment
|
||||
metadata:
|
||||
name: "{{ .Chart.Name }}-{{- template "mychart.name" . -}}-surrealdb"
|
||||
labels:
|
||||
app: "{{ .Chart.Name }}-{{- template "mychart.name" . -}}-surrealdb"
|
||||
{{- include "mychart.labels" . | nindent 2 }}
|
||||
annotations:
|
||||
deployment.kubernetes.io/revision: "{{ .Release.Revision }}-surrealdb"
|
||||
deployment.git-branch: "{{ .Values.image.tag }}"
|
||||
rollme: {{ randAlphaNum 5 | quote }}
|
||||
spec:
|
||||
replicas: 1
|
||||
selector:
|
||||
matchLabels:
|
||||
app: "{{ .Chart.Name }}-{{- template "mychart.name" . -}}-surrealdb"
|
||||
template:
|
||||
metadata:
|
||||
labels:
|
||||
app: "{{ .Chart.Name }}-{{- template "mychart.name" . -}}-surrealdb"
|
||||
annotations:
|
||||
rollme: {{ randAlphaNum 5 | quote }}
|
||||
spec:
|
||||
imagePullSecrets:
|
||||
- name: harbor-pull
|
||||
volumes:
|
||||
- name: "{{ .Chart.Name }}-{{- template "mychart.name" . -}}-surrealdb"
|
||||
persistentVolumeClaim:
|
||||
claimName: "{{ .Chart.Name }}-{{- template "mychart.name" . -}}-surrealdb"
|
||||
containers:
|
||||
- name: "{{ .Chart.Name }}-{{- template "mychart.name" . -}}-surrealdb"
|
||||
image: "surrealdb/surrealdb:latest"
|
||||
imagePullPolicy: Always
|
||||
command:
|
||||
- start
|
||||
ports:
|
||||
- containerPort: 8000
|
||||
name: http
|
||||
env:
|
||||
{{- range $env := .Values.env }}
|
||||
- name: "{{ $env.name }}"
|
||||
value: "{{ $env.value }}"
|
||||
{{- end }}
|
||||
- name: POD_NAME
|
||||
valueFrom:
|
||||
fieldRef:
|
||||
fieldPath: metadata.name
|
||||
- name: SURREAL_AUTH
|
||||
value: "true"
|
||||
- name: SURREAL_USER
|
||||
envFrom:
|
||||
secretRef:
|
||||
name: "bot-discord-db"
|
||||
key: "username"
|
||||
- name: SURREAL_PASS
|
||||
envFrom:
|
||||
secretRef:
|
||||
name: "bot-discord-db"
|
||||
key: "password"
|
||||
- name: SURREAL_PATH
|
||||
value: "file:/appdata/bot.db"
|
||||
resources:
|
||||
{{- toYaml .Values.resources | nindent 12 }}
|
||||
volumeMounts:
|
||||
- name: "{{ .Chart.Name }}-{{- template "mychart.name" . -}}-surrealdb"
|
||||
mountPath: /appdata
|
||||
livenessProbe:
|
||||
httpGet:
|
||||
path: /
|
||||
port: http
|
||||
initialDelaySeconds: 10
|
||||
periodSeconds: 10
|
||||
readinessProbe:
|
||||
httpGet:
|
||||
path: /
|
||||
port: http
|
||||
initialDelaySeconds: 5
|
||||
periodSeconds: 10
|
118
chart/templates/Deployment.yaml
Normal file
118
chart/templates/Deployment.yaml
Normal file
@ -0,0 +1,118 @@
|
||||
{{- $host_dev := printf "%s-bu-teammaker.dev.%s" .Values.image.tag .Values.ingress.host -}}
|
||||
{{- $host_prod := printf "%s.%s" "bu-teammaker" .Values.ingress.host -}}
|
||||
{{- $host := regexMatch "^v[0-9]+\\.[0-9]+\\.[0-9]+$" .Values.image.tag | ternary $host_prod $host_dev -}}
|
||||
---
|
||||
apiVersion: apps/v1
|
||||
kind: Deployment
|
||||
metadata:
|
||||
name: "{{ .Chart.Name }}-{{- template "mychart.name" . -}}"
|
||||
labels:
|
||||
app: "{{ .Chart.Name }}-{{- template "mychart.name" . -}}"
|
||||
{{- include "mychart.labels" . | nindent 2 }}
|
||||
annotations:
|
||||
deployment.kubernetes.io/revision: "{{ .Release.Revision }}"
|
||||
deployment.git-branch: "{{ .Values.image.tag }}"
|
||||
rollme: {{ randAlphaNum 5 | quote }}
|
||||
spec:
|
||||
replicas: 1
|
||||
selector:
|
||||
matchLabels:
|
||||
app: "{{ .Chart.Name }}-{{- template "mychart.name" . -}}"
|
||||
template:
|
||||
metadata:
|
||||
labels:
|
||||
app: "{{ .Chart.Name }}-{{- template "mychart.name" . -}}"
|
||||
annotations:
|
||||
rollme: {{ randAlphaNum 5 | quote }}
|
||||
spec:
|
||||
imagePullSecrets:
|
||||
- name: harbor-pull
|
||||
volumes:
|
||||
- name: "base_image"
|
||||
emptyDir: {}
|
||||
- name: "ssh-key"
|
||||
secret:
|
||||
secretName: "bot-discord-pull"
|
||||
initContainers:
|
||||
- name: "init"
|
||||
image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
|
||||
imagePullPolicy: Always
|
||||
command: ["sh", "-c", "cd /appdata && git clone git@git.weebo.fr:sandbox/base-image.git ."]
|
||||
env:
|
||||
- name: "GIT_SSH_COMMAND"
|
||||
value: "ssh -o StrictHostKeyChecking=no"
|
||||
volumeMounts:
|
||||
- name: "base_image"
|
||||
mountPath: "/appdata"
|
||||
- name: "ssh-key"
|
||||
mountPath: "/root/.ssh"
|
||||
containers:
|
||||
- name: "{{ .Chart.Name }}-{{- template "mychart.name" . -}}"
|
||||
image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
|
||||
imagePullPolicy: Always
|
||||
ports:
|
||||
- containerPort: 5437
|
||||
name: http
|
||||
env:
|
||||
{{- range $env := .Values.env }}
|
||||
- name: "{{ $env.name }}"
|
||||
value: "{{ $env.value }}"
|
||||
{{- end }}
|
||||
- name: POD_NAME
|
||||
valueFrom:
|
||||
fieldRef:
|
||||
fieldPath: metadata.name
|
||||
- name: RUST_BACKTRACE
|
||||
value: "1"
|
||||
- name: PORT
|
||||
value: "5437"
|
||||
- name: IMAGE_PATH
|
||||
value: "/appdata/"
|
||||
- name: "DB_NAME"
|
||||
envFrom:
|
||||
secretRef:
|
||||
name: "bot-discord-db"
|
||||
key: "db_name"
|
||||
- name: "DB_PASSWORD"
|
||||
envFrom:
|
||||
secretRef:
|
||||
name: "bot-discord-db"
|
||||
key: "password"
|
||||
- name: "DB_USER"
|
||||
envFrom:
|
||||
secretRef:
|
||||
name: "bot-discord-db"
|
||||
key: "username"
|
||||
- name: "DB_NAMESPACE"
|
||||
envFrom:
|
||||
secretRef:
|
||||
name: "bot-discord-db"
|
||||
key: "db_namespace"
|
||||
- name: "BOT_TOKEN"
|
||||
envFrom:
|
||||
secretRef:
|
||||
name: "botdiscord"
|
||||
key: "token"
|
||||
- name: RUST_ENV
|
||||
{{- if regexMatch "^[0-9]+\\.[0-9]+\\.[0-9]+$" .Values.image.tag }}
|
||||
value: "prod"
|
||||
{{- else }}
|
||||
value: "dev-{{ .Values.image.tag }}"
|
||||
{{- end }}
|
||||
resources:
|
||||
{{- toYaml .Values.resources | nindent 12 }}
|
||||
volumeMounts:
|
||||
- name: "base_image"
|
||||
mountPath: "/appdata"
|
||||
livenessProbe:
|
||||
httpGet:
|
||||
path: /
|
||||
port: http
|
||||
initialDelaySeconds: 10
|
||||
periodSeconds: 10
|
||||
readinessProbe:
|
||||
httpGet:
|
||||
path: /
|
||||
port: http
|
||||
initialDelaySeconds: 5
|
||||
periodSeconds: 10
|
19
chart/templates/Service.surreal.yaml
Normal file
19
chart/templates/Service.surreal.yaml
Normal file
@ -0,0 +1,19 @@
|
||||
---
|
||||
apiVersion: v1
|
||||
kind: Service
|
||||
metadata:
|
||||
name: "{{ .Chart.Name }}-{{- template "mychart.name" . -}}-surrealdb"
|
||||
labels:
|
||||
app: "{{ .Chart.Name }}-{{- template "mychart.name" . -}}-surrealdb"
|
||||
{{- include "mychart.labels" . | nindent 2 }}
|
||||
annotations:
|
||||
deployment.kubernetes.io/revision: "{{ .Release.Revision }}"
|
||||
deployment.git-branch: "{{ .Values.image.tag }}"
|
||||
spec:
|
||||
ports:
|
||||
- port: 8000
|
||||
targetPort: 8000
|
||||
name: http
|
||||
selector:
|
||||
app: "{{ .Chart.Name }}-{{- template "mychart.name" . -}}-surrealdb"
|
||||
type: ClusterIP
|
19
chart/templates/Service.yaml
Normal file
19
chart/templates/Service.yaml
Normal file
@ -0,0 +1,19 @@
|
||||
---
|
||||
apiVersion: v1
|
||||
kind: Service
|
||||
metadata:
|
||||
name: "{{ .Chart.Name }}-{{- template "mychart.name" . -}}"
|
||||
labels:
|
||||
app: "{{ .Chart.Name }}-{{- template "mychart.name" . -}}"
|
||||
{{- include "mychart.labels" . | nindent 2 }}
|
||||
annotations:
|
||||
deployment.kubernetes.io/revision: "{{ .Release.Revision }}"
|
||||
deployment.git-branch: "{{ .Values.image.tag }}"
|
||||
spec:
|
||||
ports:
|
||||
- port: 5437
|
||||
targetPort: 5437
|
||||
name: http
|
||||
selector:
|
||||
app: "{{ .Chart.Name }}-{{- template "mychart.name" . -}}"
|
||||
type: ClusterIP
|
13
chart/templates/_helpers.tpl
Normal file
13
chart/templates/_helpers.tpl
Normal file
@ -0,0 +1,13 @@
|
||||
{{/* Generate object name */}}
|
||||
{{- define "mychart.name" }}
|
||||
{{- regexMatch "^v[0-9]+\\.[0-9]+\\.[0-9]+$" .Values.image.tag | ternary "prod" (regexReplaceAll "\\W+" .Values.image.tag "_") -}}
|
||||
{{- end }}
|
||||
|
||||
{{/* Generate labels */}}
|
||||
{{- define "mychart.labels" -}}
|
||||
{{- with .Values.labels }}
|
||||
{{- range $key, $value := . }}
|
||||
{{ $key }}: {{ tpl $value $ | quote }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- end }}
|
10
chart/templates/volume.surreal.yaml
Normal file
10
chart/templates/volume.surreal.yaml
Normal file
@ -0,0 +1,10 @@
|
||||
kind: PersistentVolumeClaim
|
||||
apiVersion: v1
|
||||
metadata:
|
||||
name: "{{ .Chart.Name }}-{{- template "mychart.name" . -}}-surrealdb"
|
||||
spec:
|
||||
accessModes:
|
||||
- ReadWriteOnce
|
||||
resources:
|
||||
requests:
|
||||
storage: 5Gi
|
32
chart/values.yaml
Normal file
32
chart/values.yaml
Normal file
@ -0,0 +1,32 @@
|
||||
resources: # Need to be fine tunned in the futur
|
||||
limits:
|
||||
cpu: 100m
|
||||
memory: 128Mi
|
||||
requests:
|
||||
cpu: 20m
|
||||
memory: 16Mi
|
||||
|
||||
env:
|
||||
- name: OTEL_EXPORTER_OTLP_ENDPOINT
|
||||
value: "http://tempo.monitoring.svc.cluster.local:4317"
|
||||
- name: RUST_LOG
|
||||
value: "debug"
|
||||
- name: APP_NAME
|
||||
value: "BotDiscord"
|
||||
|
||||
ingress:
|
||||
annotations:
|
||||
kubernetes.io/ingress.class: "haproxy"
|
||||
cert-manager.io/cluster-issuer: "letsencrypt-prod"
|
||||
host: weebo.fr
|
||||
|
||||
image:
|
||||
repository: harbor.weebo.fr/bu_teammaker/botdiscord
|
||||
pullPolicy: Always
|
||||
tag: "v1.17.8"
|
||||
|
||||
labels:
|
||||
app.kubernetes.io/name: botdiscord
|
||||
app.kubernetes.io/component: botdiscord
|
||||
app.kubernetes.io/instance: "botdiscord-{{ .Release.Name }}"
|
||||
app.kubernetes.io/part-of: "bot-discord"
|
23
cicd/.helmignore
Normal file
23
cicd/.helmignore
Normal file
@ -0,0 +1,23 @@
|
||||
# Patterns to ignore when building packages.
|
||||
# This supports shell glob matching, relative path matching, and
|
||||
# negation (prefixed with !). Only one pattern per line.
|
||||
.DS_Store
|
||||
# Common VCS dirs
|
||||
.git/
|
||||
.gitignore
|
||||
.bzr/
|
||||
.bzrignore
|
||||
.hg/
|
||||
.hgignore
|
||||
.svn/
|
||||
# Common backup files
|
||||
*.swp
|
||||
*.bak
|
||||
*.tmp
|
||||
*.orig
|
||||
*~
|
||||
# Various IDEs
|
||||
.project
|
||||
.idea/
|
||||
*.tmproj
|
||||
.vscode/
|
24
cicd/Chart.yaml
Normal file
24
cicd/Chart.yaml
Normal file
@ -0,0 +1,24 @@
|
||||
apiVersion: v2
|
||||
name: cicdv2
|
||||
description: A CICD pipeline for Kubernetes Tekton
|
||||
|
||||
# A chart can be either an 'application' or a 'library' chart.
|
||||
#
|
||||
# Application charts are a collection of templates that can be packaged into versioned archives
|
||||
# to be deployed.
|
||||
#
|
||||
# Library charts provide useful utilities or functions for the chart developer. They're included as
|
||||
# a dependency of application charts to inject those utilities and functions into the rendering
|
||||
# pipeline. Library charts do not define any templates and therefore cannot be deployed.
|
||||
type: application
|
||||
|
||||
# This is the chart version. This version number should be incremented each time you make changes
|
||||
# to the chart and its templates, including the app version.
|
||||
# Versions are expected to follow Semantic Versioning (https://semver.org/)
|
||||
version: 0.1.53
|
||||
|
||||
# This is the version number of the application being deployed. This version number should be
|
||||
# incremented each time you make changes to the application. Versions are not expected to
|
||||
# follow Semantic Versioning. They should reflect the version the application is using.
|
||||
# It is recommended to use it with quotes.
|
||||
appVersion: "1.16.0"
|
238
cicd/templates/dep/git-clone.yaml
Normal file
238
cicd/templates/dep/git-clone.yaml
Normal file
@ -0,0 +1,238 @@
|
||||
apiVersion: tekton.dev/v1beta1
|
||||
kind: Task
|
||||
metadata:
|
||||
name: git-clone
|
||||
labels:
|
||||
app.kubernetes.io/version: "0.8"
|
||||
annotations:
|
||||
tekton.dev/pipelines.minVersion: "0.29.0"
|
||||
tekton.dev/categories: Git
|
||||
tekton.dev/tags: git
|
||||
tekton.dev/displayName: "git clone"
|
||||
tekton.dev/platforms: "linux/amd64,linux/s390x,linux/ppc64le,linux/arm64"
|
||||
spec:
|
||||
description: >-
|
||||
These Tasks are Git tasks to work with repositories used by other tasks
|
||||
in your Pipeline.
|
||||
|
||||
The git-clone Task will clone a repo from the provided url into the
|
||||
output Workspace. By default the repo will be cloned into the root of
|
||||
your Workspace. You can clone into a subdirectory by setting this Task's
|
||||
subdirectory param. This Task also supports sparse checkouts. To perform
|
||||
a sparse checkout, pass a list of comma separated directory patterns to
|
||||
this Task's sparseCheckoutDirectories param.
|
||||
workspaces:
|
||||
- name: output
|
||||
description: The git repo will be cloned onto the volume backing this Workspace.
|
||||
- name: ssh-directory
|
||||
optional: true
|
||||
description: |
|
||||
A .ssh directory with private key, known_hosts, config, etc. Copied to
|
||||
the user's home before git commands are executed. Used to authenticate
|
||||
with the git remote when performing the clone. Binding a Secret to this
|
||||
Workspace is strongly recommended over other volume types.
|
||||
- name: basic-auth
|
||||
optional: true
|
||||
description: |
|
||||
A Workspace containing a .gitconfig and .git-credentials file. These
|
||||
will be copied to the user's home before any git commands are run. Any
|
||||
other files in this Workspace are ignored. It is strongly recommended
|
||||
to use ssh-directory over basic-auth whenever possible and to bind a
|
||||
Secret to this Workspace over other volume types.
|
||||
- name: ssl-ca-directory
|
||||
optional: true
|
||||
description: |
|
||||
A workspace containing CA certificates, this will be used by Git to
|
||||
verify the peer with when fetching or pushing over HTTPS.
|
||||
params:
|
||||
- name: url
|
||||
description: Repository URL to clone from.
|
||||
type: string
|
||||
- name: revision
|
||||
description: Revision to checkout. (branch, tag, sha, ref, etc...)
|
||||
type: string
|
||||
default: ""
|
||||
- name: refspec
|
||||
description: Refspec to fetch before checking out revision.
|
||||
default: ""
|
||||
- name: submodules
|
||||
description: Initialize and fetch git submodules.
|
||||
type: string
|
||||
default: "true"
|
||||
- name: depth
|
||||
description: Perform a shallow clone, fetching only the most recent N commits.
|
||||
type: string
|
||||
default: "1"
|
||||
- name: sslVerify
|
||||
description: Set the `http.sslVerify` global git config. Setting this to `false` is not advised unless you are sure that you trust your git remote.
|
||||
type: string
|
||||
default: "true"
|
||||
- name: crtFileName
|
||||
description: file name of mounted crt using ssl-ca-directory workspace. default value is ca-bundle.crt.
|
||||
type: string
|
||||
default: "ca-bundle.crt"
|
||||
- name: subdirectory
|
||||
description: Subdirectory inside the `output` Workspace to clone the repo into.
|
||||
type: string
|
||||
default: ""
|
||||
- name: sparseCheckoutDirectories
|
||||
description: Define the directory patterns to match or exclude when performing a sparse checkout.
|
||||
type: string
|
||||
default: ""
|
||||
- name: deleteExisting
|
||||
description: Clean out the contents of the destination directory if it already exists before cloning.
|
||||
type: string
|
||||
default: "true"
|
||||
- name: httpProxy
|
||||
description: HTTP proxy server for non-SSL requests.
|
||||
type: string
|
||||
default: ""
|
||||
- name: httpsProxy
|
||||
description: HTTPS proxy server for SSL requests.
|
||||
type: string
|
||||
default: ""
|
||||
- name: noProxy
|
||||
description: Opt out of proxying HTTP/HTTPS requests.
|
||||
type: string
|
||||
default: ""
|
||||
- name: verbose
|
||||
description: Log the commands that are executed during `git-clone`'s operation.
|
||||
type: string
|
||||
default: "true"
|
||||
- name: gitInitImage
|
||||
description: The image providing the git-init binary that this Task runs.
|
||||
type: string
|
||||
default: "gcr.io/tekton-releases/github.com/tektoncd/pipeline/cmd/git-init:v0.29.0"
|
||||
- name: userHome
|
||||
description: |
|
||||
Absolute path to the user's home directory.
|
||||
type: string
|
||||
default: "/tekton/home"
|
||||
results:
|
||||
- name: commit
|
||||
description: The precise commit SHA that was fetched by this Task.
|
||||
- name: url
|
||||
description: The precise URL that was fetched by this Task.
|
||||
steps:
|
||||
- name: clone
|
||||
image: "$(params.gitInitImage)"
|
||||
env:
|
||||
- name: HOME
|
||||
value: "$(params.userHome)"
|
||||
- name: PARAM_URL
|
||||
value: $(params.url)
|
||||
- name: PARAM_REVISION
|
||||
value: $(params.revision)
|
||||
- name: PARAM_REFSPEC
|
||||
value: $(params.refspec)
|
||||
- name: PARAM_SUBMODULES
|
||||
value: $(params.submodules)
|
||||
- name: PARAM_DEPTH
|
||||
value: $(params.depth)
|
||||
- name: PARAM_SSL_VERIFY
|
||||
value: $(params.sslVerify)
|
||||
- name: PARAM_CRT_FILENAME
|
||||
value: $(params.crtFileName)
|
||||
- name: PARAM_SUBDIRECTORY
|
||||
value: $(params.subdirectory)
|
||||
- name: PARAM_DELETE_EXISTING
|
||||
value: $(params.deleteExisting)
|
||||
- name: PARAM_HTTP_PROXY
|
||||
value: $(params.httpProxy)
|
||||
- name: PARAM_HTTPS_PROXY
|
||||
value: $(params.httpsProxy)
|
||||
- name: PARAM_NO_PROXY
|
||||
value: $(params.noProxy)
|
||||
- name: PARAM_VERBOSE
|
||||
value: $(params.verbose)
|
||||
- name: PARAM_SPARSE_CHECKOUT_DIRECTORIES
|
||||
value: $(params.sparseCheckoutDirectories)
|
||||
- name: PARAM_USER_HOME
|
||||
value: $(params.userHome)
|
||||
- name: WORKSPACE_OUTPUT_PATH
|
||||
value: $(workspaces.output.path)
|
||||
- name: WORKSPACE_SSH_DIRECTORY_BOUND
|
||||
value: $(workspaces.ssh-directory.bound)
|
||||
- name: WORKSPACE_SSH_DIRECTORY_PATH
|
||||
value: $(workspaces.ssh-directory.path)
|
||||
- name: WORKSPACE_BASIC_AUTH_DIRECTORY_BOUND
|
||||
value: $(workspaces.basic-auth.bound)
|
||||
- name: WORKSPACE_BASIC_AUTH_DIRECTORY_PATH
|
||||
value: $(workspaces.basic-auth.path)
|
||||
- name: WORKSPACE_SSL_CA_DIRECTORY_BOUND
|
||||
value: $(workspaces.ssl-ca-directory.bound)
|
||||
- name: WORKSPACE_SSL_CA_DIRECTORY_PATH
|
||||
value: $(workspaces.ssl-ca-directory.path)
|
||||
securityContext:
|
||||
runAsNonRoot: true
|
||||
runAsUser: 65532
|
||||
script: |
|
||||
#!/usr/bin/env sh
|
||||
set -eu
|
||||
|
||||
if [ "${PARAM_VERBOSE}" = "true" ] ; then
|
||||
set -x
|
||||
fi
|
||||
|
||||
|
||||
if [ "${WORKSPACE_BASIC_AUTH_DIRECTORY_BOUND}" = "true" ] ; then
|
||||
cp "${WORKSPACE_BASIC_AUTH_DIRECTORY_PATH}/.git-credentials" "${PARAM_USER_HOME}/.git-credentials"
|
||||
cp "${WORKSPACE_BASIC_AUTH_DIRECTORY_PATH}/.gitconfig" "${PARAM_USER_HOME}/.gitconfig"
|
||||
chmod 400 "${PARAM_USER_HOME}/.git-credentials"
|
||||
chmod 400 "${PARAM_USER_HOME}/.gitconfig"
|
||||
fi
|
||||
|
||||
if [ "${WORKSPACE_SSH_DIRECTORY_BOUND}" = "true" ] ; then
|
||||
cp -R "${WORKSPACE_SSH_DIRECTORY_PATH}" "${PARAM_USER_HOME}"/.ssh
|
||||
chmod 700 "${PARAM_USER_HOME}"/.ssh
|
||||
chmod -R 400 "${PARAM_USER_HOME}"/.ssh/*
|
||||
fi
|
||||
|
||||
if [ "${WORKSPACE_SSL_CA_DIRECTORY_BOUND}" = "true" ] ; then
|
||||
export GIT_SSL_CAPATH="${WORKSPACE_SSL_CA_DIRECTORY_PATH}"
|
||||
if [ "${PARAM_CRT_FILENAME}" != "" ] ; then
|
||||
export GIT_SSL_CAINFO="${WORKSPACE_SSL_CA_DIRECTORY_PATH}/${PARAM_CRT_FILENAME}"
|
||||
fi
|
||||
fi
|
||||
CHECKOUT_DIR="${WORKSPACE_OUTPUT_PATH}/${PARAM_SUBDIRECTORY}"
|
||||
|
||||
cleandir() {
|
||||
# Delete any existing contents of the repo directory if it exists.
|
||||
#
|
||||
# We don't just "rm -rf ${CHECKOUT_DIR}" because ${CHECKOUT_DIR} might be "/"
|
||||
# or the root of a mounted volume.
|
||||
if [ -d "${CHECKOUT_DIR}" ] ; then
|
||||
# Delete non-hidden files and directories
|
||||
rm -rf "${CHECKOUT_DIR:?}"/*
|
||||
# Delete files and directories starting with . but excluding ..
|
||||
rm -rf "${CHECKOUT_DIR}"/.[!.]*
|
||||
# Delete files and directories starting with .. plus any other character
|
||||
rm -rf "${CHECKOUT_DIR}"/..?*
|
||||
fi
|
||||
}
|
||||
|
||||
if [ "${PARAM_DELETE_EXISTING}" = "true" ] ; then
|
||||
cleandir
|
||||
fi
|
||||
|
||||
test -z "${PARAM_HTTP_PROXY}" || export HTTP_PROXY="${PARAM_HTTP_PROXY}"
|
||||
test -z "${PARAM_HTTPS_PROXY}" || export HTTPS_PROXY="${PARAM_HTTPS_PROXY}"
|
||||
test -z "${PARAM_NO_PROXY}" || export NO_PROXY="${PARAM_NO_PROXY}"
|
||||
|
||||
/ko-app/git-init \
|
||||
-url="${PARAM_URL}" \
|
||||
-revision="${PARAM_REVISION}" \
|
||||
-refspec="${PARAM_REFSPEC}" \
|
||||
-path="${CHECKOUT_DIR}" \
|
||||
-sslVerify="${PARAM_SSL_VERIFY}" \
|
||||
-submodules="${PARAM_SUBMODULES}" \
|
||||
-depth="${PARAM_DEPTH}" \
|
||||
-sparseCheckoutDirectories="${PARAM_SPARSE_CHECKOUT_DIRECTORIES}"
|
||||
cd "${CHECKOUT_DIR}"
|
||||
RESULT_SHA="$(git rev-parse HEAD)"
|
||||
EXIT_CODE="$?"
|
||||
if [ "${EXIT_CODE}" != 0 ] ; then
|
||||
exit "${EXIT_CODE}"
|
||||
fi
|
||||
printf "%s" "${RESULT_SHA}" > "$(results.commit.path)"
|
||||
printf "%s" "${PARAM_URL}" > "$(results.url.path)"
|
60
cicd/templates/dep/helm-upgrade-from-source.yaml
Normal file
60
cicd/templates/dep/helm-upgrade-from-source.yaml
Normal file
@ -0,0 +1,60 @@
|
||||
apiVersion: tekton.dev/v1beta1
|
||||
kind: Task
|
||||
metadata:
|
||||
name: helm-upgrade-from-source
|
||||
labels:
|
||||
app.kubernetes.io/version: "0.3"
|
||||
annotations:
|
||||
tekton.dev/pipelines.minVersion: "0.12.1"
|
||||
tekton.dev/categories: Deployment
|
||||
tekton.dev/tags: helm
|
||||
tekton.dev/platforms: "linux/amd64,linux/s390x,linux/ppc64le,linux/arm64"
|
||||
spec:
|
||||
description: >-
|
||||
These tasks will install / upgrade a helm chart into your Kubernetes /
|
||||
OpenShift Cluster using Helm
|
||||
|
||||
params:
|
||||
- name: charts_dir
|
||||
description: The directory in source that contains the helm chart
|
||||
- name: release_version
|
||||
description: The helm release version in semantic versioning format
|
||||
default: "v1.0.0"
|
||||
- name: release_name
|
||||
description: The helm release name
|
||||
default: "helm-release"
|
||||
- name: release_namespace
|
||||
description: The helm release namespace
|
||||
default: ""
|
||||
- name: overwrite_values
|
||||
description: "Specify the values you want to overwrite, comma separated: autoscaling.enabled=true,replicas=1"
|
||||
default: ""
|
||||
- name: values_file
|
||||
description: "The values file to be used"
|
||||
default: "values.yaml"
|
||||
- name: helm_image
|
||||
description: "helm image to be used"
|
||||
default: "docker.io/lachlanevenson/k8s-helm:v3.10.2" #tag: v3.6.0
|
||||
- name: upgrade_extra_params
|
||||
description: "Extra parameters passed for the helm upgrade command"
|
||||
default: ""
|
||||
workspaces:
|
||||
- name: source
|
||||
- name: kubeconfig-dir
|
||||
optional: true
|
||||
steps:
|
||||
- name: upgrade
|
||||
image: $(params.helm_image)
|
||||
workingDir: /workspace/source
|
||||
script: |
|
||||
echo "Setting up kubeconfig..."
|
||||
[[ "$(workspaces.kubeconfig-dir.bound)" == "true" ]] && \
|
||||
[[ -f $(workspaces.kubeconfig-dir.path)/kubeconfig ]] && \
|
||||
export KUBECONFIG=$(workspaces.kubeconfig-dir.path)/kubeconfig
|
||||
echo "Setting up variables..."
|
||||
release_name="$(echo '$(params.release_name)' | tr '[:upper:]' '[:lower:]')"
|
||||
echo "Release name: $release_name"
|
||||
echo "Getting helm dependencies..."
|
||||
helm dependency build "$(params.charts_dir)"
|
||||
echo "installing helm chart..."
|
||||
helm upgrade --install --wait --values "$(params.charts_dir)/$(params.values_file)" --namespace "$(params.release_namespace)" --version "$(params.release_version)" "$release_name" "$(params.charts_dir)" --debug --set "$(params.overwrite_values)" $(params.upgrade_extra_params)
|
54
cicd/templates/dep/kubernetes-action.yaml
Normal file
54
cicd/templates/dep/kubernetes-action.yaml
Normal file
@ -0,0 +1,54 @@
|
||||
apiVersion: tekton.dev/v1beta1
|
||||
kind: Task
|
||||
metadata:
|
||||
name: kubernetes-actions
|
||||
labels:
|
||||
app.kubernetes.io/version: "0.2"
|
||||
annotations:
|
||||
tekton.dev/pipelines.minVersion: "0.17.0"
|
||||
tekton.dev/categories: Kubernetes
|
||||
tekton.dev/tags: CLI, kubectl
|
||||
tekton.dev/displayName: "kubernetes actions"
|
||||
tekton.dev/platforms: "linux/amd64"
|
||||
spec:
|
||||
description: >-
|
||||
This task is the generic kubectl CLI task which can be used
|
||||
to run all kinds of k8s commands
|
||||
workspaces:
|
||||
- name: manifest-dir
|
||||
optional: true
|
||||
- name: kubeconfig-dir
|
||||
optional: true
|
||||
results:
|
||||
- name: output-result
|
||||
description: some result can be emitted if someone wants to.
|
||||
params:
|
||||
- name: script
|
||||
description: The Kubernetes CLI script to run
|
||||
type: string
|
||||
default: "kubectl $@"
|
||||
- name: args
|
||||
description: The Kubernetes CLI arguments to run
|
||||
type: array
|
||||
default:
|
||||
- "help"
|
||||
- name: image
|
||||
default: gcr.io/cloud-builders/kubectl@sha256:8ab94be8b2b4f3d117f02d868b39540fddd225447abf4014f7ba4765cb39f753 #image is huge
|
||||
description: Kubectl wrapper image
|
||||
steps:
|
||||
- name: kubectl
|
||||
image: $(params.image)
|
||||
script: |
|
||||
#!/usr/bin/env bash
|
||||
|
||||
[[ "$(workspaces.manifest-dir.bound)" == "true" ]] && \
|
||||
cd $(workspaces.manifest-dir.path)
|
||||
|
||||
[[ "$(workspaces.kubeconfig-dir.bound)" == "true" ]] && \
|
||||
[[ -f $(workspaces.kubeconfig-dir.path)/kubeconfig ]] && \
|
||||
export KUBECONFIG=$(workspaces.kubeconfig-dir.path)/kubeconfig
|
||||
|
||||
$(params.script)
|
||||
|
||||
args:
|
||||
- "$(params.args)"
|
179
cicd/templates/dep/sonarqube.yaml
Normal file
179
cicd/templates/dep/sonarqube.yaml
Normal file
@ -0,0 +1,179 @@
|
||||
apiVersion: tekton.dev/v1beta1
|
||||
kind: Task
|
||||
metadata:
|
||||
name: sonarqube-scanner
|
||||
labels:
|
||||
app.kubernetes.io/version: "0.5"
|
||||
annotations:
|
||||
tekton.dev/pipelines.minVersion: "0.17.0"
|
||||
tekton.dev/categories: Security
|
||||
tekton.dev/tags: security
|
||||
tekton.dev/displayName: "sonarqube scanner"
|
||||
tekton.dev/platforms: "linux/amd64"
|
||||
spec:
|
||||
description: >-
|
||||
The following task can be used to perform static analysis on the source code
|
||||
provided the SonarQube server is hosted
|
||||
|
||||
SonarQube is the leading tool for continuously inspecting the Code Quality and Security
|
||||
of your codebases, all while empowering development teams. Analyze over 25 popular
|
||||
programming languages including C#, VB.Net, JavaScript, TypeScript and C++. It detects
|
||||
bugs, vulnerabilities and code smells across project branches and pull requests.
|
||||
This version has been tweeked in order to handle the token authentication method.
|
||||
|
||||
workspaces:
|
||||
- name: source
|
||||
description: "Workspace containing the code which needs to be scanned by SonarQube"
|
||||
- name: sonar-settings
|
||||
description: "Optional workspace where SonarQube properties can be mounted"
|
||||
optional: true
|
||||
- name: sonar-credentials
|
||||
description: |
|
||||
A workspace containing a login or password for use within sonarqube.
|
||||
optional: true
|
||||
params:
|
||||
- name: SONAR_HOST_URL
|
||||
description: SonarQube server URL
|
||||
default: ""
|
||||
- name: SONAR_PROJECT_KEY
|
||||
description: Project's unique key
|
||||
default: ""
|
||||
- name: PROJECT_VERSION
|
||||
description: "Version of the project. Default: 1.0"
|
||||
default: "1.0"
|
||||
- name: SOURCE_TO_SCAN
|
||||
description: "Comma-separated paths to directories containing main source files"
|
||||
default: "."
|
||||
- name: SONAR_ORGANIZATION
|
||||
description: "The organization in sonarqube where the project exists"
|
||||
default: ""
|
||||
- name: SONAR_SCANNER_IMAGE
|
||||
description: "The sonarqube scanner CLI image which will run the scan"
|
||||
default: "docker.io/sonarsource/sonar-scanner-cli:4.6@sha256:7a976330a8bad1beca6584c1c118e946e7a25fdc5b664d5c0a869a6577d81b4f"
|
||||
- name: SONAR_LOGIN_KEY
|
||||
description: Name of the file of the login within the sonarqube credentials workspace
|
||||
default: "login"
|
||||
- name: SONAR_PASSWORD_KEY
|
||||
description: Name of the file of the password within the sonarqube credentials workspace
|
||||
default: "password"
|
||||
- name: SONAR_TOKEN_KEY
|
||||
description: Name of the file of the token within the sonarqube credentials workspace
|
||||
default: "token"
|
||||
steps:
|
||||
- name: sonar-properties-create
|
||||
image: registry.access.redhat.com/ubi8/ubi-minimal:8.2
|
||||
workingDir: $(workspaces.source.path)
|
||||
env:
|
||||
- name: SONAR_HOST_URL
|
||||
value: $(params.SONAR_HOST_URL)
|
||||
- name: SONAR_PROJECT_KEY
|
||||
value: $(params.SONAR_PROJECT_KEY)
|
||||
- name: PROJECT_VERSION
|
||||
value: $(params.PROJECT_VERSION)
|
||||
- name: SOURCE_TO_SCAN
|
||||
value: $(params.SOURCE_TO_SCAN)
|
||||
- name: SONAR_ORGANIZATION
|
||||
value: $(params.SONAR_ORGANIZATION)
|
||||
script: |
|
||||
#!/usr/bin/env bash
|
||||
|
||||
replaceValues() {
|
||||
filename=$1
|
||||
thekey=$2
|
||||
newvalue=$3
|
||||
|
||||
if ! grep -R "^[#]*\s*${thekey}=.*" $filename >/dev/null; then
|
||||
echo "APPENDING because '${thekey}' not found"
|
||||
echo "" >>$filename
|
||||
echo "$thekey=$newvalue" >>$filename
|
||||
else
|
||||
echo "SETTING because '${thekey}' found already"
|
||||
sed -ir "s|^[#]*\s*${thekey}=.*|$thekey=$newvalue|" $filename
|
||||
fi
|
||||
}
|
||||
|
||||
if [[ "$(workspaces.sonar-settings.bound)" == "true" ]]; then
|
||||
if [[ -f $(workspaces.sonar-settings.path)/sonar-project.properties ]]; then
|
||||
echo "using user provided sonar-project.properties file"
|
||||
cp -RL $(workspaces.sonar-settings.path)/sonar-project.properties $(workspaces.source.path)/sonar-project.properties
|
||||
fi
|
||||
fi
|
||||
|
||||
if [[ -f $(workspaces.source.path)/sonar-project.properties ]]; then
|
||||
if [[ -n "${SONAR_HOST_URL}" ]]; then
|
||||
echo "replacing sonar host URL"
|
||||
replaceValues $(workspaces.source.path)/sonar-project.properties sonar.host.url "${SONAR_HOST_URL}"
|
||||
fi
|
||||
if [[ -n "${SONAR_PROJECT_KEY}" ]]; then
|
||||
echo "replacing sonar project key"
|
||||
replaceValues $(workspaces.source.path)/sonar-project.properties sonar.projectKey "${SONAR_PROJECT_KEY}"
|
||||
fi
|
||||
echo "Values in sonar-project.properties file replaced successfully..."
|
||||
else
|
||||
echo "Creating sonar-project.properties file..."
|
||||
touch sonar-project.properties
|
||||
[[ -n "${SONAR_PROJECT_KEY}" ]] && {
|
||||
echo "sonar.projectKey=${SONAR_PROJECT_KEY}" >> sonar-project.properties
|
||||
} || {
|
||||
echo "missing property SONAR_PROJECT_KEY"
|
||||
exit 1
|
||||
}
|
||||
|
||||
[[ -n "${SONAR_HOST_URL}" ]] && {
|
||||
echo "sonar.host.url=${SONAR_HOST_URL}" >> sonar-project.properties
|
||||
} || {
|
||||
echo "missing property SONAR_HOST_URL"
|
||||
exit 1
|
||||
}
|
||||
|
||||
[[ -n "${PROJECT_VERSION}" ]] && {
|
||||
echo "sonar.projectVersion=${PROJECT_VERSION}" >> sonar-project.properties
|
||||
} || {
|
||||
echo "missing property PROJECT_VERSION"
|
||||
exit 1
|
||||
}
|
||||
|
||||
[[ -n "${SONAR_ORGANIZATION}" ]] && {
|
||||
echo "sonar.organization=${SONAR_ORGANIZATION}" >> sonar-project.properties
|
||||
} || {
|
||||
echo "missing property SONAR_ORGANIZATION"
|
||||
exit 1
|
||||
}
|
||||
echo "sonar.sources=${SOURCE_TO_SCAN}" >> sonar-project.properties
|
||||
echo "---------------------------"
|
||||
cat $(workspaces.source.path)/sonar-project.properties
|
||||
fi
|
||||
|
||||
if [[ "$(workspaces.sonar-credentials.bound)" == "true" ]]; then
|
||||
if [[ -f $(workspaces.sonar-credentials.path)/$(params.SONAR_PASSWORD_KEY) ]]; then
|
||||
SONAR_PASSWORD=`cat $(workspaces.sonar-credentials.path)/$(params.SONAR_PASSWORD_KEY)`
|
||||
replaceValues $(workspaces.source.path)/sonar-project.properties sonar.password "${SONAR_PASSWORD}"
|
||||
fi
|
||||
if [[ -f $(workspaces.sonar-credentials.path)/$(params.SONAR_LOGIN_KEY) ]]; then
|
||||
SONAR_LOGIN=`cat $(workspaces.sonar-credentials.path)/$(params.SONAR_LOGIN_KEY)`
|
||||
replaceValues $(workspaces.source.path)/sonar-project.properties sonar.login "${SONAR_LOGIN}"
|
||||
fi
|
||||
if [[ -f $(workspaces.sonar-credentials.path)/$(params.SONAR_TOKEN_KEY) ]]; then
|
||||
SONAR_TOKEN=`cat $(workspaces.sonar-credentials.path)/$(params.SONAR_TOKEN_KEY)`
|
||||
replaceValues $(workspaces.source.path)/sonar-project.properties sonar.token "${SONAR_TOKEN}"
|
||||
replaceValues $(workspaces.source.path)/sonar-project.properties sonar.login "${SONAR_TOKEN}"
|
||||
fi
|
||||
fi
|
||||
{{- if .Values.config.sonarqube.additionalScript.enabled}}
|
||||
- name: prepare-cli
|
||||
image: {{ .Values.config.sonarqube.additionalScript.image}}
|
||||
workingDir: $(workspaces.source.path)
|
||||
command:
|
||||
- /bin/sh
|
||||
args:
|
||||
- -c
|
||||
- |
|
||||
{{- .Values.config.sonarqube.additionalScript.script | nindent 10}}
|
||||
{{- end}}
|
||||
- name: sonar-scan
|
||||
image: $(params.SONAR_SCANNER_IMAGE)
|
||||
workingDir: $(workspaces.source.path)
|
||||
command:
|
||||
- sonar-scanner
|
||||
|
||||
# TODO: mise en place result https://tekton.dev/docs/pipelines/tasks/#emitting-results https://tekton.dev/docs/pipelines/pipelines/#adding-finally-to-the-pipeline
|
56
cicd/templates/dep/task.build.yaml
Normal file
56
cicd/templates/dep/task.build.yaml
Normal file
@ -0,0 +1,56 @@
|
||||
apiVersion: tekton.dev/v1beta1
|
||||
kind: Task
|
||||
metadata:
|
||||
name: build
|
||||
spec:
|
||||
description: |
|
||||
This task builds all dockerfile in a repo based on a yaml file.
|
||||
workspaces:
|
||||
- name: shared-data
|
||||
description: |
|
||||
This workspace contains the cloned repo files, so they can be read by the
|
||||
next task.
|
||||
- name: dockerconfig
|
||||
description: |
|
||||
This workspace contains the docker config.json file, so it can be used by
|
||||
the next task.
|
||||
params:
|
||||
- name: registrydns
|
||||
type: string
|
||||
description: The registry dns name.
|
||||
default: harbor.weebo.fr
|
||||
- name: buildctl_tcp
|
||||
type: string
|
||||
description: The buildctl tcp address.
|
||||
default: tcp://buildkitd.buildkit.svc.cluster.local:1234
|
||||
- name: repo-branch
|
||||
type: string
|
||||
description: The git repo branch to clone from.
|
||||
default: main
|
||||
- name: path-dockerfile
|
||||
type: string
|
||||
description: The folder where the dockerfile are.
|
||||
default: .
|
||||
- name: context-dockerfile
|
||||
type: string
|
||||
description: The context where the dockerfile are.
|
||||
default: .
|
||||
- name: DOCKERFILE
|
||||
type: string
|
||||
description: The dockerfile to build.
|
||||
default: Dockerfile
|
||||
- name: IMAGE
|
||||
type: string
|
||||
description: The image name to build (repo/imagename).
|
||||
steps:
|
||||
- image: harbor.weebo.fr/cache/moby/buildkit:v0.11.4
|
||||
name: build-all
|
||||
env:
|
||||
- name: DOCKER_CONFIG
|
||||
value: $(workspaces.dockerconfig.path)
|
||||
workingDir: $(workspaces.shared-data.path)
|
||||
script: |
|
||||
#!/usr/bin/env ash
|
||||
buildctl --addr $(params.buildctl_tcp) build --progress=plain --frontend dockerfile.v0 --local context=$(params.context-dockerfile) --local dockerfile=$(params.path-dockerfile) --opt filename=$(params.DOCKERFILE) --output type=image,name=$(params.registrydns)/$(params.IMAGE):$(params.repo-branch),push=true
|
||||
|
||||
# https://tekton.dev/docs/pipelines/tasks/#specifying-workspaces
|
34
cicd/templates/eventListener.yaml
Normal file
34
cicd/templates/eventListener.yaml
Normal file
@ -0,0 +1,34 @@
|
||||
apiVersion: triggers.tekton.dev/v1alpha1
|
||||
kind: EventListener
|
||||
metadata:
|
||||
name: {{.Values.config.prefix}}-event-listener
|
||||
spec:
|
||||
serviceAccountName: {{.Values.config.prefix}}-sa
|
||||
triggers:
|
||||
- name: {{.Values.config.prefix}}-trigger
|
||||
interceptors:
|
||||
- ref:
|
||||
name: "gitea"
|
||||
kind: ClusterInterceptor
|
||||
apiVersion: triggers.tekton.dev
|
||||
params:
|
||||
- name: secretRef
|
||||
value:
|
||||
secretName: {{.Values.config.prefix}}-gitea-secret
|
||||
secretKey: secretToken
|
||||
- name: eventTypes
|
||||
value:
|
||||
- push
|
||||
- ref:
|
||||
name: "cel"
|
||||
params:
|
||||
- name: filter
|
||||
value: "body.ref.startsWith('refs/heads/')"
|
||||
- name: overlays
|
||||
value:
|
||||
- key: branch_name
|
||||
expression: "body.ref.split('/')[2]"
|
||||
bindings:
|
||||
- ref: {{.Values.config.prefix}}-trigger-binding
|
||||
template:
|
||||
ref: {{.Values.config.prefix}}-pipeline-template
|
20
cicd/templates/ingress.yaml
Normal file
20
cicd/templates/ingress.yaml
Normal file
@ -0,0 +1,20 @@
|
||||
apiVersion: networking.k8s.io/v1
|
||||
kind: Ingress
|
||||
metadata:
|
||||
name: "{{.Values.config.prefix}}-webhook"
|
||||
annotations:
|
||||
nginx.ingress.kubernetes.io/ssl-redirect: "false"
|
||||
haproxy-ingress.github.io/ssl-redirect: "false"
|
||||
kubernetes.io/ingress.class: "{{.Values.config.ingress.class}}"
|
||||
spec:
|
||||
rules:
|
||||
- host: "{{.Values.config.ingress.domain}}"
|
||||
http:
|
||||
paths:
|
||||
- path: "/{{.Values.config.name}}/{{.Values.config.prefix}}"
|
||||
pathType: Exact
|
||||
backend:
|
||||
service:
|
||||
name: "el-{{.Values.config.prefix}}-event-listener"
|
||||
port:
|
||||
number: 8080
|
43
cicd/templates/job-kubeconfig.yaml
Normal file
43
cicd/templates/job-kubeconfig.yaml
Normal file
@ -0,0 +1,43 @@
|
||||
apiVersion: batch/v1
|
||||
kind: CronJob
|
||||
metadata:
|
||||
name: "terra-job"
|
||||
labels:
|
||||
app.kubernetes.io/managed-by: "{{ .Release.Service }}"
|
||||
app.kubernetes.io/instance: "{{ .Release.Name }}"
|
||||
app.kubernetes.io/version: "{{ .Chart.AppVersion }}"
|
||||
helm.sh/chart: "{{ .Chart.Name }}-{{ .Chart.Version }}"
|
||||
spec:
|
||||
schedule: "0 0 1 * *"
|
||||
jobTemplate:
|
||||
spec:
|
||||
template:
|
||||
metadata:
|
||||
name: "{{ .Release.Name }}"
|
||||
labels:
|
||||
app.kubernetes.io/managed-by: "{{ .Release.Service }}"
|
||||
app.kubernetes.io/instance: "{{ .Release.Name }}"
|
||||
helm.sh/chart: "{{ .Chart.Name }}-{{ .Chart.Version }}"
|
||||
spec:
|
||||
restartPolicy: Never
|
||||
serviceAccountName: "{{.Values.config.prefix}}-sa"
|
||||
containers:
|
||||
- name: apply-terraform
|
||||
image: hashicorp/terraform:latest
|
||||
imagePullPolicy: IfNotPresent
|
||||
command:
|
||||
- /bin/sh
|
||||
- -c
|
||||
- cd /terraform && touch anotherNAmeThatsoudnothing.tf && rm *.tf && cp /app/*.tf . && terraform init && terraform apply -auto-approve
|
||||
volumeMounts:
|
||||
- name: terra-job
|
||||
mountPath: /terraform
|
||||
- name: terraform-sa
|
||||
mountPath: /app/
|
||||
volumes:
|
||||
- name: terra-job
|
||||
persistentVolumeClaim:
|
||||
claimName: terra-job
|
||||
- name: terraform-sa
|
||||
configMap:
|
||||
name: terraform-sa
|
11
cicd/templates/job-volume.yaml
Normal file
11
cicd/templates/job-volume.yaml
Normal file
@ -0,0 +1,11 @@
|
||||
kind: PersistentVolumeClaim
|
||||
apiVersion: v1
|
||||
metadata:
|
||||
name: terra-job
|
||||
spec:
|
||||
accessModes:
|
||||
- ReadWriteOnce
|
||||
resources:
|
||||
requests:
|
||||
storage: 1Gi
|
||||
storageClassName: local-path
|
111
cicd/templates/pipeline.yaml
Normal file
111
cicd/templates/pipeline.yaml
Normal file
@ -0,0 +1,111 @@
|
||||
apiVersion: tekton.dev/v1beta1
|
||||
kind: Pipeline
|
||||
metadata:
|
||||
name: {{.Values.config.prefix}}-pipeline
|
||||
spec:
|
||||
## TODO https://tekton.dev/docs/pipelines/pipelines/#using-execution-status-of-pipelinetask
|
||||
description: |
|
||||
This pipeline builds batleforc template-rust.
|
||||
params:
|
||||
- name: repo-url
|
||||
type: string
|
||||
description: The git repo URL to clone from.
|
||||
- name: repo-branch
|
||||
type: string
|
||||
default: main
|
||||
description: The git repo branch to clone from.
|
||||
- name: repo-revision
|
||||
type: string
|
||||
default: main
|
||||
description: The git repo revision to clone from.
|
||||
workspaces:
|
||||
- name: shared-data
|
||||
description: |
|
||||
This workspace contains the cloned repo files, so they can be read by the
|
||||
next task.
|
||||
- name: dockerconfig
|
||||
description: |
|
||||
This workspace contains the docker config.json file, so it can be used by
|
||||
the next task.
|
||||
- name: kubeconfig
|
||||
description: |
|
||||
This workspace contains the kubeconfig file, it define the namespace to rollout.
|
||||
{{- if .Values.config.sonarqube.useToken }}
|
||||
- name: sonarqube
|
||||
description: |
|
||||
This workspace contains the sonarqube credentials.
|
||||
{{- end }}
|
||||
tasks:
|
||||
- name: fetch-source
|
||||
taskRef:
|
||||
name: git-clone
|
||||
workspaces:
|
||||
- name: output
|
||||
workspace: shared-data
|
||||
params:
|
||||
- name: url
|
||||
value: $(params.repo-url)
|
||||
- name: revision
|
||||
value: $(params.repo-revision)
|
||||
- name: build-docker
|
||||
runAfter: ["fetch-source"]
|
||||
taskRef:
|
||||
name: build
|
||||
workspaces:
|
||||
- name: shared-data
|
||||
workspace: shared-data
|
||||
- name: dockerconfig
|
||||
workspace: dockerconfig
|
||||
params:
|
||||
- name: path-dockerfile
|
||||
value: .
|
||||
- name: context-dockerfile
|
||||
value: .
|
||||
- name: IMAGE
|
||||
value: {{.Values.config.registry.imageName}}
|
||||
- name: repo-branch
|
||||
value: $(params.repo-branch)
|
||||
{{ if .Values.config.sonarqube.enabled }}
|
||||
- name: sonarqube-scan
|
||||
runAfter: ["build-docker"]
|
||||
taskRef:
|
||||
name: sonarqube-scanner
|
||||
workspaces:
|
||||
- name: source
|
||||
workspace: shared-data
|
||||
{{ if .Values.config.sonarqube.useToken }}
|
||||
- name: sonar-credentials
|
||||
workspace: sonarqube
|
||||
{{ end }}
|
||||
params:
|
||||
- name: SONAR_HOST_URL
|
||||
value: {{.Values.config.sonarqube.host}}
|
||||
- name: SONAR_SCANNER_IMAGE
|
||||
value: {{.Values.config.sonarqube.image}}
|
||||
{{ if .Values.config.sonarqube.useToken }}
|
||||
- name: SONAR_TOKEN_KEY
|
||||
value: token
|
||||
{{ end }}
|
||||
{{ end }}
|
||||
- name: helm-upgrade
|
||||
{{ if .Values.config.sonarqube.enabled }}
|
||||
runAfter: ["sonarqube-scan"]
|
||||
{{ else }}
|
||||
runAfter: ["build-docker"]
|
||||
{{ end }}
|
||||
taskRef:
|
||||
name: helm-upgrade-from-source
|
||||
workspaces:
|
||||
- name: source
|
||||
workspace: shared-data
|
||||
- name: kubeconfig-dir
|
||||
workspace: kubeconfig
|
||||
params:
|
||||
- name: charts_dir
|
||||
value: ./chart
|
||||
- name: release_name
|
||||
value: $(params.repo-branch)
|
||||
- name: release_namespace
|
||||
value: {{.Release.Namespace}}
|
||||
- name: overwrite_values
|
||||
value: "image.tag=$(params.repo-branch)"
|
74
cicd/templates/rbac.yaml
Normal file
74
cicd/templates/rbac.yaml
Normal file
@ -0,0 +1,74 @@
|
||||
apiVersion: v1
|
||||
kind: ServiceAccount
|
||||
metadata:
|
||||
name: {{.Values.config.prefix}}-sa
|
||||
---
|
||||
apiVersion: rbac.authorization.k8s.io/v1
|
||||
kind: Role
|
||||
metadata:
|
||||
name: {{.Values.config.prefix}}-sa
|
||||
rules:
|
||||
- apiGroups: ["apps"]
|
||||
resources: ["deployments", "statefulsets", "daemonsets", "replicasets"]
|
||||
verbs: ["get", "list", "watch", "create", "update", "patch", "delete"]
|
||||
- apiGroups: [""]
|
||||
resources: ["secrets"]
|
||||
verbs: ["get", "list", "watch", "create", "update", "patch", "delete"]
|
||||
- apiGroups: [""]
|
||||
resources: ["configmaps"]
|
||||
verbs: ["get", "list", "watch", "create", "update", "patch", "delete"]
|
||||
- apiGroups: [""]
|
||||
resources: ["services"]
|
||||
verbs: ["get", "list", "watch", "create", "update", "patch", "delete"]
|
||||
- apiGroups: ["networking.k8s.io"]
|
||||
resources: ["ingresses"]
|
||||
verbs: ["get", "list", "watch", "create", "update", "patch", "delete"]
|
||||
- apiGroups: [""]
|
||||
resources: ["pods"]
|
||||
verbs: ["get", "list", "watch", "create", "update", "patch", "delete"]
|
||||
---
|
||||
apiVersion: rbac.authorization.k8s.io/v1
|
||||
kind: RoleBinding
|
||||
metadata:
|
||||
name: {{.Values.config.prefix}}-sa
|
||||
roleRef:
|
||||
apiGroup: rbac.authorization.k8s.io
|
||||
kind: Role
|
||||
name: {{.Values.config.prefix}}-sa
|
||||
subjects:
|
||||
- kind: ServiceAccount
|
||||
name: {{.Values.config.prefix}}-sa
|
||||
---
|
||||
apiVersion: rbac.authorization.k8s.io/v1
|
||||
kind: RoleBinding
|
||||
metadata:
|
||||
name: {{.Values.config.prefix}}-sa-binding-2
|
||||
subjects:
|
||||
- kind: ServiceAccount
|
||||
name: {{.Values.config.prefix}}-sa
|
||||
namespace: {{.Release.Namespace}}
|
||||
roleRef:
|
||||
apiGroup: rbac.authorization.k8s.io
|
||||
kind: ClusterRole
|
||||
name: tekton-triggers-eventlistener-roles
|
||||
---
|
||||
apiVersion: rbac.authorization.k8s.io/v1
|
||||
kind: ClusterRoleBinding
|
||||
metadata:
|
||||
name: {{.Values.config.prefix}}-sa-clusterbinding
|
||||
subjects:
|
||||
- kind: ServiceAccount
|
||||
name: {{.Values.config.prefix}}-sa
|
||||
namespace: {{.Release.Namespace}}
|
||||
roleRef:
|
||||
apiGroup: rbac.authorization.k8s.io
|
||||
kind: ClusterRole
|
||||
name: tekton-triggers-eventlistener-clusterroles
|
||||
---
|
||||
apiVersion: v1
|
||||
kind: Secret
|
||||
metadata:
|
||||
name: {{.Values.config.prefix}}-sa
|
||||
annotations:
|
||||
kubernetes.io/service-account.name: {{.Values.config.prefix}}-sa
|
||||
type: kubernetes.io/service-account-token
|
61
cicd/templates/terraform-sa.yaml
Normal file
61
cicd/templates/terraform-sa.yaml
Normal file
@ -0,0 +1,61 @@
|
||||
# Configmap containing Terraform file
|
||||
apiVersion: v1
|
||||
kind: ConfigMap
|
||||
metadata:
|
||||
name: terraform-sa
|
||||
data:
|
||||
main.tf: |
|
||||
terraform {
|
||||
required_providers {
|
||||
harbor = {
|
||||
source = "goharbor/harbor"
|
||||
version = "3.9.4"
|
||||
}
|
||||
kubernetes = {
|
||||
source = "hashicorp/kubernetes"
|
||||
version = "2.22.0"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
variable "kubepath" {
|
||||
type = string
|
||||
default = "/var/run/secrets/kubernetes.io/serviceaccount"
|
||||
}
|
||||
|
||||
provider "kubernetes" {
|
||||
host = "https://kubernetes.default.svc"
|
||||
token = file("${var.kubepath}/token")
|
||||
cluster_ca_certificate = file("${var.kubepath}/ca.crt")
|
||||
}
|
||||
|
||||
resource "kubernetes_secret_v1" "kubeconfig" {
|
||||
metadata {
|
||||
name = "kubeconfig"
|
||||
namespace = "{{.Release.Namespace}}"
|
||||
}
|
||||
data = {
|
||||
"kubeconfig" = <<EOF
|
||||
apiVersion: v1
|
||||
kind: Config
|
||||
clusters:
|
||||
- name: tpl
|
||||
cluster:
|
||||
server: https://kubernetes.default.svc
|
||||
certificate-authority-data: >-
|
||||
${base64encode(file("${var.kubepath}/ca.crt"))}
|
||||
users:
|
||||
- name: tpl
|
||||
user:
|
||||
token: >-
|
||||
${file("${var.kubepath}/token")}
|
||||
contexts:
|
||||
- name: tpl
|
||||
context:
|
||||
user: tpl
|
||||
cluster: tpl
|
||||
namespace: {{.Release.Namespace}}
|
||||
current-context: tpl
|
||||
EOF
|
||||
}
|
||||
}
|
12
cicd/templates/triggerBinding.yaml
Normal file
12
cicd/templates/triggerBinding.yaml
Normal file
@ -0,0 +1,12 @@
|
||||
apiVersion: triggers.tekton.dev/v1alpha1
|
||||
kind: TriggerBinding
|
||||
metadata:
|
||||
name: {{.Values.config.prefix}}-trigger-binding
|
||||
spec:
|
||||
params:
|
||||
- name: gitrepositoryurl
|
||||
value: $(body.repository.clone_url)
|
||||
- name: gitrevision
|
||||
value: $(body.head_commit.id)
|
||||
- name: gitbranch
|
||||
value: $(extensions.branch_name)
|
50
cicd/templates/triggerTemplate.yaml
Normal file
50
cicd/templates/triggerTemplate.yaml
Normal file
@ -0,0 +1,50 @@
|
||||
apiVersion: triggers.tekton.dev/v1alpha1
|
||||
kind: TriggerTemplate
|
||||
metadata:
|
||||
name: {{.Values.config.prefix}}-pipeline-template
|
||||
spec:
|
||||
params:
|
||||
- name: gitrevision
|
||||
description: The git revision (SHA)
|
||||
default: master
|
||||
- name: gitbranch
|
||||
description: The git branch
|
||||
default: master
|
||||
- name: gitrepositoryurl
|
||||
description: The git repository url ("https://github.com/batleforc/rust-template")
|
||||
resourcetemplates:
|
||||
- apiVersion: tekton.dev/v1beta1
|
||||
kind: PipelineRun
|
||||
metadata:
|
||||
generateName: {{.Values.config.prefix}}-pipeline-run-
|
||||
spec:
|
||||
pipelineRef:
|
||||
name: {{.Values.config.prefix}}-pipeline
|
||||
workspaces:
|
||||
- name: shared-data
|
||||
volumeClaimTemplate:
|
||||
spec:
|
||||
accessModes:
|
||||
- ReadWriteOnce
|
||||
resources:
|
||||
requests:
|
||||
storage: 2Gi
|
||||
storageClassName: local-path
|
||||
- name: dockerconfig
|
||||
secret:
|
||||
secretName: harbor-auth
|
||||
- name: kubeconfig
|
||||
secret:
|
||||
secretName: kubeconfig
|
||||
{{- if .Values.config.sonarqube.useToken }}
|
||||
- name: sonarqube
|
||||
secret:
|
||||
secretName: tpl-bu-sonarqube
|
||||
{{ end }}
|
||||
params:
|
||||
- name: repo-revision
|
||||
value: $(tt.params.gitrevision)
|
||||
- name: repo-branch
|
||||
value: $(tt.params.gitbranch)
|
||||
- name: repo-url
|
||||
value: $(tt.params.gitrepositoryurl)
|
24
cicd/values.yaml
Normal file
24
cicd/values.yaml
Normal file
@ -0,0 +1,24 @@
|
||||
config:
|
||||
prefix: botdiscord
|
||||
name: batleforc
|
||||
ingress:
|
||||
class: haproxy
|
||||
domain: webhook.weebo.fr
|
||||
registry:
|
||||
imageName: batleforc/botdiscord
|
||||
sonarqube:
|
||||
enabled: false
|
||||
host: https://qube.weebo.fr
|
||||
image: harbor.weebo.fr/sonar/rust:v1.17.12
|
||||
useToken: false
|
||||
additionalScript:
|
||||
enabled: false
|
||||
image: harbor.weebo.fr/sonar/rust:v1.17.12-prepare
|
||||
script: |
|
||||
set -x
|
||||
git config --global --add safe.directory /workspace/source
|
||||
git fetch --unshallow
|
||||
cargo clippy --message-format=json > clippy-report.json
|
||||
cargo audit --json > audit-report.json
|
||||
cargo outdated --depth 1 --format json > outdated-report.json
|
||||
cargo sonar --clippy --clippy-path clippy-report.json --audit --audit-path audit-report.json --outdated --outdated-path outdated-report.json
|
10
sonar-project.properties
Normal file
10
sonar-project.properties
Normal file
@ -0,0 +1,10 @@
|
||||
sonar.projectKey=BotDiscord
|
||||
sonar.projectname=botdiscord
|
||||
sonar.projectversion=1.0
|
||||
sonar.sources=.
|
||||
sonar.projectDescription=Bot Discord
|
||||
sonar.links.homepage=https://git.weebo.fr/sandbox/BotDiscord
|
||||
sonar.links.ci=https://cicd.weebo.fr/#/namespaces/bot-discord/pipelineruns
|
||||
sonar.externalIssuesReportPaths=sonar-issues.json
|
||||
#community.rust.clippy.reportPaths=clippy-report.json
|
||||
sonar.exclusions=deploy/**,compose.yaml,devfile.yaml,cog.toml
|
Loading…
Reference in New Issue
Block a user