diff --git a/website/.dockerignore b/website/.dockerignore new file mode 100644 index 00000000..7347a7fb --- /dev/null +++ b/website/.dockerignore @@ -0,0 +1,25 @@ +**/.classpath +**/.dockerignore +**/.env +**/.git +**/.gitignore +**/.project +**/.settings +**/.toolstarget +**/.vs +**/.vscode +**/*.*proj.user +**/*.dbmdl +**/*.jfm +**/bin +**/charts +**/docker-compose* +**/compose* +**/Dockerfile* +**/node_modules +**/npm-debug.log +**/obj +**/secrets.dev.yaml +**/values.dev.yaml +LICENSE +README.md diff --git a/website/Dockerfile b/website/Dockerfile new file mode 100644 index 00000000..335e0b91 --- /dev/null +++ b/website/Dockerfile @@ -0,0 +1,20 @@ + +FROM php:8.2-apache + + +RUN a2enmod rewrite + + +RUN docker-php-ext-install pdo pdo_mysql + + +WORKDIR /var/www/html + + +COPY . /var/www/html/ + +RUN sed -i 's/AllowOverride None/AllowOverride All/g' /etc/apache2/apache2.conf + +EXPOSE 80 + +CMD ["apache2-foreground"] diff --git a/website/ansible/deployment.yml b/website/ansible/deployment.yml new file mode 100644 index 00000000..0444d367 --- /dev/null +++ b/website/ansible/deployment.yml @@ -0,0 +1,47 @@ +--- +- name: Deploy to EKS namespace using env-specific manifests + hosts: localhost + connection: local + gather_facts: no + + vars: + target_env: "{{ env | default('dev') }}" + eks_cluster: "{{ cluster_name | default('eks_cluster-demo') }}" + aws_region: "{{ region | default('eu-west-2') }}" + + env_dir: "envs/{{ target_env }}" + inventory_dir: "{{ env_dir }}/inventory" + k8s_dir: "{{ env_dir }}/k8s" + namespace: "{{ target_env }}" + + tasks: + - name: Show deployment parameters + debug: + msg: + - "Environment: {{ target_env }}" + - "Namespace : {{ namespace }}" + - "ENV_DIR : {{ env_dir }}" + - "Inventory : {{ inventory_dir }}" + - "K8S_DIR : {{ k8s_dir }}" + - "Cluster : {{ eks_cluster }}" + - "Region : {{ aws_region }}" + + - name: Apply Kubernetes manifests + kubernetes.core.k8s: + state: present + namespace: "{{ namespace }}" + src: "{{ item }}" + with_fileglob: + - "{{ k8s_dir }}/*.yaml" + register: inventory_output + changed_when: "'created' in inventory_output.stdout or 'configured' in inventory_output.stdout" + + - name: Apply Kubernetes manifests + kubernetes.core.k8s: + state: present + namespace: "{{ namespace }}" + src: "{{ item }}" + with_fileglob: + - "{{ k8s_dir }}/*.yaml" + register: k8s_output + changed_when: "'created' in k8s_output.stdout or 'configured' in k8s_output.stdout" diff --git a/website/envs/dev/inventory/inventory.ini b/website/envs/dev/inventory/inventory.ini new file mode 100644 index 00000000..5bcac5b3 --- /dev/null +++ b/website/envs/dev/inventory/inventory.ini @@ -0,0 +1,7 @@ +[eks_dev] +host1 ansible_host=10.0.1.210 + +[eks_dev:vars] +aws_region=eu-west-2 +eks_cluster_name=eks_cluster-demo +k8s_manifest_dir=./website diff --git a/website/envs/dev/k8s/deployment.yaml b/website/envs/dev/k8s/deployment.yaml new file mode 100644 index 00000000..7294f918 --- /dev/null +++ b/website/envs/dev/k8s/deployment.yaml @@ -0,0 +1,20 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: php-app-deployment + namespace: dev # Explicitly define the namespace +spec: + replicas: 1 + selector: + matchLabels: + app: my-php-app + template: + metadata: + labels: + app: my-php-app + spec: + containers: + - name: my-container + image: apand84/php-app/your-image-name + ports: + - containerPort: 80 diff --git a/website/envs/prod/inventory/inventory.ini b/website/envs/prod/inventory/inventory.ini new file mode 100644 index 00000000..bba8b1f4 --- /dev/null +++ b/website/envs/prod/inventory/inventory.ini @@ -0,0 +1,4 @@ +[eks_prod:vars] +aws_region=eu-west-2 +eks_cluster_name=eks_cluster-demo +k8s_manifest_dir=./website diff --git a/website/envs/prod/k8s/deployment.yaml b/website/envs/prod/k8s/deployment.yaml new file mode 100644 index 00000000..02fe890b --- /dev/null +++ b/website/envs/prod/k8s/deployment.yaml @@ -0,0 +1,20 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: php-app-deployment + namespace: prod # Explicitly define the namespace +spec: + replicas: 2 + selector: + matchLabels: + app: my-php-app + template: + metadata: + labels: + app: my-php-app + spec: + containers: + - name: my-container + image: apand84/php-app/your-image-name + ports: + - containerPort: 80 diff --git a/website/envs/test/inventory/inventory.ini b/website/envs/test/inventory/inventory.ini new file mode 100644 index 00000000..5b238f0c --- /dev/null +++ b/website/envs/test/inventory/inventory.ini @@ -0,0 +1,6 @@ +[eks_test] +host1 ansible_host=10.0.1.210 + +[eks_test:vars] +aws_region=eu-west-2 +eks_cluster_name=eks_cluster-demo diff --git a/website/envs/test/k8s/deployment.yaml b/website/envs/test/k8s/deployment.yaml new file mode 100644 index 00000000..4338fd4f --- /dev/null +++ b/website/envs/test/k8s/deployment.yaml @@ -0,0 +1,20 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: php-app-deployment + namespace: test # Explicitly define the namespace +spec: + replicas: 1 + selector: + matchLabels: + app: my-php-app + template: + metadata: + labels: + app: my-php-app + spec: + containers: + - name: my-container + image: apand84/php-app/your-image-name + ports: + - containerPort: 80 diff --git a/website/jenkins b/website/jenkins new file mode 100644 index 00000000..dfb2ae6d --- /dev/null +++ b/website/jenkins @@ -0,0 +1,79 @@ +pipeline { + agent any + + environment { + DOCKER_IMAGE = "apand84/php-app" + DOCKER_CREDENTIALS_ID = 'dockerhub-login-details' + } + parameters { + + choice(name: 'NAMESPACE', choices: ['dev', 'test', 'prod'], description: 'Target K8s Namespace') + } + + stages { + stage('Clone Repository') { + steps { + git credentialsId: 'GITHUB_CREDENTIAL', url: 'https://github.com/nitesh4511/projCert/' + } + } + + stage('Build Docker Image') { + steps { + script { + def builtImage = docker.build("${DOCKER_IMAGE}:${env.BUILD_NUMBER}","./website") + builtImage.tag("latest") + dockerImage = builtImage + } + } + } + + stage('Test (Optional Placeholder)') { + steps { + sh 'echo "Running tests... (Add your PHP unit tests here)"' + // Example of running tests inside the built container: + // dockerImage.inside { + // sh 'php artisan test' + // } + } + } + + stage('Push Image to Docker Hub') { + steps { + script { + docker.withRegistry('https://registry.hub.docker.com', DOCKER_CREDENTIALS_ID) { + dockerImage.push("${env.BUILD_NUMBER}") + dockerImage.push("latest") + } + } + } + } + stage('Deploy Dev') { + steps { + script { + sh "ansible-playbook -i ./website/envs/dev/inventory/inventory.ini ./website/ansible/deployment.yml" + } + } + } + + stage('Deploy Test') { + steps { + script { + sh "ansible-playbook -i ./website/envs/test/inventory/inventory.ini ./website/ansible/deployment.yml" + } + } + } + + stage('Deploy Prod') { + when { + + branch 'master' + } + steps { + script { + + sh "ansible-playbook -i ./website/envs/prod/inventory/inventory.ini ./website/ansible/deployment.yml" + } + } + } + } +}