From c61ab676e008673a643a3fa53a94dbec6f32cec8 Mon Sep 17 00:00:00 2001 From: Sciocatti Date: Sat, 7 Jan 2023 17:28:20 +0200 Subject: [PATCH] Added bootstrap template files. --- template/Dockerfile | 3 ++ template/Jenkinsfile | 68 ++++++++++++++++++++++++++ template/deployment.yaml | 51 ++++++++++++++++++++ template/setup.sh | 102 +++++++++++++++++++++++++++++++++++++++ template/start.sh | 2 + 5 files changed, 226 insertions(+) create mode 100644 template/Dockerfile create mode 100644 template/Jenkinsfile create mode 100644 template/deployment.yaml create mode 100755 template/setup.sh create mode 100644 template/start.sh diff --git a/template/Dockerfile b/template/Dockerfile new file mode 100644 index 0000000..a0cee5e --- /dev/null +++ b/template/Dockerfile @@ -0,0 +1,3 @@ +FROM {{k3sContainerBase}} + +COPY html /usr/share/nginx/html \ No newline at end of file diff --git a/template/Jenkinsfile b/template/Jenkinsfile new file mode 100644 index 0000000..66602ef --- /dev/null +++ b/template/Jenkinsfile @@ -0,0 +1,68 @@ +#!groovy + +pipeline { + agent { + kubernetes { + defaultContainer 'jnlp' + yaml """ +apiVersion: v1 +kind: Pod +metadata: + name: {{k3sApp}}-env.BRANCH_NAME-build +spec: + serviceAccountName: jenkins-admin + containers: + - name: kaniko + image: gcr.io/kaniko-project/executor:debug + command: ["tail"] + args: ["-f", "/dev/null"] + volumeMounts: + - name: kaniko-secret + mountPath: /kaniko/.docker + - name: deploy + image: 192.168.195.195:30000/nginx:latest + command: ["tail"] + args: ["-f", "/dev/null"] + restartPolicy: Never + volumes: + - name: kaniko-secret + secret: + secretName: dockercred + items: + - key: .dockerconfigjson + path: config.json + """ + } + } + stages { + stage('Build') { + steps { + sh 'echo "No build steps configured."' + } + } + stage('Test') { + steps { + sh 'echo "No test steps configured."' + } + } + stage('Docker Build and Push') { + steps { + container("kaniko") { + sh ''' + /kaniko/executor --dockerfile `pwd`/cicd/env.BRANCH_NAME/Dockerfile --context `pwd` --destination 192.168.195.195:30000/{{k3sApp}}:env.BRANCH_NAME + ''' + } + } + } + stage('Kubernetes Deploy') { + steps { + container("deploy") { + sh 'curl -LO "https://storage.googleapis.com/kubernetes-release/release/v1.24.3/bin/linux/arm64/kubectl"' + sh 'chmod u+x ./kubectl' + sh 'sed -ie "s/{{replaceMe}}/`date +%s`/g" `pwd`/cicd/env.BRANCH_NAME/deployment.yaml' + sh './kubectl replace -f `pwd`/cicd/`env.BRANCH_NAME`/deployment.yaml' + } + } + } + } +} \ No newline at end of file diff --git a/template/deployment.yaml b/template/deployment.yaml new file mode 100644 index 0000000..73dfbcb --- /dev/null +++ b/template/deployment.yaml @@ -0,0 +1,51 @@ +apiVersion: v1 +kind: Service +metadata: + name: {{k3sApp}}-{{k3sEnv}}-svc + namespace: {{k3sNamespace}} +spec: + type: NodePort + selector: + app: {{k3sApp}}-{{k3sEnv}} + ports: + - name: http + nodePort: {{k3sport}} + port: 80 + targetPort: 80 + +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: {{k3sApp}}-{{k3sEnv}} + namespace: {{k3sNamespace}} +spec: + replicas: 2 + strategy: + rollingUpdate: + maxSurge: 1 + maxUnavailable: 1 + type: RollingUpdate + selector: + matchLabels: + app: {{k3sApp}}-{{k3sEnv}} + template: + metadata: + labels: + app: {{k3sApp}}-{{k3sEnv}} + delpoymentDate: "{{replaceMe}}" + spec: + containers: + - name: {{k3sApp}}-{{k3sEnv}} + image: 192.168.195.195:30000/{{k3sApp}}:{{k3sEnv}} + imagePullPolicy: Always + ports: + - name: http + containerPort: 80 + readinessProbe: + httpGet: + path: / + port: 80 + initialDelaySeconds: 5 + periodSeconds: 5 + successThreshold: 1 \ No newline at end of file diff --git a/template/setup.sh b/template/setup.sh new file mode 100755 index 0000000..7163956 --- /dev/null +++ b/template/setup.sh @@ -0,0 +1,102 @@ +#!/bin/bash + +#./setup.sh 3000 192.168.195.195:30000/nginx:latest cicd/Jenkinsfile + +folderName=${PWD##*/} +folderName=${folderName:-/} + +echo "Hello, lets get your project set up. Please follow the prompts attentively." + +read -p "Do you want to run this project locally? [Yn] " localProject + +if [ $localProject == 'Y' ] || [ $localProject == 'y' ] +then + echo "Configuring local settings" + read -p " Local port to expose server on? [eg 3000] " localPort + read -p " NGINX container to use? [eg nginx/nginx:latest] " localContainer + + echo " Creating start script" + cp template/start.sh start.sh + sed -ie "s|{{localPort}}|$localPort|g" start.sh + sed -ie "s|{{localContainer}}|$localContainer|g" start.sh + chmod +x start.sh + rm start.she +fi + +read -p "Are you deploying this with the Sciocatti Jenkins pipeline? [Yn] " useJenkins + +if [ $useJenkins == 'Y' ] || [ $useJenkins == 'y' ] +then + echo "Configuring deployment settings. Deployments will work on branches called 'stage' (), 'main', 'prod'" + read -p " K3S App name: " k3sApp + read -p " K3S namespace: [eg apps] " k3sNamespace + read -p " K3S base container: [eg nginx:nginx:latest] " k3sContainerBase + read -p " K3S prod NodePort: " k3sport + + k3sportMain=$((k3sport+1)) + k3sportStage=$((k3sport+2)) + + echo "Creating Folders" + echo " Creating cicd/" + mkdir cicd + echo " Creating cicd/prod" + mkdir cicd/prod + echo " Creating cicd/main" + mkdir cicd/main + echo " Creating cicd/stage" + mkdir cicd/stage + + echo "Loading files" + echo " Loading cicd/Jenkinsfile" + cp template/Jenkinsfile cicd/Jenkinsfile + sed -ie "s|{{k3sApp}}|$k3sApp|g" cicd/Jenkinsfile + rm cicd/Jenkinsfilee + + echo " Loading main" + k3sEnv=main + echo " Loading cicd/main/Dockerfile" + cp template/Dockerfile cicd/main/Dockerfile + sed -ie "s|{{k3sContainerBase}}|$k3sContainerBase|g" cicd/main/Dockerfile + rm cicd/main/Dockerfilee + + echo " Loading cicd/main/deployment.yaml" + cp template/deployment.yaml cicd/main/deployment.yaml + sed -ie "s|{{k3sApp}}|$k3sApp|g" cicd/main/deployment.yaml + sed -ie "s|{{k3sport}}|$k3sportMain|g" cicd/main/deployment.yaml + sed -ie "s|{{k3sNamespace}}|$k3sNamespace|g" cicd/main/deployment.yaml + sed -ie "s|{{k3sEnv}}|$k3sEnv|g" cicd/main/deployment.yaml + rm cicd/main/deployment.yamle + + echo " Loading stage" + k3sEnv=stage + echo " Loading cicd/stage/Dockerfile" + cp template/Dockerfile cicd/stage/Dockerfile + sed -ie "s|{{k3sContainerBase}}|$k3sContainerBase|g" cicd/stage/Dockerfile + rm cicd/stage/Dockerfilee + + echo " Loading cicd/stage/deployment.yaml" + cp template/deployment.yaml cicd/stage/deployment.yaml + sed -ie "s|{{k3sApp}}|$k3sApp|g" cicd/stage/deployment.yaml + sed -ie "s|{{k3sport}}|$k3sportStage|g" cicd/stage/deployment.yaml + sed -ie "s|{{k3sNamespace}}|$k3sNamespace|g" cicd/stage/deployment.yaml + sed -ie "s|{{k3sEnv}}|$k3sEnv|g" cicd/stage/deployment.yaml + rm cicd/stage/deployment.yamle + + echo " Loading prod" + k3sEnv=prod + echo " Loading cicd/prod/Dockerfile" + cp template/Dockerfile cicd/prod/Dockerfile + sed -ie "s|{{k3sContainerBase}}|$k3sContainerBase|g" cicd/prod/Dockerfile + rm cicd/prod/Dockerfilee + + echo " Loading cicd/prod/deployment.yaml" + cp template/deployment.yaml cicd/prod/deployment.yaml + sed -ie "s|{{k3sApp}}|$k3sApp|g" cicd/prod/deployment.yaml + sed -ie "s|{{k3sport}}|$k3sport|g" cicd/prod/deployment.yaml + sed -ie "s|{{k3sNamespace}}|$k3sNamespace|g" cicd/prod/deployment.yaml + sed -ie "s|{{k3sEnv}}|$k3sEnv|g" cicd/prod/deployment.yaml + rm cicd/prod/deployment.yamle + +fi + +echo "Thank you! Happy building..." \ No newline at end of file diff --git a/template/start.sh b/template/start.sh new file mode 100644 index 0000000..b160ce7 --- /dev/null +++ b/template/start.sh @@ -0,0 +1,2 @@ +#!/bin/bash +docker run --rm -v $(pwd)/html/:/usr/share/nginx/html/ -p {{localPort}}:80 {{localContainer}} \ No newline at end of file