3 min read

Besuchte (Metal) Festivals und Konzerte per Gitlab CI & Bash automatisch auflisten lassen

Der Ansatz für diesen Artikel stammt von meinem größten Hobby: Metal/Metalcore/Meldoic-Death-Metal und die damit verbunden und von mir besuchten Konzerte und Festivals. Jedoch ist es schwer dort noch den Überblick zu behalten, da es mittlerweile schon eine sehr beachtliche Anzahl ist.

Ich melde mich zurück aus der Sommerpause, bei mir vorallem durch Festivals und Konzerte geprägt. Rock am Ring, Nova Rock, Rammstein und Gojira habe ich die letzten Wochen besucht und live gesehen. Öfters kam mir währenddessen die Idee, doch alle Events in einer Liste in einem Git Repo aufzulisten. Also fing ich an diese Liste zusammenzustellen, welche aber schnell lang und unübersichtlich wurde. Also machte ich mir Gedanken, wie man diese am besten per Skript in weitere Listen nach bestimmten Kriterien sortiert aufteilt, und die aktuell existierenden Listen (3) wurde geboren:‌‌
all_concerts.md‌‌
Alle besuchten Konzerte, sortiert nach der Anzahl.‌‌
all_festivals.md‌‌
Alle besuchten Festivals, sortiert nach der Anzahl.‌‌
last_seen.md
‌Alle gesehenen Konzerte, sortiert nach dem Zeitpunkt.

Datenstruktur des Inputs

Anhand diesen Kriterien stellte ich mein Format für die Input Liste zusammen, wo ich die entsprechenden Zeiten, Typ des Auftritts und Bandnamen festhalte:

---
f,2022,Rock am Ring
c,2022,Spiritbox
c,2022,Caliban

So habe ich mich entschieden diese Einträge festzuhalten. f/c geben an ob Festival oder Konzert, und der Rest ist selbsterklärend.

Bash Skript(e) zur Erstellung der Markdown Dateien

Nun ging es daran, das entsprechende Bash Skript zu schreiben, welches die Einträge sortiert, zählt und eine Markdown Datei ausgibt. Hier zeige ich es exemplarisch an der Anzahl der besuchten Konzerte:

####################################
#   concerts by number of visits   #
####################################

# write the uniq names of all concerts to file concerts
cat input | grep 'c,' | cut -d ',' -f3 | sort -r | uniq > concerts
rm tmp

# while loop which goes through every line of file concerts
cat concerts | while read line 
do
    # calculate occurence of each festival from input
    cat input | grep 'c,' | grep "$line" | cut -d ',' -f3 | sort -r | uniq -c | tr -d "\n" >> tmp
    echo -n ' ( ' >> tmp
    
    # grep for each concerts date and display without newline
    cat input | grep "$line" | cut -d ',' -f2 | tr '\n' ' ' >> tmp
    echo ')' >> tmp
done

# print header
rm all_concerts.md
echo '```' > all_concerts.md
echo 'Count   Concerts' >> all_concerts.md
cat tmp | sort -r >> all_concerts.md

Zuerst schreibe ich mir alle Zeilen, beginnend mit c, daraus den Namen des Konzerts im dritten Feld  (cut -d ',' -f3), in umgekehrter Reihenfolge, und einamlig in eine seperate Datei. Dann durchlaufe ich die input Datei in einer while Schleife für jede Zeile der uniqen Konzerte und zähle, wie oft der jeweilige Name der Band in input auftritt. Die Anzahl schreibe ich dann in tmp, sowie die Jahreszahlen in eine Klammer hinter die Anzahl.‌‌ Am Ende noch den Markdown Header und die Spaltenbezeichnung für die per Tab getrennten Spalten und dann die enstprechend nach dem höchsten Wert sortierten Anzahlen und Namen der Konzerte aus tmp.

So, das war jetzt mein Versuch mein Vorgehen und meine Gedanken dazu niederzuschreiben und in Worte zu fassen. Ich weiß nicht ob alles so klar beschrieben wurde, zur Not kann man natürlich alles im Repo https://gitlab.com/peterge/visited_concerts im create_md.sh Skript nachlesen. Zu erwähnen wäre noch, dass alle temporären Dateien ignoriert werden, wie in der .gitignore angegeben:‌‌
tmp‌
concerts‌‌
festivals

Gitlab CI

Abschließend war meine Hauptanforderung das ganze per CI Chain zu automatisieren, damit die Bearbeitung der input Datei auch über den Webbrowser vom Handy möglich wird. ‌‌

---
stages:
  - create-and-commit  

commit-all:
  stage: create-and-commit
  script:
# https://forum.gitlab.com/t/git-push-from-inside-a-gitlab-runner/30554/4
    - bash create_md.sh
    - git config --global user.email "${GITLAB_USER_EMAIL}"
    - git config --global user.name "${GITLAB_USER_NAME}"
    - git pull origin main
    - git checkout -b $CI_COMMIT_BRANCH
    - git add .
    - git remote set-url --push origin https://festivals-ci:$festival_ci_token@gitlab.com/peterge/visited_concerts.git
    - git commit -m "[CI/CD] Update md documents via CI."
    - git push -o ci.skip origin HEAD:$CI_COMMIT_REF_NAME

Hierzu kommt dann die folgende .gitlab-ci.yml ins Spiel, auf deren Einzelheiten ich nicht genauer eingehen werde. Ich halte nur die folgenden besonderheiten fest, die mir auch nicht so ganz klar waren:‌‌
- git checkout -b $CI_COMMIT_BRANCH‌‌
Anlegen eines neuen Branches, in dem die Änderungen stehen

- git remote set-url --push origin https://festivals-ci:$festival_ci_token@gitlab.com/peterge/visited_concerts.git‌‌
Die Remote URL habe ich per HTTPS angegeben, und darin einen Personal Access Token über die CI Variable ($festival_ci_token) verwendet, um sie hier nicht im Klartext world-readable zu hinterlegen.

- git push -o ci.skip origin HEAD:$CI_COMMIT_REF_NAME‌‌
Über diese Zeile erfolgt dann der eigentliche push des commits, -o ci.skip bewirkt das der push aus dem CI Ablauf keinen weiteren Ablauf des CI Skripts auslöst.

Offtopic

So, das war der technische Teil dahinter. Hier noch ein Link zu meiner Kutte stand 06/2022 :D
P.S.: Da hat sich seitdem auch schon wieder sehr viel dran getan!

Author: peterge