This is a template for setting up a Jetty server running on an OpenShift DIY web cartridge. Forked from marekjelen/openshift-jetty.
- "This repository" means "Abdull/openshift-jetty"
- Let's assume you already have a Java Servlet-based application that follows a default WAR-building with Maven ("your
pom.xml
") - In your OpenShift Management Console, add a new application of type Do-It-Yourself.
- Clone the newly created repository to your file system. We will call this directory the "DIY checkout directory" from now on.
- Inside the DIY checkout directory, change to directory
.openshift/action_hooks
. Here, delete all files and replace them with all files you find in this repository'saction_hook
directory. - Now you have to merge/copy your
pom.xml
-based, WAR-based Java Servlet project into your DIY checkout directory. Probably, you will copy asrc
directory and thepom.xml
file. - Edit your
pom.xml
copy inside the DIY checkout directory. Into this file, merge the information from thepom.xml
you find in this repository. Probably, it suffices to add the whole<profiles>...</profiles>
section.
After you have followed the above mentioned prerequisites, give your Servlet a try. Inside your local DIY checkout directory
git add .
git commit -m "My first commit"
git push
Your shell will print some output which comes via ssh from your OpenShift DIY machine. You will see how your project gets built on the remote machine. After a few seconds (depending on the time it takes your Jetty-hosted Servlet to start up), your website is served on http://diyname-yourid.rhcloud.com .
So what is actually happening here? The Jetty Openshift DIY template plugs into the standard Openshift framework lifecycle. Let's assume you are NOT leveraging the OpenShift-hosted Jenkins Server build cartridge.
Whenever something got pushed to your OpenShift remote repository, a git hook named post-receive
gets executed on your remote machine. See for yourself in ~/git/diyname.git/hooks/
. Here is the gist of what's happening then.
- The OpenShift framework checks out your remote repository to the folder $OOPENSHIFT_REPO_DIR on the same machine.
- The OpenShift framework starts calling its hooks. Each hooks has an associated "user hook". These are the hooks you find in the
.openshift/action_hooks
directory of your folder. - The user hooks exploited in this template are
pre_build
,build
,deploy
,start
, andstop
, in this order. pre_build
: This script checks if your machine already has a copy of Jetty. If it doesn't it will download and set up some recent version on your machine.build
: This script will start Maven to build your project, using configurations that are necessary for an OpenShift environment.deploy
: This script sets up an environment so that the just built Servlet can run inside a Jetty server in an OpenShift environmentstart
: This script starts up a Jetty server serving your just built Servlet. It will also write a PID file containing the process ID which will be used by thestop
script.stop
: OpenShift will call this script whenenver OpenShift stops your machine (for instance, when you callctl_app stop
). It looks for the PID file written by thestart
script and use it to identify- the Jetty server process, then kill it.
Why does the openshift
Maven profile build the WAR into the deployments
directory, instead of sticking with the regular target
directory?
- The
deploy
script creates a symlink from the Jettywebapps
directory to thedeployments
build subdirectory. In the default Jetty configuration (as we are exploiting it in this repository), everything inside the Jettywebapps
directory gets scanned by Jetty and possibly gets deployed by Jetty. Now let's imagine we would stick to constructing the WAR inside the defaulttarget
directory. Besides the WAR there are lots of other artifacts and directories created by Maven during building in this directory. We don't want to confuse Jetty by having a bunch of JSP and class files in its serving folder. Therefore we put our final artifact,ROOT.war
, lonely inside its own directory.
- This template doesn't depend on on-the-fly script downloading from this repository. This is more reliable in case Github should be down. And this is more secure in case the Github repository should be updated with malicious content (i.e. no script injection).