diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 9d0ea6c5e1332a19476af1503be847a0df25ba14..f5b1fbd2fe47fb9e8f98e390b296bf6e959275b0 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -134,7 +134,8 @@ deploy-image: - kubectl apply -f secrets.yaml --namespace "${ENVIRONMENT_NAME}-${K8S_NAMESPACE}" - kubectl apply -f gitlab-registry-credentials.yaml --namespace "${ENVIRONMENT_NAME}-${K8S_NAMESPACE}" - kubectl apply -f configmap.yaml --namespace "${ENVIRONMENT_NAME}-${K8S_NAMESPACE}" - - kubectl apply -f deployment.yaml --namespace "${ENVIRONMENT_NAME}-${K8S_NAMESPACE}" + - DEPLOYMENT_MANIFEST=$(sed -e "s,{{image}},${IMAGE},g" ./deployment.yaml.tmpl) + - echo "${DEPLOYMENT_MANIFEST}" | kubectl apply --namespace "${ENVIRONMENT_NAME}-${K8S_NAMESPACE}" --filename - - kubectl apply -f service.yaml --namespace "${ENVIRONMENT_NAME}-${K8S_NAMESPACE}" - kubectl apply -f ingress.yaml --namespace "${ENVIRONMENT_NAME}-${K8S_NAMESPACE}" diff --git a/README.md b/README.md index 30a24ead3adc32e7504e7fb7ce7c3a6b6bee6707..a9f9d7eb4b861be9b68355eb85ee190904fa514a 100644 --- a/README.md +++ b/README.md @@ -1,114 +1,17 @@ -Lecture: DevOps - Application +SS22-DevOps-Deployable ============================= +### Introduction -> :warning: __Invoking `make` in a path containing white spaces will break execution and may lead to -> unforeseen side effects like DATA LOSS !__ +This repository demonstrates the automated deployment of a simple web application. It consists of two branches - **staging** and **main**. +These branches are protected, meaning that commits targetting them will fail. +Changes to the codebase are realized through the use of other temporary branches and Merge Requests to **staging**. Merge Requests to **main** should +only be opened from **staging** as a source branch. +As soon as a new change through a MR is commited to **staging**, a pipeline is triggered. It deploys the application to the **staging-todoapp-devops** namespace in a Kubernetes cluster, run on GKE. After that, the application is accessible on the URL: -This repository contains the [application](./app/README.md) that can be used as *deployable workload* for the -[project assignment](https://github.com/lucendio/lecture-devops-material/blob/master/assignments/project-work.md) -implementation. +> https://staging.todoapp-devops.software -In order to adapt the application and integrate it into your automation and deployment processes, it's usually not -required to change any existing code. Instead, you probably just want to add some *pipeline* code or even a container -file (e.g. `Dockerfile`). +The same process happens with commits (merged from **staging**) on the **main** branch. The web application is then accessible on: - -### Getting started - -For more information regarding the app, please take a look into its [README](./app/README.md). - -The `Makefile` in this directory can be seen as the main entry point for this repository. It's meant to locally run the -application and allow to mess around with the source code in order to better understand how it works and to be able to -tear it apart if necessary. -Additionally, it documents various invocations that may help you adapting this application as *workload* for the -assignment. - -**_Please note, that the `Makefile` is only meant to showcase steps that are usually taken to automate the deployment -lifecycle of such an application and code base. -It is NOT recommended to invoke `make` targets from the CI/CD, but rather to utilize platform-specific interfaces -(e.g. `.gitlab-ci.yml`, `Jenkinsfile`, etc.), which may then invoke commands shown in the `make` target or in the -`scripts` section of one of the `package.json` files._** - - -### Prerequisites - -The following software must be installed and available in `${PATH}`: - -* `node` ([NodeJS](https://nodejs.org/en/download)): latest v16 -* `npm` ([npm](https://www.npmjs.com/get-npm)): latest v8 -* `mongod` ([MongoDB](https://docs.mongodb.com/manual/installation/)): latest v4.4 - -*NOTE: the application in this repository has not been tested with versions newer than that* - -Choose for yourself how you want to install these dependencies. Perhaps you can use the package manager -available on your operating system, or maybe you prefer using container images. - - -### Commands - -The following commands are available from the root directory: - - -#### `make install` - -* installs all *server* and *client* dependencies via package manager `npm` - - -#### `make build` - -1. copy server source into some empty location -2. copy dependency manifest (`package*`) into the same location right next to the server source -3. install server dependencies there -4. install all client dependencies next to its source -5. build client code and put it next to the server source (step 1) - - -#### `make test` - -*NOTE: requires/assumes a MongoDB service (see `MONGODB_URL`) to be reachable from the context where tests are being -executed* - -* runs client & server tests in [CI mode](https://jestjs.io/docs/en/cli.html#--ci) (exits regardless of the test outcome; - closed tty) - - -#### `make dev-test-client` - -*NOTE: only demonstrates a use case during local development and are not meant to run in any other context (e.g. automation)* - -* runs client tests in a local development mode - - -#### `make dev-start-db` - -*NOTE: only demonstrates a use case during local development and are not meant to run in any other context (e.g. automation)* - -* starts a local MongoDB service - - -#### `make dev-start-app` - -*NOTE (1): only demonstrates a use case during local development and are not meant to run in any other context (e.g. automation)* -*NOTE (2): it might be desired to first start a database service (e.g. `make dev-start-db`)* - -* builds client -* starts server in development mode with development configuration - - -#### `make run` - -*NOTE (1): showcases plain executable invocation with a shared parent process. Press `Ctrl+C` to send termination signal.* -*NOTE (2): in reality those two services would always be invoked independently and __never__ share a parent process!* - -* starts a MongoDB service as a child process with an explicit inline-configuration -* starts the application service with variables being set in a way so that they are only *visible* to that invocation - (as an alternative to the configuration file `app/server/dev.env` that is used to set environment variables) -* blocks terminal and keeps it as output device until termination signal is being send. - - -#### `make clean` - -* removes all `node_modules` dependencies that have been installed locally via `npm` -* removes other temporarily created folder in `.local` +> https://todoapp-devops.software diff --git a/app/README.md b/app/README.md index 61839f4e246f1f7f4ce9a2bdfc5de254f3c43791..0252c9197bec439d28ce5ea150dcb76e153af60d 100644 --- a/app/README.md +++ b/app/README.md @@ -1,6 +1,5 @@ Todo-App ======== -d This application represents the *deployable workload* for the [lecture assignment](https://github.com/lucendio/lecture-devops-material/blob/master/assignments/exercise.md). diff --git a/k8s-manifests/deployment.yaml b/k8s-manifests/deployment.yaml.tmpl similarity index 96% rename from k8s-manifests/deployment.yaml rename to k8s-manifests/deployment.yaml.tmpl index 2de3f43c765498278154fba0a25f3ee2cb4758c6..1afcb905ef44ad9b173f4afc68128f1016090bdc 100644 --- a/k8s-manifests/deployment.yaml +++ b/k8s-manifests/deployment.yaml.tmpl @@ -19,7 +19,7 @@ spec: imagePullSecrets: - name: 'gitlab-registry-credentials' containers: - - image: devops-app + - image: {{image}} name: todo-app-container ports: - containerPort: 3000