====== LU13c - GitHub Workflow ======
//Quelle: [[https://docs.github.com/en/actions/using-workflows]]//
Ein Workflow ist ein automatisierter Prozess, der einen oder mehrere Jobs ausführt.
GitHub Workflows werden in YAML-Dateien definiert, die im Ordner ''.github/workflows'' unseres Repositories gespeichert werden.
Jeder Workflow benötigt:
* Einen oder mehrere Events, welche den Workflow auslösen.
* Einen oder mehrere Jobs, die in einer virtuellen Umgebung (//runner machine//) ausgeführt werden.
* Jeder Job besteht aus einem oder mehreren Schritten.
===== Beispiel: Copy Issues =====
Wenn du im GitHub Classroom ein Assignment akzeptierst, wird eine persönliche Kopie des Vorlage-Repositories erstellt.
Dabei werden aber allfällige Issues in der Vorlage nicht kopiert.
Dieser Workflow und das zugehörige Pythonskript ermöglicht es, die Issues in die persönlichen Repositories zu kopieren.
name: GitHub Classroom Workflow
on: push
env:
DEVOPS_DIR: devops
GHSECRET: ${{ secrets.GITHUB_TOKEN }}
permissions:
checks: write
actions: read
contents: read
jobs:
copy-issues:
# copy all issues from the source repo to the students repo
env:
SCRIPT_REPO: BZZ-Commons/copy-issues
SOURCE_REPO: BZZ-Commons/copy-issues # TODO set the owner/name of the source repo
TARGET_REPO: ${{ github.repository }}
ADD_LABELS: "true" # should the labels for the issues be added
if: ${{ contains(github.actor, 'classroom') }}
name: CopyIssues
runs-on: ubuntu-latest
steps:
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install pyGithub
if [ -f requirements.txt ]; then pip install -r requirements.txt; fi
- name: Check-out the IssueCopy Repo
uses: actions/checkout@v2
with:
repository: ${{ env.SCRIPT_REPO }}
path: ${{ env.DEVOPS_DIR }}
- name: Copy the Issues
run: python ${{ env.DEVOPS_DIR }}/issues.py
shell: sh
==== Erklärungen ====
name: GitHub Classroom Workflow
Dieser Name erscheint im Tab "Actions" um den Workflow zu identifizieren.
on: push
Der Event um diesen Workflow auszulösen; er wird bei jedem ''push'' ins Repository ausgelöst.
Für eine manuelle Auslösung würde ich ''workflow_dispatch'' verwenden.
jobs:
copy-issues:
Ab hier werden die Verarbeitungen definiert. In diesem Beispiel gibt es nur einen Job.
env:
SCRIPT_REPO: BZZ-Commons/copy-issues
SOURCE_REPO: BZZ-Commons/copy-issues # TODO set the owner/name of the source repo
TARGET_REPO: ${{ github.repository }}
ADD_LABELS: "true"
Hier werden einige Umgebungsvariablen definiert.
Auf diese Werte kann das Pythonskript zugreifen.
if: ${{ contains(github.actor, 'classroom') }}
Nur wenn der Push durch den ''classroom'' Bot erfolgt ist, wird der Job durchgeführt.
Dadurch werden die Issues nicht bei jedem Push neu kopiert und überschrieben.
runs-on: ubuntu-latest
Hier wird die Umgebung (//runner machine//) für den Job festgelegt.
steps:
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install pyGithub
if [ -f requirements.txt ]; then pip install -r requirements.txt; fi
- name: Check-out the IssueCopy Repo
uses: actions/checkout@v2
with:
repository: ${{ env.SCRIPT_REPO }}
path: ${{ env.DEVOPS_DIR }}
- name: Copy the Issues
run: python ${{ env.DEVOPS_DIR }}/issues.py
shell: sh
Nun folgen die Steps mit der eigentlichen Verarbeitung:
- Installiere alle Abhängigkeiten für das Pythonskript.
- Lies (//check-out//) das Repository mit den Issues.
- Führe das Pythonskript ''issues.py'' aus.
Falls du das Pythonskript anschauen möchtest, du findest es unter [[https://github.com/BZZ-Commons/copy-issues/blob/main/issues.py]].
----
{{tag>M450-LU13}}
[[https://creativecommons.org/licenses/by-nc-sa/4.0/|{{https://i.creativecommons.org/l/by-nc-sa/4.0/88x31.png}}]] Marcel Suter