This is a follow up to my original post: .NET Core 1.1 building with Docker and Cake That post has a bit more detail than here.
Essentially, overtime, the build was a bit too slow. Having a build container (with Mono) being pulled on Circle CI each time was too slow.
I’ve moved away from a build container but still publish and create a Docker image.
Build Process Overview
- Dependencies:
- Install
dotnet
SDK dotnet restore
via Cake
- Install
- Compile:
dotnet build
via Cake
- Test:
dotnet test
via Cake
- Deployment:
dotnet publish
- Use
Dockerfile
to create image - Push built image to AWS ECS
Circle CI configuration
machine:
environment:
DOTNET_CLI_TELEMETRY_OPTOUT: 1
services:
– docker
dependencies:
pre:
– sudo sh -c 'echo "deb [arch=amd64] https://apt-mo.trafficmanager.net/repos/dotnet-release/ trusty main" > /etc/apt/sources.list.d/dotnetdev.list'
– sudo apt-key adv –keyserver hkp://keyserver.ubuntu.com:80 –recv-keys 417A0893
– sudo apt-get update
– sudo apt-get install dotnet-dev-1.0.4
override:
– ./build.sh build.cake –target=restore
cache_directories:
– ~/.nuget
compile:
override:
– ./build.sh build.cake –target=build
test:
override:
– ./build.sh build.cake –target=test
deployment:
builds:
branch: [master, dev]
commands:
– mkdir publish/
– dotnet publish src/Api.Server -f netcoreapp1.1 -c Release -o ../../publish –version-suffix ${CIRCLE_BRANCH}-${CIRCLE_BUILD_NUM}
– docker build -f Dockerfile -t server-api:latest .
– docker tag server-api:latest $AWS_ACCOUNT_ID.dkr.ecr.eu-west-1.amazonaws.com/server-api:$CIRCLE_BUILD_NUM-$CIRCLE_BRANCH
– ./push.sh
New: Build Phases
I still hang everything together with a Cake script but call the stages individually to better match the stags on Circle CI. It seems most build services work this way.
New: dotnet
SDK installation
This is just a copy/paste from the https://dot.net site for Ubuntu. The current version of the SDK now is 1.0.4.
New: Caching NuGet dependencies
Circle CI and other services have a notion of caching. This was easy on Circle. I just tell it to save my .nuget
directory and nuget pulls are much faster. I should figure out something better for the SDK itself. But that probably means a base docker image. Maybe this is better for Circle CI 2.0 which all docker based.
New: Branch tagging
Circle supports having the build number as well as the branch as an environment variable. Using this to tag is nicer for me as well.
Cake file
The cake file has changed since the last post too. Cake better supports the dotnet
commands. I still have to manually glob for tests to run though.
var target = Argument("target", "Default"); var tag = Argument("tag", "cake"); Task("Restore") .Does(() => { DotNetCoreRestore("."); }); Task("Build") .Does(() => { DotNetCoreBuild("."); }); Task("Test") .Does(() => { var files = GetFiles("test/**/*.csproj"); foreach(var file in files) { DotNetCoreTest(file.ToString()); } }); Task("Publish") .Does(() => { var settings = new DotNetCorePublishSettings { Framework = "netcoreapp1.1", Configuration = "Release", OutputDirectory = "../../publish", VersionSuffix = tag }; DotNetCorePublish("src/Api.Server", settings); }); Task("Default") .IsDependentOn("Restore") .IsDependentOn("Build") .IsDependentOn("Test"); RunTarget(target);
The deployment Dockerfile
FROM microsoft/dotnet:1.1.2-runtime
COPY ./publish/api /app
WORKDIR /app
EXPOSE 5000
ENTRYPOINT ["dotnet", "Api.Server.dll"]
I no longer hardcore the ASPNETCORE_ENVIRONMENT
variable in the Dockerfile
and put that in my ECS config in using terraform
. That’s another subject though.
Publishing to AWS ECR – push.sh
I could probably fold this into the circle.yml
but I like having it separate
I added a git push
for tagging to my Github repo
#!/usr/bin/env bash # more bash-friendly output for jq JQ="jq --raw-output --exit-status" configure_aws_cli(){ aws --version aws configure set default.region eu-west-1 aws configure set default.output json } push_ecr_image(){ eval $(aws ecr get-login --region eu-west-1) docker push $AWS_ACCOUNT_ID.dkr.ecr.eu-west-1.amazonaws.com/server-api:$CIRCLE_BUILD_NUM-$CIRCLE_BRANCH } configure_aws_cli push_ecr_image git tag -a $CIRCLE_BUILD_NUM-$CIRCLE_BRANCH -m "Circle CI Build Tag" git push origin --tags
One thought on “.NET Core 1.1 building with Docker and Cake (part 2)”