Automatyzacja kopii zapasowej repozytorium na GitHubie

Czasami zdarza się tak, że nad kodem pracuje więcej niż jeden podwykonawca. Przykładowo, jedna firma – Wykonawca X – odpowiada za pisanie kodu aplikacji, a druga – Wykonawca Y – ma regularnie odpowiadać za kontrolę jego jakości.

W takiej sytuacji optymalnym rozwiązaniem jest regularne przesyłanie kopii kodu napisanego przez Wykonawcę X do Wykonawcy Y.

Wbrew pozorom takie drobne, regularne czynności potrafią być całkiem uciążliwe. Jest to więc modelowy proces, który powinno się automatyzować, aby zaoszczędzić czas, energię, a w konsekwencji pieniądze.

W poniższym wpisie umieściliśmy krótką instrukcję, dzięki której można zaoszczędzić trochę czasu na regularnym tworzeniu backupów.

Instrukcja

Poniższa instrukcja wyjaśnia jak przygotować skrypt automatyzujący zrobienie kopii zapasowej kodu między dwoma repozytoriami na GitHubie.

1. Utwórz nowe repozytorium 

Repozytorium z domyślną gałęzią może być prywatne.

Ustawienia nowego repozytorium na Github.

Repozytorium powinno zawierać pusty plik np. readme.md.

Nowe repozytorium Github.

2. Wygeneruj PAT (Personal Access Token)

Token PAT wygenerujesz w zakładce Developer settings na swoim koncie GitHub.

Następnie musisz wybrać okres ważności tokenu. Można wybrać opcję, aby PAT nie wygasał, ale nie jest to najbezpieczniejsze rozwiązanie, więc go nie zalecamy.

WAŻNE: token powinien posiadać uprawnienia repo.

Generowanie Personal Access Token w Github.

3. W repozytorium źródłowym dodaj nowy sekret z wygenerowanym tokenem

Możesz to zrobić na swoim koncie GitHub w zakładce: Security → Secret and variables → Actions.

Dla ułatwienia możesz skorzystać z poniższego schematu adresu URL (podmień ’owner’ i ’repo’).

https://github.com/owner/repo/settings/secrets/actions
Dodawanie sekretu w repozytorium Github.

4. Skopiuj poniższy kod źródłowy

Poniższy kod źródłowy umieść w postaci pliku np. backup.yml w katalogu .github/workflows na docelowej gałęzi w źródłowym repozytorium.

# Steps to make this workflow work
# 1. Create new repository with any default branch (it can just contain dummy readme.md file)
# 2. Generate PAT with repo priveleges
# 3. Add PAT as github secret in source repository
# 4. Add this workflow to source repository
# 5. Change whatever variables you want to change in this workflow (target repo with default branch and source branch are required)
# Disclaimer: This workflow doesn't copy any workflow files from source repository to target repository. It only copies source code.

name: Push code to another Github repository

on:
  push:
    branches:
      - <source-repository-target-branch> # swap this for source repository target branch name

jobs:
  push:
    runs-on: ubuntu-latest
    steps:
    - name: Checkout source repository
      uses: actions/checkout@v4
      with:
        path: src
        ref: <source-repository-target-branch> # swap this for source repository target branch name
        persist-credentials: false
    - name: Get current timestamp
      id: date
      run: echo "::set-output name=timestamp::$(date +'%Y%m%d%H%M%S')"
    - name: Set target branch name
      run: echo "TARGET_BRANCH=master-${{ steps.date.outputs.timestamp }}" >> $GITHUB_ENV # rename new branch name to match your naming convention
    - name: Checkout target repository
      uses: actions/checkout@v4
      with:
        path: target
        ref: <target-repository-target-branch> # swap this for target repository default branch name
        repository: <owner>/<repository> # swap this for target repository
        token: ${{ secrets.TARGET_REPO_TOKEN }} # remember to add github secret in source repository with github PAT that has repo priveleges
        fetch-depth: 0
        persist-credentials: true
    - name: Push to Target Repository
      working-directory: ./target
      run: |
        git checkout -b ${{ env.TARGET_BRANCH }}
        rm -rf ./*
        cp -r ../src/* .
        git config --local user.name "Dummy User"
        git config --local user.email "dummy@email.com"
        git add .
        git commit -m 'Create new backup'
        git push -u origin ${{ env.TARGET_BRANCH }}

5. Podmień zmienne w kodzie skryptu

Podmień wszystkie zmienne wyróżnione ’<>’ w kodzie skryptu, tak aby odpowiadały nazwom Twojego repozytorium oraz gałęzi.

I to by było na tyle

Jeśli wszystkie kroki zostały wykonane poprawnie, to skrypt będzie uruchamiany za każdym razem kiedy na gałąź docelową zostanie wypchnięty kod.

Podgląd poprawnie utworzonego repozytorium

Aby upewnić się, że wszytko działa tak jak powinno, sprawdź zgodność swojego repozytorium z podglądem na poniższych zrzutach ekranu:

1. Docelowa gałąź na repozytorium źródłowym:

Docelowa gałąź na repozytorium źródłowym Github.

2. Widok Actions w repozytorium źródłowym:

Widok Action w repozytorium źródłowym Github.

3. Nowo utworzona gałąź w docelowym repozytorium:

Nowo utworzona gałąź w docelowym repozytorium Github.
Karol Ścibior

Specjalista TypeScript | Node | React. Full-Stack Developer, dla którego nie ma projektów niewykonalnych.

Przekształć
swoje pomysły w rzeczywistość

Skontaktuj się z nami i pozwól nam sprawdzić jak możemy Ci pomóc.

Najciekawsze treści na Blogu