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.

Krok 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
Krok 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
Krok 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 linku (podmień ’owner’ i ’repo’).

https://github.com/owner/repo/settings/secrets/actions

Dodawanie sekretu w repozytorium Github
Krok 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 }}
Krok 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

Full-Stack TypeScript Dev | Everything Node.js related | Casual DevOps with Docker & Github Actions

Zostaw komentarz:

Witryna jest chroniona przez reCAPTCHA i Google Politykę Prywatności oraz obowiązują Warunki Korzystania z Usługi.