Skip to content

Commit

Permalink
Add a script for live-reloading the app for local development
Browse files Browse the repository at this point in the history
It is not real live-reloading since the build and config updates are
still required. The `docker-reload.sh` simple handles everything for
you with significantly reduced overhead.
  • Loading branch information
cslzchen committed Oct 27, 2020
1 parent 02faacc commit 7d4b751
Show file tree
Hide file tree
Showing 4 changed files with 160 additions and 5 deletions.
8 changes: 5 additions & 3 deletions Dockerfile-local
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,9 @@ RUN mkdir -p ~/.gradle \

RUN cd cas-overlay && ./gradlew clean build --parallel --no-daemon;
# The build process above in docker may takes a long time depending on your local resources. This OK if you only use
# CAS by building it once. For local development, building with your IDE such as IntelliJ is much faster. Afterwards,
# simply comment out the above "RUN" command and enable the following "COPY" one.
# CAS by building it once. For local development, building in local shell or with your IDE such as IntelliJ is much
# faster. Afterwards, simply comment out the above "RUN" command and enable the following "COPY" one. In fact, this
# stage can be skipped if you have the WAR built locally. Just need run the second stage with a modified WAR source.
# COPY ./build cas-overlay/build/

FROM adoptopenjdk/openjdk11:alpine-jre AS cas
Expand All @@ -32,9 +33,10 @@ RUN cd / \
COPY etc/cas/ /etc/cas/

COPY etc/cas/config/ /etc/cas/config/
# Use "cas-local.properties" for local development
# Use "cas-local.properties" and "log4j2-local.xml" for local development
RUN rm etc/cas/config/cas.properties
COPY etc/cas/config/local/cas-local.properties etc/cas/config/cas.properties
COPY etc/cas/config/local/log4j2-local.xml etc/cas/config/log4j2.xml
RUN rm -r etc/cas/config/local

COPY etc/cas/services/ /etc/cas/services/
Expand Down
18 changes: 18 additions & 0 deletions docker-reload.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
#!/bin/bash

# Rebuild locally and replace the WAR
./gradlew clean build
docker cp ./build/libs/cas.war cas:/cas-overlay

# Sync configuration files
docker exec -d cas sh -c "rm -rf /etc/cas/config/*"
docker cp ./etc/cas/config/local/cas-local.properties cas:/etc/cas/config/cas.properties
docker cp ./etc/cas/config/local/log4j2-local.xml cas:/etc/cas/config/log4j2.xml

# Sync JSON registered service files
docker exec -d cas sh -c "rm -rf /etc/cas/services/*"
docker cp ./etc/cas/services/local/. cas:/etc/cas/services

