SlideShare a Scribd company logo
THE NUTS AND BOLTS OF CI/CD
WITH A LARGE XPAGES AND
REST APP
IT'S... TECHNICALLY DOABLE
JESSE
GALLAGHER
CTO - I KNOW SOME GUYS
IP MANAGER - OPENNTF
HTTPS://FROSTILLIC.US
@GIDGERBY
The Moving Parts
Core set of OSGi plugins
XPages Library
JAX-RS–based REST services
A handful of compile-time tests
NPM-build–based JavaScript applications
Some delivered from OSGi
One delivered via NSF
A set of NSFs
Some XPages apps
Most Notes client apps
Most not properly run with source control
A set of JEE webapps
The main XPages app
One of the JS apps
Testcontainers-based tests
The Toolchain
Maven
maven-bundle-plugin (used to
use Tycho)
frontend-maven-plugin
NSF ODP Tooling
Eclipse (Usually)
NPM (via frontend-maven-
plugin)
XPages Jakarta EE Support
Open Liberty
XPages Runtime project
Testcontainers (Docker)
Opening Caveat
Every explanation in this presentation comes with an implicit "...but it
gets more complicated in practice"
MAVEN
Brief Aside: Maven
It’s not (inherently) scary!
Just look how cute that owl is
Maven is a tool used for build automation
It’s primarily used for Java projects, but is
adaptable to many things via plugins
A “pom.xml” file is a clear giveaway of
Maven’s use
We use it here because it allows for cleanly-
reproducible builds across systems, without
environment-specific details
Tycho vs. MBP
Historically, we used Tycho to manage the OSGi build
It presents an OSGi environment very similar to Domino
It can strongly enforce expectations and dependencies
Good support for OSGi-based test suites with Notes environments
I switched to maven-bundle-plugin for added flexibility
It makes it much easier to use normal Maven dependencies
...but it requires a lot more knowledge of the "gotchas" of the Domino stack
I still hand-tweak OSGi options, and the compile step doesn't validate this
There are other options (bnd-maven-plugin), but I don't know them enough yet
https://frostillic.us/blog/posts/2019/8/22/converting-tycho-projects-to-maven-bundle-plugin-initial-phase
OpenAPI Generation
<plugin>
<groupId>io.openapitools.swagger</groupId>
<artifactId>swagger-maven-plugin</artifactId>
<version>2.1.5</version>
<executions>
<execution>
<id>generate-openapi</id>
<goals>
<goal>generate</goal>
</goals>
</execution>
</executions>
</plugin>
We use swagger-maven-plugin and swagger-annotations to generate an
openapi.yaml file during the build
RUNTIME-INDEPENDENT CORE
Runtime Independence
The core parts of the app target three
main environments:
XPages on Domino (OSGi)
Servlets on Domino (OSGi)
.war-based Jakarta EE (not OSGi)
Can't make a lot of assumptions!
RuntimeEnvironment Idiom
We use a RuntimeEnvironment type to handle differences
Contains methods like getSession(), getServletRequest(), etc.
Each target runtime has an implementation that does the dirty work
Core code calls RuntimeEnvironment.getSession() and works
anywhere
It gets fiddly! Error handling, detecting the right runtime, etc.
Balancing Dependencies
maven-bundle-plugin makes third-party dependencies easier
...but Domino still makes it hard
Some dependencies need to be re-packaged for Domino's OSGi
environment
Some are safest to avoid due to Domino's polluted classpath (Guava)
RuntimeEnvironment Links
https://frostillic.us/blog/posts/2020/6/18/the-runtimeenvironment-idiom
NPM-BASED BUILDS IN MAVEN
frontend-maven-plugin
frontend-maven-plugin allows you to run various frontend-dev tools
(npm, yarn, webpack, etc.) based on configuration in a Maven pom
We have the JS apps in a separate directory away from Java
The build config specifies node+npm versions and the target directory
One project copies the results into an OSGi plugin, another copies
them into an NSF during build
Example Use
Install Local Node + NPM `npm install` `npm run build`
<execution>
<id>install node and npm</id>
<goals>
<goal>install-node-and-npm</goal>
</goals>
<phase>generate-resources</phase>
</execution>
<execution>
<id>actionItems install</id>
<goals>
<goal>npm</goal>
</goals>
<phase>generate-resources</phase>
<configuration>
<workingDirectory>${buildDir}</workingDir
ectory>
</configuration>
</execution>
<execution>
<id>actionItems build</id>
<goals>
<goal>npm</goal>
</goals>
<phase>generate-resources</phase>
<configuration>
<workingDirectory>${buildDir}</workingDir
ectory>
<arguments>run build</arguments>
</configuration>
</execution>
frontend-maven-plugin Links
https://frostillic.us/blog/posts/2020/7/17/nsf-odp-tooling-3-1-0-
dynamically-including-web-resources
https://github.com/eirslett/frontend-maven-plugin
NSF ODP TOOLING
NSF ODP Tooling
The glue for working with NSFs:
Compiles ODPs to NSF
Updates ODPs for server-side changes outside Git
Provides DXL and XSP autocomplete in Eclipse
Compilation
Compiles ODPs into NSFs
Uses fresh build of the OSGi plugins to
ensure compatibility
Runs in a local Equinox environment
similar to Domino
Sets $TemplateBuild fields
Updating Other-Developer ODPs
<build>
<plugins>
<plugin>
<groupId>org.openntf.maven</groupId>
<artifactId>nsfodp-maven-plugin</artifactId>
<configuration>
<databasePath>Some/Server!!db/app.nsf</databasePath>
</configuration>
</plugin>
</plugins>
</build>
Configure ODP projects for the canonical source:
Updating Other-Developer ODPs
#!/usr/bin/env bash
set -e
REPO_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )/.."
find $REPO_DIR/osgi-plugin/nsfs/ -name pom.xml 
-not -path */nsf-dashboard/pom.xml 
-not -path */nsf-plans/pom.xml 
-print0 | xargs -0 -n 1 sh -c 'mvn org.openntf.maven:nsfodp-maven-
plugin:3.5.0:generate-odp -X -f $0 || exit 255'
Update ODPs for projects other than those properly done in Git:
XML Autocomplete
Provides "good enough" XML
autocomplete for XSP
Covers core and custom controls, but
not third-party library controls
No preview pane, but eh...
DXL autocomplete uses the provided-
with-Domino schema files
NSF ODP Links
https://frostillic.us/blog/posts/2018/3/5/301B92A0DF1F2CAF85258247007
BD28F
https://frostillic.us/blog/posts/2020/8/27/nsf-odp-tooling-setting-up-jenkins-
builds
https://www.openntf.org/main.nsf/project.xsp?r=project/NSF%20ODP%20
Tooling
https://github.com/OpenNTF/org.openntf.nsfodp
Last year's session: https://youtu.be/7MeCMz0F-vM
XPAGES JAKARTA EE SUPPORT
XPages Jakarta EE Support
Acts as a "platform update" for the app
Brings in, in particular, EL 3 and JAX-RS 2.1, much newer than the
built-in variants
Also brings in CDI, which is used fully in the webapps and REST
services
Like managed beans, but much better
Not required for the rest of this, but it sure is nice
Example JAX-RS Resource
@Path("/serverInfo")
@PermitAll
public class ServerInfoResource {
@Inject
private ServerInfo serverInfo;
@GET
@Produces(MediaType.APPLICATION_JSON)
@Tag(name = TAG_EXTERNALPORTAL)
@Operation(summary = "Get information about server-specific resources", description = "...")
public ServerInfo get() {
return serverInfo;
}
}
XPages Jakarta EE Links
https://frostillic.us/blog/posts/2018/6/3/6AC99D0B866A92AA852582A
1006C2FA6
https://www.openntf.org/main.nsf/project.xsp?r=project/XPages%20Ja
karta%20EE%20Support
https://github.com/OpenNTF/org.openntf.xsp.jakartaee
XPAGES OUTSIDE DOMINO
XPages Runtime
Open-Source project that allows running XPages in a normal Servlet
container
I've only run it in Liberty, but others should work
Turns out all the stuff from pre-OSGi is still in there
Requires some tweaks with third-party libraries, and code has to not
assume it's in OSGi
This enables CI deployment servers and full automated tests
XPages Runtime
Some shim code handles bootstrapping
ODA, etc.
JAX-RS services use Liberty's built-in
support
The webapp projects use symlinks to
point to the ODP for XPages, Java, etc.
XPages Runtime - Tweaks
Make no assumptions about OSGi
The RuntimeEnvironment idiom goes a long way
The IBM Commons ExtensionManager accounts for this
Duplicate any plugin.xml extensions in META-INF/services
With a JEE server, no JAX-RS runtime (Wink, RestEasy, etc.) is
needed
On Liberty, don't enable JSF or JSP features (conflict with XPages)
XPages Runtime - Tweaks
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
NotesThread.sinitThread();
Set<Long> handles = new HashSet<>();
if(!Factory.isInitialized()) {
Factory.initThread(new Factory.ThreadConfig(new Fixes[0], AutoMime.WRAP_32K, true));
}
if(sessions.get() == null) {
sessions.set(createSession((HttpServletRequest)request, handles));
sessionsAsSigner.set(createNativeSession());
sessionsFull.set(createNativeSession());
if(StringUtil.isEmpty(expectedDbPath)) {
throw new IllegalStateException(ENV_DBPATH + " environment variable should be set to the Domino API path to the context database");
}
try {
databases.set(sessions.get().getDatabase(expectedDbPath));
} catch(Throwable e) {
}
if(!checkAccess(databases.get())) {
databases.set(null);
}
}
// ...
}
Use a @WebFilter to provide context sessions/database
(There's a lot more to this in practice)
XPages Runtime - Tweaks
@Override
public Object resolveVariable(FacesContext facesContext, String varName) throws EvaluationException
{
switch(StringUtil.toString(varName)) {
case "session":
case "sessionAsSigner":
case "sessionAsSignerFullAccess":
return ODAFilter.sessions.get();
case "database":
return ODAFilter.databases.get();
}
// ...
}
Use a VariableResolver to find custom session/database
XPages Runtime Links
https://openliberty.io/
https://frostillic.us/blog/posts/2019/1/7/letting-madness-take-hold-
xpages-outside-domino
https://github.com/jesse-gallagher/xpages-runtime
CONTAINERIZED XPAGES APPS
Dockerized XPages Apps
We start with the open-liberty:full-java8-openj9 image
Then we bring in the Notes runtime parts of the official HCL Domino Docker
images
Then we bring in the built application WAR
It's already been adapted to read the context server/DB from the environment
Et voilà !
This is how I deploy CI servers with Jenkins nowadays
Dockerfile
# Configure the runtime image
FROM --platform=linux/amd64 open-liberty:full-java8-openj9
# Bring in the Liberty app and configuration
COPY --chown=default:users webapp.war /apps/
COPY config/* /config/
# Bring in the Domino runtime
COPY --from=domino-docker:V1101_03212020prod /opt/hcl/domino/notes/11000100/linux /opt/hcl/domino/notes/latest/linux
COPY --from=domino-docker:V1101_03212020prod /local/notesdata /local/notesdata
# Bring in our Domino config and assign the data directory to the default user
USER root
COPY --chown=default:users notesdata/* /local/notesdata/
RUN mkdir -p /local/notesdata/IBM_TECHNICAL_SUPPORT
RUN chown -R default:users /local/notesdata
USER default
ENV LD_LIBRARY_PATH "/opt/hcl/domino/notes/latest/linux"
ENV NotesINI "/local/notesdata/notes.ini"
ENV Notes_ExecDirectory "/opt/hcl/domino/notes/latest/linux"
ENV Directory "/local/notesdata"
ENV PATH="${PATH}:/opt/hcl/domino/notes/latest/linux:/opt/hcl/domino/notes/latest/linux/res/C"
ENV InitDominoRuntime="1"
# DB context env var is set when launching the container and read by the app
EXPOSE 8080 8443
Containerized XPages Apps Links
https://frostillic.us/blog/posts/2020/6/28/weekend-domino-apps-in-
docker-experimentation
https://frostillic.us/blog/posts/2020/8/13/executing-a-complicated-osgi-
nsf-surefire-npm-build-with-docker
https://github.com/jesse-gallagher/domino-docker-war-example
TESTCONTAINERS
Testcontainers
Testcontainers lets us run the full webapp (XPages + REST) with true
headless browsers
Requires Docker, a containerized app, and patience
I've only gone so far with it - with work, this could run full automated UI
tests of XPages and JavaScript apps
Testcontainers - Maven Process
Use maven-resources-plugin to copy a Dockerfile, built WAR, and Notes
runtime files to scratch space
Use dockerfile-maven-plugin to build the app image
`<pullNewerImage>false</pullNewerImage>` to avoid trying to resolve official
Domino images from Docker Hub
Use maven-failsafe-plugin to run all `it.*` classes
Set environment `TESTCONTAINERS_RYUK_DISABLED=true` to avoid
trouble I hit when running on Jenkins and instead manage lifecycles manually
Testcontainers - Example Code
driver.get(getContainerRootUrl() + "index.xsp");
assertEquals("Expected Page Title", driver.getTitle());
// Test all CSS and JS to make sure there's no 404s
URI rootUri = URI.create(getRootUrl());
driver.findElements(By.xpath("//link[@rel='stylesheet']"))
.stream()
.map(link -> link.getAttribute("href"))
.map(href -> rootUri.resolve(href))
.map(this::decontainerize) // etc.
.forEach(uri -> checkUrlWorks(uri, client));
driver.findElements(By.xpath("//script[@href]"))
// etc.
Testcontainers Links
https://www.testcontainers.org
https://openliberty.io/blog/2019/03/27/integration-testing-with-
testcontainers.html
https://frostillic.us/blog/posts/2021/7/19/tinkering-with-testcontainers-for-
domino-based-web-apps
https://frostillic.us/blog/posts/2021/7/20/adding-selenium-browser-tests-to-
my-testcontainers-setup
QUESTIONS

More Related Content

What's hot

Utilizing the OpenNTF Domino API
Utilizing the OpenNTF Domino APIUtilizing the OpenNTF Domino API
Utilizing the OpenNTF Domino API
Oliver Busse
 
Play Framework: The Basics
Play Framework: The BasicsPlay Framework: The Basics
Play Framework: The BasicsPhilip Langer
 
DanNotes XPages Mobile Controls
DanNotes XPages Mobile ControlsDanNotes XPages Mobile Controls
DanNotes XPages Mobile Controls
Paul Withers
 
BP204 It's Not Infernal: Dante's Nine Circles of XPages Heaven
BP204 It's Not Infernal: Dante's Nine Circles of XPages HeavenBP204 It's Not Infernal: Dante's Nine Circles of XPages Heaven
BP204 It's Not Infernal: Dante's Nine Circles of XPages Heaven
Michael McGarel
 
FAST for SharePoint Deep Dive
FAST for SharePoint Deep DiveFAST for SharePoint Deep Dive
FAST for SharePoint Deep Dive
neil_richards
 
Intro to JavaScript Tooling in Visual Studio Code
Intro to JavaScript Tooling in Visual Studio CodeIntro to JavaScript Tooling in Visual Studio Code
Intro to JavaScript Tooling in Visual Studio Code
ColdFusionConference
 
Maven
MavenMaven
Demystifying Maven
Demystifying MavenDemystifying Maven
Demystifying Maven
Mike Desjardins
 
Plugin architecture (Extensible Application Architecture)
Plugin architecture (Extensible Application Architecture)Plugin architecture (Extensible Application Architecture)
Plugin architecture (Extensible Application Architecture)
Chinmoy Mohanty
 
Maven basics
Maven basicsMaven basics
Maven
Maven Maven
Maven
Khan625
 
Hands On with Maven
Hands On with MavenHands On with Maven
Hands On with Maven
Sid Anand
 
Maven Introduction
Maven IntroductionMaven Introduction
Maven Introduction
Sandeep Chawla
 
Development Tools - Maven
Development Tools - MavenDevelopment Tools - Maven
Development Tools - Maven
Bert Koorengevel
 
Maven Presentation - SureFire vs FailSafe
Maven Presentation - SureFire vs FailSafeMaven Presentation - SureFire vs FailSafe
Maven Presentation - SureFire vs FailSafeHolasz Kati
 
Features, Exportables & You
Features, Exportables & YouFeatures, Exportables & You
Features, Exportables & You
jskulski
 
Introduction in the play framework
Introduction in the play frameworkIntroduction in the play framework
Introduction in the play framework
Alexander Reelsen
 
Command Box ColdFusion Package Manager, Automation
Command Box ColdFusion Package Manager, AutomationCommand Box ColdFusion Package Manager, Automation
Command Box ColdFusion Package Manager, Automation
ColdFusionConference
 
Eclipse Overview
Eclipse Overview Eclipse Overview
Eclipse Overview
Lars Vogel
 
An Introduction to Maven Part 1
An Introduction to Maven Part 1An Introduction to Maven Part 1
An Introduction to Maven Part 1
MD Sayem Ahmed
 

What's hot (20)

Utilizing the OpenNTF Domino API
Utilizing the OpenNTF Domino APIUtilizing the OpenNTF Domino API
Utilizing the OpenNTF Domino API
 
Play Framework: The Basics
Play Framework: The BasicsPlay Framework: The Basics
Play Framework: The Basics
 
DanNotes XPages Mobile Controls
DanNotes XPages Mobile ControlsDanNotes XPages Mobile Controls
DanNotes XPages Mobile Controls
 
BP204 It's Not Infernal: Dante's Nine Circles of XPages Heaven
BP204 It's Not Infernal: Dante's Nine Circles of XPages HeavenBP204 It's Not Infernal: Dante's Nine Circles of XPages Heaven
BP204 It's Not Infernal: Dante's Nine Circles of XPages Heaven
 
FAST for SharePoint Deep Dive
FAST for SharePoint Deep DiveFAST for SharePoint Deep Dive
FAST for SharePoint Deep Dive
 
Intro to JavaScript Tooling in Visual Studio Code
Intro to JavaScript Tooling in Visual Studio CodeIntro to JavaScript Tooling in Visual Studio Code
Intro to JavaScript Tooling in Visual Studio Code
 
Maven
MavenMaven
Maven
 
Demystifying Maven
Demystifying MavenDemystifying Maven
Demystifying Maven
 
Plugin architecture (Extensible Application Architecture)
Plugin architecture (Extensible Application Architecture)Plugin architecture (Extensible Application Architecture)
Plugin architecture (Extensible Application Architecture)
 
Maven basics
Maven basicsMaven basics
Maven basics
 
Maven
Maven Maven
Maven
 
Hands On with Maven
Hands On with MavenHands On with Maven
Hands On with Maven
 
Maven Introduction
Maven IntroductionMaven Introduction
Maven Introduction
 
Development Tools - Maven
Development Tools - MavenDevelopment Tools - Maven
Development Tools - Maven
 
Maven Presentation - SureFire vs FailSafe
Maven Presentation - SureFire vs FailSafeMaven Presentation - SureFire vs FailSafe
Maven Presentation - SureFire vs FailSafe
 
Features, Exportables & You
Features, Exportables & YouFeatures, Exportables & You
Features, Exportables & You
 
Introduction in the play framework
Introduction in the play frameworkIntroduction in the play framework
Introduction in the play framework
 
Command Box ColdFusion Package Manager, Automation
Command Box ColdFusion Package Manager, AutomationCommand Box ColdFusion Package Manager, Automation
Command Box ColdFusion Package Manager, Automation
 
Eclipse Overview
Eclipse Overview Eclipse Overview
Eclipse Overview
 
An Introduction to Maven Part 1
An Introduction to Maven Part 1An Introduction to Maven Part 1
An Introduction to Maven Part 1
 

Similar to CollabSphere 2021 - DEV114 - The Nuts and Bolts of CI/CD With a Large XPages And REST App

eXo Platform SEA - Play Framework Introduction
eXo Platform SEA - Play Framework IntroductioneXo Platform SEA - Play Framework Introduction
eXo Platform SEA - Play Framework Introductionvstorm83
 
Riga Dev Day - Automated Android Continuous Integration
Riga Dev Day - Automated Android Continuous IntegrationRiga Dev Day - Automated Android Continuous Integration
Riga Dev Day - Automated Android Continuous Integration
Nicolas Fränkel
 
Building JBoss AS 7 for Fedora
Building JBoss AS 7 for FedoraBuilding JBoss AS 7 for Fedora
Building JBoss AS 7 for Fedora
wolfc71
 
Meetup Performance
Meetup PerformanceMeetup Performance
Meetup Performance
Greg Whalin
 
node.js 실무 - node js in practice by Jesang Yoon
node.js 실무 - node js in practice by Jesang Yoonnode.js 실무 - node js in practice by Jesang Yoon
node.js 실무 - node js in practice by Jesang Yoon
Jesang Yoon
 
Frontend JS workflow - Gulp 4 and the like
Frontend JS workflow - Gulp 4 and the likeFrontend JS workflow - Gulp 4 and the like
Frontend JS workflow - Gulp 4 and the like
Damien Seguin
 
How to deploy a Java application on Google App engine Flexible environment
How to deploy a Java application on Google App engine Flexible environmentHow to deploy a Java application on Google App engine Flexible environment
How to deploy a Java application on Google App engine Flexible environment
Michelantonio Trizio
 
GlassFish Embedded API
GlassFish Embedded APIGlassFish Embedded API
GlassFish Embedded API
Eduardo Pelegri-Llopart
 
Workflow automation for Front-end web applications
Workflow automation for Front-end web applicationsWorkflow automation for Front-end web applications
Workflow automation for Front-end web applications
Mayank Patel
 
Lean microservices through ahead of time compilation (Tobias Piper, Loveholid...
Lean microservices through ahead of time compilation (Tobias Piper, Loveholid...Lean microservices through ahead of time compilation (Tobias Piper, Loveholid...
Lean microservices through ahead of time compilation (Tobias Piper, Loveholid...
London Microservices
 
GlassFish and JavaEE, Today and Future
GlassFish and JavaEE, Today and FutureGlassFish and JavaEE, Today and Future
GlassFish and JavaEE, Today and Future
Alexis Moussine-Pouchkine
 
Introduction to node.js By Ahmed Assaf
Introduction to node.js  By Ahmed AssafIntroduction to node.js  By Ahmed Assaf
Introduction to node.js By Ahmed Assaf
Ahmed Assaf
 
Java 6 [Mustang] - Features and Enchantments
Java 6 [Mustang] - Features and Enchantments Java 6 [Mustang] - Features and Enchantments
Java 6 [Mustang] - Features and Enchantments
Pavel Kaminsky
 
Introduction to PowerShell
Introduction to PowerShellIntroduction to PowerShell
Introduction to PowerShell
Boulos Dib
 
A Fabric/Puppet Build/Deploy System
A Fabric/Puppet Build/Deploy SystemA Fabric/Puppet Build/Deploy System
A Fabric/Puppet Build/Deploy System
adrian_nye
 
Selenium & PHPUnit made easy with Steward (Berlin, April 2017)
Selenium & PHPUnit made easy with Steward (Berlin, April 2017)Selenium & PHPUnit made easy with Steward (Berlin, April 2017)
Selenium & PHPUnit made easy with Steward (Berlin, April 2017)
Ondřej Machulda
 
Django deployment with PaaS
Django deployment with PaaSDjango deployment with PaaS
Django deployment with PaaS
Appsembler
 

Similar to CollabSphere 2021 - DEV114 - The Nuts and Bolts of CI/CD With a Large XPages And REST App (20)

eXo Platform SEA - Play Framework Introduction
eXo Platform SEA - Play Framework IntroductioneXo Platform SEA - Play Framework Introduction
eXo Platform SEA - Play Framework Introduction
 
Riga Dev Day - Automated Android Continuous Integration
Riga Dev Day - Automated Android Continuous IntegrationRiga Dev Day - Automated Android Continuous Integration
Riga Dev Day - Automated Android Continuous Integration
 
Building JBoss AS 7 for Fedora
Building JBoss AS 7 for FedoraBuilding JBoss AS 7 for Fedora
Building JBoss AS 7 for Fedora
 
Meetup Performance
Meetup PerformanceMeetup Performance
Meetup Performance
 
Meetup Performance
Meetup PerformanceMeetup Performance
Meetup Performance
 
node.js 실무 - node js in practice by Jesang Yoon
node.js 실무 - node js in practice by Jesang Yoonnode.js 실무 - node js in practice by Jesang Yoon
node.js 실무 - node js in practice by Jesang Yoon
 
Frontend JS workflow - Gulp 4 and the like
Frontend JS workflow - Gulp 4 and the likeFrontend JS workflow - Gulp 4 and the like
Frontend JS workflow - Gulp 4 and the like
 
How to deploy a Java application on Google App engine Flexible environment
How to deploy a Java application on Google App engine Flexible environmentHow to deploy a Java application on Google App engine Flexible environment
How to deploy a Java application on Google App engine Flexible environment
 
GlassFish Embedded API
GlassFish Embedded APIGlassFish Embedded API
GlassFish Embedded API
 
Workflow automation for Front-end web applications
Workflow automation for Front-end web applicationsWorkflow automation for Front-end web applications
Workflow automation for Front-end web applications
 
Lean microservices through ahead of time compilation (Tobias Piper, Loveholid...
Lean microservices through ahead of time compilation (Tobias Piper, Loveholid...Lean microservices through ahead of time compilation (Tobias Piper, Loveholid...
Lean microservices through ahead of time compilation (Tobias Piper, Loveholid...
 
GlassFish and JavaEE, Today and Future
GlassFish and JavaEE, Today and FutureGlassFish and JavaEE, Today and Future
GlassFish and JavaEE, Today and Future
 
Introduction to node.js By Ahmed Assaf
Introduction to node.js  By Ahmed AssafIntroduction to node.js  By Ahmed Assaf
Introduction to node.js By Ahmed Assaf
 
Java 6 [Mustang] - Features and Enchantments
Java 6 [Mustang] - Features and Enchantments Java 6 [Mustang] - Features and Enchantments
Java 6 [Mustang] - Features and Enchantments
 
Introduction to PowerShell
Introduction to PowerShellIntroduction to PowerShell
Introduction to PowerShell
 
A Fabric/Puppet Build/Deploy System
A Fabric/Puppet Build/Deploy SystemA Fabric/Puppet Build/Deploy System
A Fabric/Puppet Build/Deploy System
 
Using Maven2
Using Maven2Using Maven2
Using Maven2
 
Selenium & PHPUnit made easy with Steward (Berlin, April 2017)
Selenium & PHPUnit made easy with Steward (Berlin, April 2017)Selenium & PHPUnit made easy with Steward (Berlin, April 2017)
Selenium & PHPUnit made easy with Steward (Berlin, April 2017)
 
Django deployment with PaaS
Django deployment with PaaSDjango deployment with PaaS
Django deployment with PaaS
 
BPMS1
BPMS1BPMS1
BPMS1
 

More from Jesse Gallagher

OpenNTF Webinar 2022-08 - XPages Jakarta EE Support in Practice
OpenNTF Webinar 2022-08 - XPages Jakarta EE Support in PracticeOpenNTF Webinar 2022-08 - XPages Jakarta EE Support in Practice
OpenNTF Webinar 2022-08 - XPages Jakarta EE Support in Practice
Jesse Gallagher
 
OpenNTF Webinar May 2021 - Jesse
OpenNTF Webinar May 2021 - JesseOpenNTF Webinar May 2021 - Jesse
OpenNTF Webinar May 2021 - Jesse
Jesse Gallagher
 
Engage 2019 - De04. Java with Domino After XPages
Engage 2019 - De04. Java with Domino After XPagesEngage 2019 - De04. Java with Domino After XPages
Engage 2019 - De04. Java with Domino After XPages
Jesse Gallagher
 
DEV-1467 - Darwino
DEV-1467 - DarwinoDEV-1467 - Darwino
DEV-1467 - Darwino
Jesse Gallagher
 
DEV-1430 IBM Connections Integration
DEV-1430 IBM Connections IntegrationDEV-1430 IBM Connections Integration
DEV-1430 IBM Connections Integration
Jesse Gallagher
 
MWLUG 2016 - AD106
MWLUG 2016 - AD106MWLUG 2016 - AD106
MWLUG 2016 - AD106
Jesse Gallagher
 

More from Jesse Gallagher (6)

OpenNTF Webinar 2022-08 - XPages Jakarta EE Support in Practice
OpenNTF Webinar 2022-08 - XPages Jakarta EE Support in PracticeOpenNTF Webinar 2022-08 - XPages Jakarta EE Support in Practice
OpenNTF Webinar 2022-08 - XPages Jakarta EE Support in Practice
 
OpenNTF Webinar May 2021 - Jesse
OpenNTF Webinar May 2021 - JesseOpenNTF Webinar May 2021 - Jesse
OpenNTF Webinar May 2021 - Jesse
 
Engage 2019 - De04. Java with Domino After XPages
Engage 2019 - De04. Java with Domino After XPagesEngage 2019 - De04. Java with Domino After XPages
Engage 2019 - De04. Java with Domino After XPages
 
DEV-1467 - Darwino
DEV-1467 - DarwinoDEV-1467 - Darwino
DEV-1467 - Darwino
 
DEV-1430 IBM Connections Integration
DEV-1430 IBM Connections IntegrationDEV-1430 IBM Connections Integration
DEV-1430 IBM Connections Integration
 
MWLUG 2016 - AD106
MWLUG 2016 - AD106MWLUG 2016 - AD106
MWLUG 2016 - AD106
 

Recently uploaded

UiPath Test Automation using UiPath Test Suite series, part 4
UiPath Test Automation using UiPath Test Suite series, part 4UiPath Test Automation using UiPath Test Suite series, part 4
UiPath Test Automation using UiPath Test Suite series, part 4
DianaGray10
 
Generative AI Deep Dive: Advancing from Proof of Concept to Production
Generative AI Deep Dive: Advancing from Proof of Concept to ProductionGenerative AI Deep Dive: Advancing from Proof of Concept to Production
Generative AI Deep Dive: Advancing from Proof of Concept to Production
Aggregage
 
National Security Agency - NSA mobile device best practices
National Security Agency - NSA mobile device best practicesNational Security Agency - NSA mobile device best practices
National Security Agency - NSA mobile device best practices
Quotidiano Piemontese
 
GraphSummit Singapore | The Future of Agility: Supercharging Digital Transfor...
GraphSummit Singapore | The Future of Agility: Supercharging Digital Transfor...GraphSummit Singapore | The Future of Agility: Supercharging Digital Transfor...
GraphSummit Singapore | The Future of Agility: Supercharging Digital Transfor...
Neo4j
 
DevOps and Testing slides at DASA Connect
DevOps and Testing slides at DASA ConnectDevOps and Testing slides at DASA Connect
DevOps and Testing slides at DASA Connect
Kari Kakkonen
 
UiPath Test Automation using UiPath Test Suite series, part 5
UiPath Test Automation using UiPath Test Suite series, part 5UiPath Test Automation using UiPath Test Suite series, part 5
UiPath Test Automation using UiPath Test Suite series, part 5
DianaGray10
 
By Design, not by Accident - Agile Venture Bolzano 2024
By Design, not by Accident - Agile Venture Bolzano 2024By Design, not by Accident - Agile Venture Bolzano 2024
By Design, not by Accident - Agile Venture Bolzano 2024
Pierluigi Pugliese
 
Why You Should Replace Windows 11 with Nitrux Linux 3.5.0 for enhanced perfor...
Why You Should Replace Windows 11 with Nitrux Linux 3.5.0 for enhanced perfor...Why You Should Replace Windows 11 with Nitrux Linux 3.5.0 for enhanced perfor...
Why You Should Replace Windows 11 with Nitrux Linux 3.5.0 for enhanced perfor...
SOFTTECHHUB
 
Encryption in Microsoft 365 - ExpertsLive Netherlands 2024
Encryption in Microsoft 365 - ExpertsLive Netherlands 2024Encryption in Microsoft 365 - ExpertsLive Netherlands 2024
Encryption in Microsoft 365 - ExpertsLive Netherlands 2024
Albert Hoitingh
 
Uni Systems Copilot event_05062024_C.Vlachos.pdf
Uni Systems Copilot event_05062024_C.Vlachos.pdfUni Systems Copilot event_05062024_C.Vlachos.pdf
Uni Systems Copilot event_05062024_C.Vlachos.pdf
Uni Systems S.M.S.A.
 
20240605 QFM017 Machine Intelligence Reading List May 2024
20240605 QFM017 Machine Intelligence Reading List May 202420240605 QFM017 Machine Intelligence Reading List May 2024
20240605 QFM017 Machine Intelligence Reading List May 2024
Matthew Sinclair
 
The Art of the Pitch: WordPress Relationships and Sales
The Art of the Pitch: WordPress Relationships and SalesThe Art of the Pitch: WordPress Relationships and Sales
The Art of the Pitch: WordPress Relationships and Sales
Laura Byrne
 
Introduction to CHERI technology - Cybersecurity
Introduction to CHERI technology - CybersecurityIntroduction to CHERI technology - Cybersecurity
Introduction to CHERI technology - Cybersecurity
mikeeftimakis1
 
SAP Sapphire 2024 - ASUG301 building better apps with SAP Fiori.pdf
SAP Sapphire 2024 - ASUG301 building better apps with SAP Fiori.pdfSAP Sapphire 2024 - ASUG301 building better apps with SAP Fiori.pdf
SAP Sapphire 2024 - ASUG301 building better apps with SAP Fiori.pdf
Peter Spielvogel
 
GraphRAG is All You need? LLM & Knowledge Graph
GraphRAG is All You need? LLM & Knowledge GraphGraphRAG is All You need? LLM & Knowledge Graph
GraphRAG is All You need? LLM & Knowledge Graph
Guy Korland
 
GridMate - End to end testing is a critical piece to ensure quality and avoid...
GridMate - End to end testing is a critical piece to ensure quality and avoid...GridMate - End to end testing is a critical piece to ensure quality and avoid...
GridMate - End to end testing is a critical piece to ensure quality and avoid...
ThomasParaiso2
 
Communications Mining Series - Zero to Hero - Session 1
Communications Mining Series - Zero to Hero - Session 1Communications Mining Series - Zero to Hero - Session 1
Communications Mining Series - Zero to Hero - Session 1
DianaGray10
 
LF Energy Webinar: Electrical Grid Modelling and Simulation Through PowSyBl -...
LF Energy Webinar: Electrical Grid Modelling and Simulation Through PowSyBl -...LF Energy Webinar: Electrical Grid Modelling and Simulation Through PowSyBl -...
LF Energy Webinar: Electrical Grid Modelling and Simulation Through PowSyBl -...
DanBrown980551
 
FIDO Alliance Osaka Seminar: Passkeys and the Road Ahead.pdf
FIDO Alliance Osaka Seminar: Passkeys and the Road Ahead.pdfFIDO Alliance Osaka Seminar: Passkeys and the Road Ahead.pdf
FIDO Alliance Osaka Seminar: Passkeys and the Road Ahead.pdf
FIDO Alliance
 
Removing Uninteresting Bytes in Software Fuzzing
Removing Uninteresting Bytes in Software FuzzingRemoving Uninteresting Bytes in Software Fuzzing
Removing Uninteresting Bytes in Software Fuzzing
Aftab Hussain
 

Recently uploaded (20)

UiPath Test Automation using UiPath Test Suite series, part 4
UiPath Test Automation using UiPath Test Suite series, part 4UiPath Test Automation using UiPath Test Suite series, part 4
UiPath Test Automation using UiPath Test Suite series, part 4
 
Generative AI Deep Dive: Advancing from Proof of Concept to Production
Generative AI Deep Dive: Advancing from Proof of Concept to ProductionGenerative AI Deep Dive: Advancing from Proof of Concept to Production
Generative AI Deep Dive: Advancing from Proof of Concept to Production
 
National Security Agency - NSA mobile device best practices
National Security Agency - NSA mobile device best practicesNational Security Agency - NSA mobile device best practices
National Security Agency - NSA mobile device best practices
 
GraphSummit Singapore | The Future of Agility: Supercharging Digital Transfor...
GraphSummit Singapore | The Future of Agility: Supercharging Digital Transfor...GraphSummit Singapore | The Future of Agility: Supercharging Digital Transfor...
GraphSummit Singapore | The Future of Agility: Supercharging Digital Transfor...
 
DevOps and Testing slides at DASA Connect
DevOps and Testing slides at DASA ConnectDevOps and Testing slides at DASA Connect
DevOps and Testing slides at DASA Connect
 
UiPath Test Automation using UiPath Test Suite series, part 5
UiPath Test Automation using UiPath Test Suite series, part 5UiPath Test Automation using UiPath Test Suite series, part 5
UiPath Test Automation using UiPath Test Suite series, part 5
 
By Design, not by Accident - Agile Venture Bolzano 2024
By Design, not by Accident - Agile Venture Bolzano 2024By Design, not by Accident - Agile Venture Bolzano 2024
By Design, not by Accident - Agile Venture Bolzano 2024
 
Why You Should Replace Windows 11 with Nitrux Linux 3.5.0 for enhanced perfor...
Why You Should Replace Windows 11 with Nitrux Linux 3.5.0 for enhanced perfor...Why You Should Replace Windows 11 with Nitrux Linux 3.5.0 for enhanced perfor...
Why You Should Replace Windows 11 with Nitrux Linux 3.5.0 for enhanced perfor...
 
Encryption in Microsoft 365 - ExpertsLive Netherlands 2024
Encryption in Microsoft 365 - ExpertsLive Netherlands 2024Encryption in Microsoft 365 - ExpertsLive Netherlands 2024
Encryption in Microsoft 365 - ExpertsLive Netherlands 2024
 
Uni Systems Copilot event_05062024_C.Vlachos.pdf
Uni Systems Copilot event_05062024_C.Vlachos.pdfUni Systems Copilot event_05062024_C.Vlachos.pdf
Uni Systems Copilot event_05062024_C.Vlachos.pdf
 
20240605 QFM017 Machine Intelligence Reading List May 2024
20240605 QFM017 Machine Intelligence Reading List May 202420240605 QFM017 Machine Intelligence Reading List May 2024
20240605 QFM017 Machine Intelligence Reading List May 2024
 
The Art of the Pitch: WordPress Relationships and Sales
The Art of the Pitch: WordPress Relationships and SalesThe Art of the Pitch: WordPress Relationships and Sales
The Art of the Pitch: WordPress Relationships and Sales
 
Introduction to CHERI technology - Cybersecurity
Introduction to CHERI technology - CybersecurityIntroduction to CHERI technology - Cybersecurity
Introduction to CHERI technology - Cybersecurity
 
SAP Sapphire 2024 - ASUG301 building better apps with SAP Fiori.pdf
SAP Sapphire 2024 - ASUG301 building better apps with SAP Fiori.pdfSAP Sapphire 2024 - ASUG301 building better apps with SAP Fiori.pdf
SAP Sapphire 2024 - ASUG301 building better apps with SAP Fiori.pdf
 
GraphRAG is All You need? LLM & Knowledge Graph
GraphRAG is All You need? LLM & Knowledge GraphGraphRAG is All You need? LLM & Knowledge Graph
GraphRAG is All You need? LLM & Knowledge Graph
 
GridMate - End to end testing is a critical piece to ensure quality and avoid...
GridMate - End to end testing is a critical piece to ensure quality and avoid...GridMate - End to end testing is a critical piece to ensure quality and avoid...
GridMate - End to end testing is a critical piece to ensure quality and avoid...
 
Communications Mining Series - Zero to Hero - Session 1
Communications Mining Series - Zero to Hero - Session 1Communications Mining Series - Zero to Hero - Session 1
Communications Mining Series - Zero to Hero - Session 1
 
LF Energy Webinar: Electrical Grid Modelling and Simulation Through PowSyBl -...
LF Energy Webinar: Electrical Grid Modelling and Simulation Through PowSyBl -...LF Energy Webinar: Electrical Grid Modelling and Simulation Through PowSyBl -...
LF Energy Webinar: Electrical Grid Modelling and Simulation Through PowSyBl -...
 
FIDO Alliance Osaka Seminar: Passkeys and the Road Ahead.pdf
FIDO Alliance Osaka Seminar: Passkeys and the Road Ahead.pdfFIDO Alliance Osaka Seminar: Passkeys and the Road Ahead.pdf
FIDO Alliance Osaka Seminar: Passkeys and the Road Ahead.pdf
 
Removing Uninteresting Bytes in Software Fuzzing
Removing Uninteresting Bytes in Software FuzzingRemoving Uninteresting Bytes in Software Fuzzing
Removing Uninteresting Bytes in Software Fuzzing
 

CollabSphere 2021 - DEV114 - The Nuts and Bolts of CI/CD With a Large XPages And REST App