Skip to content

Commit 50c3102

Browse files
committed
Pin workflow actions, update devcontainer & add policy
Pin GitHub Actions to full commit SHAs across CI/pr/release workflows and related workflow files to satisfy org security policy. Update devcontainer to use the shared dotnet-dev image and add GitHub Copilot extensions. Remove Dependabot automation for GitHub Actions (actions are managed with SHA pins). Replace automated release step with a gh CLI-based release, and add a new docs/github-actions-org-policy.md describing organisation-level Actions and security rules, signing, SBOM/provenance, Dependabot expectations, and required repository controls.
1 parent f06fbef commit 50c3102

File tree

8 files changed

+446
-71
lines changed

8 files changed

+446
-71
lines changed

.devcontainer/devcontainer.json

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,19 @@
22
"name": "ServiceTemplate Dev",
33
// Central devcontainer image maintained by the platform team in:
44
// github.com/dever-labs/devcontainers
5+
// Image: ghcr.io/dever-labs/devcontainers/dotnet-dev:latest
56
// Includes: .NET 10 SDK, Docker-in-Docker, kubectl, Helm, git, GitHub CLI.
67
// Update the image there — all service repos pick it up on next container start.
7-
"image": "ghcr.io/dever-labs/devcontainers/dotnet-service:latest",
8+
"image": "ghcr.io/dever-labs/devcontainers/dotnet-dev:latest",
89

