Skip to content

Commit 9146f7d

Browse files
authored
Merge pull request #551 from fossa-app/multi-platform-image
Multi platform image
2 parents 54cbd75 + 0aee1ef commit 9146f7d

4 files changed

Lines changed: 45 additions & 23 deletions

File tree

.build.ps1

Lines changed: 13 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -32,13 +32,12 @@ Task Publish Pack, {
3232
$state = Import-Clixml -Path ".\.trash\$Instance\state.clixml"
3333
$dockerImageVersionTag = $state.DockerImageVersionTag
3434
$dockerImageLatestTag = $state.DockerImageLatestTag
35-
$dockerImageVersionArchiveName = $state.DockerImageVersionArchiveName
36-
$dockerImageLatestArchiveName = $state.DockerImageLatestArchiveName
37-
$dockerImageVersionArchive = Resolve-Path -Path ".\.trash\$Instance\artifacts\$dockerImageVersionArchiveName"
38-
$dockerImageLatestArchive = Resolve-Path -Path ".\.trash\$Instance\artifacts\$dockerImageLatestArchiveName"
35+
$buildArtifactsFolder = $state.BuildArtifactsFolder
36+
$dockerImageMultiArchArchiveName = $state.DockerImageMultiArchArchiveName
37+
$dockerImageMultiArchArchive = Join-Path -Path $buildArtifactsFolder -ChildPath $dockerImageMultiArchArchiveName
38+
$dockerImageMultiArchArchive = Resolve-Path -Path $dockerImageMultiArchArchive
3939

40-
Exec { docker image load --input $dockerImageVersionArchive }
41-
Exec { docker image load --input $dockerImageLatestArchive }
40+
Exec { docker image load --input $dockerImageMultiArchArchive }
4241

4342
if ($null -eq $env:DOCKER_ACCESS_TOKEN) {
4443
Import-Module -Name Microsoft.PowerShell.SecretManagement
@@ -60,26 +59,21 @@ Task Publish Pack, {
6059
Exec { docker push $dockerImageLatestTag }
6160
}
6261

63-
# Synopsis: Pack NuGet package
62+
# Synopsis: Pack Docker image artifact
6463
Task Pack Build, Test, Ward, {
6564
$state = Import-Clixml -Path ".\.trash\$Instance\state.clixml"
6665
$dockerImageName = $state.DockerImageName
6766
$nextVersion = $state.NextVersion
68-
$linuxX64BuildArtifactsFolder = $state.LinuxX64BuildArtifactsFolder
69-
$linuxArm64BuildArtifactsFolder = $state.LinuxArm64BuildArtifactsFolder
7067
$dockerFilePath = Resolve-Path -Path '.\src\API.Web\Dockerfile'
68+
$buildArtifactsFolder = $state.BuildArtifactsFolder
7169

7270
$dockerImageVersionTag = "$($dockerImageName):$nextVersion"
7371
$dockerImageLatestTag = "$($dockerImageName):latest"
7472

75-
$dockerImageVersionArchiveName = $state.DockerImageVersionArchiveName
76-
$dockerImageLatestArchiveName = $state.DockerImageLatestArchiveName
77-
$dockerImageVersionArchive = $ExecutionContext.SessionState.Path.GetUnresolvedProviderPathFromPSPath(".\.trash\$Instance\artifacts\$dockerImageVersionArchiveName")
78-
$dockerImageLatestArchive = $ExecutionContext.SessionState.Path.GetUnresolvedProviderPathFromPSPath(".\.trash\$Instance\artifacts\$dockerImageLatestArchiveName")
73+
$dockerImageMultiArchArchiveName = $state.DockerImageMultiArchArchiveName
74+
$dockerImageMultiArchArchive = Join-Path -Path $buildArtifactsFolder -ChildPath $dockerImageMultiArchArchiveName
7975

80-
Exec { docker buildx build --file $dockerFilePath --tag $dockerImageVersionTag --tag $dockerImageLatestTag $linuxX64BuildArtifactsFolder }
81-
Exec { docker image save --output $dockerImageVersionArchive $dockerImageVersionTag }
82-
Exec { docker image save --output $dockerImageLatestArchive $dockerImageLatestTag }
76+
Exec { docker buildx build --platform 'linux/amd64,linux/arm64' --output "type=oci,dest=$dockerImageMultiArchArchive" --load --file $dockerFilePath --tag $dockerImageVersionTag --tag $dockerImageLatestTag . }
8377

8478
$state.DockerImageVersionTag = $dockerImageVersionTag
8579
$state.DockerImageLatestTag = $dockerImageLatestTag
@@ -124,7 +118,7 @@ Task BuildWeb EstimateVersion, {
124118
$nextVersion = $state.NextVersion
125119

126120
Exec { dotnet build $project /v:m /p:Configuration=Release /p:version=$nextVersion /p:OutDir=$linuxX64BuildArtifactsFolder --runtime linux-x64 }
127-
Exec { dotnet build $project /v:m /p:Configuration=Release /p:version=$nextVersion /p:OutDir=$linuxArm64BuildArtifactsFolder --runtime linux-x64 }
121+
Exec { dotnet build $project /v:m /p:Configuration=Release /p:version=$nextVersion /p:OutDir=$linuxArm64BuildArtifactsFolder --runtime linux-arm64 }
128122
Exec { dotnet build $project /v:m /p:Configuration=Release /p:version=$nextVersion /p:OutDir=$winX64BuildArtifactsFolder --runtime win-x64 }
129123
}
130124

@@ -324,12 +318,11 @@ Task Init {
324318
ContractsArtifactsFolder = $contractsArtifactsFolder
325319
LinuxX64BuildArtifactsFolder = $linuxX64BuildArtifactsFolder
326320
LinuxArm64BuildArtifactsFolder = $linuxArm64BuildArtifactsFolder
327-
WinX64BuildArtifactsFolder = $winX64BuildArtifactsFolder
321+
WinX64BuildArtifactsFolder = $winX64BuildArtifactsFolder
328322
DockerImageName = 'tiksn/fossa-api'
329323
DockerImageVersionTag = $null
330324
DockerImageLatestTag = $null
331-
DockerImageVersionArchiveName = 'tiksn-fossa-api-version.tar'
332-
DockerImageLatestArchiveName = 'tiksn-fossa-api-latest.tar'
325+
DockerImageMultiArchArchiveName= 'fossa-api-multiarch.tar'
333326
}
334327

335328
$state | Export-Clixml -Path ".\.trash\$Instance\state.clixml"

.github/workflows/cicd.yml

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,11 +27,22 @@ jobs:
2727
with:
2828
lfs: true
2929
fetch-depth: 0
30+
- name: Set up Docker with containerd
31+
uses: docker/setup-docker-action@v4
32+
with:
33+
daemon-config: |
34+
{
35+
"features": {
36+
"containerd-snapshotter": true
37+
}
38+
}
3039
- name: "Install .NET Core SDK"
3140
uses: actions/setup-dotnet@v5.0.1
3241
- name: "Install InvokeBuild Module"
3342
shell: pwsh
3443
run: Install-Module -Name InvokeBuild -Force
44+
- name: Set up Docker Buildx
45+
uses: docker/setup-buildx-action@v3
3546
- name: "Restore"
3647
shell: pwsh
3748
run: .\restore.ps1 -Instance ${{github.run_id}}
@@ -76,6 +87,15 @@ jobs:
7687
with:
7788
name: ".trash"
7889
path: "./.trash"
90+
- name: Set up Docker with containerd
91+
uses: docker/setup-docker-action@v4
92+
with:
93+
daemon-config: |
94+
{
95+
"features": {
96+
"containerd-snapshotter": true
97+
}
98+
}
7999
- name: "Install InvokeBuild Module"
80100
shell: pwsh
81101
run: Install-Module -Name InvokeBuild -Force

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ The easiest way to run the API is by using Docker.
2121
```sh
2222
docker run --rm -it -p 8080:8080 --env-file .env tiksn/fossa-api:latest
2323
```
24+
This image supports multiple architectures (linux/amd64, linux/arm64).
2425

2526
## Configuration
2627

src/API.Web/Dockerfile

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,15 @@
1-
FROM mcr.microsoft.com/dotnet/aspnet:10.0.0
1+
FROM --platform=$TARGETARCH mcr.microsoft.com/dotnet/sdk:10.0.100 AS build
2+
ARG TARGETARCH
3+
WORKDIR /source
4+
COPY --link . /source
5+
RUN dotnet restore --runtime linux-$TARGETARCH
6+
WORKDIR /source/src/API.Web
7+
RUN dotnet publish --no-restore --configuration Release --runtime linux-$TARGETARCH --no-self-contained --output /app
8+
9+
FROM --platform=$TARGETARCH mcr.microsoft.com/dotnet/aspnet:10.0.0 AS runtime
210
RUN apt-get update && apt-get upgrade -y && apt-get install -y curl=8.5.0-2ubuntu10.6 && apt-get clean
3-
WORKDIR /App
4-
COPY . ./
11+
WORKDIR /app
12+
COPY --link --from=build /app .
513
USER app
614
EXPOSE 8080
715
ENTRYPOINT ["dotnet", "API.Web.dll"]

0 commit comments

Comments
 (0)