Skip to content

Update CI/CD workflow to include performance testing and download per… #128

Update CI/CD workflow to include performance testing and download per…

Update CI/CD workflow to include performance testing and download per… #128

Workflow file for this run

name: CI/CD Pipeline
on:
push:
branches:
- main
pull_request:
branches:
- main
permissions:
issues: write
contents: read
jobs:
setup:
name: Setup
runs-on: ubuntu-latest
outputs:
cache-hit: ${{ steps.node-with-cache.outputs.cache-hit }}
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Setup Node.js with node_modules cache
id: node-with-cache
uses: actions/cache@v4
with:
path: ~/.npm
key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }}
restore-keys: |
${{ runner.os }}-node-
- name: Install npm packages
run: npm ci
# linting:
# name: Linting
# runs-on: ubuntu-latest
# needs: setup
# steps:
# - name: Checkout repository
# uses: actions/checkout@v4
# - name: Setup Node.js
# uses: actions/setup-node@v4
# with:
# node-version: 18.x
# - name: Use cached node_modules
# run: npm ci --cache ~/.npm
# - name: Run ESLint and generate report
# run: npm run lint
# - name: Annotate Code Linting Results
# uses: ataylorme/eslint-annotate-action@v3
# with:
# report-json: 'lint_report.json'
# - name: Upload ESLint report
# uses: actions/upload-artifact@v4
# with:
# name: lint_report.json
# path: lint_report.json
# retention-days: 5
# e2e-testing:
# name: E2E Testing
# runs-on: ubuntu-latest
# needs: linting
# steps:
# - name: Checkout repository
# uses: actions/checkout@v4
# - name: Setup Node.js
# uses: actions/setup-node@v4
# with:
# node-version: 18.x
# - name: Use cached node_modules
# run: npm ci --cache ~/.npm
# - name: Build application
# run: npm run build
# - name: Start server
# run: npm run start &
# - name: Wait for server to start
# run: npx wait-on http://localhost:3000
# - name: Run tests
# run: npx cypress run --reporter junit --reporter-options mochaFile=reports/TEST-[hash].xml
# # - name: Generate testing report
# # run: |
# # npx mochawesome-merge "cypress/reports/*.json" > report.json
# # npx marge report.json --reportFilename "e2e_testing_report" --reportTitle "E2E Testing Report" --reportPageTitle "E2E Testing Report"
# # - name: Upload testing report
# # uses: actions/upload-artifact@v4
# # with:
# # name: e2e_testing_report
# # path: mochawesome-report
# # retention-days: 5
# - name: Python setup
# if: always()
# uses: actions/setup-python@v3
# with:
# python-version: '3.x'
# - name: Upload testing results to TestRail
# env:
# TESTRAIL_EMAIL: ${{ secrets.TESTRAIL_EMAIL }}
# TESTRAIL_PASS: ${{ secrets.TESTRAIL_PASS }}
# if: always()
# run: |
# pip install trcli
# junitparser merge --glob "reports/TEST-*" "reports/junit-report.xml"
# trcli -y \
# -h https://lukamlinaric.testrail.io/ \
# --project "TestOps PoC" \
# -u "$TESTRAIL_EMAIL" \
# -p "$TESTRAIL_PASS" \
# parse_junit \
# --title "E2E Tests from CI/CD Pipeline" \
# --run-description ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }} \
# -f "reports/junit-report.xml"
# security-testing:
# name: Security Testing
# runs-on: ubuntu-latest
# outputs:
# full_scan_result: ${{ steps.store_full_scan_result.outputs.full_scan_result }}
# needs: e2e-testing
# services:
# app:
# image: quiirex/nowted-app:latest
# ports:
# - 3000:3000
# steps:
# - name: ZAP Full Scan
# id: full_scan
# uses: zaproxy/action-full-scan@v0.10.0
# with:
# target: 'http://app:3000'
# - name: Store Full Scan Result
# id: store_full_scan_result
# run: |
# mkdir -p full_scan_results
# mv *.html full_scan_results/ || true
# FULL_RESULT_FILE=$(find full_scan_results -name "*.html" -type f)
# echo "::set-output name=full_scan_result::$FULL_RESULT_FILE"
# - name: Upload Full Scan Artifact
# uses: actions/upload-artifact@v4
# with:
# name: security_testing_report
# path: ${{ steps.store_full_scan_result.outputs.full_scan_result }}
# retention-days: 5
# containerize-and-publish-image:
# name: Containerize and Publish Image
# runs-on: ubuntu-latest
# outputs:
# image-tag: ${{ steps.build-and-push.outputs.IMAGE_TAG }}
# steps:
# - name: Checkout repository
# uses: actions/checkout@v4
# - name: Log in to DockerHub
# uses: docker/login-action@v3
# with:
# username: ${{ secrets.DOCKERHUB_USERNAME }}
# password: ${{ secrets.DOCKERHUB_TOKEN }}
# - id: build-and-push
# name: Build and Push Docker Image
# run: |
# IMAGE_TAG=${{ secrets.DOCKERHUB_USERNAME }}/nowted-app:${{ github.sha }}
# echo $IMAGE_TAG > image-tag.txt
# docker build -t $IMAGE_TAG .
# docker push $IMAGE_TAG
# - name: Upload IMAGE_TAG file
# uses: actions/upload-artifact@v4
# with:
# name: image-tag
# path: image-tag.txt
# deployment:
# name: Deploy to GKE Cluster
# runs-on: ubuntu-latest
# needs: containerize-and-publish-image
# steps:
# - name: Checkout repository
# uses: actions/checkout@v4
# - id: auth
# name: Authenticate with Google Cloud
# uses: google-github-actions/auth@v2
# with:
# credentials_json: '${{ secrets.GCP_CREDENTIALS }}'
# - name: Set up Google Cloud SDK
# uses: google-github-actions/setup-gcloud@v2
# with:
# install_components: 'gke-gcloud-auth-plugin'
# - name: Configure kubectl
# run: |
# gcloud container clusters get-credentials autopilot-cluster-1 --region europe-central2
# kubectl config current-context
# - name: Download IMAGE_TAG file
# uses: actions/download-artifact@v4
# with:
# name: image-tag
# - name: Apply Kubernetes manifests
# run: |
# IMAGE_TAG=$(cat image-tag.txt)
# echo "Using image tag: $IMAGE_TAG"
# sed -i "s|quiirex/nowted-app:latest|$IMAGE_TAG|g" k8s/resources.yaml
# cat k8s/resources.yaml
# kubectl apply -f k8s/resources.yaml
# - name: Verify Deployment
# run: |
# echo "Checking deployment status..."
# kubectl rollout status deployment/testopspoc
# echo "Listing pods..."
# kubectl get pods
performance-testing:
name: Performance Testing
runs-on: ubuntu-latest
# needs: deployment
services:
app:
image: quiirex/nowted-app:latest
ports:
- 3000:3000
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Run k6 local test
uses: grafana/k6-action@v0.3.1
with:
filename: __tests__/performance/test.js
flags: --vus 50 --duration 15s --out json=performance-testing-report.json
env:
BASE_URL: 'http://app:3000'
- name: Upload k6 performance reports
uses: actions/upload-artifact@v4
with:
name: performance-testing-report
path: performance-testing-report.json
notifications:
name: Notifications
runs-on: ubuntu-latest
needs: performance-testing
if: always()
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Download performance testing report
uses: actions/download-artifact@v4
with:
name: performance-testing-report
- name: Notify Email
uses: dawidd6/action-send-mail@v3
with:
server_address: smtp.gmail.com
server_port: 465
username: ${{ secrets.EMAIL_USERNAME }}
password: ${{ secrets.EMAIL_PASSWORD }}
subject: 'CI/CD Pipeline Notification'
body: 'The CI/CD pipeline has completed successfully. See the attached testing reports.'
to: ${{ secrets.EMAIL_TO }}
from: ${{ secrets.EMAIL_FROM }}
attachments: 'performance-testing-report'