Skip to content

Global: add a README to guide our upcoming developers #353

Global: add a README to guide our upcoming developers

Global: add a README to guide our upcoming developers #353

name: 🕵 Création d'une recette jetable

Check failure on line 1 in .github/workflows/review_app_creation.yml

View workflow run for this annotation

GitHub Actions / .github/workflows/review_app_creation.yml

Invalid workflow file

(Line: 145, Col: 13): Expected format {org}/{repo}[/path]@ref. Actual 'actions/setup-python@@a309ff8b426b58ec0e2a45f0f869d46889d02405'
# 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'