11import { buildSysrootStageService , isSysrootEnabled , resolveSysrootImage } from './sysroot-service' ;
2+ import { parseImageTag } from '../image-tag' ;
23import { WrapperConfig } from '../types' ;
34
45// Minimal WrapperConfig for testing
@@ -62,14 +63,25 @@ describe('resolveSysrootImage', () => {
6263 } ) ;
6364 expect ( resolveSysrootImage ( config ) ) . toBe ( 'ghcr.io/my-org/custom-sysroot:v1' ) ;
6465 } ) ;
66+
67+ it ( 'includes sha256 digest in resolved image when provided in imageTag' , ( ) => {
68+ const digest = 'sha256:' + 'f' . repeat ( 64 ) ;
69+ const config = makeConfig ( {
70+ runnerTopology : 'arc-dind' ,
71+ imageTag : `v0.28.0,build-tools=${ digest } ` ,
72+ } ) ;
73+ expect ( resolveSysrootImage ( config ) ) . toBe (
74+ `ghcr.io/github/gh-aw-firewall/build-tools:v0.28.0@${ digest } ` ,
75+ ) ;
76+ } ) ;
6577} ) ;
6678
6779describe ( 'buildSysrootStageService' , ( ) => {
6880 it ( 'generates a service with correct container name' , ( ) => {
6981 const service = buildSysrootStageService ( {
7082 config : makeConfig ( { runnerTopology : 'arc-dind' } ) ,
7183 registry : 'ghcr.io/github/gh-aw-firewall' ,
72- imageTag : 'latest' ,
84+ parsedTag : parseImageTag ( 'latest' ) ,
7385 } ) ;
7486 expect ( service . container_name ) . toBe ( 'awf-sysroot-stage' ) ;
7587 } ) ;
@@ -78,19 +90,29 @@ describe('buildSysrootStageService', () => {
7890 const service = buildSysrootStageService ( {
7991 config : makeConfig ( { runnerTopology : 'arc-dind' } ) ,
8092 registry : 'ghcr.io/github/gh-aw-firewall' ,
81- imageTag : '0.28.0' ,
93+ parsedTag : parseImageTag ( '0.28.0' ) ,
8294 } ) ;
8395 expect ( service . image ) . toBe ( 'ghcr.io/github/gh-aw-firewall/build-tools:0.28.0' ) ;
8496 } ) ;
8597
98+ it ( 'appends sha256 digest when build-tools digest is provided' , ( ) => {
99+ const digest = 'sha256:' + 'e' . repeat ( 64 ) ;
100+ const service = buildSysrootStageService ( {
101+ config : makeConfig ( { runnerTopology : 'arc-dind' } ) ,
102+ registry : 'ghcr.io/github/gh-aw-firewall' ,
103+ parsedTag : parseImageTag ( `0.28.0,build-tools=${ digest } ` ) ,
104+ } ) ;
105+ expect ( service . image ) . toBe ( `ghcr.io/github/gh-aw-firewall/build-tools:0.28.0@${ digest } ` ) ;
106+ } ) ;
107+
86108 it ( 'uses explicit sysrootImage when configured' , ( ) => {
87109 const service = buildSysrootStageService ( {
88110 config : makeConfig ( {
89111 runnerTopology : 'arc-dind' ,
90112 sysrootImage : 'ghcr.io/my-org/sysroot:v2' ,
91113 } ) ,
92114 registry : 'ghcr.io/github/gh-aw-firewall' ,
93- imageTag : 'latest' ,
115+ parsedTag : parseImageTag ( 'latest' ) ,
94116 } ) ;
95117 expect ( service . image ) . toBe ( 'ghcr.io/my-org/sysroot:v2' ) ;
96118 } ) ;
@@ -99,7 +121,7 @@ describe('buildSysrootStageService', () => {
99121 const service = buildSysrootStageService ( {
100122 config : makeConfig ( { runnerTopology : 'arc-dind' } ) ,
101123 registry : 'ghcr.io/github/gh-aw-firewall' ,
102- imageTag : 'latest' ,
124+ parsedTag : parseImageTag ( 'latest' ) ,
103125 } ) ;
104126 expect ( service . volumes ) . toEqual ( [ 'sysroot:/sysroot' ] ) ;
105127 } ) ;
@@ -108,7 +130,7 @@ describe('buildSysrootStageService', () => {
108130 const service = buildSysrootStageService ( {
109131 config : makeConfig ( { runnerTopology : 'arc-dind' } ) ,
110132 registry : 'ghcr.io/github/gh-aw-firewall' ,
111- imageTag : 'latest' ,
133+ parsedTag : parseImageTag ( 'latest' ) ,
112134 } ) ;
113135 expect ( service . entrypoint ) . toEqual ( [ '/bin/sh' , '-c' ] ) ;
114136 expect ( service . command ) . toHaveLength ( 1 ) ;
@@ -120,7 +142,7 @@ describe('buildSysrootStageService', () => {
120142 const service = buildSysrootStageService ( {
121143 config : makeConfig ( { runnerTopology : 'arc-dind' } ) ,
122144 registry : 'ghcr.io/github/gh-aw-firewall' ,
123- imageTag : 'latest' ,
145+ parsedTag : parseImageTag ( 'latest' ) ,
124146 } ) ;
125147 expect ( service . command [ 0 ] ) . toContain ( '.awf-sysroot-ready' ) ;
126148 } ) ;
@@ -129,7 +151,7 @@ describe('buildSysrootStageService', () => {
129151 const service = buildSysrootStageService ( {
130152 config : makeConfig ( { runnerTopology : 'arc-dind' } ) ,
131153 registry : 'ghcr.io/github/gh-aw-firewall' ,
132- imageTag : 'latest' ,
154+ parsedTag : parseImageTag ( 'latest' ) ,
133155 } ) ;
134156 // Docker Compose treats $var as variable interpolation; $$ escapes to literal $
135157 expect ( service . command [ 0 ] ) . toContain ( '/$$d' ) ;
@@ -140,7 +162,7 @@ describe('buildSysrootStageService', () => {
140162 const service = buildSysrootStageService ( {
141163 config : makeConfig ( { runnerTopology : 'arc-dind' } ) ,
142164 registry : 'ghcr.io/github/gh-aw-firewall' ,
143- imageTag : 'latest' ,
165+ parsedTag : parseImageTag ( 'latest' ) ,
144166 } ) ;
145167 expect ( service . network_mode ) . toBe ( 'none' ) ;
146168 } ) ;
@@ -149,7 +171,7 @@ describe('buildSysrootStageService', () => {
149171 const service = buildSysrootStageService ( {
150172 config : makeConfig ( { runnerTopology : 'arc-dind' } ) ,
151173 registry : 'ghcr.io/github/gh-aw-firewall' ,
152- imageTag : 'latest' ,
174+ parsedTag : parseImageTag ( 'latest' ) ,
153175 } ) ;
154176 expect ( service . command [ 0 ] ) . toContain ( 'if [ -d /lib64 ]; then cp -a /lib64 /sysroot/; fi;' ) ;
155177 expect ( service . command [ 0 ] ) . not . toContain ( '|| true' ) ;
0 commit comments