Aller au contenu

Github

De Banane Atomic

Contribuer à un projet : workflow

Fork et Push

Créer un fork du dépot en cliquant sur le bouton Fork de la page web du projet

# Clonez votre fork, son nom est origin par défaut
git clone https://github.com/mon_nom/projet.git

# Ajoutez le dépôt du mainteneur du projet
git remote add upstream https://github.com/mainteneur/projet.git

# Créez une branche locale pour chaque développement et basculer dans cette branche pour effectuer les modifications
git checkout -b NouveauDev

# Commiter les modification sur la branche locale NouveauDev

# Pousser les modifications de la branche locale NouveauDev vers le dépôt origin
# ce qui aura pour effet de créer une branche origin/NouveauDev sur le dépôt distant origin
git push origin NouveauDev

Pull request

Notifiez le mainteneur du projet d'une modification pour qu'il la fusionne :
Allez sur la page web du fork du projet → branches → New pull request

Une seule pull request par branche.
C'est pourquoi il est utile de faire une branche pour chaque développement.

Utiliser les modifications des Pull requests

Chaque nouvelle fonctionnalité a été développée sur une nouvelle branche, car chaque Pull request est associé à une branche.
En attendant que les Pull requests soit acceptées, on aimerait profiter de ces nouvelles fonctionnalités fraîchement développées.

# création d'une nouvelle branche à partir de master qui contiendra toutes les modifications des Pull requests
git checkout -b AllDevPullRequest master

# fusionner les branches des Pull requests dans AllDevPullRequest
git merge BranchPullRequest1

# astuce: fusion en avance rapide (fast-forward merge) de BranchPullRequest1 dans AllDevPullRequest
# on a pas besoin de basculer sur AllDevPullRequest pour faire cette fusion
git fetch . BranchPullRequest1:AllDevPullRequest

# mettre à jour AllDevPullRequest par rapport à upstream/master
git fetch upstream
git rebase upstream/master AllDevPullRequest

Pull request acceptée

Une fois la Pull request fusionnée dans le dépôt mainteneur/master

# se positionner sur le dépôt local (branche master)
git checkout master

# mettre à jour le dépôt local (branche master) avec les modification du dépôt du mainteneur (branche upstream)
git pull upstream master

# mettre à jour le dépôt fork (branche origin) avec les modification du dépôt local (branche master)
git push --tags origin master

# supprimer la branche locale NouveauDev
git branch -d NouveauDev

# supprimer la branche NouveauDev du dépôt origin
git push origin :NouveauDev

Mettre à jour origin par rapport à upstream

# bascule sur la branche master
git checkout master

# rebase de upstream/master dans la branche courante (master)
git rebase upstream/master

# push les changements de la branche courante (master) vers origin/master
git push origin master

Créez un dépôt

Cliquez sur le bouton Create a new repo situé en haut à droite de la page de votre compte GitHub.

# Liez un dossier Git à un dépôt distant
git remote add origin https://github.com/Utilisateur/Projet.git

Supprimer un dépôt

Se rendre sur la page du dépôt → Settings → Delete this repository

GitHub Flavored Markdown pour les fichiers md

# Titre 1
## Titre 2

Titre 1
========
Titre 2
--------

