Skip to content

Commit 6b14459

Browse files
authored
feat: add action and on_stop support to environment (#58)
* feat: add action and on_stop support to environment * fix: linter warnings
1 parent c0eecdc commit 6b14459

14 files changed

Lines changed: 375 additions & 74 deletions

File tree

.github/workflows/build.yml

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,11 @@ env:
99
GOFLAGS: -trimpath
1010
jobs:
1111
lint-go:
12+
runs-on: ubuntu-latest
1213
if: ${{ github.event.pull_request.number }}
1314
continue-on-error: true
1415
container:
15-
image: golangci/golangci-lint:v2.11.3-alpine
16+
image: golangci/golangci-lint:v2.11.4-alpine
1617
options: --entrypoint ""
1718
steps:
1819
- uses: actions/checkout@v6
@@ -23,8 +24,8 @@ jobs:
2324
path: /go/pkg/mod
2425
- name: Run
2526
run: golangci-lint run --timeout 5m ./...
26-
runs-on: ubuntu-latest
2727
vulncheck:
28+
if: ${{ github.event.pull_request.number }}
2829
continue-on-error: true
2930
container:
3031
image: golang:1.26
@@ -42,7 +43,6 @@ jobs:
4243
go install golang.org/x/vuln/cmd/govulncheck@latest
4344
./scripts/govulncheck.sh
4445
runs-on: ubuntu-latest
45-
if: ${{ github.event.pull_request.number }}
4646
unit-tests:
4747
runs-on: ubuntu-latest
4848
needs:
@@ -90,7 +90,6 @@ jobs:
9090
name: Set outputs
9191
run: cat version.env >> $GITHUB_OUTPUT
9292
build-binary:
93-
runs-on: ubuntu-latest
9493
needs:
9594
- gen-version
9695
container:

.github/workflows/release-please.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ on:
66
- main
77
jobs:
88
release-please:
9+
runs-on: ubuntu-latest
910
env:
1011
RELEASE_PAT: ${{ secrets.RELEASE_PAT }}
1112
container:
@@ -16,4 +17,3 @@ jobs:
1617
run: |-
1718
npx release-please release-pr --repo-url=${{ github.server_url }}/${{ github.repository }} --token=$RELEASE_PAT --release-type=go --pull-request-header=":robot: new release" --pull-request-footer=" "
1819
npx release-please github-release --repo-url=${{ github.server_url }}/${{ github.repository }} --token=$RELEASE_PAT --release-type=go
19-
runs-on: ubuntu-latest

.github/workflows/release.yml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,9 @@ on:
66
- v*
77
jobs:
88
goreleaser:
9+
runs-on: ubuntu-latest
10+
env:
11+
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
912
container:
1013
image: goreleaser/goreleaser:v2.15.4
1114
steps:
@@ -16,6 +19,3 @@ jobs:
1619
run: git config --global --add safe.directory ${GITHUB_WORKSPACE}
1720
- name: Run
1821
run: goreleaser release --clean
19-
runs-on: ubuntu-latest
20-
env:
21-
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

go.mod

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@ go 1.26.1
44

55
require (
66
charm.land/bubbles/v2 v2.1.0
7-
charm.land/bubbletea/v2 v2.0.6
8-
charm.land/lipgloss/v2 v2.0.3
7+
charm.land/bubbletea/v2 v2.0.2
8+
charm.land/lipgloss/v2 v2.0.2
99
github.com/docker/docker v28.5.2+incompatible
1010
github.com/santhosh-tekuri/jsonschema/v6 v6.0.2
1111
github.com/spf13/cobra v1.10.2
@@ -16,8 +16,8 @@ require (
1616
github.com/Microsoft/go-winio v0.6.2 // indirect
1717
github.com/cespare/xxhash/v2 v2.3.0 // indirect
1818
github.com/charmbracelet/colorprofile v0.4.3 // indirect
19-
github.com/charmbracelet/ultraviolet v0.0.0-20260422141423-a0f1f21775f7 // indirect
20-
github.com/charmbracelet/x/ansi v0.11.7 // indirect
19+
github.com/charmbracelet/ultraviolet v0.0.0-20260330092749-0f94982c930b // indirect
20+
github.com/charmbracelet/x/ansi v0.11.6 // indirect
2121
github.com/charmbracelet/x/term v0.2.2 // indirect
2222
github.com/charmbracelet/x/termios v0.1.1 // indirect
2323
github.com/charmbracelet/x/windows v0.2.2 // indirect
@@ -27,14 +27,14 @@ require (
2727
github.com/containerd/errdefs/pkg v0.3.0 // indirect
2828
github.com/containerd/log v0.1.0 // indirect
2929
github.com/distribution/reference v0.6.0 // indirect
30-
github.com/docker/go-connections v0.7.0 // indirect
30+
github.com/docker/go-connections v0.6.0 // indirect
3131
github.com/docker/go-units v0.5.0 // indirect
3232
github.com/felixge/httpsnoop v1.0.4 // indirect
3333
github.com/go-logr/logr v1.4.3 // indirect
3434
github.com/go-logr/stdr v1.2.2 // indirect
3535
github.com/inconshreveable/mousetrap v1.1.0 // indirect
3636
github.com/lucasb-eyer/go-colorful v1.4.0 // indirect
37-
github.com/mattn/go-runewidth v0.0.23 // indirect
37+
github.com/mattn/go-runewidth v0.0.21 // indirect
3838
github.com/moby/docker-image-spec v1.3.1 // indirect
3939
github.com/moby/sys/atomicwriter v0.1.0 // indirect
4040
github.com/moby/term v0.5.2 // indirect
@@ -47,14 +47,14 @@ require (
4747
github.com/spf13/pflag v1.0.10 // indirect
4848
github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e // indirect
4949
go.opentelemetry.io/auto/sdk v1.2.1 // indirect
50-
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.68.0 // indirect
51-
go.opentelemetry.io/otel v1.43.0 // indirect
50+
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.67.0 // indirect
51+
go.opentelemetry.io/otel v1.42.0 // indirect
5252
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.42.0 // indirect
53-
go.opentelemetry.io/otel/metric v1.43.0 // indirect
54-
go.opentelemetry.io/otel/trace v1.43.0 // indirect
53+
go.opentelemetry.io/otel/metric v1.42.0 // indirect
54+
go.opentelemetry.io/otel/trace v1.42.0 // indirect
5555
golang.org/x/sync v0.20.0 // indirect
56-
golang.org/x/sys v0.43.0 // indirect
57-
golang.org/x/text v0.36.0 // indirect
56+
golang.org/x/sys v0.42.0 // indirect
57+
golang.org/x/text v0.35.0 // indirect
5858
golang.org/x/time v0.15.0 // indirect
5959
gotest.tools/v3 v3.5.2 // indirect
6060
)

go.sum

Lines changed: 28 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
charm.land/bubbles/v2 v2.1.0 h1:YSnNh5cPYlYjPxRrzs5VEn3vwhtEn3jVGRBT3M7/I0g=
22
charm.land/bubbles/v2 v2.1.0/go.mod h1:l97h4hym2hvWBVfmJDtrEHHCtkIKeTEb3TTJ4ZOB3wY=
3-
charm.land/bubbletea/v2 v2.0.6 h1:UHN/91OyuhaOFGSrBXQ/hMZD8IO1Uc4BvHlgHXL2WJo=
4-
charm.land/bubbletea/v2 v2.0.6/go.mod h1:MH/D8ZLlN3op37vQvijKuU29g3rqTp+aQapURFonF9g=
5-
charm.land/lipgloss/v2 v2.0.3 h1:yM2zJ4Cf5Y51b7RHIwioil4ApI/aypFXXVHSwlM6RzU=
6-
charm.land/lipgloss/v2 v2.0.3/go.mod h1:7myLU9iG/3xluAWzpY/fSxYYHCgoKTie7laxk6ATwXA=
3+
charm.land/bubbletea/v2 v2.0.2 h1:4CRtRnuZOdFDTWSff9r8QFt/9+z6Emubz3aDMnf/dx0=
4+
charm.land/bubbletea/v2 v2.0.2/go.mod h1:3LRff2U4WIYXy7MTxfbAQ+AdfM3D8Xuvz2wbsOD9OHQ=
5+
charm.land/lipgloss/v2 v2.0.2 h1:xFolbF8JdpNkM2cEPTfXEcW1p6NRzOWTSamRfYEw8cs=
6+
charm.land/lipgloss/v2 v2.0.2/go.mod h1:KjPle2Qd3YmvP1KL5OMHiHysGcNwq6u83MUjYkFvEkM=
77
github.com/Azure/go-ansiterm v0.0.0-20250102033503-faa5f7b0171c h1:udKWzYgxTojEKWjV8V+WSxDXJ4NFATAsZjh8iIbsQIg=
88
github.com/Azure/go-ansiterm v0.0.0-20250102033503-faa5f7b0171c/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E=
99
github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY=
@@ -16,10 +16,10 @@ github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UF
1616
github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
1717
github.com/charmbracelet/colorprofile v0.4.3 h1:QPa1IWkYI+AOB+fE+mg/5/4HRMZcaXex9t5KX76i20Q=
1818
github.com/charmbracelet/colorprofile v0.4.3/go.mod h1:/zT4BhpD5aGFpqQQqw7a+VtHCzu+zrQtt1zhMt9mR4Q=
19-
github.com/charmbracelet/ultraviolet v0.0.0-20260422141423-a0f1f21775f7 h1:PeRlqWGEoO0apcS62iEgxQhVnFCTOYyQvi2sUTdf6IE=
20-
github.com/charmbracelet/ultraviolet v0.0.0-20260422141423-a0f1f21775f7/go.mod h1:3YdTxlnV/L0bQ3VN8WOSw8doF7LZV/xawUQ4MuAPDvo=
21-
github.com/charmbracelet/x/ansi v0.11.7 h1:kzv1kJvjg2S3r9KHo8hDdHFQLEqn4RBCb39dAYC84jI=
22-
github.com/charmbracelet/x/ansi v0.11.7/go.mod h1:9qGpnAVYz+8ACONkZBUWPtL7lulP9No6p1epAihUZwQ=
19+
github.com/charmbracelet/ultraviolet v0.0.0-20260330092749-0f94982c930b h1:ASDO9RT6SNKTQN87jO2bRfxHFJq8cgeYdFzivY2gCeM=
20+
github.com/charmbracelet/ultraviolet v0.0.0-20260330092749-0f94982c930b/go.mod h1:Vo8TffMf0q7Uho/n8e6XpBZvOWtd3g39yX+9P5rRutA=
21+
github.com/charmbracelet/x/ansi v0.11.6 h1:GhV21SiDz/45W9AnV2R61xZMRri5NlLnl6CVF7ihZW8=
22+
github.com/charmbracelet/x/ansi v0.11.6/go.mod h1:2JNYLgQUsyqaiLovhU2Rv/pb8r6ydXKS3NIttu3VGZQ=
2323
github.com/charmbracelet/x/exp/golden v0.0.0-20250806222409-83e3a29d542f h1:pk6gmGpCE7F3FcjaOEKYriCvpmIN4+6OS/RD0vm4uIA=
2424
github.com/charmbracelet/x/exp/golden v0.0.0-20250806222409-83e3a29d542f/go.mod h1:IfZAMTHB6XkZSeXUqriemErjAWCCzT0LwjKFYCZyw0I=
2525
github.com/charmbracelet/x/term v0.2.2 h1:xVRT/S2ZcKdhhOuSP4t5cLi5o+JxklsoEObBSgfgZRk=
@@ -47,8 +47,8 @@ github.com/dlclark/regexp2 v1.11.0 h1:G/nrcoOa7ZXlpoa/91N3X7mM3r8eIlMBBJZvsz/mxK
4747
github.com/dlclark/regexp2 v1.11.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8=
4848
github.com/docker/docker v28.5.2+incompatible h1:DBX0Y0zAjZbSrm1uzOkdr1onVghKaftjlSWt4AFexzM=
4949
github.com/docker/docker v28.5.2+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk=
50-
github.com/docker/go-connections v0.7.0 h1:6SsRfJddP22WMrCkj19x9WKjEDTB+ahsdiGYf0mN39c=
51-
github.com/docker/go-connections v0.7.0/go.mod h1:no1qkHdjq7kLMGUXYAduOhYPSJxxvgWBh7ogVvptn3Q=
50+
github.com/docker/go-connections v0.6.0 h1:LlMG9azAe1TqfR7sO+NJttz1gy6KO7VJBh+pMmjSD94=
51+
github.com/docker/go-connections v0.6.0/go.mod h1:AahvXYshr6JgfUJGdDCs2b5EZG/vmaMAntpSFH5BFKE=
5252
github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4=
5353
github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk=
5454
github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg=
@@ -72,8 +72,8 @@ github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
7272
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
7373
github.com/lucasb-eyer/go-colorful v1.4.0 h1:UtrWVfLdarDgc44HcS7pYloGHJUjHV/4FwW4TvVgFr4=
7474
github.com/lucasb-eyer/go-colorful v1.4.0/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0=
75-
github.com/mattn/go-runewidth v0.0.23 h1:7ykA0T0jkPpzSvMS5i9uoNn2Xy3R383f9HDx3RybWcw=
76-
github.com/mattn/go-runewidth v0.0.23/go.mod h1:XBkDxAl56ILZc9knddidhrOlY5R/pDhgLpndooCuJAs=
75+
github.com/mattn/go-runewidth v0.0.21 h1:jJKAZiQH+2mIinzCJIaIG9Be1+0NR+5sz/lYEEjdM8w=
76+
github.com/mattn/go-runewidth v0.0.21/go.mod h1:XBkDxAl56ILZc9knddidhrOlY5R/pDhgLpndooCuJAs=
7777
github.com/moby/docker-image-spec v1.3.1 h1:jMKff3w6PgbfSa69GfNg+zN/XLhfXJGnEx3Nl2EsFP0=
7878
github.com/moby/docker-image-spec v1.3.1/go.mod h1:eKmb5VW8vQEh/BAr2yvVNvuiJuY6UIocYsFu/DxxRpo=
7979
github.com/moby/sys/atomicwriter v0.1.0 h1:kw5D/EqkBwsBFi0ss9v1VG3wIkVhzGvLklJ+w3A14Sw=
@@ -114,22 +114,22 @@ github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e h1:JVG44RsyaB9T2KIHavM
114114
github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e/go.mod h1:RbqR21r5mrJuqunuUZ/Dhy/avygyECGrLceyNeo4LiM=
115115
go.opentelemetry.io/auto/sdk v1.2.1 h1:jXsnJ4Lmnqd11kwkBV2LgLoFMZKizbCi5fNZ/ipaZ64=
116116
go.opentelemetry.io/auto/sdk v1.2.1/go.mod h1:KRTj+aOaElaLi+wW1kO/DZRXwkF4C5xPbEe3ZiIhN7Y=
117-
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.68.0 h1:CqXxU8VOmDefoh0+ztfGaymYbhdB/tT3zs79QaZTNGY=
118-
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.68.0/go.mod h1:BuhAPThV8PBHBvg8ZzZ/Ok3idOdhWIodywz2xEcRbJo=
119-
go.opentelemetry.io/otel v1.43.0 h1:mYIM03dnh5zfN7HautFE4ieIig9amkNANT+xcVxAj9I=
120-
go.opentelemetry.io/otel v1.43.0/go.mod h1:JuG+u74mvjvcm8vj8pI5XiHy1zDeoCS2LB1spIq7Ay0=
117+
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.67.0 h1:OyrsyzuttWTSur2qN/Lm0m2a8yqyIjUVBZcxFPuXq2o=
118+
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.67.0/go.mod h1:C2NGBr+kAB4bk3xtMXfZ94gqFDtg/GkI7e9zqGh5Beg=
119+
go.opentelemetry.io/otel v1.42.0 h1:lSQGzTgVR3+sgJDAU/7/ZMjN9Z+vUip7leaqBKy4sho=
120+
go.opentelemetry.io/otel v1.42.0/go.mod h1:lJNsdRMxCUIWuMlVJWzecSMuNjE7dOYyWlqOXWkdqCc=
121121
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.42.0 h1:THuZiwpQZuHPul65w4WcwEnkX2QIuMT+UFoOrygtoJw=
122122
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.42.0/go.mod h1:J2pvYM5NGHofZ2/Ru6zw/TNWnEQp5crgyDeSrYpXkAw=
123123
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.42.0 h1:uLXP+3mghfMf7XmV4PkGfFhFKuNWoCvvx5wP/wOXo0o=
124124
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.42.0/go.mod h1:v0Tj04armyT59mnURNUJf7RCKcKzq+lgJs6QSjHjaTc=
125-
go.opentelemetry.io/otel/metric v1.43.0 h1:d7638QeInOnuwOONPp4JAOGfbCEpYb+K6DVWvdxGzgM=
126-
go.opentelemetry.io/otel/metric v1.43.0/go.mod h1:RDnPtIxvqlgO8GRW18W6Z/4P462ldprJtfxHxyKd2PY=
127-
go.opentelemetry.io/otel/sdk v1.43.0 h1:pi5mE86i5rTeLXqoF/hhiBtUNcrAGHLKQdhg4h4V9Dg=
128-
go.opentelemetry.io/otel/sdk v1.43.0/go.mod h1:P+IkVU3iWukmiit/Yf9AWvpyRDlUeBaRg6Y+C58QHzg=
129-
go.opentelemetry.io/otel/sdk/metric v1.43.0 h1:S88dyqXjJkuBNLeMcVPRFXpRw2fuwdvfCGLEo89fDkw=
130-
go.opentelemetry.io/otel/sdk/metric v1.43.0/go.mod h1:C/RJtwSEJ5hzTiUz5pXF1kILHStzb9zFlIEe85bhj6A=
131-
go.opentelemetry.io/otel/trace v1.43.0 h1:BkNrHpup+4k4w+ZZ86CZoHHEkohws8AY+WTX09nk+3A=
132-
go.opentelemetry.io/otel/trace v1.43.0/go.mod h1:/QJhyVBUUswCphDVxq+8mld+AvhXZLhe+8WVFxiFff0=
125+
go.opentelemetry.io/otel/metric v1.42.0 h1:2jXG+3oZLNXEPfNmnpxKDeZsFI5o4J+nz6xUlaFdF/4=
126+
go.opentelemetry.io/otel/metric v1.42.0/go.mod h1:RlUN/7vTU7Ao/diDkEpQpnz3/92J9ko05BIwxYa2SSI=
127+
go.opentelemetry.io/otel/sdk v1.42.0 h1:LyC8+jqk6UJwdrI/8VydAq/hvkFKNHZVIWuslJXYsDo=
128+
go.opentelemetry.io/otel/sdk v1.42.0/go.mod h1:rGHCAxd9DAph0joO4W6OPwxjNTYWghRWmkHuGbayMts=
129+
go.opentelemetry.io/otel/sdk/metric v1.42.0 h1:D/1QR46Clz6ajyZ3G8SgNlTJKBdGp84q9RKCAZ3YGuA=
130+
go.opentelemetry.io/otel/sdk/metric v1.42.0/go.mod h1:Ua6AAlDKdZ7tdvaQKfSmnFTdHx37+J4ba8MwVCYM5hc=
131+
go.opentelemetry.io/otel/trace v1.42.0 h1:OUCgIPt+mzOnaUTpOQcBiM/PLQ/Op7oq6g4LenLmOYY=
132+
go.opentelemetry.io/otel/trace v1.42.0/go.mod h1:f3K9S+IFqnumBkKhRJMeaZeNk9epyhnCmQh/EysQCdc=
133133
go.opentelemetry.io/proto/otlp v1.9.0 h1:l706jCMITVouPOqEnii2fIAuO3IVGBRPV5ICjceRb/A=
134134
go.opentelemetry.io/proto/otlp v1.9.0/go.mod h1:xE+Cx5E/eEHw+ISFkwPLwCZefwVjY+pqKg1qcK03+/4=
135135
go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg=
@@ -139,10 +139,10 @@ golang.org/x/net v0.51.0 h1:94R/GTO7mt3/4wIKpcR5gkGmRLOuE/2hNGeWq/GBIFo=
139139
golang.org/x/net v0.51.0/go.mod h1:aamm+2QF5ogm02fjy5Bb7CQ0WMt1/WVM7FtyaTLlA9Y=
140140
golang.org/x/sync v0.20.0 h1:e0PTpb7pjO8GAtTs2dQ6jYa5BWYlMuX047Dco/pItO4=
141141
golang.org/x/sync v0.20.0/go.mod h1:9xrNwdLfx4jkKbNva9FpL6vEN7evnE43NNNJQ2LF3+0=
142-
golang.org/x/sys v0.43.0 h1:Rlag2XtaFTxp19wS8MXlJwTvoh8ArU6ezoyFsMyCTNI=
143-
golang.org/x/sys v0.43.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw=
144-
golang.org/x/text v0.36.0 h1:JfKh3XmcRPqZPKevfXVpI1wXPTqbkE5f7JA92a55Yxg=
145-
golang.org/x/text v0.36.0/go.mod h1:NIdBknypM8iqVmPiuco0Dh6P5Jcdk8lJL0CUebqK164=
142+
golang.org/x/sys v0.42.0 h1:omrd2nAlyT5ESRdCLYdm3+fMfNFE/+Rf4bDIQImRJeo=
143+
golang.org/x/sys v0.42.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw=
144+
golang.org/x/text v0.35.0 h1:JOVx6vVDFokkpaq1AEptVzLTpDe9KGpj5tR4/X+ybL8=
145+
golang.org/x/text v0.35.0/go.mod h1:khi/HExzZJ2pGnjenulevKNX1W67CUy0AsXcNubPGCA=
146146
golang.org/x/time v0.15.0 h1:bbrp8t3bGUeFOx08pvsMYRTCVSMk89u4tKbNOZbp88U=
147147
golang.org/x/time v0.15.0/go.mod h1:Y4YMaQmXwGQZoFaVFk4YpCt4FLQMYKZe9oeV/f4MSno=
148148
google.golang.org/genproto/googleapis/api v0.0.0-20260209200024-4cfbd4190f57 h1:JLQynH/LBHfCTSbDWl+py8C+Rg/k1OVH3xfcaiANuF0=

pkg/importer/gitlab/codegen.go

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -216,7 +216,23 @@ func emitJobFields(b *strings.Builder, job *pisyn.IRJob) {
216216
}
217217

218218
if job.Environment != nil {
219-
w(".\n\t\tSetEnvironment(%q, %q)", job.Environment.Name, job.Environment.URL)
219+
if job.Environment.Action == "stop" && job.Environment.URL == "" && job.Environment.OnStop == "" {
220+
w(".\n\t\tSetEnvironmentStop(%q)", job.Environment.Name)
221+
} else if job.Environment.Action != "" || job.Environment.OnStop != "" {
222+
w(".\n\t\tSetEnvironmentOpts(ps.Environment{Name: %q", job.Environment.Name)
223+
if job.Environment.URL != "" {
224+
w(", URL: %q", job.Environment.URL)
225+
}
226+
if job.Environment.Action != "" {
227+
w(", Action: %q", job.Environment.Action)
228+
}
229+
if job.Environment.OnStop != "" {
230+
w(", OnStop: %q", job.Environment.OnStop)
231+
}
232+
w("})")
233+
} else {
234+
w(".\n\t\tSetEnvironment(%q, %q)", job.Environment.Name, job.Environment.URL)
235+
}
220236
}
221237

222238
for _, r := range job.Rules {

pkg/importer/gitlab/codegen_test.go

Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -378,6 +378,111 @@ test-job:
378378
t.Error("test-job not found")
379379
}
380380

381+
func TestParse_EnvironmentActionOnStop(t *testing.T) {
382+
yml := []byte(`
383+
stages:
384+
- deploy
385+
deploy-review:
386+
stage: deploy
387+
script:
388+
- echo deploy
389+
environment:
390+
name: review/$CI_COMMIT_REF_SLUG
391+
url: https://review.example.com
392+
on_stop: stop-review
393+
stop-review:
394+
stage: deploy
395+
script:
396+
- echo stop
397+
environment:
398+
name: review/$CI_COMMIT_REF_SLUG
399+
action: stop
400+
when: manual
401+
`)
402+
r, err := Parse(yml)
403+
if err != nil {
404+
t.Fatalf("parse: %v", err)
405+
}
406+
var deployJob, stopJob *pisyn.IRJob
407+
for _, stage := range r.Pipeline.Stages {
408+
for i := range stage.Jobs {
409+
switch stage.Jobs[i].Name {
410+
case "deploy-review":
411+
deployJob = &stage.Jobs[i]
412+
case "stop-review":
413+
stopJob = &stage.Jobs[i]
414+
}
415+
}
416+
}
417+
if deployJob == nil {
418+
t.Fatal("deploy-review job not found")
419+
}
420+
if deployJob.Environment == nil {
421+
t.Fatal("deploy-review environment should not be nil")
422+
}
423+
if deployJob.Environment.OnStop != "stop-review" {
424+
t.Errorf("deploy-review on_stop = %q, want stop-review", deployJob.Environment.OnStop)
425+
}
426+
if deployJob.Environment.URL != "https://review.example.com" {
427+
t.Errorf("deploy-review url = %q", deployJob.Environment.URL)
428+
}
429+
430+
if stopJob == nil {
431+
t.Fatal("stop-review job not found")
432+
}
433+
if stopJob.Environment == nil {
434+
t.Fatal("stop-review environment should not be nil")
435+
}
436+
if stopJob.Environment.Action != "stop" {
437+
t.Errorf("stop-review action = %q, want stop", stopJob.Environment.Action)
438+
}
439+
if stopJob.Environment.Name != "review/$CI_COMMIT_REF_SLUG" {
440+
t.Errorf("stop-review name = %q", stopJob.Environment.Name)
441+
}
442+
}
443+
444+
func TestGenerateGo_EnvironmentOnStop(t *testing.T) {
445+
r := &ParseResult{Pipeline: &pisyn.IRPipeline{
446+
Name: "CI",
447+
Stages: []pisyn.IRStage{{
448+
Name: "deploy",
449+
Jobs: []pisyn.IRJob{
450+
{
451+
Name: "deploy-review",
452+
Image: "alpine",
453+
Environment: &pisyn.Environment{
454+
Name: "review",
455+
URL: "https://review.example.com",
456+
OnStop: "stop-review",
457+
},
458+
Actions: []pisyn.Action{{Script: strPtr("echo deploy")}},
459+
},
460+
{
461+
Name: "stop-review",
462+
Image: "alpine",
463+
Environment: &pisyn.Environment{
464+
Name: "review",
465+
Action: "stop",
466+
},
467+
Actions: []pisyn.Action{{Script: strPtr("echo stop")}},
468+
},
469+
},
470+
}},
471+
}}
472+
473+
got := GenerateGo(r)
474+
475+
if !strings.Contains(got, `SetEnvironmentStop("review")`) {
476+
t.Errorf("expected SetEnvironmentStop for stop job:\n%s", got)
477+
}
478+
if !strings.Contains(got, `SetEnvironmentOpts(`) {
479+
t.Errorf("expected SetEnvironmentOpts for deploy job:\n%s", got)
480+
}
481+
if !strings.Contains(got, `OnStop: "stop-review"`) {
482+
t.Errorf("expected OnStop field in SetEnvironmentOpts:\n%s", got)
483+
}
484+
}
485+
381486
func TestParse_CacheKeyStringForm(t *testing.T) {
382487
yml := []byte(`
383488
stages:

pkg/importer/gitlab/gitlab.go

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -494,11 +494,13 @@ func parseEnvironment(node *yaml.Node, ir *pisyn.IRJob) {
494494
return
495495
}
496496
var env struct {
497-
Name string `yaml:"name"`
498-
URL string `yaml:"url"`
497+
Name string `yaml:"name"`
498+
URL string `yaml:"url"`
499+
Action string `yaml:"action"`
500+
OnStop string `yaml:"on_stop"`
499501
}
500502
if err := node.Decode(&env); err == nil {
501-
ir.Environment = &pisyn.Environment{Name: env.Name, URL: env.URL}
503+
ir.Environment = &pisyn.Environment{Name: env.Name, URL: env.URL, Action: env.Action, OnStop: env.OnStop}
502504
}
503505
}
504506

0 commit comments

Comments
 (0)