Skip to content

Commit 7d31248

Browse files
committed
Add jbang script to start gitlab with testcontainers
1 parent f75a5f5 commit 7d31248

File tree

4 files changed

+578
-0
lines changed

4 files changed

+578
-0
lines changed

testcontainers/RunGitlab.java

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
///usr/bin/env jbang "$0" "$@" ; exit $?
2+
3+
//DEPS org.testcontainers:testcontainers:1.19.0
4+
//DEPS org.slf4j:slf4j-simple:1.7.36
5+
//JAVA 17
6+
7+
import java.time.Duration;
8+
import java.io.IOException;
9+
import java.net.URI;
10+
import java.net.http.HttpClient;
11+
import java.net.http.HttpRequest;
12+
import java.net.http.HttpResponse;
13+
import java.net.http.HttpResponse.BodyHandlers;
14+
import java.util.concurrent.TimeUnit;
15+
16+
import org.testcontainers.containers.GenericContainer;
17+
import org.testcontainers.containers.wait.strategy.Wait;
18+
import org.testcontainers.containers.wait.strategy.WaitStrategy;
19+
import org.testcontainers.containers.output.*;
20+
import org.testcontainers.utility.DockerImageName;
21+
import org.testcontainers.containers.Container.ExecResult;
22+
23+
import org.slf4j.Logger;
24+
import org.slf4j.LoggerFactory;
25+
26+
public class RunGitlab {
27+
28+
public static void main(String... args) throws Exception {
29+
Logger logger = LoggerFactory.getLogger(RunGitlab.class);
30+
Slf4jLogConsumer logConsumer = new Slf4jLogConsumer(logger);
31+
32+
GenericContainer<?> gitlab = new GenericContainer<>(DockerImageName.parse("gitlab/gitlab-ce:15.4.2-ce.0"))
33+
.withEnv("GITLAB_OMNIBUS_CONFIG", "gitlab_rails['initial_root_password']=\"Pass_w0rd\";gitlab_rails['lfs_enabled']=false;external_url 'http://localhost:8090';gitlab_rails['gitlab_shell_ssh_port'] = 9022")
34+
.withExposedPorts(8090)
35+
//.withLogConsumer(logConsumer)
36+
.waitingFor(
37+
Wait
38+
.forHttp("/")
39+
.forStatusCode(302)
40+
.forStatusCode(200)
41+
.withStartupTimeout(Duration.ofSeconds(3600))
42+
);
43+
44+
gitlab.start();
45+
46+
String rootUserToken = "tk-" + System.currentTimeMillis();
47+
try {
48+
ExecResult r = gitlab.execInContainer("bash", "-c", "gitlab-rails runner \"token = User.find_by_username('root').personal_access_tokens.create(scopes: ['api'], name: 'Test token', expires_at: 365.days.from_now); token.set_token('"+ rootUserToken + "'); token.save!\"");
49+
System.out.println("ExecResult: " + r.getExitCode());
50+
System.out.println(r.getStdout());
51+
System.out.println(r.getStderr());
52+
} catch (UnsupportedOperationException | IOException | InterruptedException e) {
53+
e.printStackTrace();
54+
}
55+
56+
// TimeUnit.SECONDS.sleep(10);
57+
58+
HttpRequest request = HttpRequest.newBuilder()
59+
.header("PRIVATE-TOKEN", rootUserToken)
60+
.uri(new URI("http://localhost:" + gitlab.getMappedPort(8090) + "/api/v4/users/1"))
61+
.GET()
62+
.build();
63+
64+
HttpClient client = HttpClient.newHttpClient();
65+
HttpResponse<String> response = client.send(request, BodyHandlers.ofString());
66+
String content = response.body();
67+
int code = response.statusCode();
68+
if (!(code >= 200 && code < 300)) {
69+
System.out.println("Error while performing the call. Response:");
70+
//System.out.println(content);
71+
//throw new IllegalStateException("Unexpected status code. " + code);
72+
}
73+
System.out.println(content);
74+
75+
//Keep Jbang script running forever:
76+
Thread.currentThread().join();
77+
}
78+
}

