diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
new file mode 100644
index 0000000000000000000000000000000000000000..da3137b2d3461e0aa17e267848c6cdeece1b0bcc
--- /dev/null
+++ b/.gitlab-ci.yml
@@ -0,0 +1,23 @@
+image: openjdk:latest
+
+build:
+    stage: build
+    script:
+        - javac SiteGen.java
+
+test:
+    stage: test
+    script:
+        - javac -cp "./junit-platform-console-standalone-1.8.1.jar" SiteGenTest.java SiteGen.java
+        - java -jar junit-platform-console-standalone-1.8.1.jar -cp "." -c SiteGenTest 
+
+pages:
+    stage: deploy
+    script:
+        - javac SiteGen.java
+        - java SiteGen
+    artifacts:
+        paths:
+            - public
+    only:
+        - main
diff --git a/README.md b/README.md
index e46f4a50fbb8de6acf2f9a2b8cbb58e1e4f0a165..7b6fb2eb6057fbdbb5b2bf5da14045245514f059 100644
--- a/README.md
+++ b/README.md
@@ -1,2 +1,19 @@
-# Ohtu-harjoitus5
+# DEVOPS demonstration
+
+Build your own CI/CD pipeline to the Gitlab environment through following steps:
+
+- Create new project to either UTU gitlab https://gitlab.utu.fi/ or Gitlab.com ​​https://gitlab.com/users/sign_in if you don’t have an UTU account
+- Use the project template as a basis for your project
+- The CI/CD pipeline should fail at the testing phase; read the console logs for all the phases and see what goes wrong
+- Create new branch to investigate the situation; verify that the pipeline still fails
+- Fix the situation by modifying the Java source code file based on the unit testing report found from the CI/CD console log
+- When the testing phase goes green, merge the branch to the main branch
+- The resulting web page generated by the Java application should now be deployed to the Gitlab Pages; Access the web pages via Gitlab setting and give public access to the resulting web site
+- Read through the .gitlab-ci.yml file and try to understand what each line does
+- Prepare to demonstrate you CI/CD pipeline and explain how it works
+
+Note: Each step can be done using the Gitlab online tools and editors
+
+
+
 
diff --git a/SiteGen.java b/SiteGen.java
new file mode 100644
index 0000000000000000000000000000000000000000..9d777ae3773c6731075973995e40fd6af3b46cae
--- /dev/null
+++ b/SiteGen.java
@@ -0,0 +1,27 @@
+import java.nio.file.*;
+import java.util.*;
+import java.util.stream.*;
+
+class SiteGen {
+    static String siteTitle = "My favorite movies";
+
+    static List<String> movieList = List.of(
+        "Star Wars",
+        "Star Trek",
+        "Battlestar Galactica"
+    );
+
+    static String htmlString =
+        "<html>" +
+            "<head><title>" + siteTitle + "</title></head>" +
+            "<body>" +
+                "<h1>" + siteTitle + "</h1>" +
+                "<ul>" + movieList.stream().map(i -> "<li>"+ i + "</li>").collect(Collectors.joining()) + "</ul>" +
+            "</body>" +
+        "<html>";
+
+    public static void main(String args[]) throws Exception {
+        Files.createDirectory(Paths.get("public/"));
+        Files.write(Paths.get("public/index.html"), htmlString.getBytes());
+    }
+}
diff --git a/SiteGenTest.java b/SiteGenTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..4e7dc08b6c45a7e435a591852efb8c9a736a25dd
--- /dev/null
+++ b/SiteGenTest.java
@@ -0,0 +1,13 @@
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.Test;
+
+public class SiteGenTest {
+
+    @Test
+    public void testHtmlString() {
+        String correctHtml = "<html><head><title>My favorite movies</title></head><body><h1>My favorite movies</h1><ul><li>Star Wars</li><li>Star Trek</li><li>Battlestar Galactica</li></ul></body></html>";
+        Assertions.assertEquals(correctHtml, SiteGen.htmlString);
+    }
+
+}
+
diff --git a/junit-platform-console-standalone-1.8.1.jar b/junit-platform-console-standalone-1.8.1.jar
new file mode 100644
index 0000000000000000000000000000000000000000..7a904901b242d782feec6ba9f62f16d8a2cd2038
Binary files /dev/null and b/junit-platform-console-standalone-1.8.1.jar differ