# Restart the container
docker restart cas
docker logs -f --tail 0 cas
4 changes: 2 additions & 2 deletions docker-run.sh
Original file line number Diff line number Diff line change
Expand Up @@ -3,5 +3,5 @@
docker stop cas > /dev/null 2>&1
docker rm cas > /dev/null 2>&1
image_tag=(`cat gradle.properties | grep "cas.version" | cut -d= -f2`)
docker run -d -p 8080:8080 -p 8443:8443 --name="cas" apereo/cas:"v${image_tag}"
docker logs -f cas
docker run -d -p 8080:8080 --name="cas" apereo/cas:"v${image_tag}"
docker logs -f cas
135 changes: 135 additions & 0 deletions etc/cas/config/local/log4j2-local.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,135 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!-- Specify the refresh internal in seconds. -->
<Configuration monitorInterval="5" packages="org.apereo.cas.logging">
<Properties>
<Property name="baseDir">/var/log</Property>
<!-- OSF CAS logging level -->
<Property name="cas.log.level">debug</Property>
<!-- Apache logging levels -->
<Property name="apache.log.level">info</Property>
<Property name="apache.http.log.level">warn</Property>
<!-- Apereo and Jasig logging levels -->
<Property name="apereo.log.level">info</Property>
<Property name="apereo.cas.log.level">debug</Property>
<Property name="apereo.service.log.level">warn</Property>
<Property name="apereo.inspektr.log.level">info</Property>
<!-- Spring framework logging levels -->
<Property name="spring.boot.admin.log.level">warn</Property>
<Property name="spring.boot.log.level">info</Property>
<Property name="spring.cloud.log.level">warn</Property>
<Property name="spring.security.log.level">info</Property>
<Property name="spring.web.log.level">debug</Property>
<Property name="spring.webflow.log.level">debug</Property>
<!-- Logging levels for 6.2.x packages that are explicitly used by OSF CAS -->
<Property name="thymeleaf.log.level">info</Property>
<Property name="pac4j.log.level">info</Property>
<!-- Logging levels for new packages that are added by OSF CAS -->
<Property name="hibernate.log.level">warn</Property>
<Property name="scribejava.log.level">warn</Property>
<Property name="google.gson.log.level">warn</Property>
<!-- Generic logging levels for 6.2.x packages that are not explicitly used by OSF CAS -->
<Property name="generic.off.log.level">off</Property>
<Property name="generic.error.log.level">error</Property>
<Property name="generic.warn.log.level">warn</Property>
<Property name="generic.info.log.level">info</Property>
<Property name="generic.debug.log.level">debug</Property>
</Properties>
<Appenders>
<Console name="console" target="SYSTEM_OUT">
<PatternLayout pattern="%highlight{%d %p [%c] - &lt;%m&gt;}%n"/>
</Console>
<RollingFile name="file" fileName="${baseDir}/cas.log" append="true"
filePattern="${baseDir}/cas-%d{yyyy-MM-dd-HH}-%i.log">
<PatternLayout pattern="%d %p [%c] - &lt;%m&gt;%n"/>
<Policies>
<OnStartupTriggeringPolicy/>
<SizeBasedTriggeringPolicy size="10 MB"/>
<TimeBasedTriggeringPolicy/>
</Policies>
</RollingFile>
<RollingFile name="auditlogfile" fileName="${baseDir}/cas_audit.log" append="true"
filePattern="${baseDir}/cas_audit-%d{yyyy-MM-dd-HH}-%i.log">
<PatternLayout pattern="%d %p [%c] - %m%n"/>
<Policies>
<OnStartupTriggeringPolicy/>
<SizeBasedTriggeringPolicy size="10 MB"/>
<TimeBasedTriggeringPolicy/>
</Policies>
</RollingFile>
<CasAppender name="casAudit">
<AppenderRef ref="auditlogfile"/>
</CasAppender>
<CasAppender name="casFile">
<AppenderRef ref="file"/>
</CasAppender>
<CasAppender name="casConsole">
<AppenderRef ref="console"/>
</CasAppender>
</Appenders>
<Loggers>
<!-- If adding a Logger with level set higher than warn, make category as selective as possible -->
<!-- Loggers inherit appenders from Root Logger unless additivity is false -->
<!-- Logger: OSF CAS -->
<AsyncLogger name="io.cos.cas" level="${sys:cas.log.level}" includeLocation="true"/>
<!-- Logger: Apache -->
<AsyncLogger name="org.apache" level="${sys:apache.log.level}"/>
<AsyncLogger name="org.apache.http" level="${sys:apache.http.log.level}"/>
<!-- Logger: Apereo and Jasig -->
<AsyncLogger name="org.apereo" level="${sys:apereo.log.level}" includeLocation="true"/>
<AsyncLogger name="org.apereo.cas" level="${sys:apereo.cas.log.level}" includeLocation="true"/>
<AsyncLogger name="org.apereo.services" level="${sys:apereo.service.log.level}" includeLocation="true"/>
<AsyncLogger name="org.apereo.spring" level="${sys:apereo.log.level}" includeLocation="true"/>
<!-- Logger: Spring framework -->
<AsyncLogger name="org.springframework" level="warn" includeLocation="true"/>
<AsyncLogger name="org.springframework.boot" level="${sys:spring.boot.log.level}" includeLocation="true"/>
<AsyncLogger name="org.springframework.boot.context.embedded" level="${sys:generic.info.log.level}" includeLocation="true"/>
<AsyncLogger name="org.springframework.boot.autoconfigure.security.servlet.UserDetailsServiceAutoConfiguration" level="${sys:spring.security.log.level}" includeLocation="true"/>
<AsyncLogger name="org.springframework.boot.autoconfigure.security" level="${sys:spring.security.log.level}" includeLocation="true"/>
<AsyncLogger name="org.springframework.boot.devtools" level="${sys:generic.off.log.level}" includeLocation="true"/>
<AsyncLogger name="org.springframework.web" level="${sys:spring.web.log.level}" includeLocation="true"/>
<AsyncLogger name="org.springframework.web.client" level="${sys:generic.warn.log.level}" includeLocation="true"/>
<AsyncLogger name="org.springframework.web.socket" level="${sys:generic.warn.log.level}" includeLocation="true"/>
<AsyncLogger name="org.springframework.webflow" level="${sys:spring.webflow.log.level}" includeLocation="true"/>
<AsyncLogger name="org.springframework.webflow.engine.impl" level="${sys:generic.info.log.level}" includeLocation="true"/>
<AsyncLogger name="org.springframework.webflow.mvc.view" level="${sys:generic.info.log.level}" includeLocation="true"/>
<AsyncLogger name="org.springframework.cloud" level="${sys:spring.cloud.log.level}" includeLocation="true"/>
<AsyncLogger name="org.springframework.cloud.vault" level="${sys:generic.warn.log.level}" includeLocation="true"/>
<AsyncLogger name="org.springframework.amqp" level="${sys:generic.error.log.level}"/>
<AsyncLogger name="org.springframework.aop" level="${sys:generic.warn.log.level}" includeLocation="true"/>
<AsyncLogger name="org.springframework.context.annotation" level="${sys:generic.off.log.level}" includeLocation="true"/>
<AsyncLogger name="org.springframework.integration" level="${sys:generic.warn.log.level}" includeLocation="true"/>
<AsyncLogger name="org.springframework.messaging" level="${sys:generic.warn.log.level}" includeLocation="true"/>
<AsyncLogger name="org.springframework.orm.jpa" level="${sys:generic.warn.log.level}" includeLocation="true"/>
<AsyncLogger name="org.springframework.scheduling" level="${sys:generic.info.log.level}" includeLocation="true"/>
<AsyncLogger name="org.springframework.security" level="${sys:spring.security.log.level}" includeLocation="true"/>
<AsyncLogger name="org.springframework.session" level="${sys:generic.warn.log.level}" includeLocation="true"/>
<AsyncLogger name="org.springframework.scheduling" level="${sys:generic.warn.log.level}" includeLocation="true"/>
<!-- Logger: 6.2.x packages explicitly used by OSF CAS -->
<AsyncLogger name="org.pac4j" level="${sys:pac4j.log.level}" includeLocation="true"/>
<AsyncLogger name="org.thymeleaf" level="${org.thymeleaf.log.level}" includeLocation="true"/>
<!-- Logger: new packages added (and explicitly used) by OSF CAS-->
<AsyncLogger name="com.github.scribejava" level="${sys:scribejava.log.level}" includeLocation="true"/>
<AsyncLogger name="com.google.code.gson" level="${sys:google.gson.log.level}" includeLocation="true"/>
<AsyncLogger name="org.hibernate" level="${sys:hibernate.log.level}" includeLocation="true"/>
<!-- Logger: 6.2.x packages not explicitly used by OSF CAS -->
<AsyncLogger name="PROTOCOL_MESSAGE" level="${sys:generic.warn.log.level}" includeLocation="true"/>
<AsyncLogger name="com.couchbase" level="${sys:generic.warn.log.level}" includeLocation="true"/>
<AsyncLogger name="com.hazelcast" level="${sys:generic.warn.log.level}" includeLocation="true"/>
<AsyncLogger name="de.codecentric" level="${sys:spring.boot.admin.log.level}" includeLocation="true"/>
<AsyncLogger name="net.jradius" level="${sys:generic.warn.log.level}" includeLocation="true"/>
<AsyncLogger name="net.sf.ehcache" level="${sys:generic.warn.log.level}" includeLocation="true"/>
<AsyncLogger name="org.ldaptive" level="${sys:generic.warn.log.level}" includeLocation="true"/>
<AsyncLogger name="org.opensaml" level="${sys:generic.warn.log.level}" includeLocation="true"/>
<AsyncLogger name="org.openid4java" level="${sys:generic.warn.log.level}" includeLocation="true"/>
<!-- Log audit to all root appenders, and also to audit log (additivity is not false) -->
<AsyncLogger name="org.apereo.inspektr.audit.support" level="${sys:org.apereo.inspektr.log.level}" includeLocation="true">
<AppenderRef ref="casAudit"/>
</AsyncLogger>
<!-- All Loggers inherit appenders specified here, unless additivity="false" on the Logger -->
<AsyncRoot level="warn">
<AppenderRef ref="casFile"/>
<!-- For deployment to an application server running as service, delete the casConsole appender below -->
<AppenderRef ref="casConsole"/>
</AsyncRoot>
</Loggers>
</Configuration>

0 comments on commit 7d4b751

Please sign in to comment.