data una struttura directory del progetto-A come da specifica che segue, creare i seguenti script in bash: premessa: i file values.env contengono elenco coppie chiave/valore del tipo chiave1=valore1, ecc.. 1) customize.sh: script che ha in input l'ambiente (dev,qa o prod) ed esegue la sostituzione nel file infrasructure.yaml della directory kubernetes dei tag del tipo con il relativo valore letto dal file values.env della directory corrispondente all'input fornito 1) build_container.sh : script che effettua la docker build di tutti i container presenti nella directory containers usando il nome della directory sotto containers come nome del container,nome della root directory come nome del repository e sha del commit come tag. lo script deve eseguire anche la push su un registry con precedente login con credenziali lette dal file properties.env 2) deploy.sh: script che effettua il deploy in kubernetes del file infrastructure.yaml contenuto nella directory kubernetes struttura directory di progetto: progetto-A properties.env build_src.sh .gitea/ workflows pipeline.yaml containers frontend dockerfile backend dockerfile env dev values.env qa values.env prod values.env kubernetes infrastructure.yaml src Provisioning: env: $organization= nome della società $project=nome del progetto 1) Gitea: creazione Organization--> $organization(if not alreay exist) 2) Gitea: creazione progetto nome--> $project 3) Harbor: creazione project $project 4) X3 k8s creazione NAMSPACE,SA, ROLE, ROLEBINDING,KUBECONFIG per deploy su namespace (kube-provisioning.sh) per dev qa e prod 5) X3 Gitea: creazione secret KUBECONFIG_DEV, KUBECONFIG_QA e KUBECONFIG_PROD con kubeconfig generato da kube-provisioning.sh 6) harbor: creazione robot-user "git" con permessi full su repo del progetto ---> $registry_user, $registry_pass 7) harbor: creazione robot-user "k8spull" con permessi full su repo del progetto ---> $registry_user, $registry_pass 8) creazione secret e patch SA default kubectl -n <$project> create secret docker-registry harbor-pull \ --docker-server=harbor.italiadatacenter.com \ --docker-username=robot\$<$project>+k8spull \ --docker-password= \ --docker-email=harbor@italiadatacenter.com kubectl patch serviceaccount default -n athleteos-dev -p '{"imagePullSecrets":[{"name":"harbor-pull"}]}' kubectl patch serviceaccount default -n <$project-qa> -p '{"imagePullSecrets":[{"name":"harbor-pull"}]}' kubectl patch serviceaccount default -n <$project-prod> -p '{"imagePullSecrets":[{"name":"harbor-pull"}]}' 9) Gitea: creazione secret REGISTRY_USER -->$registry_user, REGISTRY_PASS -->$registry_pass 10)Gitea: poplazione repo con skeleton template gitea-api-token 65fc5f07365bd3f89c5b9ddca3d2d2e7b3777a88 https://git.italiadatacenter.com/api/swagger List Template curl -X 'GET' \ 'https://git.italiadatacenter.com/api/v1/repos/search?q=tmpl&topic=false&includeDesc=true&token=65fc5f07365bd3f89c5b9ddca3d2d2e7b3777a88' \ -H 'accept: application/json' List repository: curl -X 'GET' \ 'https://git.italiadatacenter.com/api/v1/repos/search?token=65fc5f07365bd3f89c5b9ddca3d2d2e7b3777a88' \ -H 'accept: application/json' Create repo from template: curl -X 'POST' \ 'https://git.italiadatacenter.com/api/v1/repos/STS_Lab/tmpl_nginx_node/generate?token=65fc5f07365bd3f89c5b9ddca3d2d2e7b3777a88' \ -H 'accept: application/json' \ -H 'Content-Type: application/json' \ -d '{ "avatar": true, "default_branch": "string", "description": "string", "git_content": true, "git_hooks": true, "labels": true, "name": "secondo", "owner": "STS_Lab", "private": true, "protected_branch": true, "topics": true, "webhooks": true }' creazione din una applicazione backstage che permetta la creazione di un repo da template con questa api: curl -X 'POST' \ 'https://git.italiadatacenter.com/api/v1/repos/STS_Lab/tmpl_nginx_node/generate?token=65fc5f07365bd3f89c5b9ddca3d2d2e7b3777a88' \ -H 'accept: application/json' \ -H 'Content-Type: application/json' \ -d '{ "avatar": true, "default_branch": "string", "description": "string", "git_content": true, "git_hooks": true, "labels": true, "name": "secondo", "owner": "STS_Lab", "private": true, "protected_branch": true, "topics": true, "webhooks": true }' la lista dei template disponbili è fornita dall'api: curl -X 'GET' \ 'https://git.italiadatacenter.com/api/v1/repos/search?q=tmpl&topic=false&includeDesc=true&token=65fc5f07365bd3f89c5b9ddca3d2d2e7b3777a88' \ -H 'accept: application/json' l'utente deve poter creare un nuovo repo fornendo nome e template scelto dalla lista --------------------------------- Harbor api: https://harbor.italiadatacenter.com/devcenter-api-2.0 admin/KAYQE1QA7uwUZ8uI Create project curl -X 'POST' \ -u admin:KAYQE1QA7uwUZ8uI \ 'https://harbor.italiadatacenter.com/api/v2.0/projects' \ -H 'accept: application/json' \ -H 'X-Resource-Name-In-Location: false' \ -H 'Content-Type: application/json' \ -d '{ "project_name": "secondo", "public": false, "metadata": { "public": "false", "enable_content_trust": "string", "enable_content_trust_cosign": "string", "prevent_vul": "string", "severity": "string", "auto_scan": "string", "auto_sbom_generation": "string", "reuse_sys_cve_allowlist": "string", "proxy_speed_kb": "string", "max_upstream_conn": "string" }, "cve_allowlist": { "id": 0, "project_id": 0, "expires_at": 0, "items": [ { "cve_id": "string" } ], "creation_time": "2026-03-21T17:12:18.108Z", "update_time": "2026-03-21T17:12:18.108Z" }, "storage_limit": 0 }' creazionnr robot user curl -X 'POST' \ -u admin:KAYQE1QA7uwUZ8uI \ 'https://harbor.italiadatacenter.com/api/v2.0/robots' \ -H 'accept: application/json' \ -H 'Content-Type: application/json' \ -d '{ "name": "secondobot", "description": "scondo bot", "secret": "string", "level": "system", "disable": true, "duration": -1, "permissions": [ { "kind": "project", "namespace": "secondo", "access": [ { "action": "delete", "resource": "repository" }, { "action": "list", "resource": "repository" }, { "action": "push", "resource": "repository" }, { "action": "read", "resource": "repository" }, { "action": "update", "resource": "repository" }, { "action": "pull", "resource": "repository" } ] } ] }' { "creation_time": "2026-03-21T18:24:57.665Z", "expires_at": -1, "id": 44, "name": "robot$secondobot", "secret": "YxlIfu6o73zsQnKkgaWMdSc6MEwftVzk" } ####### template modulari######################################################### # 🧠 🎯 Cos’è `git subtree` (in pratica) 👉 `subtree` ti permette di: ```text includere un altro repository dentro una sottocartella MANTENENDO la possibilità di aggiornarlo ``` 👉 differenza chiave: * il codice viene **copiato nel repo** * ma mantiene un **legame logico con l’origine** --- # 🔥 Perché è perfetto per template modulari Scenario IDP: ```text template-node template-k8s template-ci ``` 👉 li vuoi combinare in: ```text my-service/ app/ k8s/ ci/ ``` 👉 `subtree` fa ESATTAMENTE questo, in modo pulito --- # 🏗️ Setup iniziale (step-by-step) ## 1️⃣ Aggiungi il repo template ```bash git remote add template-node https://gitea/template-node.git git fetch template-node ``` --- ## 2️⃣ Importa il template ```bash git subtree add \ --prefix=app \ template-node main \ --squash ``` --- ### 🔍 Cosa succede * copia contenuto in `app/` * crea 1 commit (grazie a `--squash`) * mantiene riferimento al repo remoto --- # 🔄 Aggiornare il template 👉 quando il template evolve: ```bash git subtree pull \ --prefix=app \ template-node main \ --squash ``` --- 👉 risultato: * aggiorna solo quella cartella * merge automatico --- # 🚀 Multi-template (use case IDP) ```bash git subtree add --prefix=app template-node main --squash git subtree add --prefix=k8s template-k8s main --squash git subtree add --prefix=ci template-ci main --squash ``` --- 👉 ottieni: ```text repo finale: app/ k8s/ ci/ ```