Skip to content

Commit 2316503

Browse files
SergeySergey
authored andcommitted
initial release
1 parent dc6ad5e commit 2316503

372 files changed

Lines changed: 19083 additions & 1 deletion

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.editorconfig

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
root = true
2+
3+
[*]
4+
end_of_line = lf
5+
insert_final_newline = true
6+
7+
[*.{js,json,yml}]
8+
charset = utf-8
9+
indent_style = space
10+
indent_size = 2

.gitattributes

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
/.yarn/** linguist-vendored
2+
/.yarn/releases/* binary
3+
/.yarn/plugins/**/* binary
4+
/.pnp.* binary linguist-generated
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
name: Cleanup on Branch Delete
2+
3+
on:
4+
delete:
5+
branches:
6+
- feat/*
7+
- hotfix/*
8+
9+
jobs:
10+
cleanup:
11+
runs-on: self-hosted
12+
steps:
13+
- name: Configure kubectl
14+
run: |
15+
mkdir -p $HOME/.kube
16+
echo "${{ secrets.KUBE_CONFIG_DATA }}" | base64 -d > $HOME/.kube/config
17+
chmod 600 $HOME/.kube/config
18+
19+
- name: Delete namespace
20+
run: |
21+
BRANCH_NAME="${{ github.event.ref }}"
22+
PREFIX=""
23+
if [[ "${BRANCH_NAME}" == feat/* ]]; then
24+
PREFIX="feat"
25+
BRANCH_NAME="${BRANCH_NAME#feat/}"
26+
elif [[ "${BRANCH_NAME}" == hotfix/* ]]; then
27+
PREFIX="hotfix"
28+
BRANCH_NAME="${BRANCH_NAME#hotfix/}"
29+
else
30+
echo "Branch $BRANCH_NAME does not match feat/* or hotfix/* — skipping namespace deletion."
31+
exit 0
32+
fi
33+
34+
SAFE_NAME=$(echo "$BRANCH_NAME" | tr '[:upper:]' '[:lower:]' | sed 's/[^a-z0-9-]/-/g')
35+
NAMESPACE="${PREFIX}-${SAFE_NAME}"
36+
echo "Deleting namespace: $NAMESPACE"
37+
kubectl delete namespace "$NAMESPACE" --wait || {
38+
echo "⚠️ Namespace $NAMESPACE not found"
39+
}

.github/workflows/dev.yaml

Lines changed: 151 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,151 @@
1+
name: Core Dev
2+
3+
on:
4+
push:
5+
branches:
6+
- dev
7+
- feat/*
8+
- hotfix/*
9+
10+
env:
11+
APP: core
12+
API_URL: https://dev.datedata.dev/api
13+
14+
jobs:
15+
setup:
16+
runs-on: self-hosted
17+
steps:
18+
- name: Actions checkout
19+
uses: actions/checkout@v5
20+
21+
- name: Setup Docker Buildx Action
22+
uses: docker/setup-buildx-action@v3
23+
24+
- name: Setup kubectl
25+
uses: azure/setup-kubectl@v4
26+
27+
setup-env:
28+
runs-on: self-hosted
29+
needs: setup
30+
outputs:
31+
release_name: ${{ steps.branch-env.outputs.release_name }}
32+
host: ${{ steps.branch-env.outputs.host }}
33+
namespace: ${{ steps.branch-env.outputs.namespace }}
34+
35+
steps:
36+
- name: Setup branch environment
37+
id: branch-env
38+
run: |
39+
PREFIX=""
40+
BRANCH_NAME=""
41+
42+
if [[ "${GITHUB_REF}" == refs/heads/feat/* ]]; then
43+
PREFIX="feat"
44+
BRANCH_NAME="${GITHUB_REF#refs/heads/feat/}"
45+
elif [[ "${GITHUB_REF}" == refs/heads/hotfix/* ]]; then
46+
PREFIX="hotfix"
47+
BRANCH_NAME="${GITHUB_REF#refs/heads/hotfix/}"
48+
elif [[ "${GITHUB_REF}" == refs/heads/dev ]]; then
49+
PREFIX="core"
50+
fi
51+
52+
if [[ -n "$BRANCH_NAME" ]]; then
53+
SAFE_NAME=$(echo "$BRANCH_NAME" | tr '[:upper:]' '[:lower:]' | sed 's/[^a-z0-9-]/-/g')
54+
RELEASE_NAME="${PREFIX}-${SAFE_NAME}"
55+
HOST="${PREFIX}-${SAFE_NAME}.datedata.dev"
56+
NAMESPACE="${PREFIX}-${SAFE_NAME}"
57+
else
58+
RELEASE_NAME="${PREFIX}"
59+
HOST="dev.datedata.dev"
60+
NAMESPACE="dev"
61+
fi
62+
63+
echo "release_name=${RELEASE_NAME}" >> "$GITHUB_OUTPUT"
64+
echo "host=${HOST}" >> "$GITHUB_OUTPUT"
65+
echo "namespace=${NAMESPACE}" >> "$GITHUB_OUTPUT"
66+
67+
build:
68+
runs-on: self-hosted
69+
needs: setup-env
70+
steps:
71+
- name: Docker build & push
72+
run: |
73+
if [[ -z "${{ secrets.DOCKER_USERNAME }}" ]]; then
74+
echo "Error: DOCKER_USERNAME is not set"
75+
exit 1
76+
fi
77+
78+
docker build -t ${{ secrets.DOCKER_USERNAME }}/datedata-front:${GITHUB_SHA} --build-arg APP=${{ env.APP }} --build-arg API_URL=${{ env.API_URL }} .
79+
docker push ${{ secrets.DOCKER_USERNAME }}/datedata-front:${GITHUB_SHA}
80+
81+
deploy:
82+
runs-on: self-hosted
83+
needs: [setup-env, build]
84+
steps:
85+
- name: Configure kubectl
86+
run: |
87+
if [[ -z "${{ secrets.KUBE_CONFIG_DATA }}" ]]; then
88+
echo "Error: KUBE_CONFIG_DATA secret is not set"
89+
exit 1
90+
fi
91+
92+
mkdir -p $HOME/.kube
93+
94+
echo "${{ secrets.KUBE_CONFIG_DATA }}" | base64 -d > $HOME/.kube/config
95+
if [[ $? -ne 0 ]]; then
96+
echo "Error: Failed to decode the kubeconfig"
97+
exit 1
98+
fi
99+
100+
chmod 600 $HOME/.kube/config
101+
kubectl config current-context
102+
103+
- name: Helm Deploy
104+
run: |
105+
if [[ -z "${{ needs.setup-env.outputs.namespace }}" ]]; then
106+
echo "Error: namespace is not set"
107+
exit 1
108+
fi
109+
if [[ -z "${{ needs.setup-env.outputs.release_name }}" ]]; then
110+
echo "Error: release_name is not set"
111+
exit 1
112+
fi
113+
if [[ -z "${{ needs.setup-env.outputs.host }}" ]]; then
114+
echo "Error: host is not set"
115+
exit 1
116+
fi
117+
118+
kubectl create namespace ${{ needs.setup-env.outputs.namespace }} --dry-run=client -o yaml | kubectl apply -f -
119+
helm upgrade --install ${{ needs.setup-env.outputs.release_name }} ./.helm/core \
120+
-f ./.helm/core/envs/dev/values.yaml \
121+
--kubeconfig $HOME/.kube/config \
122+
--namespace ${{ needs.setup-env.outputs.namespace }} \
123+
--set image.repository=${{ secrets.DOCKER_USERNAME }}/datedata-front \
124+
--set image.tag=${GITHUB_SHA} \
125+
--set ingress.host=${{ needs.setup-env.outputs.host }} \
126+
--wait --timeout=300s
127+
128+
post-deploy:
129+
runs-on: self-hosted
130+
needs: [setup-env, deploy]
131+
steps:
132+
- name: Verify deployment
133+
run: |
134+
if [[ -z "${{ needs.setup-env.outputs.namespace }}" ]]; then
135+
echo "Error: namespace is not set"
136+
exit 1
137+
fi
138+
if [[ -z "${{ needs.setup-env.outputs.release_name }}" ]]; then
139+
echo "Error: release_name is not set"
140+
exit 1
141+
fi
142+
143+
kubectl rollout status deployment/${{ needs.setup-env.outputs.release_name }} -n ${{ needs.setup-env.outputs.namespace }} --timeout=300s
144+
145+
if [[ $? -ne 0 ]]; then
146+
echo "Error: Deployment failed"
147+
exit 1
148+
fi
149+
150+
echo "📆 Deployment successful! https://${{ needs.setup-env.outputs.host }}"
151+

.github/workflows/prod.yaml

Lines changed: 136 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,136 @@
1+
name: Core Prod
2+
3+
on:
4+
push:
5+
tags:
6+
- 'release/*'
7+
8+
env:
9+
APP: core
10+
API_URL: https://datedata.dev/api
11+
12+
jobs:
13+
setup:
14+
runs-on: self-hosted
15+
steps:
16+
- name: Actions checkout
17+
uses: actions/checkout@v5
18+
19+
- name: Setup Docker Buildx Action
20+
uses: docker/setup-buildx-action@v3
21+
22+
- name: Setup kubectl
23+
uses: azure/setup-kubectl@v4
24+
25+
setup-env:
26+
runs-on: self-hosted
27+
needs: setup
28+
outputs:
29+
release_name: ${{ steps.tag-env.outputs.release_name }}
30+
host: ${{ steps.tag-env.outputs.host }}
31+
namespace: ${{ steps.tag-env.outputs.namespace }}
32+
image_tag: ${{ steps.tag-env.outputs.image_tag }}
33+
34+
steps:
35+
- name: Setup tag environment
36+
id: tag-env
37+
run: |
38+
if [[ "${GITHUB_REF}" == refs/tags/release/* ]]; then
39+
RELEASE_NAME="core"
40+
HOST="datedata.dev"
41+
NAMESPACE="prod"
42+
IMAGE_TAG=$(echo "${GITHUB_REF#refs/tags/}" | tr '[:upper:]' '[:lower:]' | sed 's|/|-|g')
43+
else
44+
echo "Error: Not a release tag"
45+
exit 1
46+
fi
47+
48+
echo "release_name=${RELEASE_NAME}" >> "$GITHUB_OUTPUT"
49+
echo "host=${HOST}" >> "$GITHUB_OUTPUT"
50+
echo "namespace=${NAMESPACE}" >> "$GITHUB_OUTPUT"
51+
echo "image_tag=${IMAGE_TAG}" >> "$GITHUB_OUTPUT"
52+
53+
build:
54+
runs-on: self-hosted
55+
needs: setup-env
56+
steps:
57+
- name: Docker build & push
58+
run: |
59+
if [[ -z "${{ secrets.DOCKER_USERNAME }}" ]]; then
60+
echo "Error: DOCKER_USERNAME is not set"
61+
exit 1
62+
fi
63+
64+
docker build -t ${{ secrets.DOCKER_USERNAME }}/datedata-front:${{ needs.setup-env.outputs.image_tag }} --build-arg APP=${{ env.APP }} --build-arg API_URL=${{ env.API_URL }} .
65+
docker push ${{ secrets.DOCKER_USERNAME }}/datedata-front:${{ needs.setup-env.outputs.image_tag }}
66+
67+
deploy:
68+
runs-on: self-hosted
69+
needs: [setup-env, build]
70+
steps:
71+
- name: Configure kubectl
72+
run: |
73+
if [[ -z "${{ secrets.KUBE_CONFIG_DATA }}" ]]; then
74+
echo "Error: KUBE_CONFIG_DATA secret is not set"
75+
exit 1
76+
fi
77+
78+
mkdir -p $HOME/.kube
79+
80+
echo "${{ secrets.KUBE_CONFIG_DATA }}" | base64 -d > $HOME/.kube/config
81+
if [[ $? -ne 0 ]]; then
82+
echo "Error: Failed to decode the kubeconfig"
83+
exit 1
84+
fi
85+
86+
chmod 600 $HOME/.kube/config
87+
kubectl config current-context
88+
89+
- name: Helm Deploy
90+
run: |
91+
if [[ -z "${{ needs.setup-env.outputs.namespace }}" ]]; then
92+
echo "Error: namespace is not set"
93+
exit 1
94+
fi
95+
if [[ -z "${{ needs.setup-env.outputs.release_name }}" ]]; then
96+
echo "Error: release_name is not set"
97+
exit 1
98+
fi
99+
if [[ -z "${{ needs.setup-env.outputs.host }}" ]]; then
100+
echo "Error: host is not set"
101+
exit 1
102+
fi
103+
104+
kubectl create namespace ${{ needs.setup-env.outputs.namespace }} --dry-run=client -o yaml | kubectl apply -f -
105+
helm upgrade --install ${{ needs.setup-env.outputs.release_name }} ./.helm/core \
106+
-f ./.helm/core/envs/prod/values.yaml \
107+
--kubeconfig $HOME/.kube/config \
108+
--namespace ${{ needs.setup-env.outputs.namespace }} \
109+
--set image.repository=${{ secrets.DOCKER_USERNAME }}/datedata-front \
110+
--set image.tag=${{ needs.setup-env.outputs.image_tag }} \
111+
--set ingress.host=${{ needs.setup-env.outputs.host }} \
112+
--wait --timeout=300s
113+
114+
post-deploy:
115+
runs-on: self-hosted
116+
needs: [setup-env, deploy]
117+
steps:
118+
- name: Verify deployment
119+
run: |
120+
if [[ -z "${{ needs.setup-env.outputs.namespace }}" ]]; then
121+
echo "Error: namespace is not set"
122+
exit 1
123+
fi
124+
if [[ -z "${{ needs.setup-env.outputs.release_name }}" ]]; then
125+
echo "Error: release_name is not set"
126+
exit 1
127+
fi
128+
129+
kubectl rollout status deployment/${{ needs.setup-env.outputs.release_name }} -n ${{ needs.setup-env.outputs.namespace }} --timeout=300s
130+
131+
if [[ $? -ne 0 ]]; then
132+
echo "Error: Deployment failed"
133+
exit 1
134+
fi
135+
136+
echo "🚀 Production deployment successful! https://${{ needs.setup-env.outputs.host }}"

.gitignore

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
.yarn/*
2+
!.yarn/patches
3+
!.yarn/plugins
4+
!.yarn/releases
5+
!.yarn/sdks
6+
!.yarn/versions
7+
8+
# Swap the comments on the following lines if you wish to use zero-installs
9+
# In that case, don't forget to run `yarn config set enableGlobalCache false`!
10+
# Documentation here: https://yarnpkg.com/features/caching#zero-installs
11+
12+
#!.yarn/cache
13+
.pnp.*
14+
node_modules
15+
16+
.turbo
17+
18+
.DS_Store
19+
20+
docker-compose.yml

.helm/core/Chart.yaml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
# .helm/core/Chart.yaml
2+
apiVersion: v2
3+
name: core
4+
description: Core Frontend App
5+
version: 0.1.0

0 commit comments

Comments
 (0)