Skip to content

Commit

Permalink
Merge pull request #16 from merschformann/merschformann/support-aarch…
Browse files Browse the repository at this point in the history
…64-docker

Adds linux/arm64 docker image, bumps to net8, reworks release process
  • Loading branch information
merschformann authored Nov 3, 2024
2 parents 5b46a1a + 88b5f47 commit 9471b9e
Show file tree
Hide file tree
Showing 19 changed files with 212 additions and 87 deletions.
7 changes: 7 additions & 0 deletions .dockerignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
# Ignore build directories
bin/
obj/

# Ignore some project files
.git/
.vs/
8 changes: 2 additions & 6 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -8,18 +8,14 @@ jobs:
runs-on: windows-latest
strategy:
matrix:
dotnet-version: ["7.0.x"]
dotnet-version: ["8.0.x"]

steps:
- uses: actions/checkout@v4
- name: Setup .NET Core SDK ${{ matrix.dotnet-version }}
uses: actions/setup-dotnet@v4.0.1
uses: actions/setup-dotnet@v4.1.0
with:
dotnet-version: ${{ matrix.dotnet-version }}
# - name: Validate version consistency
# run: bash validate-version-consistency.sh
# working-directory: ./Material/Scripts
# shell: bash
- name: Install dependencies
run: dotnet restore
- name: Build
Expand Down
26 changes: 0 additions & 26 deletions .github/workflows/publish.yml

This file was deleted.

93 changes: 93 additions & 0 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,93 @@
name: publish

on:
workflow_dispatch:
inputs:
VERSION:
description: "The version to release (e.g. 1.0.0)"
required: true

jobs:
release:
runs-on: ubuntu-latest
env:
VERSION: ${{ inputs.VERSION }}
GH_TOKEN: ${{ github.token }}
SSH_AUTH_SOCK: /tmp/ssh_agent.sock
permissions:
contents: write
steps:
- name: configure git with the bot credentials
run: |
mkdir -p ~/.ssh
ssh-keyscan github.com >> ~/.ssh/known_hosts
ssh-agent -a $SSH_AUTH_SOCK > /dev/null
ssh-add - <<< "${{ secrets.BOT_SSH_KEY }}"
echo "${{ secrets.BOT_SIGNING_KEY }}" > ~/.ssh/signing.key
chmod 600 ~/.ssh/signing.key
git config --global user.name "Merschbotmann"
git config --global user.email "bot.merschformann@gmail.com"
git config --global gpg.format ssh
git config --global user.signingkey ~/.ssh/signing.key
git clone git@github.com:merschformann/sardine-can.git
cd sardine-can
git checkout ${{ github.ref_name }}
git rev-parse --short HEAD
- name: bump version in project
run: |
python Material/Scripts/release.py --version $VERSION
working-directory: ./sardine-can

- name: commit version bump
run: |
git commit -am "Bumping version to $VERSION"
git push origin ${{ github.ref_name }}
working-directory: ./sardine-can

- name: push release tag
run: |
git tag $VERSION
git push origin $VERSION
working-directory: ./sardine-can

- name: create release
run: |
gh release create $VERSION \
--verify-tag \
--generate-notes \
--title $VERSION
working-directory: ./sardine-can

docker-image:
runs-on: ubuntu-24.04
needs: release

steps:
- uses: actions/checkout@v4
with:
ref: ${{ inputs.VERSION }}

- name: Set up QEMU
uses: docker/setup-qemu-action@v3

- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3

- name: Get version
run: |
echo "VERSION=$(cat VERSION.txt)" >> $GITHUB_ENV
- name: Build the SardineCan Docker image
run: |
echo "Building SardineCan docker in ${{ env.VERSION }}"
echo ${{ secrets.GITHUB_TOKEN }} | docker login ghcr.io -u ${{ github.actor }} --password-stdin
export LATEST_TAG="ghcr.io/merschformann/sardinecan:latest"
export VERSION_TAG="ghcr.io/merschformann/sardinecan:${{ env.VERSION }}"
docker buildx build --platform linux/amd64,linux/arm64 --push -t $LATEST_TAG -t $VERSION_TAG -f Dockerfile ..
working-directory: ./SC.Service
90 changes: 90 additions & 0 deletions Material/Scripts/release.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@
import argparse
import glob
import os
import re
import xml.etree.ElementTree as ET

VERSION_FILE = os.path.join(os.path.dirname(__file__), "..", "..", "VERSION.txt")


def parse_args() -> argparse.Namespace:
"""
Parse command line arguments.
"""
parser = argparse.ArgumentParser(description="Bump the version of the project.")
parser.add_argument("--version", required=True, help="The version to bump to.")
return parser.parse_args()


def check_version(version: str) -> bool:
"""
Check whether a given version is in expected format and actually newer than the
current version.
"""
if not re.match(r"^\d+\.\d+\.\d+$", version):
raise Exception(f"Version {version} is not in the format x.y.z")

with open(VERSION_FILE, "r") as f:
current_version = f.read().strip()

version = version.strip("v")
current_version = current_version.strip("v")

def parse_version(version: str):
return tuple(map(int, version.split(".")))

if parse_version(version) <= parse_version(current_version):
raise Exception(
f"New version {version} is not newer than current version {current_version}"
)


def bump_version_csproj(csproj_file: str, version: str) -> None:
"""
Bump the version of a csproj file.
"""
try:
tree = ET.parse(csproj_file)
root = tree.getroot()

bumped = False
for elem in root.iter():
if elem.tag == "Version":
elem.text = version
bumped = True

if not bumped:
raise Exception("No version element found")

tree.write(csproj_file)
except Exception as e:
print(f"Error bumping version in {csproj_file}: {e}")


