Skip to content

Commit e46c648

Browse files
feat: central package management (#1800)
* partial commit * Partially working * base docker image part 1 * fix build issues * fix broken test * function base image * testing docker base image on function * updating docker files * update build to also build base images * update build bug * commit testing build * fixing env varible * fix build issue * test * test list all images * testing changes * typo * test * typo * more testing * test login action * add checkout step * update permissions * Detect base image changes * changing base image build check script * fix perms * checking run * fix following slash bug * set image tags step * fixing shell bugs * remove wild card from change detector * refactor image tag logic * trim white space * bug fix * fix space removal bug * test build * bug in building base image * test pushing to ghcr * test full build. * correct output issues * test build change * testing more fixes? * moving base image names to step env varibles * extra logging and activities * removing docker images step * testing with a .env file in pipeline * hard coding to test * remove spaces from export * testing more env sending * fix quote marks * more testing of build process * update base image * use env file * use correct pipeline * update all functions to use base image * correct docker files * incorrect path * incorrect work dir * Tidy Build Images * add push to main logic * revert change to speed up cicd * update dotnet mesh client * fix tagging * typo * update build base image to always run on main * Missing package ref * feat: added devtest workflows compatible with CPM change --------- Co-authored-by: Maciej Murawski <maciej.murawski@nordcloud.com>
1 parent 550196b commit e46c648

151 files changed

Lines changed: 1354 additions & 1372 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.github/workflows/cicd-1-pull-request-devtest.yaml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,8 @@ jobs:
129129
permissions:
130130
contents: read
131131
id-token: write
132-
pull-requests: read
132+
pull-requests: write
133+
packages: write
133134
secrets:
134135
client_id: ${{ secrets.AZURE_CLIENT_ID }}
135136
tenant_id: ${{ secrets.AZURE_TENANT_ID }}

.github/workflows/cicd-1-pull-request.yaml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -133,7 +133,8 @@ jobs:
133133
permissions:
134134
contents: read
135135
id-token: write
136-
pull-requests: read
136+
pull-requests: write
137+
packages: write
137138
secrets:
138139
client_id: ${{ secrets.AZURE_CLIENT_ID }}
139140
tenant_id: ${{ secrets.AZURE_TENANT_ID }}

.github/workflows/stage-3-build-images-devtest.yaml

Lines changed: 92 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -77,18 +77,102 @@ jobs:
7777
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
7878
run: bash scripts/deployment/get-docker-names.sh
7979

80+
build-base-images:
81+
runs-on: ubuntu-latest
82+
permissions:
83+
contents: read
84+
pull-requests: read
85+
id-token: write
86+
packages: write
87+
outputs:
88+
DOTNET_BASE_IMAGE: ${{ steps.set-image-tags.outputs.DOTNET_BASE_IMAGE }}
89+
FUNCTION_BASE_IMAGE: ${{ steps.set-image-tags.outputs.FUNCTION_BASE_IMAGE }}
90+
steps:
91+
- uses: actions/checkout@v4
92+
with:
93+
token: ${{ secrets.GITHUB_TOKEN }}
94+
fetch-depth: 1
95+
submodules: 'true'
96+
97+
- name: log in to GHCR
98+
uses: docker/login-action@v3
99+
continue-on-error: false
100+
with:
101+
registry: ghcr.io
102+
username: ${{ github.actor }}
103+
password: ${{ secrets.GITHUB_TOKEN }}
104+
105+
- name: Detect base image changes
106+
id: detect-base-image-changes
107+
continue-on-error: false
108+
run: bash scripts/deployment/check-base-image-changes.sh
109+
110+
- name: Build Base Images
111+
id: build-base-images
112+
working-directory: ./
113+
if: ${{ steps.detect-base-image-changes.outputs.BASE_IMAGE_CHANGE == 'true' || github.ref == 'refs/heads/main' }}
114+
continue-on-error: false
115+
env:
116+
GH_TOKEN: ${{ github.token }}
117+
run: |
118+
119+
echo "The branch is: ${GITHUB_REF}"
120+
PR_NUM=$(gh api repos/${{ github.repository }}/commits/${{ github.sha }}/pulls --jq '.[0].number')
121+
PR_NUM_TAG="pr${PR_NUM}"
122+
SHORT_COMMIT_HASH=$(git rev-parse --short ${GITHUB_SHA})
123+
124+
docker build -f Dockerfile.dotnet.base -t cohort-manager-dotnet-base:latest .
125+
docker tag cohort-manager-dotnet-base:latest "ghcr.io/nhsdigital/cohort-manager-dotnet-base:${PR_NUM_TAG}"
126+
docker tag cohort-manager-dotnet-base:latest "ghcr.io/nhsdigital/cohort-manager-dotnet-base:${SHORT_COMMIT_HASH}"
127+
128+
docker build -f Dockerfile.function.base -t cohort-manager-function-base:latest .
129+
docker tag cohort-manager-function-base:latest "ghcr.io/nhsdigital/cohort-manager-function-base:${PR_NUM_TAG}"
130+
docker tag cohort-manager-function-base:latest "ghcr.io/nhsdigital/cohort-manager-function-base:${SHORT_COMMIT_HASH}"
131+
132+
docker push "ghcr.io/nhsdigital/cohort-manager-dotnet-base:${PR_NUM_TAG}"
133+
docker push "ghcr.io/nhsdigital/cohort-manager-dotnet-base:${SHORT_COMMIT_HASH}"
134+
docker push "ghcr.io/nhsdigital/cohort-manager-function-base:${PR_NUM_TAG}"
135+
docker push "ghcr.io/nhsdigital/cohort-manager-function-base:${SHORT_COMMIT_HASH}"
136+
if [ "${GITHUB_REF}" == 'refs/heads/main' ]; then
137+
docker push "ghcr.io/nhsdigital/cohort-manager-dotnet-base:latest"
138+
docker push "ghcr.io/nhsdigital/cohort-manager-function-base:latest"
139+
fi
140+
141+
- name: Set Image Tags
142+
id: set-image-tags
143+
env:
144+
GH_TOKEN: ${{ github.token }}
145+
run: |
146+
147+
PR_NUM=$(gh api repos/${{ github.repository }}/commits/${{ github.sha }}/pulls --jq '.[0].number')
148+
PR_NUM_TAG="pr${PR_NUM}"
149+
IMAGE_TAG="latest"
150+
151+
if [[ ${{steps.detect-base-image-changes.outputs.BASE_IMAGE_CHANGE}} == 'true' ]]; then
152+
IMAGE_TAG="${PR_NUM_TAG}"
153+
fi
154+
echo "Image Tag: ${IMAGE_TAG}"
155+
156+
echo "DOTNET_BASE_IMAGE=ghcr.io/nhsdigital/cohort-manager-dotnet-base:${IMAGE_TAG}" >> "${GITHUB_OUTPUT}"
157+
echo "FUNCTION_BASE_IMAGE=ghcr.io/nhsdigital/cohort-manager-function-base:${IMAGE_TAG}" >> "${GITHUB_OUTPUT}"
158+
159+
160+
161+
162+
80163
build-and-push:
81164
runs-on: ubuntu-latest
82165
permissions:
83166
id-token: write
84167
contents: read
85168
pull-requests: read
86-
needs: get-functions
169+
needs: [get-functions, build-base-images]
87170
strategy:
88171
matrix:
89172
function: ${{ fromJSON(needs.get-functions.outputs.FUNC_NAMES) }}
90173
if: needs.get-functions.outputs.FUNC_NAMES != '[]'
91174
outputs:
175+
pr_num_tag: ${{ env.PR_NUM_TAG }}
92176
short_commit_hash: ${{ env.COMMIT_HASH_TAG }}
93177
devtest_pr_num_tag: ${{ env.DEVTEST_PR_NUM_TAG }}
94178
steps:
@@ -132,6 +216,7 @@ jobs:
132216
echo "DEVTEST_PR_NUM_TAG=${DEVTEST_PR_NUM_TAG}" >> ${GITHUB_ENV}
133217
134218
SHORT_COMMIT_HASH=$(git rev-parse --short ${GITHUB_SHA})
219+
echo "Commit hash tag: ${SHORT_COMMIT_HASH}"
135220
echo "COMMIT_HASH_TAG=${SHORT_COMMIT_HASH}" >> ${GITHUB_ENV}
136221
137222
echo "ENVIRONMENT_TAG=${ENVIRONMENT_TAG}" >> ${GITHUB_ENV}
@@ -143,6 +228,8 @@ jobs:
143228
COMPOSE_FILE: ${{ inputs.docker_compose_file }}
144229
PROJECT_NAME: ${{ inputs.project_name }}
145230
ACR_NAME: ${{ secrets.acr_name }}
231+
DOTNET_BASE_IMAGE : ${{ needs.build-base-images.outputs.DOTNET_BASE_IMAGE }}
232+
FUNCTION_BASE_IMAGE: ${{ needs.build-base-images.outputs.FUNCTION_BASE_IMAGE }}
146233
run: |
147234
function=${{ matrix.function }}
148235
@@ -153,8 +240,10 @@ jobs:
153240
exit 0
154241
fi
155242
156-
# Build the image
157-
docker compose -f ${COMPOSE_FILE//,/ -f } -p ${PROJECT_NAME} --profile "*" build --no-cache --pull ${function}
243+
244+
docker compose -f ${COMPOSE_FILE//,/ -f } \
245+
-p ${PROJECT_NAME} \
246+
--profile "*" build --no-cache --pull ${function}
158247
159248
repo_name="${ACR_NAME}.azurecr.io/${PROJECT_NAME}-${function}"
160249
echo $(repo_name)

.github/workflows/stage-3-build-images.yaml

Lines changed: 85 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -77,13 +77,88 @@ jobs:
7777
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
7878
run: bash scripts/deployment/get-docker-names.sh
7979

80+
build-base-images:
81+
runs-on: ubuntu-latest
82+
permissions:
83+
contents: read
84+
pull-requests: read
85+
id-token: write
86+
packages: write
87+
outputs:
88+
DOTNET_BASE_IMAGE: ${{ steps.set-image-tags.outputs.DOTNET_BASE_IMAGE }}
89+
FUNCTION_BASE_IMAGE: ${{ steps.set-image-tags.outputs.FUNCTION_BASE_IMAGE }}
90+
steps:
91+
- uses: actions/checkout@v4
92+
with:
93+
token: ${{ secrets.GITHUB_TOKEN }}
94+
fetch-depth: 1
95+
submodules: 'true'
96+
97+
- name: log in to GHCR
98+
uses: docker/login-action@v3
99+
continue-on-error: false
100+
with:
101+
registry: ghcr.io
102+
username: ${{ github.actor }}
103+
password: ${{ secrets.GITHUB_TOKEN }}
104+
105+
- name: Detect base image changes
106+
id: detect-base-image-changes
107+
continue-on-error: false
108+
run: bash scripts/deployment/check-base-image-changes.sh
109+
110+
- name: Build Base Images
111+
id: build-base-images
112+
working-directory: ./
113+
if: ${{ steps.detect-base-image-changes.outputs.BASE_IMAGE_CHANGE == 'true' || github.ref == 'refs/heads/main' }}
114+
continue-on-error: false
115+
run: |
116+
PR_NUM_TAG=$(echo "${GITHUB_REF}" | sed 's/refs\/pull\/\([0-9]*\)\/merge/\1/')
117+
SHORT_COMMIT_HASH=$(git rev-parse --short ${GITHUB_SHA})
118+
119+
docker build -f Dockerfile.dotnet.base -t cohort-manager-dotnet-base:latest .
120+
docker tag cohort-manager-dotnet-base:latest "ghcr.io/nhsdigital/cohort-manager-dotnet-base:${PR_NUM_TAG}"
121+
docker tag cohort-manager-dotnet-base:latest "ghcr.io/nhsdigital/cohort-manager-dotnet-base:${SHORT_COMMIT_HASH}"
122+
123+
docker build -f Dockerfile.function.base -t cohort-manager-function-base:latest .
124+
docker tag cohort-manager-function-base:latest "ghcr.io/nhsdigital/cohort-manager-function-base:${PR_NUM_TAG}"
125+
docker tag cohort-manager-function-base:latest "ghcr.io/nhsdigital/cohort-manager-function-base:${SHORT_COMMIT_HASH}"
126+
127+
docker push "ghcr.io/nhsdigital/cohort-manager-dotnet-base:${PR_NUM_TAG}"
128+
docker push "ghcr.io/nhsdigital/cohort-manager-dotnet-base:${SHORT_COMMIT_HASH}"
129+
docker push "ghcr.io/nhsdigital/cohort-manager-function-base:${PR_NUM_TAG}"
130+
docker push "ghcr.io/nhsdigital/cohort-manager-function-base:${SHORT_COMMIT_HASH}"
131+
if [ "${GITHUB_REF}" == 'refs/heads/main' ]; then
132+
docker push "ghcr.io/nhsdigital/cohort-manager-dotnet-base:latest"
133+
docker push "ghcr.io/nhsdigital/cohort-manager-function-base:latest"
134+
fi
135+
136+
- name: Set Image Tags
137+
id: set-image-tags
138+
run: |
139+
140+
PR_NUM_TAG=$(echo "${GITHUB_REF}" | sed 's/refs\/pull\/\([0-9]*\)\/merge/\1/')
141+
IMAGE_TAG="latest"
142+
143+
if [[ ${{steps.detect-base-image-changes.outputs.BASE_IMAGE_CHANGE}} == 'true' ]]; then
144+
IMAGE_TAG="${PR_NUM_TAG}"
145+
fi
146+
echo "Image Tag = ${IMAGE_TAG}"
147+
148+
echo "DOTNET_BASE_IMAGE=ghcr.io/nhsdigital/cohort-manager-dotnet-base:${IMAGE_TAG}" >> "${GITHUB_OUTPUT}"
149+
echo "FUNCTION_BASE_IMAGE=ghcr.io/nhsdigital/cohort-manager-function-base:${IMAGE_TAG}" >> "${GITHUB_OUTPUT}"
150+
151+
152+
153+
154+
80155
build-and-push:
81156
runs-on: ubuntu-latest
82157
permissions:
83158
id-token: write
84159
contents: read
85160
pull-requests: read
86-
needs: get-functions
161+
needs: [get-functions, build-base-images]
87162
strategy:
88163
matrix:
89164
function: ${{ fromJSON(needs.get-functions.outputs.FUNC_NAMES) }}
@@ -145,25 +220,32 @@ jobs:
145220
146221
echo "ENVIRONMENT_TAG=${ENVIRONMENT_TAG}" >> ${GITHUB_ENV}
147222
223+
148224
- name: Build and Push Image
149225
working-directory: ${{ steps.get-function-names.outputs.DOCKER_COMPOSE_DIR }}
150226
continue-on-error: false
151227
env:
152228
COMPOSE_FILE: ${{ inputs.docker_compose_file }}
153229
PROJECT_NAME: ${{ inputs.project_name }}
154230
ACR_NAME: ${{ secrets.acr_name }}
231+
DOTNET_BASE_IMAGE : ${{ needs.build-base-images.outputs.DOTNET_BASE_IMAGE }}
232+
FUNCTION_BASE_IMAGE: ${{ needs.build-base-images.outputs.FUNCTION_BASE_IMAGE }}
155233
run: |
156234
function=${{ matrix.function }}
157235
236+
237+
158238
echo PROJECT_NAME: ${PROJECT_NAME}
159239
160240
if [ -z "${function}" ]; then
161241
echo "Function variable is empty. Skipping Docker build."
162242
exit 0
163243
fi
164244
165-
# Build the image
166-
docker compose -f ${COMPOSE_FILE//,/ -f } -p ${PROJECT_NAME} --profile "*" build --no-cache --pull ${function}
245+
246+
docker compose -f ${COMPOSE_FILE//,/ -f } \
247+
-p ${PROJECT_NAME} \
248+
--profile "*" build --no-cache --pull ${function}
167249
168250
repo_name="${ACR_NAME}.azurecr.io/${PROJECT_NAME}-${function}"
169251
echo $(repo_name)

Directory.Build.props

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
<Project>
2+
<PropertyGroup Condition="'$(MSBuildProjectName)' == 'WorkerExtensions'">
3+
<ManagePackageVersionsCentrally>false</ManagePackageVersionsCentrally>
4+
<TreatWarningsAsErrors>false</TreatWarningsAsErrors>
5+
<NoWarn>$(NoWarn);NU1605;NU1701;NU1507</NoWarn>
6+
</PropertyGroup>
7+
</Project>

Directory.Build.targets

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
<Project>
2+
<PropertyGroup Condition="
3+
'$(UsingMicrosoftNETSdkWorker)' == 'true'
4+
and '$(IsTestProject)' == 'true'
5+
">
6+
<FunctionsGenerateWorkerExtensions>false</FunctionsGenerateWorkerExtensions>
7+
</PropertyGroup>
8+
</Project>

Directory.Packages.props

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
<Project>
2+
<PropertyGroup>
3+
<!-- Enable central package management,
4+
https://learn.microsoft.com/en-us/nuget/consume-packages/Central-Package-Management -->
5+
<ManagePackageVersionsCentrally>true</ManagePackageVersionsCentrally>
6+
</PropertyGroup>
7+
<ItemGroup>
8+
<PackageVersion Include="Azure.Messaging.ServiceBus" Version="7.20.1" />
9+
<PackageVersion Include="Microsoft.Azure.Functions.Worker" Version="2.0.0" />
10+
<PackageVersion Include="Microsoft.Azure.Functions.Worker.Extensions.Http" Version="3.3.0" />
11+
<PackageVersion Include="Microsoft.Azure.Functions.Worker.Extensions.Storage.Blobs"
12+
Version="6.7.0" />
13+
<PackageVersion Include="Microsoft.Azure.Functions.Worker.Sdk" Version="2.0.4" />
14+
<PackageVersion Include="Microsoft.Azure.Functions.Worker.ApplicationInsights" Version="2.0.0" />
15+
<PackageVersion Include="Microsoft.Extensions.Diagnostics.HealthChecks" Version="9.0.2" />
16+
<PackageVersion Include="Polly" Version="8.5.0" />
17+
<PackageVersion Include="Azure.Extensions.AspNetCore.Configuration.Secrets" Version="1.4.0" />
18+
<PackageVersion Include="Azure.Identity" Version="1.14.1" />
19+
<PackageVersion Include="Azure.Security.KeyVault.Certificates" Version="4.6.0" />
20+
<PackageVersion Include="Azure.Security.KeyVault.Secrets" Version="4.6.0" />
21+
<PackageVersion Include="Azure.Storage.Blobs" Version="12.20.0" />
22+
<PackageVersion Include="Azure.Storage.Queues" Version="12.20.1" />
23+
<PackageVersion Include="Azure.Messaging.EventGrid" Version="4.28.0" />
24+
<PackageVersion Include="Microsoft.ApplicationInsights.DependencyCollector" Version="2.23.0" />
25+
<PackageVersion Include="Microsoft.ApplicationInsights.WorkerService" Version="2.23.0" />
26+
<PackageVersion Include="Microsoft.AspNetCore.WebUtilities" Version="8.0.7" />
27+
<PackageVersion Include="Microsoft.Extensions.Azure" Version="1.12.0" />
28+
<PackageVersion Include="Microsoft.Extensions.Options.DataAnnotations" Version="9.0.6" />
29+
<PackageVersion Include="Microsoft.Identity.Client" Version="4.74.0" />
30+
<PackageVersion Include="Microsoft.IdentityModel.Tokens" Version="8.12.1" />
31+
<PackageVersion Include="Hl7.Fhir.R4" Version="5.11.4" />
32+
<PackageVersion Include="System.IdentityModel.Tokens.Jwt" Version="8.12.1" />
33+
<PackageVersion Include="Microsoft.Extensions.Hosting" Version="9.0.6" />
34+
<PackageVersion Include="System.Linq.Dynamic.Core" Version="1.7.1" />
35+
<PackageVersion Include="ParquetSharp" Version="17.0.0-beta1" />
36+
<PackageVersion Include="RulesEngine" Version="5.0.5" />
37+
<PackageVersion Include="Microsoft.EntityFrameworkCore.Tools" Version="10.0.1" />
38+
<PackageVersion Include="Microsoft.Extensions.HealthChecks.AzureStorage" Version="1.0.0" />
39+
<PackageVersion Include="Microsoft.Extensions.Logging" Version="9.0.6" />
40+
<PackageVersion Include="Microsoft.Extensions.Caching.Memory" Version="9.0.3" />
41+
<PackageVersion Include="System.Runtime.Caching" Version="8.0.1" />
42+
<PackageVersion Include="Microsoft.Azure.Functions.Worker.Extensions.Http.AspNetCore"
43+
Version="2.0.2" />
44+
<PackageVersion Include="Microsoft.Azure.Functions.Worker.Extensions.Timer" Version="4.3.1" />
45+
<PackageVersion Include="Microsoft.Azure.Functions.Worker.Extensions.DurableTask"
46+
Version="1.4.0" />
47+
<PackageVersion Include="Microsoft.Azure.Functions.Worker.Extensions.ServiceBus"
48+
Version="5.23.0" />
49+
<PackageVersion Include="Grpc.Net.Client" Version="2.70.0" />
50+
<PackageVersion Include="Contrib.Grpc.Core.M1" Version="2.41.0" />
51+
<PackageVersion Include="Hl7.Fhir.STU3" Version="4.3.0" />
52+
<PackageVersion Include="Microsoft.EntityFrameworkCore" Version="9.0.3" />
53+
<PackageVersion Include="Microsoft.EntityFrameworkCore.Design" Version="9.0.3" />
54+
<PackageVersion Include="Microsoft.EntityFrameworkCore.SqlServer.NetTopologySuite"
55+
Version="9.0.3" />
56+
<PackageVersion Include="Microsoft.EntityFrameworkCore.SqlServer" Version="9.0.3" />
57+
<PackageVersion Include="Microsoft.Extensions.DependencyInjection" Version="9.0.8" />
58+
<PackageVersion Include="Microsoft.NET.Test.Sdk" Version="17.12.0" />
59+
<PackageVersion Include="Moq" Version="4.20.72" />
60+
<PackageVersion Include="MSTest" Version="3.6.4" />
61+
<PackageVersion Include="MSTest.TestAdapter" Version="3.1.1" />
62+
<PackageVersion Include="MSTest.TestFramework" Version="3.1.1" />
63+
<PackageVersion Include="coverlet.collector" Version="6.0.0" />
64+
<PackageVersion Include="FluentAssertions" Version="6.12.2" />
65+
<PackageVersion Include="Microsoft.EntityFrameworkCore.InMemory" Version="9.0.3" />
66+
<PackageVersion Include="Microsoft.EntityFrameworkCore.Sqlite" Version="9.0.3" />
67+
<PackageVersion Include="Microsoft.Extensions.Logging.Abstractions" Version="10.0.1" />
68+
</ItemGroup>
69+
</Project>

Dockerfile.dotnet.base

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
FROM mcr.microsoft.com/dotnet/sdk:8.0 AS base
2+
3+
COPY Directory.Build.props /app/Directory.Build.props
4+
COPY Directory.Build.targets /app/Directory.Build.targets
5+
COPY Directory.Packages.props /app/Directory.Packages.props
6+
7+
COPY ./application/CohortManager/src/Functions/Shared/ /app/Shared
8+
9+
10+

Dockerfile.function.base

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
FROM mcr.microsoft.com/dotnet/sdk:8.0 AS base
2+
3+
# Copy Build and Package Properties
4+
COPY Directory.Build.props /app/Directory.Build.props
5+
COPY Directory.Build.targets /app/Directory.Build.targets
6+
COPY Directory.Packages.props /app/Directory.Packages.props
7+
8+
9+
COPY ./application/CohortManager/src/Functions/Shared/ /app/Shared
10+
11+
WORKDIR /app/Shared
12+
13+
RUN mkdir -p /home/site/wwwroot && \
14+
dotnet publish ./Common/Common.csproj --output /home/site/wwwroot && \
15+
dotnet publish ./Model/Model.csproj --output /home/site/wwwroot && \
16+
dotnet publish ./Data/Data.csproj --output /home/site/wwwroot && \
17+
dotnet publish ./Utilities/Utilities.csproj --output /home/site/wwwroot && \
18+
dotnet publish ./DataServices.Client/DataServices.Client.csproj --output /home/site/wwwroot && \
19+
dotnet publish ./DataServices.Core/DataServices.Core.csproj --output /home/site/wwwroot && \
20+
dotnet publish ./DataServices.Database/DataServices.Database.csproj --output /home/site/wwwroot

0 commit comments

Comments
 (0)