[Texte du lien](http://url.fr)
![alt text](http://url.gif "Tooltip text")
<user@email.fr>

* puce 1
    * puce 1.1 avec tabulation
* puce 2

*Texte italique*
**Texte gras**

`code`

```python
    code python
```

Authentication and Configuration

  1. Generate a PAT: Github → top-right icon → Settings → bottom left Developer settings → Personal access tokens → Fine-grained tokens
  2. Edit the git config to add the username and PAT in the remote url
.git/config
; local git config

[remote "origin"]
    url = https://USERNAME:PAT@github.com/ACCOUNT/REPOSITORY

; usefull only for the author commit
[user]
    name = nicolas
    email = nicolas@bananeatomic.fr

Cache

Credentials are stored in cache:

  • on Windows, they are stored in the Credential Manager → Windows Credentials

Maybe deprecated

# Mise en cache du mot de passe pour 15 mn pour éviter de le retaper à chaque échange avec le serveur
git config --global credential.helper cache

Issues

Filtering based on WWW-Authenticate header information

The credentials stored in GCM are filtered out by empty public domain.

Filtering based on WWW-Authenticate header information...
[FilterAccounts] Matched 0 accounts with public domain:
# workaround
git config --global credential.gitHubAccountFiltering "false"
.gitconfig
[global]
[credential]
    helper = manager
    gitHubAccountFiltering = false

Ne plus autoriser l'accès à une OAuth Apps

Menu déroulant en haut à droite à côté de l’icône de profile → Settings → Authorized OAuth Apps

Configuration

Changing the default branch

  • Settings → General → Default branch

Default reviewers / CODEOWNERS

.github/CODEOWNERS
*       @Team1 @User1

When a pull request is ready for review, code owners are automatically notified.

Branch protection rules

  • Require a pull request before merging
    • Require approvals (define the number of approvals required)
    • Dismiss stale pull request approvals when new commits are pushed
    • Require review from Code Owners
    • Allow specified actors to bypass required pull requests
    • Require approval of the most recent reviewable push
  • Require conversation resolution before merging
  • Require linear history
  • Do not allow bypassing the above settings
  • Restrict who can push to matching branches
    • Restrict pushes that create matching branches

Automatically delete head branches

After pull requests are merged, you can have head branches deleted automatically.

  • General → Pull Requests

Personal Access Token

  • Personal Icon (top-right) → Settings
  • Developer Settings (left side menu) → Personal Access Tokens (left side menu)

Action

deploy.yml
name: Deploy

on:
  workflow_dispatch:
    inputs:
      ENV:
        description: "Target env"
        required: true
        type: choice
        options:
          - "dev"
          - "ppd"
          - "prod"
        default: "dev"

Docker and AWS ECR

deploy.yml
permissions:
  id-token: write
  contents: write
  pull-requests: write

env:
  AWS_REGION: eu-central-1
  ECR_REPO_NAME: repo1
  IMAGE_TAG: latest

jobs:
  build-and-push:
    name: Build, tag and push to AWS ECR
    runs-on: ubuntu-latest
    environment: ${{ inputs.ENV }}

    steps:
      - name: Checkout repository
        uses: actions/checkout@v3

      - name: Configure AWS credentials
        uses: aws-actions/configure-aws-credentials@v2
        with:
          role-to-assume: ${{ secrets.ASSUME_ROLE }}
          aws-region: ${{ env.AWS_REGION }}

      - name: Login to Amazon ECR
        id: login-ecr
        uses: aws-actions/amazon-ecr-login@v2

      - name: Determine PYTHON_ENVIRONMENT
        id: set_env
        run: |
          if [ "${{ inputs.ENV }}" = "prod" ]; then
            echo "PYTHON_ENVIRONMENT=PROD" >> $GITHUB_OUTPUT
          elif [ "${{ inputs.ENV }}" = "ppd" ]; then
            echo "PYTHON_ENVIRONMENT=PREPROD" >> $GITHUB_OUTPUT
          else
            echo "PYTHON_ENVIRONMENT=DEV" >> $GITHUB_OUTPUT
          fi

      - name: Build and push Docker image
        uses: docker/build-push-action@v4
        with:
          context: .
          file: Dockerfile # default
          push: true
          tags: ${{ steps.login-ecr.outputs.registry }}/${{ env.ECR_REPO_NAME }}:${{ env.IMAGE_TAG }}
          build-args: |
            PYTHON_ENVIRONMENT=${{ steps.set_env.outputs.PYTHON_ENVIRONMENT }}
          secrets: |
            jfrog_key=${{ secrets.JFROG_API_COMMON_TOKEN }} # secret will be placed in /run/secrets/jfrog_key
Dockerfile
# use the secret
RUN --mount=type=secret,id=jfrog_key pip3 install --no-cache-dir --upgrade -r requirements.txt --trusted-host xxx.jfrog.io --extra-index-url https://api-common:$(cat /run/secrets/jfrog_key)@xxx.jfrog.io/artifactory/api/pypi/common-pypi/simple/

AWS secrets manager

Copy the Github environment variables and secrets to an AWS secrets manager.

deploy-secrets.yml
env:
  AWS_REGION: eu-central-1

permissions:
  id-token: write

jobs:
  deploy-secrets:
    name: Deploy secrets
    runs-on: ubuntu-latest
    environment: ${{ inputs.TARGET_ENV }}

    steps:
      - name: Configure AWS credentials
        uses: aws-actions/configure-aws-credentials@v3
        with:
          role-to-assume: ${{ secrets.ASSUME_ROLE }}
          aws-region: ${{ env.AWS_REGION }}

      - name: Deploy secrets
        run: |
          aws secretsmanager update-secret --secret-id <secrets-manager-name> --secret-string \
            "{ \
              \"SECRET_NAME\": \"${{ secrets.SECRET_NAME}}\", \
              \"ENV_VAR_NAME\": \"${{ vars.ENV_VAR_NAME}}\", \
            }"