Global: add a README to guide our upcoming developers #353
Workflow file for this run
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: 🕵 Création d'une recette jetable | ||
|
Check failure on line 1 in .github/workflows/review_app_creation.yml
|
||
| # L'action est lancée lorsque l'étiquette « recette-jetable » est ajoutée à la PR. | ||
| on: | ||
| pull_request: | ||
| types: [ labeled ] | ||
| # https://docs.github.com/en/actions/how-tos/manage-workflow-runs/manually-run-a-workflow | ||
| workflow_dispatch: | ||
| concurrency: | ||
| group: ${{ github.workflow }}-${{ github.ref_name }}-${{ github.event.pull_request.number || github.sha }} | ||
| env: | ||
| SUPABASE_ACCESS_TOKEN: ${{ secrets.TEST_SUPABASE_ACCESS_TOKEN }} | ||
| SUPABASE_PROJECT_ID: ${{ secrets.TEST_SUPABASE_PROJECT_ID }} | ||
| BRANCH: ${{ github.head_ref }} | ||
| PR_ID: ${{ github.event.number }} | ||
| SCALINGO_DJANGO_APP_NAME: docurba-django-demo | ||
| SCALINGO_NUXT_APP_NAME: docurba-nuxt-demo | ||
| NUXT3_REPO_HTTPS: https://github.com/betagouv/docurba-nuxt3/ | ||
| NUXT3_BRANCH: main | ||
| jobs: | ||
| create: | ||
| runs-on: ubuntu-latest | ||
| permissions: | ||
| pull-requests: write | ||
| if: github.event.action == 'labeled' && github.event.label.name == 'recette-jetable' | ||
| steps: | ||
| - name: 📥 Récupération du code | ||
| uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 | ||
| with: | ||
| ref: ${{ env.BRANCH }} | ||
| - name: 🏷️ Définition des noms de la recette jetable | ||
| run: | | ||
| # Le nom est déterminé automatiquement par Scalingo pour les applications Nuxt2 et Django | ||
| # car ce sont des recettes jetables. | ||
| # Suivons le même modèle pour Supabase et Nuxt3. | ||
| echo "SUPABASE_REVIEW_APP_NAME=supabase-pr${PR_ID}" >> $GITHUB_ENV | ||
| echo "NUXT_3_REVIEW_APP_NAME=docurba-nuxt3-pr${PR_ID}" >> $GITHUB_ENV | ||
| echo "NUXT_2_REVIEW_APP_NAME=${SCALINGO_NUXT_APP_NAME}-pr${PR_ID}" >> $GITHUB_ENV | ||
| echo "DJANGO_REVIEW_APP_NAME=${SCALINGO_DJANGO_APP_NAME}-pr${PR_ID}" >> $GITHUB_ENV | ||
| # La version est figée car la dernière version casse lors de l'envoi de la configuration. | ||
| # L'erreur est cryptique. | ||
| - name: 🛠️ Installation de la CLI Supabase | ||
| uses: supabase/setup-cli@b60b5899c73b63a2d2d651b1e90db8d4c9392f51 | ||
| with: | ||
| version: 2.60.0 | ||
| - name: 🪆 Creation de la branche Supabase | ||
| run: | | ||
| supabase branches --project-ref ${SUPABASE_PROJECT_ID} create ${SUPABASE_REVIEW_APP_NAME} | ||
| - name: 🤹♀️ Export des variables d'environment à partir de Supabase | ||
| shell: bash | ||
| run: | | ||
| until supabase branches --project-ref ${SUPABASE_PROJECT_ID} get ${SUPABASE_REVIEW_APP_NAME} -o env | grep --quiet "SUPABASE_URL" &> /dev/null | ||
| do | ||
| echo "Attendons que la base Supabase soit prête pendant encore 20 secondes." | ||
| sleep 20 | ||
| done | ||
| env_vars=$(supabase branches --project-ref ${SUPABASE_PROJECT_ID} get ${SUPABASE_REVIEW_APP_NAME} -o env) | ||
| declare -A env_dict | ||
| env_dict["DATABASE_URL"]=$(echo "${env_vars}" | grep -w "POSTGRES_URL" | sed -r 's/POSTGRES_URL=//g' | sed -r 's/\"//g') | ||
| env_dict["SUPABASE_ANON_KEY"]=$(echo "${env_vars}" | grep -w "SUPABASE_ANON_KEY" | sed -r 's/SUPABASE_ANON_KEY=//g' | sed -r 's/\"//g') | ||
| env_dict["SUPABASE_ADMIN_KEY"]=$(echo "${env_vars}" | grep -w "SUPABASE_SERVICE_ROLE_KEY" | sed -r 's/SUPABASE_SERVICE_ROLE_KEY=//g' | sed -r 's/\"//g') | ||
| env_dict["SUPABASE_URL"]=$(echo "${env_vars}" | grep -w "SUPABASE_URL" | sed -r 's/SUPABASE_URL=//g' | sed -r 's/\"//g') | ||
| env_dict["SUPABASE_BRANCH_ID"]=$(echo "${env_dict["SUPABASE_URL"]}" | sed --expression 's/\(https:\/\/\|\.supabase\.co\)//g') | ||
| # https://www.chunyangwen.com/blog/shell/bash-array-dict.html | ||
| for key in "${!env_dict[@]}" | ||
| do | ||
| value=${env_dict[${key}]}; | ||
| # https://docs.github.com/fr/actions/reference/workflows-and-actions/workflow-commands#masking-a-value-in-a-log | ||
| echo "::add-mask::${value}"; | ||
| echo "${key}=${value}" >> $GITHUB_ENV | ||
| done | ||
| # La configuration de chaque nouvelle branche reprend celle par défaut et non celle du projet parent. | ||
| # Le fichier supabase/config.toml est le seul moyen documenté par Supabase | ||
| # pour mettre à jour la configuration d'un projet. | ||
| # https://github.com/orgs/supabase/discussions/3765 | ||
| # https://supabase.com/docs/reference/cli/supabase-config-push | ||
| # Une erreur est levée car la variable APP_URL n'est pas encore définie. | ||
| # Elle l'est plus tard, lors du second envoi. | ||
| - name: 🤹♀️ Mise à jour de la configuration de Supabase | ||
| continue-on-error: true | ||
| run: supabase --project-ref "${SUPABASE_BRANCH_ID}" --yes config push | ||
| - name: 🛠️ Installation de la CLI Scalingo | ||
| uses: scalingo-community/setup-scalingo@87fe86eedc708ffb9d232c756b21f6a5784f6c8a # v0.1.1 | ||
| with: | ||
| # Jeton personnel de Céline Martinet Sanchez. | ||
| api_token: ${{ secrets.SCALINGO_API_TOKEN }} | ||
| region: 'osc-fr1' | ||
| - name: 🪆 Création de l'application Nuxt 3 | ||
| run: | | ||
| # Il n'est pas possible de créer une recette jetable pour Nuxt3 car chaque recette jetable | ||
| # s'appuie sur une branche Git différente de celle utilisée pour le dépôt parent. | ||
| scalingo create "${NUXT_3_REVIEW_APP_NAME}" | ||
| app_url="https://${NUXT_3_REVIEW_APP_NAME}.osc-fr1.scalingo.io" | ||
| scalingo --app ${NUXT_3_REVIEW_APP_NAME} env-set \ | ||
| SUPABASE_URL="${SUPABASE_URL}" \ | ||
| SUPABASE_ADMIN_KEY="${SUPABASE_ADMIN_KEY}"\ | ||
| NODE_OPTIONS="--max-old-space-size=4096" | ||
| scalingo --app "${NUXT_3_REVIEW_APP_NAME}" integration-link-create --branch "${NUXT3_BRANCH}" "${NUXT3_REPO_HTTPS}" | ||
| scalingo --app "${NUXT_3_REVIEW_APP_NAME}" integration-link-manual-deploy main | ||
| echo "NUXT3_URL=${app_url}" >> $GITHUB_ENV | ||
| echo "Utilisation de la branche ${NUXT3_BRANCH}." | ||
| echo "Pour déployer une autre branche, vous pouvez modifier ce script ou utiliser l'interface graphique." | ||
| - name: 🪆 Création et déploiement de la recette jetable Nuxt2 | ||
| run: | | ||
| # Le nom est créé par Scalingo. | ||
| # Création d'une recette jetable. | ||
| scalingo --app ${SCALINGO_NUXT_APP_NAME} integration-link-manual-review-app ${{ github.event.number }} | ||
| # Mise à jour de la configuration. | ||
| scalingo --app "${NUXT_2_REVIEW_APP_NAME}" env-set \ | ||
| SUPABASE_URL="${SUPABASE_URL}" \ | ||
| SUPABASE_ADMIN_KEY="${SUPABASE_ADMIN_KEY}" \ | ||
| SUPABASE_ANON_KEY="${SUPABASE_ANON_KEY}"\ | ||
| NUXT3_API_URL="${NUXT3_URL}" | ||
| scalingo --app "${NUXT_2_REVIEW_APP_NAME}" integration-link-update --auto-deploy --branch "${BRANCH}" --destroy-on-close | ||
| - name: 🪆 Déploiement de la recette jetable Nuxt2 | ||
| run: | | ||
| # Déploiement manuel. | ||
| scalingo --app "${NUXT_2_REVIEW_APP_NAME}" integration-link-manual-deploy "${BRANCH}" &> /dev/null | ||
| # Récupération de NUXT_URL pour Django. | ||
| until scalingo apps | grep "${NUXT_2_REVIEW_APP_NAME}" | grep --quiet 'running' &> /dev/null | ||
| do | ||
| echo "En attente de l'application Nuxt." | ||
| sleep 10s | ||
| done | ||
| nuxt_url=$(scalingo --app "${NUXT_2_REVIEW_APP_NAME}" env-get NUXT_URL) | ||
| echo "NUXT_URL=${nuxt_url}" >> $GITHUB_ENV | ||
| - name: 🛠️ Installation de Python | ||
| uses: actions/setup-python@@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0 | ||
| with: | ||
| python-version-file: django/.python-version | ||
| - name: 🪆 Création de la recette jetable Django | ||
| run: | | ||
| # La longueur de la clé secrète doit être supérieure à 50 caractères, | ||
| # or le générateur de secret de Scalingo génère une clé de 32 caractères. | ||
| # Selon le support, il n'est pas possible d'en spécifier la longueur dans scalingo.json. | ||
| django_secret_key=$(python -c "import secrets; print(secrets.token_hex(60))") | ||
| echo "::add-mask::${django_secret_key}"; | ||
| scalingo --app ${SCALINGO_DJANGO_APP_NAME} integration-link-manual-review-app ${{ github.event.number }} | ||
| scalingo --app "${DJANGO_REVIEW_APP_NAME}" env-set \ | ||
| UPSTREAM_NUXT="${NUXT_URL}" \ | ||
| DATABASE_URL="${DATABASE_URL}" \ | ||
| NUXT3_API_URL="${NUXT3_URL}" \ | ||
| SECRET_KEY="${django_secret_key}" | ||
| scalingo --app "${DJANGO_REVIEW_APP_NAME}" integration-link-update --auto-deploy --branch "${BRANCH}" --destroy-on-close | ||
| - name: 🪆 Déploiement de la recette jetable Django | ||
| run: | | ||
| scalingo --app "${DJANGO_REVIEW_APP_NAME}" integration-link-manual-deploy "${BRANCH}" &> /dev/null | ||
| until scalingo apps | grep "${DJANGO_REVIEW_APP_NAME}" | grep --quiet 'running' &> /dev/null | ||
| do | ||
| echo "En attente de l'application Django pendant 10 secondes." | ||
| sleep 10s | ||
| done | ||
| django_url=$(scalingo --app "${DJANGO_REVIEW_APP_NAME}" env-get APP_URL) | ||
| echo "DJANGO_URL=${django_url}" >> $GITHUB_ENV | ||
| - name: 🤹♀️ Intégration de l'URL de Django dans Nuxt2 | ||
| run: scalingo --app "${NUXT_2_REVIEW_APP_NAME}" env-set APP_URL="${DJANGO_URL}" | ||
| # APP_URL : Supabase est le SSO de Nuxt2. APP_URL est l'URL de redirection après la connexion par lien magique. | ||
| # Configurée dans supabase/config.toml et dans l'interface : Supabase > Authorization > URL configuration. | ||
| - name: 🤹♀️ Mise à jour de la configuration de Supabase | ||
| continue-on-error: true | ||
| run: APP_URL="${DJANGO_URL}" supabase --project-ref "${SUPABASE_BRANCH_ID}" --yes config push | ||
| - name: 🍻 Ajout du lien en commentaire de la PR | ||
| uses: thollander/actions-comment-pull-request@24bffb9b452ba05a4f3f77933840a6a841d1b32b # v3.0.1 | ||
| with: | ||
| message: |- | ||
| 🥁 La recette jetable est prête ! [👉 Je veux tester cette PR !](${{ env.DJANGO_URL }}) | ||
| Lien vers Nuxt3 pour modifier le déclencheur : [${{ env.NUXT3_URL }}](${{ env.NUXT3_URL }}). | ||
| Attention, les données ne sont pas encore importées. Revenez quand l'action GitHub sera terminée. | ||
| - name: 🔂 Génération des données | ||
| run: scalingo --app "${DJANGO_REVIEW_APP_NAME}" run './scripts/restore_database.sh ${DATABASE_URL}' &> /dev/null | ||
| - name: ⏩ Lancement des migrations | ||
| run: | | ||
| # La connexion PG doit être libérée avant de pouvoir passer les migrations | ||
| # mais on ne sait jamais combien de temps Supabase met à le faire. | ||
| sleep 5m | ||
| scalingo --app "${DJANGO_REVIEW_APP_NAME}" run 'django-admin migrate' | ||