DevOps engineer focused on CI/CD, Kubernetes and cloud infrastructure.
I'm Khawla Rouis. I design reusable delivery pipelines, run containerized workloads on Kubernetes, and set up the infrastructure, monitoring and secrets management around them.
- Experience
- 3+ years, DevOps engineer at Worldsoft Group
- Focus
- CI/CD, Kubernetes, infrastructure as code, observability
- Certification
- Microsoft Azure Fundamentals (AZ-900)
- Location
- Tunis, Tunisia.
I'm looking for a role on a larger Kubernetes and cloud platform. Contact me.
Skills
- CI/CD
- JenkinsGitHub ActionsGitLab CIShared libraries and templatesSonarQubeNexusMaven
- Containers and orchestration
- DockerDocker ComposeDocker SwarmKubernetesHelmMinikubeArgoCD
- Cloud and IaC
- TerraformAWS EKSRDSIAM / IRSAGitHub OIDCConsul stateAWS S3AWS ECR
- Observability
- PrometheusGrafanak6InfluxDBElasticsearchLogstashKibana
- Security
- HashiCorp VaultAppRoleTLS/SSL certificatesExternal SecretsNginx HTTPS
- Development
- JavaSpring BootREST APIsRedisBash
Projects
Each project was built and run on real VMs or clusters. Most READMEs include architecture diagrams.
Deploying to EKS without storing AWS keys
A Python app on EKS. Terraform builds the infrastructure, ArgoCD keeps the cluster matching what's in git, and GitHub Actions reaches AWS through OIDC, so there are no long-lived AWS keys in the repo secrets. RDS, IRSA and External Secrets are wired in so pods receive database credentials without storing them in the repository.
One pipeline, written three times
I wrote the same pipeline as a Jenkins shared library, a GitLab CI template and a GitHub Actions reusable workflow. reliable-ci-cd-pipeline is the repo that uses them: four services, each with a few lines of config that call the shared pipeline. Every run works out a version, builds, tests, pushes the image, deploys with Helm, waits for approval before prod, and tells Slack. A change to one service only triggers that service's pipeline.
A pipeline change is made once per platform instead of once per service.
reliable-ci-cd-pipeline, jenkins-shared-library, gitlab-shared-template, github-shared-workflow
Cluster setup in Terraform
Local, Dev and prod namespaces, RBAC, NGINX Ingress and TLS on Kubernetes clusters, with the state kept in Consul. After each apply it pushes a kubeconfig for a limited github-actions service account into the pipeline repo's secrets. CI can deploy with Helm, and it never holds admin credentials.
devops-infrastructure-terraform
Kubernetes and Helm, driven by Jenkins
Two setups. In one, a monorepo of microservices uses Jenkins multibranch pipelines: the dev branch deploys to the dev cluster and main to prod, with Helm charts and semantic versions. In the other, a single Jenkins pipeline deploys a Spring Boot app to Minikube on a push to main and to a real cluster when a git tag is pushed. Jenkins runs on a private VM, so GitHub webhooks reach it through ngrok.
kubernetes-helm-deployment, k8s-minikube-vs-cluster
Load testing next to a monitoring stack
The app runs on one VM and the monitoring on another. Node Exporter and Prometheus feed Grafana, and k6 runs baseline, stress and spike tests with the results going into InfluxDB. This makes it possible to compare system behavior against each load profile.
monitoring-grafana-prometheus-k6
Vault and Redis over TLS
A Spring Boot app that gets its secrets from Vault at startup through AppRole and talks to Redis over TLS. Vault unseals itself on boot with a systemd unit and a script, and for local development the certificates come from a Java KeyStore.
Smaller ones
A Docker Swarm setup across several VMs with Eureka, an API gateway, an Angular frontend and Nginx with HTTPS on a custom DNS name (docker-microservices). A Spring Boot service that uploads TXT, JSON and XML files and indexes them into Elasticsearch over HTTPS (springboot-elasticsearch-files). An ELK stack for a Spring Boot app (elk-monitoring-stack). Full Spring Boot pipelines on Jenkins, GitHub Actions and GitLab CI. And a collection of automation scripts. Everything is on my GitHub.
Writing
I wrote a five-part series on making CI/CD pipelines reliable across Jenkins, GitHub Actions and GitLab CI.
- Designing Reliable CI/CD Pipelines Across Platforms
- How to Build Reusable CI/CD Pipelines Across Jenkins, GitHub Actions, and GitLab CI
- Cross-Platform Consistency
- Automated Pre-Deployment Validation
- Rollback-Ready Pipelines
Engineering practices
Principles I apply when designing pipelines:
- Pipeline logic lives in one place. Copies drift apart.
- Check before deploying, not after.
- Expect to roll back, and make it easy before the day you need it.
Background
I came to DevOps from electronics networking and telecommunications, which shaped how I approach systems: know what each component is responsible for. I have a bachelor's in electronics and electrotechnics from the Faculty of Sciences of Tunis (El Manar), then did two years of the master's in networking and telecommunications . I hold the Azure Fundamentals certification (AZ-900).+
Most days I use Jenkins, GitHub Actions, GitLab CI, Docker, Kubernetes, Helm, SonarQube, Spring Boot, Redis, Elasticsearch, Kibana and Vault. On my own projects I've gone deeper into Terraform, AWS, ArgoCD, Prometheus, Grafana and k6.
Contact
LinkedIn is the easiest way to reach me: linkedin.com/in/khawla-rouis. My code is at github.com/rouisskhawla and my articles are on Medium.