GitLab CI/CD¶
GitLab CI/CD aitab automatiseerida programmi kompileerimist, testimist ja käivitamist erinevatel operatsioonsüsteemidel. See on paindlik ja mugav viis programmi kontrollimiseks enne selle liitmist põhiharuga.
Enne GitLab CI/CD kasutamist tuleb enda projekti seadistada.
GitLab Projekti Seadistamine CI/CD kasutamiseks¶
Avage oma projekt ja navigeerige vasakpoolses menüüs CI/CD sätete juurde.
Erinevate sektsioonide vahel leidke Runners ja avage see
Pange tähele, et Instance runners on sisse lülitatud
Leidke Variables sektsioonist Add variable
Lisage järgnevad väärtused
Key |
Value |
|---|---|
SSH_PRIVATE_KEY |
SSH privaatvõti, mis vastab serverisse lisatud avalikule võtmele |
DEPLOY_HOST |
Serveri IP aadress |
DEPLOY_USER |
Serveri kasutaja (TalTechi serverites tavaliselt 'ubuntu') |
Serveri Seadistamine¶
Serveri faili saaks pakendada Dockeri konteinerisse, kuid see nõuab eraldi Dockeri registry kontot ja Dockerfile'i. TalTechi serverid kasutavad ubuntu operatsioonisüsteemi, millel jookseb systemd protsess. Selleks, et serveris oleks lihtsam JAR faili käivitada ja kinni panna kasutame systemd service-it.
Seega tuleb serverisse lisada fail /etc/systemd/system/server.service
[Unit]
Description=LibGDX Game Server
After=network.target
[Service]
Type=simple
User=ubuntu
WorkingDirectory=/home/ubuntu
ExecStart=java -jar /home/ubuntu/server.jar
Restart=on-failure
[Install]
WantedBy=multi-user.target
Vaadake üle, et ExecStart vastab teie JAR faili asukohale ja nimele. Faili nimi vastab sellele, kuidas seda käivitatakse, ehk fail nimega example.service käivitub käsuga sudo systemctl start example, seega antud koodis käivitub server käsuga sudo systemctl start server.
GitLab CI faili loomine¶
Enda projekti root kaustas (ehk kõige ülimas) looge .gitlab-ci.yml fail ja kopeerige järgmine sisu ning vaadake üle kommentaarides mainitud väärtused
stages:
- build
- deploy
variables:
GRADLE_OPTS: "-Dorg.gradle.daemon=false"
DEPLOY_PATH: "/home/ubuntu/" # Serveris oleva JAR faili asukoht
ARTIFACT_NAME: "server.jar" # Serveris oleva JAR faili nimi
# Vaadake, et nimed ühtiksid üleval oleva service failiga!!!
# ── BUILD ────────────────────────────────────────────────────────────────────
build:
stage: build
image: eclipse-temurin:21-jdk # Vaadake, et oleks õige JDK versioon teie projekti jaoks
only:
- main # Ainult main harus
script:
- chmod +x gradlew
- ./gradlew clean --no-daemon # Kustutab ära eelmised build/ failid
- ./gradlew server:jar --no-daemon # Ehitab JAR faili, KUI TEIE PROJKETIS TEHAKSE SEE TEISTMOODI, MUUTKE!!!
artifacts:
paths:
- server/build/libs/*.jar # Koht, kuhu JAR fail tekitatakse
expire_in: 1 hour
# ── DEPLOY ───────────────────────────────────────────────────────────────────
deploy:
stage: deploy
image: eclipse-temurin:21-jdk # Vaadake, et JDK versioon on õige teie projekti jaoks
only:
- main
before_script:
# Install SSH client
- apt-get update -qq && apt-get install -y -qq openssh-client rsync #rsync on vajalik tõmmata, ainult siis kui see käima läheb
# Set up SSH key from a CI/CD secret variable (Settings → CI/CD → Variables)
- eval $(ssh-agent -s)
- echo "$SSH_PRIVATE_KEY" | tr -d '\r' | ssh-add -
- mkdir -p ~/.ssh && chmod 700 ~/.ssh
- |
cat >> ~/.ssh/config <<EOF
Host $DEPLOY_HOST
StrictHostKeyChecking no
UserKnownHostsFile /dev/null
EOF
- chmod 600 ~/.ssh/config
script:
# Paneb kinni jooksva serveri
- ssh $DEPLOY_USER@$DEPLOY_HOST "sudo systemctl stop server || true" # Vaadake üle, et service'i nimi vastab serveris oleva service'i nimele
# Laeb faili serverisse üles
# Võite proovida rsync-iga (commentige see sisse ja cat välja), aga TalTechi server teadmata põhjustel ei pruugi võtit ära tunda.
# Hetkel saadetakse fail lihtsalt üle SSH ilma erilist scp või rsync protokolli kasutamata.
# - rsync -az --progress server/build/libs/*.jar \
# $DEPLOY_USER@$DEPLOY_HOST:$DEPLOY_PATH/$ARTIFACT_NAME
- cat server/build/libs/*.jar | ssh -o StrictHostKeyChecking=no $DEPLOY_USER@$DEPLOY_HOST "cat > $DEPLOY_PATH/$ARTIFACT_NAME"
# Paneb serveri käima
- ssh $DEPLOY_USER@$DEPLOY_HOST "sudo systemctl start server" # Vaadake üle, et service'i nimi vastab serveris oleva service'i nimele
Juhul, kui teie koodistruktuur on erinev Java Game Template struktuurist, siis andke kindlasti teada Tarkvaraarenduse Discord kanalis!
NB! TalTechi serveris on avatud ainult teatud port'id, vaadake, et teie mäng kasutab porte õiges vahemikus (tavaliselt 8080-8090).
Nüüd kui teha merge request main harusse jookseb automaatselt ka pipeline ja teie serveri uusim versioon jookseb ka serveris.