910
"customizations": {
1011
"vscode": {
1112
"extensions": [
1213
"ms-dotnettools.csharp",
1314
"ms-dotnettools.csdevkit",
1415
"ms-dotnettools.vscode-dotnet-runtime",
16+
"github.copilot",
17+
"github.copilot-chat",
1518
"streetsidesoftware.code-spell-checker",
1619
"editorconfig.editorconfig",
1720
"eamodio.gitlens",

.github/dependabot.yml

Lines changed: 3 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -37,17 +37,9 @@ updates:
3737
- dotnet
3838

3939
# ── GitHub Actions ────────────────────────────────────────────────────────────
40-
- package-ecosystem: github-actions
41-
directory: /
42-
schedule:
43-
interval: weekly
44-
day: monday
45-
time: "08:00"
46-
timezone: UTC
47-
open-pull-requests-limit: 5
48-
labels:
49-
- dependencies
50-
- github-actions
40+
# Actions are pinned to full commit SHAs per org policy.
41+
# Dependabot does not preserve SHA pins (it reverts to tags), so
42+
# action updates are managed manually.
5143

5244
# ── Helm chart dependencies ───────────────────────────────────────────────────
5345
- package-ecosystem: helm

.github/workflows/ai-pr-review.yml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ jobs:
1818

1919
steps:
2020
- name: Checkout
21-
uses: actions/checkout@v4
21+
uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
2222
with:
2323
fetch-depth: 0
2424

@@ -35,7 +35,7 @@ jobs:
3535
3636
- name: Run AI review via GitHub Models
3737
id: ai-review
38-
uses: actions/github-script@v7
38+
uses: actions/github-script@f28e40c7f34bde8b3046d885e986cb6290c5673b # v7
3939
env:
4040
GITHUB_TOKEN: ${{ github.token }}
4141
PR_DIFF: ${{ steps.diff.outputs.diff }}
@@ -98,7 +98,7 @@ jobs:
9898
9999
- name: Post review comment
100100
if: steps.ai-review.outputs.review != ''
101-
uses: actions/github-script@v7
101+
uses: actions/github-script@f28e40c7f34bde8b3046d885e986cb6290c5673b # v7
102102
env:
103103
AI_REVIEW: ${{ steps.ai-review.outputs.review }}
104104
with:

.github/workflows/ci.yml

Lines changed: 19 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -21,14 +21,14 @@ jobs:
2121
name: Build & Unit Tests
2222
runs-on: ubuntu-latest
2323
steps:
24-
- uses: actions/checkout@v4
24+
- uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
2525

26-
- uses: actions/setup-dotnet@v4
26+
- uses: actions/setup-dotnet@67a3573c9a986a3f9c594539f4ab511d57bb3ce9 # v4
2727
with:
2828
dotnet-version: '10.0.x'
2929

3030
- name: Cache NuGet packages
31-
uses: actions/cache@v4
31+
uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 # v4
3232
with:
3333
path: ~/.nuget/packages
3434
key: ${{ runner.os }}-nuget-${{ hashFiles('**/Directory.Packages.props') }}
@@ -52,14 +52,14 @@ jobs:
5252
--results-directory TestResults
5353
5454
- name: Upload test results
55-
uses: actions/upload-artifact@v4
55+
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4
5656
if: always()
5757
with:
5858
name: unit-test-results
5959
path: TestResults/*.trx
6060

6161
- name: Upload coverage
62-
uses: actions/upload-artifact@v4
62+
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4
6363
with:
6464
name: coverage-unit
6565
path: TestResults/**/coverage.cobertura.xml
@@ -84,14 +84,14 @@ jobs:
8484
--health-timeout 5s
8585
--health-retries 10
8686
steps:
87-
- uses: actions/checkout@v4
87+
- uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
8888

89-
- uses: actions/setup-dotnet@v4
89+
- uses: actions/setup-dotnet@67a3573c9a986a3f9c594539f4ab511d57bb3ce9 # v4
9090
with:
9191
dotnet-version: '10.0.x'
9292

9393
- name: Cache NuGet packages
94-
uses: actions/cache@v4
94+
uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 # v4
9595
with:
9696
path: ~/.nuget/packages
9797
key: ${{ runner.os }}-nuget-${{ hashFiles('**/Directory.Packages.props') }}
@@ -114,7 +114,7 @@ jobs:
114114
ConnectionStrings__DefaultConnection: "Host=localhost;Port=5432;Database=integration_tests;Username=postgres;Password=postgres"
115115

116116
- name: Upload test results
117-
uses: actions/upload-artifact@v4
117+
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4
118118
if: always()
119119
with:
120120
name: integration-test-results
@@ -126,14 +126,14 @@ jobs:
126126
runs-on: ubuntu-latest
127127
needs: build
128128
steps:
129-
- uses: actions/checkout@v4
129+
- uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
130130

131-
- uses: actions/setup-dotnet@v4
131+
- uses: actions/setup-dotnet@67a3573c9a986a3f9c594539f4ab511d57bb3ce9 # v4
132132
with:
133133
dotnet-version: '10.0.x'
134134

135135
- name: Cache NuGet packages
136-
uses: actions/cache@v4
136+
uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 # v4
137137
with:
138138
path: ~/.nuget/packages
139139
key: ${{ runner.os }}-nuget-${{ hashFiles('**/Directory.Packages.props') }}
@@ -154,7 +154,7 @@ jobs:
154154
--results-directory TestResults
155155
156156
- name: Upload test results
157-
uses: actions/upload-artifact@v4
157+
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4
158158
if: always()
159159
with:
160160
name: acceptance-test-results
@@ -166,13 +166,13 @@ jobs:
166166
runs-on: ubuntu-latest
167167
needs: [build]
168168
steps:
169-
- uses: actions/checkout@v4
169+
- uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
170170

171171
- name: Set up Docker Buildx
172-
uses: docker/setup-buildx-action@v3
172+
uses: docker/setup-buildx-action@8d2750c68a42422c14e847fe6c8ac0403b4cbd6f # v3
173173

174174
- name: Build Docker image
175-
uses: docker/build-push-action@v6
175+
uses: docker/build-push-action@10e90e3645eae34f1e60eeb005ba3a3d33f178e8 # v6
176176
with:
177177
context: .
178178
push: false
@@ -188,16 +188,16 @@ jobs:
188188
needs: [build, integration-tests]
189189
if: always()
190190
steps:
191-
- uses: actions/checkout@v4
191+
- uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
192192

193-
- uses: actions/download-artifact@v4
193+
- uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4
194194
with:
195195
pattern: coverage-*
196196
merge-multiple: true
197197
path: coverage
198198

199199
- name: Upload to Codecov
200-
uses: codecov/codecov-action@v5
200+
uses: codecov/codecov-action@671740ac38dd9b0130fbe1cec585b89eea48d3de # v5
201201
with:
202202
directory: coverage
203203
fail_ci_if_error: false

.github/workflows/copilot-setup-steps.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,10 @@ jobs:
1414
runs-on: ubuntu-latest
1515
steps:
1616
- name: Checkout repository
17-
uses: actions/checkout@v4
17+
uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
1818

1919
- name: Setup .NET SDK
20-
uses: actions/setup-dotnet@v4
20+
uses: actions/setup-dotnet@67a3573c9a986a3f9c594539f4ab511d57bb3ce9 # v4
2121
with:
2222
global-json-file: global.json
2323

.github/workflows/pr.yml

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ jobs:
1515
name: Validate PR Title
1616
runs-on: ubuntu-latest
1717
steps:
18-
- uses: amannn/action-semantic-pull-request@v5
18+
- uses: amannn/action-semantic-pull-request@e32d7e603df1aa1ba07e981f2a23455dee596825 # v5
1919
env:
2020
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
2121
with:
@@ -37,9 +37,9 @@ jobs:
3737
name: Code Format Check
3838
runs-on: ubuntu-latest
3939
steps:
40-
- uses: actions/checkout@v4
40+
- uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
4141

42-
- uses: actions/setup-dotnet@v4
42+
- uses: actions/setup-dotnet@67a3573c9a986a3f9c594539f4ab511d57bb3ce9 # v4
4343
with:
4444
dotnet-version: '10.0.x'
4545

@@ -52,7 +52,7 @@ jobs:
5252
runs-on: ubuntu-latest
5353
if: github.event_name == 'pull_request'
5454
steps:
55-
- uses: actions/checkout@v4
56-
- uses: actions/dependency-review-action@v4
55+
- uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
56+
- uses: actions/dependency-review-action@05fe4576374b728f0c523d6a13d64c25081e0803 # v4
5757
with:
5858
fail-on-severity: high

.github/workflows/release.yml

Lines changed: 22 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,9 @@ jobs:
1818
name: Run All Tests
1919
runs-on: ubuntu-latest
2020
steps:
21-
- uses: actions/checkout@v4
21+
- uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
2222

23-
- uses: actions/setup-dotnet@v4
23+
- uses: actions/setup-dotnet@67a3573c9a986a3f9c594539f4ab511d57bb3ce9 # v4
2424
with:
2525
dotnet-version: '10.0.x'
2626

@@ -50,22 +50,22 @@ jobs:
5050
image-tags: ${{ steps.meta.outputs.tags }}
5151

5252
steps:
53-
- uses: actions/checkout@v4
53+
- uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
5454

5555
- name: Extract version from tag
5656
id: version
5757
run: echo "VERSION=${GITHUB_REF_NAME#v}" >> "$GITHUB_OUTPUT"
5858

5959
- name: Log in to GitHub Container Registry
60-
uses: docker/login-action@v3
60+
uses: docker/login-action@c94ce9fb468520275223c153574b00df6fe4bcc9 # v3
6161
with:
6262
registry: ${{ env.REGISTRY }}
6363
username: ${{ github.actor }}
6464
password: ${{ secrets.GITHUB_TOKEN }}
6565

6666
- name: Docker metadata
6767
id: meta
68-
uses: docker/metadata-action@v5
68+
uses: docker/metadata-action@c299e40c65443455700f0fdfc63efafe5b349051 # v5
6969
with:
7070
images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
7171
tags: |
@@ -75,11 +75,11 @@ jobs:
7575
type=sha,prefix=sha-
7676
7777
- name: Set up Docker Buildx
78-
uses: docker/setup-buildx-action@v3
78+
uses: docker/setup-buildx-action@8d2750c68a42422c14e847fe6c8ac0403b4cbd6f # v3
7979

8080
- name: Build and push
8181
id: build
82-
uses: docker/build-push-action@v6
82+
uses: docker/build-push-action@10e90e3645eae34f1e60eeb005ba3a3d33f178e8 # v6
8383
with:
8484
context: .
8585
push: true
@@ -101,18 +101,18 @@ jobs:
101101
packages: write
102102

103103
steps:
104-
- uses: actions/checkout@v4
104+
- uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
105105

106106
- name: Log in to GitHub Container Registry
107-
uses: docker/login-action@v3
107+
uses: docker/login-action@c94ce9fb468520275223c153574b00df6fe4bcc9 # v3
108108
with:
109109
registry: ${{ env.REGISTRY }}
110110
username: ${{ github.actor }}
111111
password: ${{ secrets.GITHUB_TOKEN }}
112112

113113
- name: Docker metadata
114114
id: meta
115-
uses: docker/metadata-action@v5
115+
uses: docker/metadata-action@c299e40c65443455700f0fdfc63efafe5b349051 # v5
116116
with:
117117
images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}-fake
118118
tags: |
@@ -122,10 +122,10 @@ jobs:
122122
type=sha,prefix=sha-
123123
124124
- name: Set up Docker Buildx
125-
uses: docker/setup-buildx-action@v3
125+
uses: docker/setup-buildx-action@8d2750c68a42422c14e847fe6c8ac0403b4cbd6f # v3
126126

127127
- name: Build and push
128-
uses: docker/build-push-action@v6
128+
uses: docker/build-push-action@10e90e3645eae34f1e60eeb005ba3a3d33f178e8 # v6
129129
with:
130130
context: fake/ServiceTemplate.Fake
131131
file: fake/ServiceTemplate.Fake/Dockerfile
@@ -145,10 +145,10 @@ jobs:
145145
packages: write
146146

147147
steps:
148-
- uses: actions/checkout@v4
148+
- uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
149149

150150
- name: Install Helm
151-
uses: azure/setup-helm@v4
151+
uses: azure/setup-helm@1a275c3b69536ee54be43f2070a358922e12c8d4 # v4
152152

153153
- name: Extract version from tag
154154
id: version
@@ -190,20 +190,12 @@ jobs:
190190
contents: write
191191

192192
steps:
193-
- uses: actions/checkout@v4
194-
with:
195-
fetch-depth: 0
193+
- uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
196194

197-
- name: Create Release
198-
uses: softprops/action-gh-release@v2
199-
with:
200-
generate_release_notes: true
201-
body: |
202-
## Docker Image
203-
```
204-
docker pull ${{ needs.docker.outputs.image-tags }}
205-
```
206-
## Helm Chart
207-
```sh
208-
helm install my-release oci://ghcr.io/${{ github.repository_owner }}/helm-charts/chart
209-
```
195+
- name: Create GitHub Release
196+
env:
197+
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
198+
run: |
199+
gh release create "${{ github.ref_name }}" \
200+
--generate-notes \
201+
--title "${{ github.ref_name }}"

0 commit comments

Comments
 (0)