chore(layout): project initialize and magicleaps manifests

Signed-off-by: 孙振宇 <>
This commit is contained in:
孙振宇 2024-12-30 17:43:50 +08:00
commit b1422e2913
17 changed files with 686 additions and 0 deletions

3
README.md Normal file
View File

@ -0,0 +1,3 @@
# Freeleaps Ops
> All GitOps relates manifests or scripts.

View File

View File

@ -0,0 +1,24 @@
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: magicleaps-alpha
namespace: freeleaps-devops-system
spec:
destination:
name: ''
namespace: magicleaps-alpha
server: https://kubernetes.default.svc
source:
path: masgicleaps/helm-pkg/magicleaps
repoURL: https://freeleaps@dev.azure.com/freeleaps/freeleaps-ops/_git/freeleaps-ops
targetRevision: HEAD
helm:
parameters: []
valueFiles:
- values.alpha.yaml
sources: []
project: magicleaps-alpha
syncPolicy:
automated:
prune: true
selfHeal: true

View File

@ -0,0 +1,10 @@
apiVersion: argoproj.io/v1alpha1
kind: AppProject
metadata:
name: magicleaps-alpha
namespace: freeleaps-devops-system
spec:
destinations:
- name: in-cluster
namespace: magicleaps-alpha
server: https://kubernetes.default.svc

141
magicleaps/alpha/ci/Jenkinsfile vendored Normal file
View File

@ -0,0 +1,141 @@
def REGISTRY_URL = 'docker.io'
def REPO_NAME = 'zhenyus'
def IMAGE_NAME = 'magicleaps'
def APP_NAME = 'magicleaps'
def TAG_PREFIX = 'snapshot'
def DOCKER_REGISTRY_SECRET = 'kaniko-secret'
pipeline {
agent any
stages {
stage('Checkout') {
steps {
git credentialsId: 'freeleaps-azure-dev', url: 'https://freeleaps@dev.azure.com/freeleaps/magicleaps/_git/magicleaps'
}
}
stage('Set Commit Hash') {
steps {
script {
def commitHash = sh(script: 'git rev-parse HEAD', returnStdout: true).trim()
def shortCommitHash = commitHash.take(7)
env.COMMIT_HASH = shortCommitHash
echo "Commit Hash: ${env.COMMIT_HASH}"
env.TRIGGERED_BRANCH = "${GIT_BRANCH}"
echo "Triggered Branch: ${env.TRIGGERED_BRANCH}"
}
}
}
stage('Build Docker Images For Each Components') {
matrix {
axes {
axis {
name 'COMPONENT'
values 'backend', 'frontend'
}
axis {
name 'ARCH'
values 'linux/amd64'
}
}
agent {
kubernetes {
defaultContainer 'kaniko'
yaml """
apiVersion: v1
kind: Pod
metadata:
labels:
freeleaps-devops-job: magicleaps-app-build
freeleaps-devops-app: magicleaps
spec:
containers:
- name: kaniko
image: gcr.io/kaniko-project/executor:debug
command:
- cat
tty: true
volumeMounts:
- name: kaniko-secret
mountPath: /kaniko/.docker/config.json
subPath: .dockerconfigjson
- name: workspace
mountPath: /workspace
volumes:
- name: kaniko-secret
secret:
secretName: kaniko-secret
- name: workspace
emptyDir: {}
"""
}
}
stages {
stage('Image Building') {
steps {
script {
def dockerfilePath = "${COMPONENT}/Dockerfile"
def arch = "${ARCH}"
def archTag = arch.replace('/', '-')
def targetImage = "${REGISTRY_URL}/${REPO_NAME}/${IMAGE_NAME}:${COMPONENT}-${TAG_PREFIX}-${COMMIT_HASH}-${archTag}"
echo "Building Docker image ${targetImage}..."
sh """
/kaniko/executor \
--dockerfile=${dockerfilePath} \
--context=${COMPONENT} \
--destination=${targetImage} \
--custom-platform=${ARCH} \
--skip-tls-verify=true \
--ignore-path=/product_uuid
"""
}
}
}
}
}
}
stage('Deploy with Argo CD') {
stages {
stage('Clone GitOps Manifests Repo') {
steps {
git credentialsId: 'freeleaps-azure-dev', url: 'https://freeleaps@dev.azure.com/freeleaps/freeleaps-ops/_git/freeleaps-ops'
}
}
stage('Automate Update Application Image Tag') {
steps {
script {
def triggeredBranch = "${TRIGGERED_BRANCH}"
if (triggeredBranch == 'origin/master') {
echo "Triggered branch is master, deploying to alpha..."
def valuesFile = APP_NAME + '/helm-pkg/' + APP_NAME + '/values.alpha.yaml'
def data = readYaml (file: valuesFile)
data.backend.image.tag = "backend-${TAG_PREFIX}-${env.COMMIT_HASH}-linux-amd64"
data.frontend.image.tag = "frontend-${TAG_PREFIX}-${env.COMMIT_HASH}-linux-amd64"
writeYaml file: valuesFile, data: data, overwrite: true
// git push
withCredentials([string(credentialsId: 'freeleaps-azure-dev-token-only', variable: 'GIT_CREDENTIALS')]) {
sh """
git config user.name "zhenyus"
git config user.email "zhenyus@mathmast.com"
git remote add ci_origin https://freeleaps@dev.azure.com/freeleaps/freeleaps-ops/_git/freeleaps-ops
git add ${valuesFile}
git commit -m "ci(bot-auto-bump): bump ${APP_NAME} image tags for alpha to ${TAG_PREFIX}-${env.COMMIT_HASH}-linux-amd64"
git push ci_origin HEAD:master
"""
}
echo "Update ${APP_NAME} image tags for alpha to ${TAG_PREFIX}-${env.COMMIT_HASH}-linux-amd64."
}
}
}
}
}
}
}
}