def bump_version_main(version: str) -> None:
"""
Bump the main version file.
"""
with open(VERSION_FILE, "w") as f:
f.write(version)


def main() -> None:
args = parse_args()
version = args.version

check_version(version)

csproj_files = glob.glob(
os.path.join(os.path.dirname(__file__), "..", "..", "**", "*.csproj"),
recursive=True,
)
for csproj_file in csproj_files:
if "Test" in csproj_file:
continue
bump_version_csproj(csproj_file, version)
bump_version_main(version)


if __name__ == "__main__":
main()
28 changes: 0 additions & 28 deletions Material/Scripts/validate-version-consistency.sh

This file was deleted.

4 changes: 2 additions & 2 deletions SC.CLI/Executor.cs
Original file line number Diff line number Diff line change
Expand Up @@ -298,9 +298,9 @@ private static void LogConfigDetails(Configuration config, Action<string> logger
else
{
if (toStringMethod != null)
value = toStringMethod.Invoke(field.GetValue(config), new object[] { CultureInfo.InvariantCulture }).ToString();
value = toStringMethod.Invoke(field.GetValue(config), new object[] { CultureInfo.InvariantCulture })?.ToString();
else
value = field.GetValue(config).ToString();
value = field.GetValue(config)?.ToString();
}
}
// Output it
Expand Down
5 changes: 3 additions & 2 deletions SC.CLI/SC.CLI.csproj
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
<Project Sdk="Microsoft.NET.Sdk">
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net7.0</TargetFramework>
<TargetFramework>net8.0</TargetFramework>
<Version>1.0.6</Version>
<SelfContained>true</SelfContained>
<PublishSingleFile>true</PublishSingleFile>
<InvariantGlobalization>true</InvariantGlobalization>
Expand Down
2 changes: 1 addition & 1 deletion SC.DataPreparation/SC.DataPreparation.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net7.0</TargetFramework>
<TargetFramework>net8.0</TargetFramework>
<Version>1.0.6</Version>
<SelfContained>true</SelfContained>
</PropertyGroup>
Expand Down
2 changes: 1 addition & 1 deletion SC.GUI/SC.GUI.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

<PropertyGroup>
<OutputType>WinExe</OutputType>
<TargetFramework>net7.0-windows</TargetFramework>
<TargetFramework>net8.0-windows</TargetFramework>
<EnableWindowsTargeting>true</EnableWindowsTargeting>
<UseWPF>true</UseWPF>
<ApplicationIcon>Logo.ico</ApplicationIcon>
Expand Down
2 changes: 1 addition & 1 deletion SC.Heuristics/SC.Heuristics.csproj
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<TargetFramework>net7.0</TargetFramework>
<TargetFramework>net8.0</TargetFramework>
<Version>1.0.6</Version>
<SelfContained>true</SelfContained>
</PropertyGroup>
Expand Down
2 changes: 1 addition & 1 deletion SC.Linear/SC.Linear.csproj
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<TargetFramework>net7.0</TargetFramework>
<TargetFramework>net8.0</TargetFramework>
<Version>1.0.6</Version>
<SelfContained>true</SelfContained>
</PropertyGroup>
Expand Down
2 changes: 1 addition & 1 deletion SC.ObjectModel/SC.ObjectModel.csproj
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<TargetFramework>net7.0</TargetFramework>
<TargetFramework>net8.0</TargetFramework>
<Version>1.0.6</Version>
<SelfContained>true</SelfContained>
</PropertyGroup>
Expand Down
2 changes: 1 addition & 1 deletion SC.Playground/SC.Playground.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net7.0</TargetFramework>
<TargetFramework>net8.0</TargetFramework>
<Version>1.0.6</Version>
<SelfContained>true</SelfContained>
</PropertyGroup>
Expand Down
18 changes: 5 additions & 13 deletions SC.Service/Dockerfile
Original file line number Diff line number Diff line change
@@ -1,22 +1,14 @@
#See https://aka.ms/containerfastmode to understand how Visual Studio uses this Dockerfile to build your images for faster debugging.

FROM mcr.microsoft.com/dotnet/aspnet:7.0 AS base
WORKDIR /app
EXPOSE 80

FROM mcr.microsoft.com/dotnet/sdk:7.0 AS build
FROM --platform=$BUILDPLATFORM mcr.microsoft.com/dotnet/sdk:8.0 AS build
WORKDIR /src
COPY ["SC.Service/SC.Service.csproj", "SC.Service/"]
RUN dotnet restore "SC.Service/SC.Service.csproj"
COPY . .
RUN dotnet restore "SC.Service/SC.Service.csproj"
WORKDIR "/src/SC.Service"
RUN dotnet build "SC.Service.csproj" -c Release -o /app/build

FROM build AS publish
RUN dotnet publish "SC.Service.csproj" -c Release -o /app/publish

FROM base AS final
FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS final
LABEL org.opencontainers.image.source="https://github.com/merschformann/sardine-can"
WORKDIR /app
COPY --from=publish /app/publish .
EXPOSE 80
COPY --from=build /app/publish .
ENTRYPOINT ["dotnet", "SC.Service.dll"]
2 changes: 1 addition & 1 deletion SC.Service/SC.Service.csproj
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
<Project Sdk="Microsoft.NET.Sdk.Web">

<PropertyGroup>
<TargetFramework>net7.0</TargetFramework>
<TargetFramework>net8.0</TargetFramework>
<DockerDefaultTargetOS>Linux</DockerDefaultTargetOS>
<Version>1.0.6</Version>
<SelfContained>true</SelfContained>
Expand Down
2 changes: 1 addition & 1 deletion SC.Tests/SC.Tests.csproj
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<TargetFramework>net7.0</TargetFramework>
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>

Expand Down
Loading

0 comments on commit 9471b9e

Please sign in to comment.