Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
29 commits
Select commit Hold shift + click to select a range
60501c2
Create README-G20.md
b-smiley Mar 12, 2025
4bb6e29
Made addition to report document
SuperSachinS Mar 12, 2025
5349276
Extended report to complete part 1 of project check in
SuperSachinS Mar 12, 2025
8185ddd
Merge pull request #1 from b-smiley/Sachin-branch
SuperSachinS Mar 12, 2025
7932d41
Add Sachin's PR to Report
Lujarios Mar 12, 2025
f96d5b9
Merge pull request #2 from b-smiley/Luca_DevBranch
b-smiley Mar 12, 2025
5668914
Fixed, Added: build.gradle, Dockerfile
b-smiley Mar 12, 2025
e29f759
Merge pull request #3 from b-smiley/smiley
mattmcdou Mar 12, 2025
924c02e
WIP: Dockerfile versioning fixes. The application runs but errors out…
b-smiley Mar 13, 2025
d1bac74
Merge pull request #4 from b-smiley/smiley
SuperSachinS Mar 14, 2025
88dbf79
Mod: Gretty version to profs version
b-smiley Mar 16, 2025
2792377
Mod: docker img version
b-smiley Mar 16, 2025
935e36f
Mod: Not functional, but added to README
b-smiley Mar 16, 2025
0ce7c96
created compose file to run docker container
SuperSachinS Mar 17, 2025
f01770e
Merge pull request #6 from b-smiley/Sachin-branch
b-smiley Mar 17, 2025
3b4e82b
Merge branch 'master' into smiley
b-smiley Mar 17, 2025
9a279ea
Added: Containerization notes
b-smiley Mar 17, 2025
db9f2d6
Merge pull request #7 from b-smiley/smiley
SuperSachinS Mar 17, 2025
1d25702
add dockerhub link to report
mattmcdou Mar 17, 2025
dcbbddc
Merge pull request #9 from b-smiley/mattmcdou-dockerhub
b-smiley Mar 17, 2025
9940953
Added: How to use docker image, specific command needed
b-smiley Mar 17, 2025
abf64bb
Merge pull request #10 from b-smiley/smiley
SuperSachinS Mar 17, 2025
8d3a7b3
README changes
Lujarios Mar 17, 2025
674e43b
Merge pull request #11 from b-smiley/Luca_DevBranch
SuperSachinS Mar 17, 2025
c3f74c3
Mod: Change README names and added -it to command, it works now
b-smiley Mar 17, 2025
160c154
Remove: Old description
b-smiley Mar 17, 2025
ca81d39
Resolved Merge Conflict
b-smiley Mar 17, 2025
91e4934
Merge pull request #12 from b-smiley/smiley
SuperSachinS Mar 17, 2025
debbb6c
Create docker-image.yml
mattmcdou Mar 18, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
55 changes: 55 additions & 0 deletions .github/workflows/docker-image.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
name: Docker Image CI

on:
pull_request:
types: [opened, synchronize]
branches:
- main

pull_request_target:
types: [closed]

jobs:
build-test:
name: Build and Test Docker Image
runs-on: ubuntu-latest
if: github.event.action != 'closed'

steps:
- name: Checkout Code
uses: actions/checkout@v4

- name: Build Docker Image (Test)
run: |
docker build -t mattmcdou/ci-cd-test-image .

push-image:
name: Push Docker Image on Merge
runs-on: ubuntu-latest
needs: build-test
if: github.event.pull_request.merged == true

steps:
- name: Checkout Code
uses: actions/checkout@v4

- name: Log in to Docker Hub
uses: docker/login-action@v2
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}

- name: Build Docker Image
run: |
docker build --no-cache -t mattmcdou/ci-cd-pipeline-automation-app:latest .

- name: Tag & Push Versioned Image
run: |
VERSION=$(git rev-parse --short HEAD)
docker tag mattmcdou/ci-cd-pipeline-automation-app:latest mattmcdou/ci-cd-pipeline-automation-app:$VERSION
docker push mattmcdou/ci-cd-pipeline-automation-app:$VERSION

