diff --git a/project2/Dockerfile b/project2/Dockerfile index f3fcfe6..b8b1735 100644 --- a/project2/Dockerfile +++ b/project2/Dockerfile @@ -2,12 +2,11 @@ FROM python:3.9-slim WORKDIR /app -COPY requirements.txt . -RUN pip install --no-cache-dir -r requirements.txt +RUN pip install --no-cache-dir requests COPY famousquotes.py . -# Defines o varianta de baza -ENV QUOTE_API_URL="https://api.quotable.io/random" +RUN touch quote.txt && chmod 666 quote.txt +# Comanda de rulare CMD ["python", "famousquotes.py"] \ No newline at end of file diff --git a/project2/famousquotes.py b/project2/famousquotes.py index 8d77a23..c1a9279 100644 --- a/project2/famousquotes.py +++ b/project2/famousquotes.py @@ -1,37 +1,64 @@ -import requests -import os -import sys +pipeline { + agent any -# Folosim variabila de mediu sau un fallback -API_URL = os.getenv("QUOTE_API_URL", "https://api.quotable.io/random") + stages { + stage('Build & Lint') { + steps { + script { + dir('project2') { + // 1. Construim imaginea + sh "docker build -t quotes-app ." + + // 2. LINT CHECK: Verificăm sintaxa Python în interiorul containerului + echo "🔍 Verificăm sintaxa codului..." + sh "docker run --rm quotes-app python -m py_compile famousquotes.py" + } + } + } + } -def get_quote(): - try: - # Timeout de 10 secunde ca să nu stea Jenkins blocat dacă API-ul nu răspunde - response = requests.get(API_URL, timeout=10) - response.raise_for_status() - data = response.json() - - if isinstance(data, list): - data = data[0] + stage('Run & Extract') { + steps { + script { + dir('project2') { + try { + // 3. Rulăm cu DNS forțat pentru a evita "NameResolutionError" + sh "docker run --name quotes-worker --network host --dns 8.8.8.8 quotes-app" + + // 4. Extragem rezultatul + sh "docker cp quotes-worker:/app/quote.txt ." + } catch (e) { + echo "Eroare la rulare, dar încercăm notificarea." + } finally { + sh "docker rm -f quotes-worker || true" + } + } + } + } + } + } - quote = data.get('content') or data.get('advice') or data.get('q') or "No quote today." - author = data.get('author') or data.get('a') or "Unknown" + post { + always { + script { + // !!! Pune Webhook-ul tău aici !!! + def discordUrl = "https://discord.com/api/webhooks/1471492658336891013/T5s6ZKZjJjDMHXc3k3jjZdk6m5EV12bKF1wda9d5I_gZJrsDZQ1m1m078IiLJWK38mqa" + + def quoteText = "Nu am putut citi fișierul." + try { + quoteText = readFile('project2/quote.txt').trim() + } catch (err) { + echo "Fișierul nu a fost găsit." + } - # Mesaj formatat pentru Discord - message = f"📜 *\"{quote}\"* \n\n✍️ **{author}**" - - with open("quote.txt", "w", encoding="utf-8") as f: - f.write(message) - - print(f"Citat salvat cu succes!") - - except Exception as e: - print(f"Eroare API: {e}") - with open("quote.txt", "w", encoding="utf-8") as f: - f.write("⚠️ Nu am putut prelua citatul din cauza unei erori de rețea.") - # Ieșim cu 0 ca să lăsăm Jenkins să trimită notificarea chiar dacă API-ul a dat fail - sys.exit(0) - -if __name__ == "__main__": - get_quote() \ No newline at end of file + def statusEmoji = (currentBuild.result == 'SUCCESS') ? "✅" : "⚠️" + + sh """ + curl -X POST -H 'Content-Type: application/json' \ + -d '{"content": "${statusEmoji} **Pipeline Finalizat (Build #${env.BUILD_NUMBER})**\\n\\n${quoteText}"}' \ + '${discordUrl}' + """ + } + } + } +} \ No newline at end of file diff --git a/project2/jenkinsfile b/project2/jenkinsfile index 3da576b..2c907bd 100644 --- a/project2/jenkinsfile +++ b/project2/jenkinsfile @@ -1,21 +1,18 @@ pipeline { agent any - stages { stage('Build & Run') { steps { script { dir('project2') { sh "docker build -t quotes-app ." - try { - // Rulăm containerul și dăm un nume pentru a putea copia fișierul afară - sh "docker run --name quotes-container --network host quotes-app" + // Adăugăm --dns 8.8.8.8 pentru a rezolva problema de rețea + sh "docker run --name quotes-container --network host --dns 8.8.8.8 quotes-app" sh "docker cp quotes-container:/app/quote.txt ." } catch (e) { - echo "Eroare la execuție, trecem la notificare." + echo "Eroare la execuție." } finally { - // Curățăm containerul ca să nu dea eroare de 'name already in use' la următorul build sh "docker rm -f quotes-container || true" } } @@ -23,23 +20,13 @@ pipeline { } } } - post { always { script { - // !!! PUNE WEBHOOK-UL TĂU AICI !!! def discordUrl = "https://discord.com/api/webhooks/1471492658336891013/T5s6ZKZjJjDMHXc3k3jjZdk6m5EV12bKF1wda9d5I_gZJrsDZQ1m1m078IiLJWK38mqa" - - def quoteText = "Fișierul cu citate nu a fost găsit." - try { - quoteText = readFile('project2/quote.txt').trim() - } catch (err) { - echo "Eroare la citirea fișierului." - } - + def quoteText = readFile('project2/quote.txt').trim() def statusEmoji = (currentBuild.result == 'SUCCESS') ? "✅" : "⚠️" - // Trimitem notificarea sh """ curl -X POST -H 'Content-Type: application/json' \ -d '{"content": "${statusEmoji} **Pipeline Finalizat (Build #${env.BUILD_NUMBER})**\\n\\n${quoteText}"}' \