Skip to main content

CI/CD for .NET Core



If you have a .NET API that you want to containerize, here are the steps to prepare it.
  1. Create docker image
  2. Push to repository
  3. Setup ECS
The TLS 1.0 option is needed if your SQL Server database does not support TLS 1.2. The recommended option is to update your database to the secure protocol.

You may also change sdk and aspnet version to 5.0 if you haven't updated to 6.0 yet.

This Dockerfile uses a multi-stage build to get an optimal image size.

Dockerfile

FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build-env
WORKDIR /app

# Copy csproj and restore as distinct layers
COPY *.csproj ./
RUN dotnet restore

# Copy everything else and build
COPY . ./
RUN dotnet publish -c Release -o out

# Build runtime image
FROM mcr.microsoft.com/dotnet/aspnet:6.0
WORKDIR /app

# Enable TLS 1.0
RUN sed -i 's/DEFAULT@SECLEVEL=2/DEFAULT@SECLEVEL=1/g' /etc/ssl/openssl.cnf
RUN sed -i 's/MinProtocol = TLSv1.2/MinProtocol = TLSv1/g' /etc/ssl/openssl.cnf
RUN sed -i 's/DEFAULT@SECLEVEL=2/DEFAULT@SECLEVEL=1/g' /usr/lib/ssl/openssl.cnf
RUN sed -i 's/MinProtocol = TLSv1.2/MinProtocol = TLSv1/g' /usr/lib/ssl/openssl.cnf

COPY --from=build-env /app/out .
ENTRYPOINT ["dotnet", "myapp-whatever.dll"]


buildspec.yml

version: 0.2

phases:
  pre_build:
    commands:
      - echo Logging in to Amazon ECR...
      - aws --version
      - aws ecr get-login-password --region $AWS_DEFAULT_REGION | docker login --username AWS --password-stdin $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com
      - REPOSITORY_URI=$AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/$IMAGE_REPO_NAME
      - COMMIT_HASH=$(echo $CODEBUILD_RESOLVED_SOURCE_VERSION | cut -c 1-7)
      - IMAGE_TAG=${COMMIT_HASH:=latest}
  build:
    commands:
      - echo Build started on `date`
      - echo Building the Docker image...
      - docker build -t $REPOSITORY_URI:latest .
      - docker tag $REPOSITORY_URI:latest $REPOSITORY_URI:$IMAGE_TAG
  post_build:
    commands:
      - echo Build completed on `date`
      - echo Pushing the Docker images...
      - docker push $REPOSITORY_URI:latest
      - docker push $REPOSITORY_URI:$IMAGE_TAG
      - echo Writing image definitions file...
      - printf '[{"name":"%s","imageUri":"%s"}]' $IMAGE_REPO_NAME $REPOSITORY_URI:$IMAGE_TAG > imagedefinitions.json
artifacts:
    files: imagedefinitions.json

If you don't have a health check endpoint, this is important for containers for the orchestrator to know if your container is ready or if needs to be restarted.

Startup.cs

app.UseEndpoints(endpoints =>
            {
                endpoints.MapControllers();
                endpoints.MapHealthChecks("/api/health");
            });

Comments

Popular posts from this blog

iReport Default Date Parameter

If you want to set a default date for a jasperreports parameter, you can enter the following in the default value expression of the parameter. new Date() However, if you wanted the default to be relative from today, for example, 3 days ago, you will need to do go outside of the standard java date libraries (Date, Calendar) because JR parameter does not allow you to have multiple statements. You can write your own utility package or you can use Joda , a replacement library for the JDK date and time library. To use Joda in iReports, you need to extract the jar file and add it to Options -> Classpath. You may also drop the jar file in iReports' lib directory. You will also need to add this library to your application or report server. For setting a default date 5 days prior from today, use this: new org.joda.time.DateTime().minusDays(5).toDate() or this if you want the time part set to the beginning of the day: new org.joda.time.LocalDate().toDateTimeAtStartOfDay().minusDays(5).to...

Your car key remote got wet, what now?

My car key fell into a street drain where it lay there for at least 5 minutes before somebody was able to fish it out. The first thing you need to do is remove the battery and dry out the electronic parts. I used tissue paper to blot out all visible moisture. When everything appeared to be dry, assembled the key back and tried to open the car. Fortunately, it worked. A couple of hours later, it didn't work anymore. When I checked the battery again, there was a little water and it appeared that there was still moisture inside the casing. The best thing to do here is to find silica gel or a dessicant which you can find inside new shoes or bags. If you can't find any, you can go to a supermarket and buy a pack of rice crackers. I knew One One Rice Crackers had a large pack of dessicant inside. That's the one on the left below. I found the one on the right from a Case Logic bag. Just pack these together with the electronic component of the car key in plastic bag. Seal it and...

Activating NDD on your Globe landline

NDD and IDD is not available by default on your new Globe landline to protect you from inadvertent charges due to calls to mobile phones and long distance numbers. Note that these instructions are for Metro Manila accounts. To activate NDD, you need call 730-1000. The problem is, an Interactive Voice Response (IVR) menu greets you at that number and there is no menu option to activate NDD. There is also no easy way to get to a human in the options. For credit card companies, I always use the "Report a lost card" option to reach an agent immediately. It appears there is no such shortcut with Globe's number. After several attempts at the menus, the way I got to an agent was to pretend to customize my plan and select the option that says the information is not helpful. Here's the guide: 730-1000 IVR Menu: 1 - English 1 - Globelines 1 - Customize your plan 1 - Customize your plan 2 - Not helpful 1- Talk to a customer agent It will take about 3 minutes for the ...