- name: Push Latest Image
run: |
docker push mattmcdou/ci-cd-pipeline-automation-app:latest

13 changes: 13 additions & 0 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
# Use the correct gradle jdk image to avoid versioning issues
FROM gradle:7.6.4-jdk11

# Make the working directory
RUN mkdir /home/app
COPY . /home/app
WORKDIR /home/app


EXPOSE 8080

# Start the application, speed up the image build by excluding the daemon
CMD [ "gradle", "--no-daemon", "apprun"]
185 changes: 185 additions & 0 deletions README-DEMO.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,185 @@
## Demo - demonstrates an application and tests

This is an application by [Coveros](https://www.coveros.com/) to demonstrate good
software practices. As we say in agile... _Working software over comprehensive
documentation_ ... but that doesn't mean we can't have pretty good documentation too.

#### Quick Start:

* Install [Java](https://www.java.com/en/download/) if you don't already have it.
* Clone or [download](https://github.com/7ep/demo/archive/master.zip) this repo. (if you download, unzip the file to a directory.)
* On the command line in the top directory of this repo, run `gradlew apprun`
* Visit the application with your browser at http://localhost:8080/demo

#### Summary:

Demo consists of a simple web application and tests. Its goal is to provide
an environment suitable for demonstration and practice in valuable development
techniques. Some of the techniques exemplified are:
* [Unit](https://github.com/7ep/demo/blob/master/src/test/java/com/coveros/training/authentication/RegistrationUtilsTests.java) [tests](https://github.com/7ep/demo/blob/master/src/test/java/com/coveros/training/library/LibraryUtilsTests.java) developed by [TDD](https://en.wikipedia.org/wiki/Test-driven_development) using [Junit](https://junit.org/junit5/) as a driver and [Mockito](https://site.mockito.org/) for mocks, with coverage reports.
* [UI tests](https://github.com/7ep/demo/blob/master/src/ui_tests/behave/features/librarian_ui.feature) using [multiple frameworks](https://github.com/7ep/demo/tree/master/src/ui_tests)
* [BDD](https://en.wikipedia.org/wiki/Behavior-driven_development) [tests](https://github.com/7ep/demo/blob/master/src/bdd_test/resources/library/check_out_a_book.feature) using gherkin
* [Cucumber](https://docs.cucumber.io/) tests, with reports
* [Behave](https://behave.readthedocs.io/en/latest/) UI tests that use [Selenium](https://www.selenium.dev/) web driver.
* [Integration tests](https://github.com/7ep/demo/blob/master/src/integration_test/java/com/coveros/training/persistence/PersistenceLayerTests.java) that test the [H2 database](https://www.h2database.com/html/main.html)
* [Database versioning](https://github.com/7ep/demo/blob/master/src/main/resources/db/migration/V2__Rest_of_tables_for_auth_and_library.sql), with [Flyway](https://flywaydb.org/)
* Security analysis using [DependencyCheck](https://www.owasp.org/index.php/OWASP_Dependency_Check)
* Hot-swap code with [Gretty](https://github.com/gretty-gradle-plugin/gretty)
* Enhanced type system using [Checker Framework](https://checkerframework.org/)
* See its [architecture](https://github.com/7ep/demo/blob/master/docs/dev_notes/architecture.txt)


Its essential goals:
* Just works, any platform.
* As simple as possible
* Minimal system requirements
* Fast and easy to install and to run
* High test coverage
* Multiple business domains
* Easy to maintain and improve
* Well documented
* High performance
* Illustrates maximum number of techniques
* Easy to get up to speed

#### Table of contents:
1. [Optional dependencies](#optional-dependencies)
1. [Chromedriver installation notes](#chromedriver-installation-notes)
1. [Python installation notes](#python-installation-notes)
1. [To build and run tests](#to-build-and-run-tests)
1. [To run the application](#to-run-the-web-application)
1. [To run API and UI tests](#to-run-api-and-ui-tests)
1. [Summary of relevant Gradle commands](#summary-of-relevant-gradle-commands)
1. [The whole shebang - CI/CD pipeline](#the-whole-shebang---a-cicd-pipeline)

###### Optional Dependencies
If you want API testing and Selenium testing, you will need
to visit these links and download / install the applications found there.
* [Python](https://www.python.org/downloads/)
* [Chromedriver](http://chromedriver.chromium.org/downloads)
* [Chrome internet browser](https://www.google.com/chrome/)

---

#### Chromedriver installation notes
make sure that the [Chromedriver](https://chromedriver.chromium.org/) executable is installed in one of the directories that is
on your path. To see your path, type the following in a command line:

on Windows:

echo %PATH%

On Mac/Linux:

echo $PATH

If you run the command, `chromedriver` on the command line, you should get a result similar to this:

Starting ChromeDriver ...

#### Python installation notes
Python can be downloaded [here](https://www.python.org/downloads/)

To run API tests and Selenium tests, an easy way to handle its
dependencies is to use *pipenv*. To get this installed, first download
[get-pip.py](https://bootstrap.pypa.io/get-pip.py), and run the following on the command line:

python get-pip.py

Then,

pip install pipenv

And in the demo directory,

pipenv install

#### To build and run tests:
On the command line, run the following:

On Mac/Linux

./gradlew check

On Windows

gradlew check

#### To run the web application:
On the command line, run the following:

On Mac/Linux

./gradlew apprun

On Windows

gradlew apprun

Then, head to http://localhost:8080/demo


#### To run API and UI tests:
Note: The app has to be [already running](#to-run-the-web-application) for these tests to pass, and you _need_
to have installed [Python] and [Chromedriver].

In a new terminal, separate from the one where the server is running, run the following:

On Mac/Linux

./gradlew runAllTests

On Windows

gradlew runAllTests

#### Summary of relevant Gradle commands
* gradlew coveros - show a cheat sheet of commands for Demo
* gradlew apprun - runs the application
* gradlew check - runs all tests possible with only dependency being Java 8. No need for app to be running.
* gradlew runAllTests - runs the whole set of tests**
* gradlew clean - cleans build products and installs pre-push hook. (see the file in this directory, pre-push)
* gradlew runBehaveTests - runs the UI tests**
* gradlew runApiTests - runs the API tests**
* gradlew generateCucumberReport - runs cucumber and creates a nice-looking HTML report
* gradlew pitest - runs mutation testing (see http://pitest.org/)
* gradlew dependencyCheckAnalyze - analyzes security reports for the dependencies of
this project. See https://www.owasp.org/index.php/OWASP_Dependency_Check
* gradlew sonarqube - runs static analysis using SonarQube. Sonarqube must be running - check http://localhost:9000
* gradlew integrate - runs the database integration tests
* gradlew startH2Console - Starts a console to examine the H2 database file. (user and
password are empty, URL to use is jdbc:h2:./build/db/training)
* gradlew <task 1>...<task N> taskTree - a utility that will show the task tree for a particular task


** Requires the app to be running
(usually in another terminal) and all optional dependencies installed.

#### The whole shebang - a CI/CD pipeline

Details on building out a CI/CD pipeline are found in the "docs/ci_and_cd" directory.
For example, to set it all up on a [local Windows box](https://raw.githubusercontent.com/7ep/demo/master/docs/ci_and_cd/ci_and_cd_for_localhost.txt)

###### Features of the pipeline:
* A fully functioning and documented demonstration CI/CD pipeline using Jenkins.
* BDD tests run with a report generated
* Static analysis quality-gating using SonarQube
* UI tests running on Chrome
* Performance testing with Jmeter
* Security analysis with OWASP's "DependencyCheck"
* Complex commands wrapped simply using Gradle
* Mutation testing with Pitest
* Javadocs built



---

## Screenshots:
![Jenkins pipeline](https://c2.staticflickr.com/8/7889/33202009658_11422b7f20_b.jpg)

![Zap attach proxy](https://c2.staticflickr.com/8/7905/33202009438_8f367e20ec_o.png)

![SonarQube analysis](https://c2.staticflickr.com/8/7823/33202009548_e678128200_b.jpg)

![Running performance tests](https://c2.staticflickr.com/8/7854/47077017751_7e045f68dd_b.jpg)
Loading