Skip to content
This repository was archived by the owner on Sep 3, 2024. It is now read-only.

Commit d7db8a9

Browse files
Merge pull request #39 from thefringeninja/scs
Single Container Solution
2 parents 77f3781 + 3bb094d commit d7db8a9

15 files changed

+629
-109
lines changed

.dockerignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,3 +8,5 @@
88
.vs/
99
.vscode/
1010
artifacts/
11+
build.sh
12+
build.cmd

.travis.yml

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
language: minimal
22
sudo: required
33
dist: trusty
4-
script: ./build.sh
4+
script: "./build.sh"
55
env:
66
global:
7-
secure: pnK+4X/2WLLMqEv0A2GAXHYkjjRKT+HeIOkSWLYvQc/2H8lPjg0JmQvq7MQIZJxetGv+gxSJtX2cbG55j6mj+inlHHWm87wHPh8zljJztRpH9Fz0IR5GXADuUjCRuvoHq+PJI5MZlcFPYbcaAKVOsyYlejy5Ok5wlYD2WUMMw4NH+iFmffbAuycVynZrzeEGzfx33nocUObamrMOru8UTcHEmR041mwOwjjkzzQmNSLaSt/sQvSrnR8jte3zfrCUT5H7uczs0lkO3OzhJAwqA7vULyRH9iugkauv0HzAorKXOMLKey6E/GZElHviU8E1NnbAOyoBKcITe4EDI1HSbWNQ8C7nFP6w8Rv/O1lRXWL8SHucNXbmETgJ8zlrVWlRMBmnjnjbr0uF7cK4lIaJG3B/ZsY6pMn/93pPLTLrlsl7ZCjxuplU5pfNq/ORnZnAhlKe5W2uxvNdK1C6soFaGvcvyMlcAcjx8Jhjq3Yh8sHknAl70ga/AhvjAzWaTKe5zXTxfXcRXQp5mF9k707qTDkDIeGwXxY92QeiRmFfOuH56UI4CsLgpPgk3yyaHTYZsVuJRHRSqHcNo6ivgF/vYRzSXreEWfd89d8E750SMf90ON8GiCu0cfgBbUUFtsZ8AJdwmp9F7JB23sEB9Gj1OTLgRT247hOmP0b4tinZz5M=
7+
- secure: pnK+4X/2WLLMqEv0A2GAXHYkjjRKT+HeIOkSWLYvQc/2H8lPjg0JmQvq7MQIZJxetGv+gxSJtX2cbG55j6mj+inlHHWm87wHPh8zljJztRpH9Fz0IR5GXADuUjCRuvoHq+PJI5MZlcFPYbcaAKVOsyYlejy5Ok5wlYD2WUMMw4NH+iFmffbAuycVynZrzeEGzfx33nocUObamrMOru8UTcHEmR041mwOwjjkzzQmNSLaSt/sQvSrnR8jte3zfrCUT5H7uczs0lkO3OzhJAwqA7vULyRH9iugkauv0HzAorKXOMLKey6E/GZElHviU8E1NnbAOyoBKcITe4EDI1HSbWNQ8C7nFP6w8Rv/O1lRXWL8SHucNXbmETgJ8zlrVWlRMBmnjnjbr0uF7cK4lIaJG3B/ZsY6pMn/93pPLTLrlsl7ZCjxuplU5pfNq/ORnZnAhlKe5W2uxvNdK1C6soFaGvcvyMlcAcjx8Jhjq3Yh8sHknAl70ga/AhvjAzWaTKe5zXTxfXcRXQp5mF9k707qTDkDIeGwXxY92QeiRmFfOuH56UI4CsLgpPgk3yyaHTYZsVuJRHRSqHcNo6ivgF/vYRzSXreEWfd89d8E750SMf90ON8GiCu0cfgBbUUFtsZ8AJdwmp9F7JB23sEB9Gj1OTLgRT247hOmP0b4tinZz5M=
8+
- secure: fKxyki9JzY95G17hNHSy4dgDmH+zXIk50BR6honAz7LmsA9jGv2gg+l1AIUERH3eckdJwxze4K0e5hX88Xfn4j5nN8TnEw7Wwn7c1vjR9FxvRr5cjaJC0SVsOTZj4VC1R9Sqjzrkqv3jJDtDdz9B8aZMdEzJ+BkHwUMFxmuko2p2qabKnAonaGk5VDSTtDyvDMa0aFjKDYuB6MrnrxhfCzLk1ciyGL61SNfz0/u7Hj3xC6v4U0f0BQ9n65l5dIVn+mpuCdQ7GO0HGj0ySo7ffif3qqXXTx7ZWIl3wvf5RCp0PouA8q2dRHYYyGqhhCwuRNU7dfhS/eFtUtcITclZ/DJE86NBQGJ9tpUUhL7BJ3sNJZzbajh1F28paJgi595SKpScp4VGx3iBuDSKH4eb3cRj5TJqCUoscue8/uIZGgR4PGkGF4lbad3b7xexIk1YY/2Rwun1J0N7tqS0rej3ZRZBtipMF64NrVnt9dZzgsIlssZ0W2NvG0vcLX6DUdeZaR0diz8bUl1DXrMFxAUQ/QYxilvaESmCslRElzlb+5eaqQTG5lSP5l6f3ZcKAhvcUGggu9t3vjzpEq3zFa5dorCyK+es1ASNlwZtZr8in9oYkvam9aiDkZD8cEc+9u+qxvnX9w3MsA0P047YCMQGgwRl5dpizoySC3wr52voK7I=
9+
- secure: HvSSWjsLR6qFi9/iHMKKoVUT4BDN7h4QjKHLvcrznwpfojrA1+nIlIwgcaIkxi5WClsoPmwW8YInPlyIyV+37+SaNK4sxB2puzwaC3iHBi6Ql38q+olsLdCE8u+DcfEcnzQo8pinNoyBLRjBgHjTAbrwIkLETNOZchss4A4UVhvPSznuNz5imlZxp4LqZ2pW/YcaLeCMQzuJHt5iRM6O4CMu7O4kMP/SPQXIXcqqYWI+o4um1JFO5juXBXtrhcTkOHfvGjqZghwma1F3v7zLHtqrbGBxaTLGNj0EIWPQhQEE5wDpvAqLEZcySl0ZjsPQUJd2Uxi9b8mWM1x6WaZTu9uqIy5t9lkCwUkEAwc/LUXZxwL0oi8HncgJvu7Q5KwVn375sJ0CER0Vn1FO8jphnMbpfkqUmbZmkwoIAUENNNYyGEp6zoNnRvaFQTjEW4bL2huPS0g3BgC2xyh8d5ZsPykIgQXlM8EEA2BZkd+ep2rKjOPT94rs5V5IPuVi9FYzFIsc2kpEkKZO/38j6pEAdCVIZp1m0+KRlLNQ9FeaI+xtil95V5ALIEXpc44o5OuUSoxt5ZirYaGSJtUtxo8E+HqpNL5WrTUeE8+aZos6Tu7jF63U2ehwg5xR6EubvrBjWvSHsQKcwDfdeHK2m15S/mVlahpwyyoCASAJtV7mRJI=
810
git:
9-
depth: false
11+
depth: false

Dockerfile

Lines changed: 17 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,18 @@
11
FROM microsoft/dotnet:2.1.500-sdk-alpine3.7 AS build
22
ARG MYGET_API_KEY
3-
ARG MINVERBUILDMETADATA
3+
4+
WORKDIR /app
5+
6+
COPY .git ./
47

58
RUN apk add --no-cache \
69
nodejs \
710
yarn \
8-
libcurl
11+
libcurl && \
12+
dotnet tool install -g minver-cli --version 1.0.0-alpha.15 && \
13+
/root/.dotnet/tools/minver > .version
914

10-
WORKDIR /src
15+
WORKDIR /app/src
1116

1217
COPY ./src/*.sln ./
1318
COPY ./src/*/*.csproj ./
@@ -19,31 +24,29 @@ RUN dotnet restore --runtime=alpine.3.7-x64
1924

2025
COPY ./src .
2126

22-
WORKDIR /docs
27+
WORKDIR /app/docs
2328

2429
COPY ./docs/package.json ./docs/yarn.lock ./
2530

26-
WORKDIR /.git
27-
28-
COPY ./.git .
29-
30-
WORKDIR /build
31+
WORKDIR /app/build
3132

3233
COPY ./build/build.csproj .
3334

3435
RUN dotnet restore
3536

3637
COPY ./build .
3738

38-
WORKDIR /
39+
COPY --from=sqlstreamstore/browser:0.9 /var/www /app/src/SqlStreamStore.HAL.ApplicationServer/Browser/build
40+
41+
WORKDIR /app
3942

40-
RUN MINVERBUILDMETADATA=$MINVERBUILDMETADATA \
41-
MYGET_API_KEY=$MYGET_API_KEY \
43+
RUN MYGET_API_KEY=$MYGET_API_KEY \
4244
dotnet run --project build/build.csproj
4345

4446
FROM microsoft/dotnet:2.1.6-runtime-deps-alpine3.7 AS runtime
4547

4648
WORKDIR /app
47-
COPY --from=build /publish ./
49+
COPY --from=build /app/.version ./
50+
COPY --from=build /app/publish ./
4851

49-
ENTRYPOINT ["/app/SqlStreamStore.HAL.DevServer"]
52+
ENTRYPOINT ["/app/SqlStreamStore.HAL.ApplicationServer"]

build.sh

Lines changed: 37 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,45 @@
11
#!/usr/bin/env bash
2+
23
set -e
34

4-
DOCKERTAG=${TRAVIS_TAG:-latest}
5-
BUILD_NUMBER=${TRAVIS_BUILD_NUMBER:-0}
6-
COMMIT=${TRAVIS_PULL_REQUEST_SHA:-${TRAVIS_COMMIT:-unknown}}
7-
MINVERBUILDMETADATA="build.${BUILD_NUMBER}.${COMMIT}"
5+
LOCAL_IMAGE="sql-stream-store-server"
6+
LOCAL="${LOCAL_IMAGE}:latest"
7+
8+
REMOTE_IMAGE="sqlstreamstore/hal"
89

910
docker build \
10-
--build-arg MINVERBUILDMETADATA=$MINVERBUILDMETADATA \
1111
--build-arg MYGET_API_KEY=$MYGET_API_KEY \
12-
--tag sql-stream-store-server:${DOCKERTAG} \
12+
--tag ${LOCAL} \
1313
.
1414

15-
docker images --filter=reference="sql-stream-store-server:${DOCKERTAG}"
15+
VERSION=$(docker run --entrypoint=cat ${LOCAL} /app/.version)
16+
17+
SEMVER_REGEX="^(0|[1-9][0-9]*)\\.(0|[1-9][0-9]*)\\.(0|[1-9][0-9]*)(\\-[0-9A-Za-z-]+(\\.[0-9A-Za-z-]+)*)?(\\+[0-9A-Za-z-]+(\\.[0-9A-Za-z-]+)*)?$"
18+
19+
[[ $VERSION =~ $SEMVER_REGEX ]]
20+
21+
MAJOR="${REMOTE_IMAGE}:${BASH_REMATCH[1]}"
22+
MAJOR_MINOR="${REMOTE_IMAGE}:${BASH_REMATCH[1]}.${BASH_REMATCH[2]}"
23+
MAJOR_MINOR_PATCH="${REMOTE_IMAGE}:${BASH_REMATCH[1]}.${BASH_REMATCH[2]}.${BASH_REMATCH[3]}"
24+
MAJOR_MINOR_PATCH_PRE="${REMOTE_IMAGE}:${BASH_REMATCH[1]}.${BASH_REMATCH[2]}.${BASH_REMATCH[3]}${BASH_REMATCH[4]}"
25+
26+
if [[ -n $TRAVIS_TAG && -z ${BASH_REMATCH[4]} ]]; then
27+
echo "Detected a tag with no prerelease."
28+
docker tag $LOCAL $MAJOR_MINOR_PATCH
29+
docker tag $LOCAL $MAJOR_MINOR
30+
if [[ ${BASH_REMATCH[1]} != "0" ]]; then
31+
docker tag $LOCAL $MAJOR
32+
else
33+
echo "Detected unstable version."
34+
fi
35+
else
36+
echo "Detected a prerelease."
37+
docker tag $LOCAL $MAJOR_MINOR_PATCH_PRE
38+
fi
39+
40+
if [[ -n $DOCKER_USER ]]; then
41+
echo "${DOCKER_PASS}" | docker login --username "${DOCKER_USER}" --password-stdin
42+
docker push $REMOTE_IMAGE
43+
fi
44+
45+
docker images --filter=reference="${REMOTE_IMAGE}"

build/Program.cs

Lines changed: 100 additions & 82 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
using System.IO;
33
using System.Linq;
44
using System.Runtime.InteropServices;
5+
using System.Threading.Tasks;
56
using static Bullseye.Targets;
67
using static SimpleExec.Command;
78

@@ -10,112 +11,129 @@ static class Program
1011
private const string ArtifactsDir = "artifacts";
1112
private const string PublishDir = "publish";
1213

13-
private const string Clean = nameof(Clean);
14-
private const string Init = nameof(Init);
15-
private const string GenerateDocumentation = nameof(GenerateDocumentation);
16-
private const string Build = nameof(Build);
17-
private const string RunTests = nameof(RunTests);
18-
private const string Pack = nameof(Pack);
19-
private const string Publish = nameof(Publish);
20-
private const string Push = nameof(Push);
14+
private static readonly string MYGET_API_KEY = Environment.GetEnvironmentVariable(nameof(MYGET_API_KEY));
2115

2216
public static void Main(string[] args)
2317
{
24-
var apiKey = Environment.GetEnvironmentVariable("MYGET_API_KEY");
25-
var srcDirectory = new DirectoryInfo("./src");
18+
const string clean = nameof(Clean);
19+
const string init = nameof(Init);
20+
const string generateDocumentation = nameof(GenerateDocumentation);
21+
const string build = nameof(Build);
22+
const string runTests = nameof(RunTests);
23+
const string pack = nameof(Pack);
24+
const string publish = nameof(Publish);
25+
const string push = nameof(Push);
2626

27-
Target(Clean, () =>
28-
{
29-
if (Directory.Exists(ArtifactsDir))
30-
{
31-
Directory.Delete(ArtifactsDir, true);
32-
}
27+
var srcDirectory = new DirectoryInfo("./src");
3328

34-
if (Directory.Exists(PublishDir))
35-
{
36-
Directory.Delete(PublishDir, true);
37-
}
38-
});
29+
Target(
30+
clean,
31+
Clean);
3932

4033
Target(
41-
Init,
42-
() =>
43-
{
44-
if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
45-
{
46-
Run("cmd", "/c yarn", "docs");
47-
}
48-
else
49-
{
50-
Run("yarn", string.Empty, "docs");
51-
}
52-
});
34+
init,
35+
Init);
5336

5437
Target(
55-
GenerateDocumentation,
56-
DependsOn(Init),
38+
generateDocumentation,
39+
DependsOn(init),
5740
ForEach(SchemaDirectories(srcDirectory)),
58-
schemaDirectory =>
59-
RunAsync(
60-
"node",
61-
$"node_modules/@adobe/jsonschema2md/cli.js -n --input {schemaDirectory} --out {schemaDirectory} --schema-out=-",
62-
"docs"));
41+
GenerateDocumentation);
6342

6443
Target(
65-
Build,
66-
DependsOn(GenerateDocumentation),
67-
() => Run(
68-
"dotnet",
69-
"build src/SqlStreamStore.HAL.sln -c Release"));
44+
build,
45+
DependsOn(generateDocumentation),
46+
Build);
7047

7148
Target(
72-
RunTests,
73-
DependsOn(Build),
74-
() => Run(
75-
"dotnet",
76-
$"test src/SqlStreamStore.HAL.Tests -c Release -r ../../{ArtifactsDir} --verbosity normal --no-build -l trx;LogFileName=SqlStreamStore.HAL.Tests.xml"));
49+
runTests,
50+
DependsOn(build),
51+
RunTests);
7752

7853
Target(
79-
Publish,
80-
DependsOn(Build),
81-
() => Run(
82-
"dotnet",
83-
$"publish --configuration=Release --output=../../{PublishDir} --runtime=alpine.3.7-x64 /p:ShowLinkerSizeComparison=true src/SqlStreamStore.HAL.DevServer"));
54+
publish,
55+
DependsOn(build),
56+
Publish);
8457

8558
Target(
86-
Pack,
87-
DependsOn(Publish),
88-
() => Run(
89-
"dotnet",
90-
$"pack src/SqlStreamStore.HAL -c Release -o ../../{ArtifactsDir} --no-build"));
59+
pack,
60+
DependsOn(publish),
61+
Pack);
9162

9263
Target(
93-
Push,
94-
DependsOn(Pack),
95-
() =>
96-
{
97-
var packagesToPush = Directory.GetFiles(ArtifactsDir, "*.nupkg", SearchOption.TopDirectoryOnly);
98-
Console.WriteLine($"Found packages to publish: {string.Join("; ", packagesToPush)}");
99-
100-
if (string.IsNullOrWhiteSpace(apiKey))
101-
{
102-
Console.WriteLine("MyGet API key not available. Packages will not be pushed.");
103-
return;
104-
}
105-
106-
foreach (var packageToPush in packagesToPush)
107-
{
108-
Run(
109-
"dotnet",
110-
$"nuget push {packageToPush} -s https://www.myget.org/F/sqlstreamstore/api/v3/index.json -k {apiKey}");
111-
}
112-
});
113-
114-
Target("default", DependsOn(Clean, RunTests, Push));
64+
push,
65+
DependsOn(pack),
66+
Push);
67+
68+
Target("default", DependsOn(clean, runTests, push));
11569

11670
RunTargets(args.Concat(new[] {"--parallel"}));
11771
}
11872

73+
private static readonly Action Init = () => Yarn("./docs");
74+
75+
private static readonly Action Clean = () =>
76+
{
77+
if (Directory.Exists(ArtifactsDir))
78+
{
79+
Directory.Delete(ArtifactsDir, true);
80+
}
81+
82+
if (Directory.Exists(PublishDir))
83+
{
84+
Directory.Delete(PublishDir, true);
85+
}
86+
};
87+
88+
private static readonly Func<string, Task> GenerateDocumentation = schemaDirectory =>
89+
RunAsync(
90+
"node",
91+
$"node_modules/@adobe/jsonschema2md/cli.js -n --input {schemaDirectory} --out {schemaDirectory} --schema-out=-",
92+
"docs");
93+
94+
private static readonly Action Build = () => Run(
95+
"dotnet",
96+
"build src/SqlStreamStore.HAL.sln --configuration Release");
97+
98+
private static readonly Action RunTests = () => Run(
99+
"dotnet",
100+
$"test src/SqlStreamStore.HAL.Tests --configuration Release --results-directory ../../{ArtifactsDir} --verbosity normal --no-build -l trx;LogFileName=SqlStreamStore.HAL.Tests.xml");
101+
102+
private static readonly Action Publish = () => Run(
103+
"dotnet",
104+
$"publish --configuration=Release --output=../../{PublishDir} --runtime=alpine.3.7-x64 /p:ShowLinkerSizeComparison=true src/SqlStreamStore.HAL.ApplicationServer");
105+
106+
private static readonly Action Pack = () => Run(
107+
"dotnet",
108+
$"pack src/SqlStreamStore.HAL --configuration Release --output ../../{ArtifactsDir} --no-build");
109+
110+
private static readonly Action Push = () =>
111+
{
112+
var packagesToPush = Directory.GetFiles(ArtifactsDir, "*.nupkg", SearchOption.TopDirectoryOnly);
113+
Console.WriteLine($"Found packages to publish: {string.Join("; ", packagesToPush)}");
114+
115+
if (string.IsNullOrWhiteSpace(MYGET_API_KEY))
116+
{
117+
Console.WriteLine("MyGet API key not available. Packages will not be pushed.");
118+
return;
119+
}
120+
121+
foreach (var packageToPush in packagesToPush)
122+
{
123+
Run(
124+
"dotnet",
125+
$"nuget push {packageToPush} -s https://www.myget.org/F/sqlstreamstore/api/v3/index.json -k {MYGET_API_KEY}");
126+
}
127+
};
128+
129+
private static void Yarn(string workingDirectory, string args = default)
130+
{
131+
if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
132+
Run("cmd", "/c yarn", workingDirectory);
133+
else
134+
Run("yarn", args, workingDirectory);
135+
}
136+
119137
private static string[] SchemaDirectories(DirectoryInfo srcDirectory)
120138
=> srcDirectory.GetFiles("*.schema.json", SearchOption.AllDirectories)
121139
.Select(schemaFile => schemaFile.DirectoryName)

build/build.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
<PropertyGroup>
44
<OutputType>Exe</OutputType>
55
<TargetFramework>netcoreapp2.1</TargetFramework>
6+
<LangVersion>latest</LangVersion>
67
</PropertyGroup>
78

89
<ItemGroup>

0 commit comments

Comments
 (0)