View 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/

View File

@ -0,0 +1,6 @@
apiVersion: v2
name: magicleaps
description: A Helm chart for Magic Leaps application.
type: application
version: 0.1.0
appVersion: "0.1.0"

View File

@ -0,0 +1,107 @@
{{/*
Expand the name of the chart.
*/}}
{{- define "magicleaps.name" -}}
{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }}
{{- end }}
{{/*
Expand the name of the frontend.
*/}}
{{- define "magicleaps.frontend.name" -}}
{{- default .Values.frontend.name .Values.nameOverride | trunc 63 | trimSuffix "-" }}
{{- end }}
{{/*
Expand the name of the backend.
*/}}
{{- define "magicleaps.backend.name" -}}
{{- default .Values.backend.name .Values.nameOverride | trunc 63 | trimSuffix "-" }}
{{- end }}
{{/*
Create a default fully qualified app name.
We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec).
If release name contains chart name it will be used as a full name.
*/}}
{{- define "magicleaps.fullname" -}}
{{- if .Values.fullnameOverride }}
{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" }}
{{- else }}
{{- $name := default .Chart.Name .Values.nameOverride }}
{{- if contains $name .Release.Name }}
{{- .Release.Name | trunc 63 | trimSuffix "-" }}
{{- else }}
{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" }}
{{- end }}
{{- end }}
{{- end }}
{{/*
Create chart name and version as used by the chart label.
*/}}
{{- define "magicleaps.chart" -}}
{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }}
{{- end }}
{{/*
Backend labels
*/}}
{{- define "magicleaps.backend.labels" -}}
helm.sh/chart: {{ include "magicleaps.chart" . }}
{{ include "magicleaps.backend.selectorLabels" . }}
{{- if .Chart.AppVersion }}
app.kubernetes.io/version: {{ .Chart.AppVersion | quote }}
{{- end }}
app.kubernetes.io/managed-by: {{ .Release.Service }}
{{- end }}
{{/*
Backend Selector labels
*/}}
{{- define "magicleaps.backend.selectorLabels" -}}
app.kubernetes.io/name: {{ include "magicleaps.backend.name" . }}
app.kubernetes.io/instance: {{ .Release.Name }}
{{- end }}
{{/*
Frontend labels
*/}}
{{- define "magicleaps.frontend.labels" -}}
helm.sh/chart: {{ include "magicleaps.chart" . }}
{{ include "magicleaps.frontend.selectorLabels" . }}
{{- if .Chart.AppVersion }}
app.kubernetes.io/version: {{ .Chart.AppVersion | quote }}
{{- end }}
app.kubernetes.io/managed-by: {{ .Release.Service }}
{{- end }}
{{/*
Frontend Selector labels
*/}}
{{- define "magicleaps.frontend.selectorLabels" -}}
app.kubernetes.io/name: {{ include "magicleaps.frontend.name" . }}
app.kubernetes.io/instance: {{ .Release.Name }}
{{- end }}
{{/*
Return the appropriate apiVersion for deployment.
*/}}
{{- define "magicleaps.deployment.apiVersion" -}}
{{- if semverCompare "<1.9-0" .Capabilities.KubeVersion.GitVersion -}}
{{- print "extensions/v1beta1" -}}
{{- else if semverCompare "^1.9-0" .Capabilities.KubeVersion.GitVersion -}}
{{- print "apps/v1" -}}
{{- end -}}
{{- end -}}
{{/*
Define the magicleaps.namespace template if set with forceNamespace or .Release.Namespace is set
*/}}
{{- define "magicleaps.namespace" -}}
{{- if .Values.forceNamespace -}}
{{ printf "namespace: %s" .Values.forceNamespace }}
{{- else -}}
{{ printf "namespace: %s" .Release.Namespace }}
{{- end -}}
{{- end -}}

View File

@ -0,0 +1,87 @@
{{- if .Values.backend.enabled -}}
apiVersion: {{ template "magicleaps.deployment.apiVersion" . }}
kind: Deployment
metadata:
labels:
{{- include "magicleaps.backend.labels" . | nindent 4 }}
name: {{ .Values.backend.name }}
{{ include "magicleaps.namespace" . | indent 2 }}
spec:
selector:
matchLabels:
{{- include "magicleaps.backend.labels" . | nindent 6 }}
replicas: {{ .Values.backend.replicaCount }}
template:
metadata:
labels:
{{- include "magicleaps.backend.labels" . | nindent 8 }}
spec:
containers:
- name: {{ .Values.backend.name }}
image: "{{ .Values.backend.image.repository }}/{{ .Values.backend.image.name }}{{ if .Values.backend.image.tag }}:{{ .Values.backend.image.tag }}{{ end }}"
imagePullPolicy: {{ .Values.backend.image.imagePullPolicy }}
ports:
- containerPort: {{ .Values.backend.port }}
{{- if .Values.backend.extraEnv }}
env:
{{- toYaml .Values.backend.extraEnv | nindent 12 }}
{{- end }}
livenessProbe:
{{- toYaml .Values.backend.livenessProbe | nindent 12 }}
readinessProbe:
{{- toYaml .Values.backend.readinessProbe | nindent 12 }}
{{- if .Values.backend.resources }}
resources:
{{- toYaml .Values.backend.resources | nindent 12 }}
{{- end }}
env:
- name: MONGO_DB
valueFrom:
secretKeyRef:
name: backend-secrets
key: MONGO_DB
- name: MONGO_HOST
valueFrom:
secretKeyRef:
name: backend-secrets
key: MONGO_HOST
- name: MONGO_PORT
valueFrom:
secretKeyRef:
name: backend-secrets
key: MONGO_PORT
- name: EMAIL_USER
valueFrom:
secretKeyRef:
name: backend-secrets
key: EMAIL_USER
- name: EMAIL_PASSWORD
valueFrom:
secretKeyRef:
name: backend-secrets
key: EMAIL_PASSWORD
- name: SUPER_ADMIN
valueFrom:
secretKeyRef:
name: backend-secrets
key: SUPER_ADMIN
- name: TWILIO_ACCOUNT_SID
valueFrom:
secretKeyRef:
name: backend-secrets
key: TWILIO_ACCOUNT_SID
- name: TWILIO_AUTH_TOKEN
valueFrom:
secretKeyRef:
name: backend-secrets
key: TWILIO_AUTH_TOKEN
- name: LOG_LEVEL
valueFrom:
secretKeyRef:
name: backend-secrets
key: LOG_LEVEL
{{- if .Values.imagePullSecrets -}}
imagePullSecrets:
{{- toYaml .Values.imagePullSecrets | nindent 8 }}
{{- end -}}
{{- end -}}

View File

@ -0,0 +1,41 @@
{{- if .Values.frontend.enabled }}
apiVersion: {{ template "magicleaps.deployment.apiVersion" . }}
kind: Deployment
metadata:
labels:
{{- include "magicleaps.frontend.labels" . | nindent 4 }}
name: {{ .Values.frontend.name }}
{{ include "magicleaps.namespace" . | indent 2 }}
spec:
selector:
matchLabels:
{{- include "magicleaps.frontend.labels" . | nindent 6 }}
replicas: {{ .Values.frontend.replicaCount }}
template:
metadata:
labels:
{{- include "magicleaps.frontend.labels" . | nindent 8 }}
spec:
containers:
- name: {{ .Values.frontend.name }}
image: "{{ .Values.frontend.image.repository }}/{{ .Values.frontend.image.name }}{{ if .Values.frontend.image.tag }}:{{ .Values.frontend.image.tag }}{{ end }}"
imagePullPolicy: {{ .Values.frontend.image.imagePullPolicy }}
ports:
- containerPort: {{ .Values.frontend.port }}
{{- if .Values.frontend.extraEnv }}
env:
{{- toYaml .Values.frontend.extraEnv | nindent 12 }}
{{- end }}
livenessProbe:
{{- toYaml .Values.frontend.livenessProbe | nindent 12 }}
readinessProbe:
{{- toYaml .Values.frontend.readinessProbe | nindent 12 }}
{{- if .Values.frontend.resources }}
resources:
{{- toYaml .Values.frontend.resources | nindent 12 }}
{{- end }}
{{- if .Values.imagePullSecrets }}
imagePullSecrets:
{{- toYaml .Values.imagePullSecrets | nindent 8 }}
{{- end }}
{{- end }}

View File

@ -0,0 +1,24 @@
{{- if and .Values.backend.enabled .Values.backend.ingress.enabled -}}
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: {{ .Values.backend.name }}-ingress
annotations:
kubernetes.io/ingress.class: "nginx"
{{- if .Values.backend.ingress.annotations }}
{{ .Values.backend.ingress.annotations | toYaml | nindent 4 }}
{{- end }}
{{ include "magicleaps.namespace" . | indent 2 }}
spec:
rules:
- host: {{ .Values.backend.ingress.host }}
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: {{ .Values.backend.name }}-svc
port:
number: {{ .Values.backend.service.port }}
{{- end -}}

View File

@ -0,0 +1,24 @@
{{- if .Values.frontend.enabled -}}
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: {{ .Values.frontend.name }}-ingress
annotations:
kubernetes.io/ingress.class: "nginx"
{{- if .Values.frontend.ingress.annotations }}
{{ .Values.frontend.ingress.annotations | toYaml | nindent 4 }}
{{- end }}
{{ include "magicleaps.namespace" . | indent 2 }}
spec:
rules:
- host: {{ .Values.frontend.ingress.host }}
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: {{ .Values.frontend.name }}-svc
port:
number: {{ .Values.frontend.service.port }}
{{- end -}}

View File

@ -0,0 +1,16 @@
apiVersion: v1
kind: Secret
metadata:
name: backend-secrets
namespace: magicleaps-alpha
type: Opaque
data:
MONGO_DB: {{ .Values.backend.config.mongo.db | b64enc | quote -}}
MONGO_HOST: {{ .Values.backend.config.mongo.host | b64enc | quote -}}
MONGO_PORT: {{ .Values.backend.config.mongo.port | b64enc | quote -}}
EMAIL_USER: {{ .Values.backend.config.email.user | b64enc | quote -}}
EMAIL_PASSWORD: {{ .Values.backend.config.email.password | b64enc | quote -}}
SUPER_ADMIN: {{ .Values.backend.config.superAdmin | b64enc | quote -}}
TWILIO_ACCOUNT_SID: {{ .Values.backend.config.twilio.accountSid | b64enc | quote -}}
TWILIO_AUTH_TOKEN: {{ .Values.backend.config.twilio.authToken | b64enc | quote -}}
LOG_LEVEL: {{ .Values.backend.config.log.level | b64enc | quote -}}

View File

@ -0,0 +1,17 @@
{{- if .Values.backend.enabled -}}
apiVersion: v1
kind: Service
metadata:
labels:
{{- include "magicleaps.backend.labels" . | nindent 4 }}
name: {{ .Values.backend.name }}-svc
{{ include "magicleaps.namespace" . | indent 2 }}
spec:
ports:
- port: {{ .Values.backend.service.port }}
targetPort: 8081
selector:
{{- include "magicleaps.backend.selectorLabels" . | nindent 4 }}
sessionAffinity: {{ .Values.backend.service.sessionAffinity }}
type: {{ .Values.backend.service.type }}
{{- end -}}

View File

@ -0,0 +1,17 @@
{{- if .Values.frontend.enabled -}}
apiVersion: v1
kind: Service
metadata:
labels:
{{- include "magicleaps.frontend.labels" . | nindent 4 }}
name: {{ .Values.frontend.name }}-svc
{{ include "magicleaps.namespace" . | indent 2 }}
spec:
ports:
- port: {{ .Values.frontend.service.port }}
targetPort: 80
selector:
{{- include "magicleaps.frontend.selectorLabels" . | nindent 4 }}
sessionAffinity: {{ .Values.frontend.service.sessionAffinity }}
type: {{ .Values.frontend.service.type }}
{{- end -}}

View File

@ -0,0 +1,73 @@
imagePullSecrets: []
backend:
enabled: true
name: magicleaps-backend
image:
repository: docker.io/magicleaps
name: magicleaps
imagePullPolicy: IfNotPresent
tag: "latest"
extraEnv: {}
port: 8081
ingress:
enabled: false
annotations: {}
host: ''
replicaCount: 1
service:
type: ClusterIP
port: 8081
sessionAffinity: None
resources: {}
livenessProbe:
httpGet:
path: /api/_/probe/liveness
port: 8081
readinessProbe:
httpGet:
path: /api/_/probe/readiness
port: 8081
config:
mongo:
db: magicleaps_alpha
host: 'mongo-mongodb.magicleaps-alpha.svc.cluster.local'
port: 27017
email:
user: 'your@freeleaps.com'
password: 'your-password'
superAdmin: 'your@email.com'
twilio:
accountSid: ''
authToken: ''
log:
level: 'INFO'
frontend:
enabled: true
name: magicleaps-frontend
image:
repository: docker.io/magicleaps
name: magicleaps
imagePullPolicy: IfNotPresent
tag: "latest"
extraEnv: {}
port: 80
ingress:
annotations: {}
host: ''
nodeSelector: {}
affinity: {}
replicaCount: 1
service:
type: ClusterIP
port: 80
sessionAffinity: None
livenessProbe:
httpGet:
path: /
port: 80
readinessProbe:
httpGet:
path: /
port: 80

View File

@ -0,0 +1,73 @@
imagePullSecrets: []
backend:
enabled: true
name: magicleaps-backend
image:
repository: docker.io/magicleaps
name: magicleaps
imagePullPolicy: IfNotPresent
tag: "latest"
extraEnv: {}
port: 8081
ingress:
enabled: false
annotations: {}
host: ''
replicaCount: 1
service:
type: ClusterIP
port: 8081
sessionAffinity: None
resources: {}
livenessProbe:
httpGet:
path: /api/_/probe/liveness
port: 8081
readinessProbe:
httpGet:
path: /api/_/probe/readiness
port: 8081
config:
mongo:
db: magicleaps_alpha
host: ''
port: 27017
email:
user: ''
password: ''
superAdmin: ''
twilio:
accountSid: ''
authToken: ''
log:
level: 'INFO'
frontend:
enabled: true
name: magicleaps-frontend
image:
repository: docker.io/magicleaps
name: magicleaps
imagePullPolicy: IfNotPresent
tag: "latest"
extraEnv: {}
port: 80
ingress:
annotations: {}
host: ''
nodeSelector: {}
affinity: {}
replicaCount: 1
service:
type: ClusterIP
port: 80
sessionAffinity: None
livenessProbe:
httpGet:
path: /
port: 80
readinessProbe:
httpGet:
path: /
port: 80