testcontainers/jbang

Lines changed: 230 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,230 @@
1+
#!/usr/bin/env bash
2+
3+
#
4+
# To run this script remotely type this in your shell
5+
# (where <args>... are the arguments you want to pass to JBang):
6+
# curl -Ls https://sh.jbang.dev | bash -s - <args>...
7+
#
8+
9+
# The Java version to install when it's not installed on the system yet
10+
javaVersion=${JBANG_DEFAULT_JAVA_VERSION:-17}
11+
12+
script_dir() {
13+
script=${BASH_SOURCE[0]}
14+
while [ -L "$script" ]; do
15+
dir=$( cd -P "$( dirname "$script" )" >/dev/null 2>&1 && pwd )
16+
script=$(readlink "$script")
17+
[[ $script != /* ]] && script=$dir/$script
18+
done
19+
dir=$( cd -P "$( dirname "$script" )" >/dev/null 2>&1 && pwd )
20+
echo $dir
21+
}
22+
23+
download() {
24+
if [ -x "$(command -v curl)" ]; then
25+
curl -sLf -o "$2" "$1"
26+
retval=$?
27+
elif [ -x "$(command -v wget)" ]; then
28+
wget -q -O "$2" "$1"
29+
retval=$?
30+
else
31+
echo "Error: curl or wget not found, please make sure one of them is installed" 1>&2
32+
exit 1
33+
fi
34+
}
35+
36+
unpack() {
37+
if [[ "$1" == *.tar.gz ]]; then
38+
gzip -cd "$1" | tar xf - -C "$2"
39+
retval=$?
40+
if [[ $os == mac && $retval -eq 0 ]]; then
41+
mv "$TDIR/jdks/$javaVersion.tmp/"*/Contents/Home/* "$TDIR/jdks/$javaVersion.tmp/"
42+
retval=$?
43+
else
44+
mv "$TDIR/jdks/$javaVersion.tmp/"*/* "$TDIR/jdks/$javaVersion.tmp/"
45+
fi
46+
else
47+
unzip -qq -o "$1" -d "$2"
48+
retval=$?
49+
mv "$TDIR/jdks/$javaVersion.tmp/"*/* "$TDIR/jdks/$javaVersion.tmp/"
50+
fi
51+
}
52+
53+
javacInPath() {
54+
[[ -x "$(command -v javac)" ]] && ( [[ $os != "mac" ]] || /usr/libexec/java_home &> /dev/null )
55+
}
56+
57+
abs_jbang_dir=$(script_dir)
58+
59+
# todo might vary by os so can be overwritten below
60+
libc_type=glibc
61+
file_type=tar.gz
62+
63+
case "$(uname -s)" in
64+
Linux*)
65+
os=linux
66+
if [ -f /etc/alpine-release ]; then
67+
os=alpine-linux
68+
javaVersion=16
69+
fi
70+
;;
71+
Darwin*)
72+
os=mac
73+
libc_type=libc;;
74+
CYGWIN*|MINGW*|MSYS*)
75+
os=windows
76+
libc_type=c_std_lib
77+
file_type=zip;;
78+
AIX)
79+
os=aix;;
80+
*)
81+
os=
82+
esac
83+
84+
case "$(uname -m)" in
85+
i?86)
86+
arch=x32;;
87+
x86_64|amd64)
88+
arch=x64;;
89+
aarch64)
90+
arch=aarch64;;
91+
armv7l)
92+
arch=arm;;
93+
ppc64le)
94+
arch=ppc64le;;
95+
s390x)
96+
arch=s390x;;
97+
arm64)
98+
arch=arm64
99+
;;
100+
*)
101+
## AIX gives a machine ID for `uname -m` but it only supports ppc64
102+
if [ "$os" = "aix" ]; then
103+
arch=ppc64
104+
else
105+
arch=
106+
fi
107+
;;
108+
esac
109+
110+
## when using cygwin fall out to just running the bat file.
111+
if [[ $os == windows && -f "$abs_jbang_dir/jbang.cmd" && "$(uname -s)" == CYGWIN* ]]; then
112+
cmd /c "$(cygpath -m "$abs_jbang_dir"/jbang.cmd)" "$@"
113+
exit $?
114+
fi
115+
116+
if [[ -z "$JBANG_JDK_VENDOR" ]]; then
117+
if [[ "$javaVersion" -eq 8 || "$javaVersion" -eq 11 || "$javaVersion" -ge 17 ]]; then
118+
distro="temurin";
119+
else
120+
distro="aoj"; fi
121+
else
122+
distro=$JBANG_JDK_VENDOR
123+
fi
124+
125+
if [[ -z "$JBANG_DIR" ]]; then JBDIR="$HOME/.jbang"; else JBDIR="$JBANG_DIR"; fi
126+
if [[ -z "$JBANG_CACHE_DIR" ]]; then TDIR="$JBDIR/cache"; else TDIR="$JBANG_CACHE_DIR"; fi
127+
128+
## resolve application jar path from script location
129+
if [ -f "$abs_jbang_dir/jbang.jar" ]; then
130+
jarPath=$abs_jbang_dir/jbang.jar
131+
elif [ -f "$abs_jbang_dir/.jbang/jbang.jar" ]; then
132+
jarPath=$abs_jbang_dir/.jbang/jbang.jar
133+
else
134+
if [[ ! -f "$JBDIR/bin/jbang.jar" || ! -f "$JBDIR/bin/jbang" ]]; then
135+
echo "Downloading JBang $JBANG_DOWNLOAD_VERSION..." 1>&2
136+
mkdir -p "$TDIR/urls"
137+
if [ -z "$JBANG_DOWNLOAD_VERSION" ]; then
138+
jburl="https://github.com/jbangdev/jbang/releases/latest/download/jbang.tar";
139+
else
140+
jburl="https://github.com/jbangdev/jbang/releases/download/v$JBANG_DOWNLOAD_VERSION/jbang.tar";
141+
fi
142+
download $jburl "$TDIR/urls/jbang.tar"
143+
if [ $retval -ne 0 ]; then echo "Error downloading JBang from $jburl" 1>&2; exit $retval; fi
144+
echo "Installing JBang..." 1>&2
145+
rm -rf "$TDIR/urls/jbang"
146+
tar xf "$TDIR/urls/jbang.tar" -C "$TDIR/urls"
147+
if [ $retval -ne 0 ]; then echo "Error installing JBang" 1>&2; exit $retval; fi
148+
mkdir -p "$JBDIR/bin"
149+
rm -f "$JBDIR/bin/jbang" "$JBDIR/bin"/jbang.*
150+
cp -f "$TDIR/urls/jbang/bin"/* "$JBDIR/bin"
151+
fi
152+
"$JBDIR"/bin/jbang "$@"
153+
exit $?
154+
fi
155+
if [ -f "$jarPath.new" ]; then
156+
# a new jbang version was found, we replace the old one with it
157+
mv "$jarPath.new" "$jarPath"
158+
fi
159+
160+
# Find/get a JDK
161+
unset JAVA_EXEC
162+
if [[ -n "$JAVA_HOME" ]]; then
163+
# Determine if a (working) JDK is available in JAVA_HOME
164+
if [ -x "$(command -v "$JAVA_HOME"/bin/javac)" ]; then
165+
JAVA_EXEC="$JAVA_HOME/bin/java"
166+
else
167+
echo "JAVA_HOME is set but does not seem to point to a valid Java JDK" 1>&2
168+
fi
169+
fi
170+
if [[ -z "$JAVA_EXEC" ]]; then
171+
# Determine if a (working) JDK is available on the PATH
172+
if javacInPath; then
173+
unset JAVA_HOME
174+
JAVA_EXEC="java"
175+
elif [ -x "$JBDIR/currentjdk/bin/javac" ]; then
176+
export JAVA_HOME="$JBDIR/currentjdk"
177+
JAVA_EXEC="$JBDIR/currentjdk/bin/java"
178+
else
179+
export JAVA_HOME="$TDIR/jdks/$javaVersion"
180+
JAVA_EXEC="$JAVA_HOME/bin/java"
181+
# Check if we installed a JDK before
182+
if [ ! -d "$TDIR/jdks/$javaVersion" ]; then
183+
# If not, download and install it
184+
if [[ $os == "" ]]; then
185+
echo "Unable to download JDK, unsupported Operating System: $(uname -s)" 1>&2
186+
exit 1
187+
fi
188+
if [[ $arch == "" ]]; then
189+
echo "Unable to download JDK, unsupported Architecture: $(uname -m)" 1>&2
190+
exit 1
191+
fi
192+
mkdir -p "$TDIR/jdks"
193+
echo "Downloading JDK $javaVersion. Be patient, this can take several minutes..." 1>&2
194+
jdkurl="https://api.foojay.io/disco/v3.0/directuris?distro=$distro&javafx_bundled=false&libc_type=$libc_type&archive_type=$file_type&operating_system=$os&package_type=jdk&version=$javaVersion&architecture=$arch&latest=available"
195+
download "$jdkurl" "$TDIR/bootstrap-jdk.$file_type"
196+
if [ $retval -ne 0 ]; then echo "Error downloading JDK" 1>&2; exit $retval; fi
197+
echo "Installing JDK $javaVersion..." 1>&2
198+
rm -rf "$TDIR/jdks/$javaVersion.tmp/"
199+
mkdir -p "$TDIR/jdks/$javaVersion.tmp"
200+
unpack "$TDIR/bootstrap-jdk.$file_type" "$TDIR/jdks/$javaVersion.tmp"
201+
if [ $retval -ne 0 ]; then
202+
# Check if the JDK was installed properly
203+
javac -version > /dev/null 2>&1
204+
retval=$?
205+
fi
206+
if [ $retval -ne 0 ]; then echo "Error installing JDK" 1>&2; exit $retval; fi
207+
# Activate the downloaded JDK giving it its proper name
208+
mv "$TDIR/jdks/$javaVersion.tmp" "$TDIR/jdks/$javaVersion"
209+
# Set the current JDK
210+
"${JAVA_EXEC}" -classpath "${jarPath}" dev.jbang.Main jdk default $javaVersion
211+
fi
212+
fi
213+
fi
214+
215+
## https://stackoverflow.com/questions/1668649/how-to-keep-quotes-in-bash-arguments
216+
## attempt to ensure each argument keeps its original quoting
217+
218+
## run it using command substitution to have just the user process once jbang is done
219+
export JBANG_RUNTIME_SHELL=bash
220+
export JBANG_STDIN_NOTTY=$([ -t 0 ] && echo "false" || echo "true")
221+
output=$(CLICOLOR_FORCE=1 "${JAVA_EXEC}" ${JBANG_JAVA_OPTIONS} -classpath "${jarPath}" dev.jbang.Main "$@")
222+
err=$?
223+
if [ $err -eq 255 ]; then
224+
eval "exec $output"
225+
elif [ -n "$output" ]; then
226+
echo "$output"
227+
exit $err
228+
else
229+
exit $err
230+
fi

testcontainers/jbang.cmd

Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
@echo off
2+
SETLOCAL ENABLEEXTENSIONS ENABLEDELAYEDEXPANSION
3+
4+
rem The Java version to install when it's not installed on the system yet
5+
if "%JBANG_DEFAULT_JAVA_VERSION%"=="" (set javaVersion=17) else (set javaVersion=%JBANG_DEFAULT_JAVA_VERSION%)
6+
7+
if "%JBANG_DIR%"=="" (set JBDIR=%userprofile%\.jbang) else (set JBDIR=%JBANG_DIR%)
8+
if "%JBANG_CACHE_DIR%"=="" (set TDIR=%JBDIR%\cache) else (set TDIR=%JBANG_CACHE_DIR%)
9+
10+
rem resolve application jar path from script location and convert to windows path when using cygwin
11+
if exist "%~dp0jbang.jar" (
12+
set jarPath=%~dp0jbang.jar
13+
) else if exist "%~dp0.jbang\jbang.jar" (
14+
set jarPath=%~dp0.jbang\jbang.jar
15+
) else (
16+
if not exist "%JBDIR%\bin\jbang.jar" (
17+
powershell -NoProfile -ExecutionPolicy Bypass -NonInteractive -Command "%~dp0jbang.ps1 version" > nul
18+
if !ERRORLEVEL! NEQ 0 ( exit /b %ERRORLEVEL% )
19+
)
20+
call "%JBDIR%\bin\jbang.cmd" %*
21+
exit /b %ERRORLEVEL%
22+
)
23+
if exist "%jarPath%.new" (
24+
rem a new jbang version was found, we replace the old one with it
25+
copy /y "%jarPath%.new" "%jarPath%" > nul 2>&1
26+
del /f /q "%jarPath%.new"
27+
)
28+
29+
rem Find/get a JDK
30+
set JAVA_EXEC=
31+
if not "%JAVA_HOME%"=="" (
32+
rem Determine if a (working) JDK is available in JAVA_HOME
33+
if exist "%JAVA_HOME%\bin\javac.exe" (
34+
set JAVA_EXEC=%JAVA_HOME%\bin\java.exe
35+
) else (
36+
echo JAVA_HOME is set but does not seem to point to a valid Java JDK 1>&2
37+
)
38+
)
39+
if "!JAVA_EXEC!"=="" (
40+
rem Determine if a (working) JDK is available on the PATH
41+
where javac > nul 2>&1
42+
if !errorlevel! equ 0 (
43+
set JAVA_HOME=
44+
set JAVA_EXEC=java.exe
45+
) else if exist "%JBDIR%\currentjdk\bin\javac" (
46+
set JAVA_HOME=%JBDIR%\currentjdk
47+
set JAVA_EXEC=%JBDIR%\currentjdk\bin\java
48+
) else (
49+
set JAVA_HOME=%TDIR%\jdks\%javaVersion%
50+
set JAVA_EXEC=!JAVA_HOME!\bin\java.exe
51+
rem Check if we installed a JDK before
52+
if not exist "%TDIR%\jdks\%javaVersion%" (
53+
rem If not, download and install it
54+
powershell -NoProfile -ExecutionPolicy Bypass -NonInteractive -Command "%~dp0jbang.ps1 jdk install %JBANG_DEFAULT_JAVA_VERSION%"
55+
if !ERRORLEVEL! NEQ 0 ( exit /b %ERRORLEVEL% )
56+
rem Set the current JDK
57+
"!JAVA_EXEC!" -classpath "%jarPath%" dev.jbang.Main jdk default "%javaVersion%"
58+
)
59+
)
60+
)
61+
62+
if not exist "%TDIR%" ( mkdir "%TDIR%" )
63+
set tmpfile=%TDIR%\%RANDOM%.jbang.tmp
64+
rem execute jbang and pipe to temporary random file
65+
set JBANG_RUNTIME_SHELL=cmd
66+
2>nul >nul timeout /t 0 && (set JBANG_STDIN_NOTTY=false) || (set JBANG_STDIN_NOTTY=true)
67+
set "CMD=!JAVA_EXEC!"
68+
SETLOCAL DISABLEDELAYEDEXPANSION
69+
"%CMD%" > "%tmpfile%" %JBANG_JAVA_OPTIONS% -classpath "%jarPath%" dev.jbang.Main %*
70+
set ERROR=%ERRORLEVEL%
71+
rem catch errorlevel straight after; rem or FOR /F swallow would have swallowed the errorlevel
72+
73+
if %ERROR% EQU 255 (
74+
rem read generated java command by jang, delete temporary file and execute.
75+
for %%A in ("%tmpfile%") do for /f "usebackq delims=" %%B in (%%A) do (
76+
set "OUTPUT=%%B"
77+
goto :break
78+
)
79+
:break
80+
del /f /q "%tmpfile%"
81+
%OUTPUT%
82+
exit /b %ERRORLEVEL%
83+
) else (
84+
type "%tmpfile%"
85+
del /f /q "%tmpfile%"
86+
exit /b %ERROR%
87+
)

0 commit comments

Comments
 (0)