- Create commit statuses on Github (success, failure, or error. Includes a description). The status is determined by success of compilation and tests.
- Email notification of build status of pushed commits.
- Build history is saved on the server. A top-level html document links to each saved build where the build log can be found and a Github link is provided
- Configurable server address, port, path for webhooks, and destination to save build logs (default app/<dir>).
The CI server is built using Java 11 and Gradle 6.8.1 for building and testing the application. ngrok is used to host the server. Furthermore, some java libraries are included to implement the specific functions: the java library: json-simple-1.1.1 is used for processing JSON data; the java libraries: javax-mail-1.6.2 as well as javax-mail-api-1.6.2 are used to send email to notify the branch owner.
For this project we use ngrok with our own machines to host the CI server. The URL provided by ngrok is publically accessible on the internet. Run:
ngrok http 127.0.0.1:8080
To make localhost accessible on the internet where the web server runs on port 8080.
Github webhooks is what allows us to be notified when a github event, such as a push, occurs. For this server we only require the push event. Github webhooks can be configured in the settings of a repository. The POST requests generated by these hooks are expected to be sent to the path: "/github-webhooks" of the main ngrok URL.
In order for Github to accept GET and POST requests sent by us, we need to verify ourselves. This is done by generating a personal access token with minimum repo and user access. The token should be saved in an environment variable called "GITHUB_TOKEN" which is retrieved by the server through Java's
System.getenv("GITHUB_TOKEN")
Example: to run on Socket Address 127.0.0.1:8080, serving Github webhooks to path "/github-webhooks" and logs are saved in "Assignment-2-CI/app/buildLogs". Also, the absolute path of the project directory needs to be supplied.
./gradlew run --args="--address 127.0.0.1 --port 8080 --target_dir buildLogs --webhooks /github-webhooks --project_dir /home/dh/masters/swe/fork/Assignment-2-CI" --no-daemon
This starts the server. Any triggered events, which are included in our webhook configuration, should now successfully send POST requests to our server on the configured path.
To test:
gradle test
in project directory, or:
./gradlew test
to run tests with wrapper. This is used by the server to verify that tests run successfully.
To build:
gradle build
in project directory, or:
./gradlew build
to build with wrapper. This is used by the server to verify that project version compiles and builds.
The build history can be found in the root directory of the generated ngrok url.
The main page of the build logs present all the commits by the date they were tested, ordered from newest to oldest. Click one a commit to get to the build info.
Each build log is presented at the top of the page with a link to its commit on Github. Then follows the status of build and tests.
- P6: ✔️
- P7: We have both commit status and email notification, when only one of them were needed as per P4. Our build logs are formated as HTML with links to their respective commit, when we only needed to present them in raw text.
- P8: ✔️
- Daniel Halvarsson: server infrastructure, building/testing commits, creating commit statuses
- Niklas Wessman: File input/output, construction and formating of build logs, documentation, etc.
- Yu Zhou: server email notification
- Hannes Sundin: Unit testing.