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.
Repozytorium powinno zawierać pusty plik np. readme.md.
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.
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
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: