Skip to content
This repository was archived by the owner on Sep 3, 2024. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .dockerignore
Original file line number Diff line number Diff line change
Expand Up @@ -8,3 +8,5 @@
.vs/
.vscode/
artifacts/
build.sh
build.cmd
8 changes: 5 additions & 3 deletions .travis.yml
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
language: minimal
sudo: required
dist: trusty
script: ./build.sh
script: "./build.sh"
env:
global:
secure: pnK+4X/2WLLMqEv0A2GAXHYkjjRKT+HeIOkSWLYvQc/2H8lPjg0JmQvq7MQIZJxetGv+gxSJtX2cbG55j6mj+inlHHWm87wHPh8zljJztRpH9Fz0IR5GXADuUjCRuvoHq+PJI5MZlcFPYbcaAKVOsyYlejy5Ok5wlYD2WUMMw4NH+iFmffbAuycVynZrzeEGzfx33nocUObamrMOru8UTcHEmR041mwOwjjkzzQmNSLaSt/sQvSrnR8jte3zfrCUT5H7uczs0lkO3OzhJAwqA7vULyRH9iugkauv0HzAorKXOMLKey6E/GZElHviU8E1NnbAOyoBKcITe4EDI1HSbWNQ8C7nFP6w8Rv/O1lRXWL8SHucNXbmETgJ8zlrVWlRMBmnjnjbr0uF7cK4lIaJG3B/ZsY6pMn/93pPLTLrlsl7ZCjxuplU5pfNq/ORnZnAhlKe5W2uxvNdK1C6soFaGvcvyMlcAcjx8Jhjq3Yh8sHknAl70ga/AhvjAzWaTKe5zXTxfXcRXQp5mF9k707qTDkDIeGwXxY92QeiRmFfOuH56UI4CsLgpPgk3yyaHTYZsVuJRHRSqHcNo6ivgF/vYRzSXreEWfd89d8E750SMf90ON8GiCu0cfgBbUUFtsZ8AJdwmp9F7JB23sEB9Gj1OTLgRT247hOmP0b4tinZz5M=
- secure: pnK+4X/2WLLMqEv0A2GAXHYkjjRKT+HeIOkSWLYvQc/2H8lPjg0JmQvq7MQIZJxetGv+gxSJtX2cbG55j6mj+inlHHWm87wHPh8zljJztRpH9Fz0IR5GXADuUjCRuvoHq+PJI5MZlcFPYbcaAKVOsyYlejy5Ok5wlYD2WUMMw4NH+iFmffbAuycVynZrzeEGzfx33nocUObamrMOru8UTcHEmR041mwOwjjkzzQmNSLaSt/sQvSrnR8jte3zfrCUT5H7uczs0lkO3OzhJAwqA7vULyRH9iugkauv0HzAorKXOMLKey6E/GZElHviU8E1NnbAOyoBKcITe4EDI1HSbWNQ8C7nFP6w8Rv/O1lRXWL8SHucNXbmETgJ8zlrVWlRMBmnjnjbr0uF7cK4lIaJG3B/ZsY6pMn/93pPLTLrlsl7ZCjxuplU5pfNq/ORnZnAhlKe5W2uxvNdK1C6soFaGvcvyMlcAcjx8Jhjq3Yh8sHknAl70ga/AhvjAzWaTKe5zXTxfXcRXQp5mF9k707qTDkDIeGwXxY92QeiRmFfOuH56UI4CsLgpPgk3yyaHTYZsVuJRHRSqHcNo6ivgF/vYRzSXreEWfd89d8E750SMf90ON8GiCu0cfgBbUUFtsZ8AJdwmp9F7JB23sEB9Gj1OTLgRT247hOmP0b4tinZz5M=
- secure: fKxyki9JzY95G17hNHSy4dgDmH+zXIk50BR6honAz7LmsA9jGv2gg+l1AIUERH3eckdJwxze4K0e5hX88Xfn4j5nN8TnEw7Wwn7c1vjR9FxvRr5cjaJC0SVsOTZj4VC1R9Sqjzrkqv3jJDtDdz9B8aZMdEzJ+BkHwUMFxmuko2p2qabKnAonaGk5VDSTtDyvDMa0aFjKDYuB6MrnrxhfCzLk1ciyGL61SNfz0/u7Hj3xC6v4U0f0BQ9n65l5dIVn+mpuCdQ7GO0HGj0ySo7ffif3qqXXTx7ZWIl3wvf5RCp0PouA8q2dRHYYyGqhhCwuRNU7dfhS/eFtUtcITclZ/DJE86NBQGJ9tpUUhL7BJ3sNJZzbajh1F28paJgi595SKpScp4VGx3iBuDSKH4eb3cRj5TJqCUoscue8/uIZGgR4PGkGF4lbad3b7xexIk1YY/2Rwun1J0N7tqS0rej3ZRZBtipMF64NrVnt9dZzgsIlssZ0W2NvG0vcLX6DUdeZaR0diz8bUl1DXrMFxAUQ/QYxilvaESmCslRElzlb+5eaqQTG5lSP5l6f3ZcKAhvcUGggu9t3vjzpEq3zFa5dorCyK+es1ASNlwZtZr8in9oYkvam9aiDkZD8cEc+9u+qxvnX9w3MsA0P047YCMQGgwRl5dpizoySC3wr52voK7I=
- secure: HvSSWjsLR6qFi9/iHMKKoVUT4BDN7h4QjKHLvcrznwpfojrA1+nIlIwgcaIkxi5WClsoPmwW8YInPlyIyV+37+SaNK4sxB2puzwaC3iHBi6Ql38q+olsLdCE8u+DcfEcnzQo8pinNoyBLRjBgHjTAbrwIkLETNOZchss4A4UVhvPSznuNz5imlZxp4LqZ2pW/YcaLeCMQzuJHt5iRM6O4CMu7O4kMP/SPQXIXcqqYWI+o4um1JFO5juXBXtrhcTkOHfvGjqZghwma1F3v7zLHtqrbGBxaTLGNj0EIWPQhQEE5wDpvAqLEZcySl0ZjsPQUJd2Uxi9b8mWM1x6WaZTu9uqIy5t9lkCwUkEAwc/LUXZxwL0oi8HncgJvu7Q5KwVn375sJ0CER0Vn1FO8jphnMbpfkqUmbZmkwoIAUENNNYyGEp6zoNnRvaFQTjEW4bL2huPS0g3BgC2xyh8d5ZsPykIgQXlM8EEA2BZkd+ep2rKjOPT94rs5V5IPuVi9FYzFIsc2kpEkKZO/38j6pEAdCVIZp1m0+KRlLNQ9FeaI+xtil95V5ALIEXpc44o5OuUSoxt5ZirYaGSJtUtxo8E+HqpNL5WrTUeE8+aZos6Tu7jF63U2ehwg5xR6EubvrBjWvSHsQKcwDfdeHK2m15S/mVlahpwyyoCASAJtV7mRJI=
git:
depth: false
depth: false
31 changes: 17 additions & 14 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -1,13 +1,18 @@
FROM microsoft/dotnet:2.1.500-sdk-alpine3.7 AS build
ARG MYGET_API_KEY
ARG MINVERBUILDMETADATA

WORKDIR /app

COPY .git ./

RUN apk add --no-cache \
nodejs \
yarn \
libcurl
libcurl && \
dotnet tool install -g minver-cli --version 1.0.0-alpha.15 && \
/root/.dotnet/tools/minver > .version

WORKDIR /src
WORKDIR /app/src

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

COPY ./src .

WORKDIR /docs
WORKDIR /app/docs

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

WORKDIR /.git

COPY ./.git .

WORKDIR /build
WORKDIR /app/build

COPY ./build/build.csproj .

RUN dotnet restore

COPY ./build .

WORKDIR /
COPY --from=sqlstreamstore/browser:0.9 /var/www /app/src/SqlStreamStore.HAL.ApplicationServer/Browser/build

WORKDIR /app

RUN MINVERBUILDMETADATA=$MINVERBUILDMETADATA \
MYGET_API_KEY=$MYGET_API_KEY \
RUN MYGET_API_KEY=$MYGET_API_KEY \
dotnet run --project build/build.csproj

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

WORKDIR /app
COPY --from=build /publish ./
COPY --from=build /app/.version ./
COPY --from=build /app/publish ./

ENTRYPOINT ["/app/SqlStreamStore.HAL.DevServer"]
ENTRYPOINT ["/app/SqlStreamStore.HAL.ApplicationServer"]
44 changes: 37 additions & 7 deletions build.sh
Original file line number Diff line number Diff line change
@@ -1,15 +1,45 @@
#!/usr/bin/env bash

set -e

DOCKERTAG=${TRAVIS_TAG:-latest}
BUILD_NUMBER=${TRAVIS_BUILD_NUMBER:-0}
COMMIT=${TRAVIS_PULL_REQUEST_SHA:-${TRAVIS_COMMIT:-unknown}}
MINVERBUILDMETADATA="build.${BUILD_NUMBER}.${COMMIT}"
LOCAL_IMAGE="sql-stream-store-server"
LOCAL="${LOCAL_IMAGE}:latest"

REMOTE_IMAGE="sqlstreamstore/hal"

docker build \
--build-arg MINVERBUILDMETADATA=$MINVERBUILDMETADATA \
--build-arg MYGET_API_KEY=$MYGET_API_KEY \
--tag sql-stream-store-server:${DOCKERTAG} \
--tag ${LOCAL} \
.

docker images --filter=reference="sql-stream-store-server:${DOCKERTAG}"
VERSION=$(docker run --entrypoint=cat ${LOCAL} /app/.version)

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-]+)*)?$"

[[ $VERSION =~ $SEMVER_REGEX ]]

MAJOR="${REMOTE_IMAGE}:${BASH_REMATCH[1]}"
MAJOR_MINOR="${REMOTE_IMAGE}:${BASH_REMATCH[1]}.${BASH_REMATCH[2]}"
MAJOR_MINOR_PATCH="${REMOTE_IMAGE}:${BASH_REMATCH[1]}.${BASH_REMATCH[2]}.${BASH_REMATCH[3]}"
MAJOR_MINOR_PATCH_PRE="${REMOTE_IMAGE}:${BASH_REMATCH[1]}.${BASH_REMATCH[2]}.${BASH_REMATCH[3]}${BASH_REMATCH[4]}"

if [[ -n $TRAVIS_TAG && -z ${BASH_REMATCH[4]} ]]; then
echo "Detected a tag with no prerelease."
docker tag $LOCAL $MAJOR_MINOR_PATCH
docker tag $LOCAL $MAJOR_MINOR
if [[ ${BASH_REMATCH[1]} != "0" ]]; then
docker tag $LOCAL $MAJOR
else
echo "Detected unstable version."
fi
else
echo "Detected a prerelease."
docker tag $LOCAL $MAJOR_MINOR_PATCH_PRE
fi

if [[ -n $DOCKER_USER ]]; then
echo "${DOCKER_PASS}" | docker login --username "${DOCKER_USER}" --password-stdin
docker push $REMOTE_IMAGE
fi

docker images --filter=reference="${REMOTE_IMAGE}"
182 changes: 100 additions & 82 deletions build/Program.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
using System.IO;
using System.Linq;
using System.Runtime.InteropServices;
using System.Threading.Tasks;
using static Bullseye.Targets;
using static SimpleExec.Command;

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

private const string Clean = nameof(Clean);
private const string Init = nameof(Init);
private const string GenerateDocumentation = nameof(GenerateDocumentation);
private const string Build = nameof(Build);
private const string RunTests = nameof(RunTests);
private const string Pack = nameof(Pack);
private const string Publish = nameof(Publish);
private const string Push = nameof(Push);
private static readonly string MYGET_API_KEY = Environment.GetEnvironmentVariable(nameof(MYGET_API_KEY));

public static void Main(string[] args)
{
var apiKey = Environment.GetEnvironmentVariable("MYGET_API_KEY");
var srcDirectory = new DirectoryInfo("./src");
const string clean = nameof(Clean);
const string init = nameof(Init);
const string generateDocumentation = nameof(GenerateDocumentation);
const string build = nameof(Build);
const string runTests = nameof(RunTests);
const string pack = nameof(Pack);
const string publish = nameof(Publish);
const string push = nameof(Push);

Target(Clean, () =>
{
if (Directory.Exists(ArtifactsDir))
{
Directory.Delete(ArtifactsDir, true);
}
var srcDirectory = new DirectoryInfo("./src");

if (Directory.Exists(PublishDir))
{
Directory.Delete(PublishDir, true);
}
});
Target(
clean,
Clean);

Target(
Init,
() =>
{
if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
{
Run("cmd", "/c yarn", "docs");
}
else
{
Run("yarn", string.Empty, "docs");
}
});
init,
Init);

Target(
GenerateDocumentation,
DependsOn(Init),
generateDocumentation,
DependsOn(init),
ForEach(SchemaDirectories(srcDirectory)),
schemaDirectory =>
RunAsync(
"node",
$"node_modules/@adobe/jsonschema2md/cli.js -n --input {schemaDirectory} --out {schemaDirectory} --schema-out=-",
"docs"));
GenerateDocumentation);

Target(
Build,
DependsOn(GenerateDocumentation),
() => Run(
"dotnet",
"build src/SqlStreamStore.HAL.sln -c Release"));
build,
DependsOn(generateDocumentation),
Build);

Target(
RunTests,
DependsOn(Build),
() => Run(
"dotnet",
$"test src/SqlStreamStore.HAL.Tests -c Release -r ../../{ArtifactsDir} --verbosity normal --no-build -l trx;LogFileName=SqlStreamStore.HAL.Tests.xml"));
runTests,
DependsOn(build),
RunTests);

Target(
Publish,
DependsOn(Build),
() => Run(
"dotnet",
$"publish --configuration=Release --output=../../{PublishDir} --runtime=alpine.3.7-x64 /p:ShowLinkerSizeComparison=true src/SqlStreamStore.HAL.DevServer"));
publish,
DependsOn(build),
Publish);

Target(
Pack,
DependsOn(Publish),
() => Run(
"dotnet",
$"pack src/SqlStreamStore.HAL -c Release -o ../../{ArtifactsDir} --no-build"));
pack,
DependsOn(publish),
Pack);

Target(
Push,
DependsOn(Pack),
() =>
{
var packagesToPush = Directory.GetFiles(ArtifactsDir, "*.nupkg", SearchOption.TopDirectoryOnly);
Console.WriteLine($"Found packages to publish: {string.Join("; ", packagesToPush)}");

if (string.IsNullOrWhiteSpace(apiKey))
{
Console.WriteLine("MyGet API key not available. Packages will not be pushed.");
return;
}

foreach (var packageToPush in packagesToPush)
{
Run(
"dotnet",
$"nuget push {packageToPush} -s https://www.myget.org/F/sqlstreamstore/api/v3/index.json -k {apiKey}");
}
});

Target("default", DependsOn(Clean, RunTests, Push));
push,
DependsOn(pack),
Push);

Target("default", DependsOn(clean, runTests, push));

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

private static readonly Action Init = () => Yarn("./docs");

private static readonly Action Clean = () =>
{
if (Directory.Exists(ArtifactsDir))
{
Directory.Delete(ArtifactsDir, true);
}

if (Directory.Exists(PublishDir))
{
Directory.Delete(PublishDir, true);
}
};

private static readonly Func<string, Task> GenerateDocumentation = schemaDirectory =>
RunAsync(
"node",
$"node_modules/@adobe/jsonschema2md/cli.js -n --input {schemaDirectory} --out {schemaDirectory} --schema-out=-",
"docs");

private static readonly Action Build = () => Run(
"dotnet",
"build src/SqlStreamStore.HAL.sln --configuration Release");

private static readonly Action RunTests = () => Run(
"dotnet",
$"test src/SqlStreamStore.HAL.Tests --configuration Release --results-directory ../../{ArtifactsDir} --verbosity normal --no-build -l trx;LogFileName=SqlStreamStore.HAL.Tests.xml");

private static readonly Action Publish = () => Run(
"dotnet",
$"publish --configuration=Release --output=../../{PublishDir} --runtime=alpine.3.7-x64 /p:ShowLinkerSizeComparison=true src/SqlStreamStore.HAL.ApplicationServer");

private static readonly Action Pack = () => Run(
"dotnet",
$"pack src/SqlStreamStore.HAL --configuration Release --output ../../{ArtifactsDir} --no-build");

private static readonly Action Push = () =>
{
var packagesToPush = Directory.GetFiles(ArtifactsDir, "*.nupkg", SearchOption.TopDirectoryOnly);
Console.WriteLine($"Found packages to publish: {string.Join("; ", packagesToPush)}");

if (string.IsNullOrWhiteSpace(MYGET_API_KEY))
{
Console.WriteLine("MyGet API key not available. Packages will not be pushed.");
return;
}

foreach (var packageToPush in packagesToPush)
{
Run(
"dotnet",
$"nuget push {packageToPush} -s https://www.myget.org/F/sqlstreamstore/api/v3/index.json -k {MYGET_API_KEY}");
}
};

private static void Yarn(string workingDirectory, string args = default)
{
if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
Run("cmd", "/c yarn", workingDirectory);
else
Run("yarn", args, workingDirectory);
}

private static string[] SchemaDirectories(DirectoryInfo srcDirectory)
=> srcDirectory.GetFiles("*.schema.json", SearchOption.AllDirectories)
.Select(schemaFile => schemaFile.DirectoryName)
Expand Down
1 change: 1 addition & 0 deletions build/build.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>netcoreapp2.1</TargetFramework>
<LangVersion>latest</LangVersion>
</PropertyGroup>

<ItemGroup>
Expand Down
Loading