Partager un sous-dossier d'un repository GitHub/GitLab
February 25, 2024
• ...
Dans certains cas, nous voulons partager avec des collaborateurs externes un unique dossier d’un projet privé.
Les contraintes sont les suivantes :
- les collaborateurs externes doivent pouvoir accéder aux modification du sous-dossier en temps réel (dès que les fichiers sont modifiés sur le repository du projet principal)
- on ne veut pas rajouter de travail pour les mainteneurs du projet principal (c’est à dire, pas de commande supplémentaire à taper pour push sur un autre repo)
- on ne veut pas que les collaborateurs externes puissent accéder au reste du projet
Pour donner du contexte au tutoriel, supposons que nous souhaitions partager le dossier tests de notre projet, et garder le reste privé.
Git Submodules ❌
Pour respecter la deuxième contrainte, nous n’utiliserons par exemple pas les Git Submodules. Cela consisterait à créer un repository qui contient le dossier tests, puis dans notre repository principal de configurer Git pour lui dire “ce dossier tests, va le chercher sur ce repository” avec la commande git submodule add <URL-of-the-tests-repository> tests
.
Problème : cela demande d’utiliser git pull --recurse-submodules
et de s’assurer d’être bien dans le dossier du submodule pour commit et push. Bref, un bazar qu’on veut éviter.
GitHub Actions ✅
Pour régler ce problème, nous utiliserons les GitHub Actions et deux repositories, un pour le projet principal (privé) et un pour le partage des tests (partagés avec les collaborateurs externes).
Etape 1 : créer un P.A.T
Nous allons devoir créer un Personal Access Token pour notre GitHub Actions.
Note pour les organisations : si vous fonctionnez avec des repositories dans une organisation, il faut aller dans Organization Settings
puis Personal Access Tokens
puis Settings
, et cocher Allow access via fine-grained personal access tokens
. En créant le P.A.T il faut définir le Resource Owner
comme l’organisation.
Il faut sélectionner comme permissions Repository > Contents > Read and Write
.
Dans les deux repositories, il faudra ajouter le P.A.T comme Secrets
comme les Actions (avec comme nom PAT
).
Etape 2 : créer l’action sur le repository de tests
Sur le repository de tests, nous allons créer une action avec le fonctionnement suivant :
- quand je reçois une requête web,
- je clone le repository principal
- je clone le repository de tests
- je copie le dossier de tests du repository principal dans le repository de tests
- je commit et je push
ça donne le code suivant :
name: Sync Specific Folderon:repository_dispatch:types:- webhookjobs:sync-folder:runs-on: ubuntu-lateststeps:- name: Checkout Test Repositoryuses: actions/checkout@v3with:path: 'shared-tests'- name: Checkout Main Repositoryuses: actions/checkout@v3with:repository: 'Androz2091/main-project'token: ${{ secrets.PAT }}path: 'main-project'- name: Configure Gitrun: |git config --global user.email "bot@androz2091.fr"git config --global user.name "Syncer"- name: Sync Changes to Specific Folderrun: |cd shared-testscp -R ../main-project/tests/* .git add .git commit -m "Add tests"git push https://androz2091:${{ secrets.PAT }}@github.com/Androz2091/shared-tests.git HEAD:master
- l’URL du repo principal est
Androz2091/main-project
- celui des tests
Androz2091/shared-tests
Etape 3 : créer l’action sur le repository principal
L’action sur le repository principal est très simple :
- quand je push,
- fais une requête web sur l’action du repo de tests
name: Trigger Tests Synchronizationon: [push]jobs:http_request_job:runs-on: ubuntu-lateststeps:- name: Checkout codeuses: actions/checkout@v2- name: Send webhookrun: |curl -X POST -H "Authorization: Bearer ${{ secrets.PAT }}" -H "Content-Type: application/json" -d '{"event_type":"webhook"}' https://api.github.com/repos/Androz2091/shared-tests/dispatches
Et voilà ! Sur GitLab la procédure est similaire. Ils ont même écrit un tutoriel pour migrer ses GitHub Actions vers GitLab.