Compare commits
10 Commits
54fd0bdcb3
...
1.0.0
| Author | SHA1 | Date | |
|---|---|---|---|
| 578c6ec842 | |||
| 1c2bf80d7d | |||
| 019ba7fe1f | |||
|
|
c22a2877d5 | ||
|
|
43cde0eefd | ||
| b1c6b93d8e | |||
| 1875792ebe | |||
| 7bbaa1d08a | |||
|
|
43a0cbac70 | ||
|
|
fb866af4e5 |
@@ -10,17 +10,7 @@ jobs:
|
|||||||
check:
|
check:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
|
- uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4, 2024-10-13
|
||||||
|
|
||||||
- uses: actions/setup-go@40f1582b2485089dde7abd97c1529aa768e1baff # v5
|
- name: Build (runs make check inside Dockerfile)
|
||||||
with:
|
run: docker build .
|
||||||
go-version-file: go.mod
|
|
||||||
|
|
||||||
- name: Install golangci-lint
|
|
||||||
run: go install github.com/golangci/golangci-lint/v2/cmd/golangci-lint@5d1e709b7be35cb2025444e19de266b056b7b7ee # v2.10.1
|
|
||||||
|
|
||||||
- name: Install goimports
|
|
||||||
run: go install golang.org/x/tools/cmd/goimports@009367f5c17a8d4c45a961a3a509277190a9a6f0 # v0.42.0
|
|
||||||
|
|
||||||
- name: Run make check
|
|
||||||
run: make check
|
|
||||||
|
|||||||
16
Dockerfile
16
Dockerfile
@@ -4,8 +4,20 @@ FROM golang@sha256:f6751d823c26342f9506c03797d2527668d095b0a15f1862cddb4d927a7a4
|
|||||||
|
|
||||||
RUN apk add --no-cache git make gcc musl-dev
|
RUN apk add --no-cache git make gcc musl-dev
|
||||||
|
|
||||||
# Install golangci-lint v2
|
# Install golangci-lint v2 (pre-built binary — go install fails in alpine due to missing linker)
|
||||||
RUN go install github.com/golangci/golangci-lint/v2/cmd/golangci-lint@5d1e709b7be35cb2025444e19de266b056b7b7ee # v2.10.1
|
RUN set -e; \
|
||||||
|
GOLANGCI_VERSION="2.10.1"; \
|
||||||
|
case "$(uname -m)" in \
|
||||||
|
x86_64) ARCH="amd64"; SHA256="dfa775874cf0561b404a02a8f4481fc69b28091da95aa697259820d429b09c99" ;; \
|
||||||
|
aarch64) ARCH="arm64"; SHA256="6652b42ae02915eb2f9cb2a2e0cac99514c8eded8388d88ae3e06e1a52c00de8" ;; \
|
||||||
|
*) echo "unsupported arch: $(uname -m)" >&2; exit 1 ;; \
|
||||||
|
esac; \
|
||||||
|
wget -q -O /tmp/golangci-lint.tar.gz \
|
||||||
|
"https://github.com/golangci/golangci-lint/releases/download/v${GOLANGCI_VERSION}/golangci-lint-${GOLANGCI_VERSION}-linux-${ARCH}.tar.gz"; \
|
||||||
|
echo "${SHA256} /tmp/golangci-lint.tar.gz" | sha256sum -c -; \
|
||||||
|
tar -xzf /tmp/golangci-lint.tar.gz -C /usr/local/bin --strip-components=1 "golangci-lint-${GOLANGCI_VERSION}-linux-${ARCH}/golangci-lint"; \
|
||||||
|
rm /tmp/golangci-lint.tar.gz; \
|
||||||
|
golangci-lint version
|
||||||
RUN go install golang.org/x/tools/cmd/goimports@009367f5c17a8d4c45a961a3a509277190a9a6f0 # v0.42.0
|
RUN go install golang.org/x/tools/cmd/goimports@009367f5c17a8d4c45a961a3a509277190a9a6f0 # v0.42.0
|
||||||
|
|
||||||
WORKDIR /src
|
WORKDIR /src
|
||||||
|
|||||||
2
go.mod
2
go.mod
@@ -19,6 +19,7 @@ require (
|
|||||||
github.com/stretchr/testify v1.11.1
|
github.com/stretchr/testify v1.11.1
|
||||||
go.uber.org/fx v1.24.0
|
go.uber.org/fx v1.24.0
|
||||||
golang.org/x/crypto v0.46.0
|
golang.org/x/crypto v0.46.0
|
||||||
|
golang.org/x/time v0.12.0
|
||||||
)
|
)
|
||||||
|
|
||||||
require (
|
require (
|
||||||
@@ -74,7 +75,6 @@ require (
|
|||||||
go.yaml.in/yaml/v3 v3.0.4 // indirect
|
go.yaml.in/yaml/v3 v3.0.4 // indirect
|
||||||
golang.org/x/sys v0.39.0 // indirect
|
golang.org/x/sys v0.39.0 // indirect
|
||||||
golang.org/x/text v0.32.0 // indirect
|
golang.org/x/text v0.32.0 // indirect
|
||||||
golang.org/x/time v0.12.0 // indirect
|
|
||||||
google.golang.org/protobuf v1.36.10 // indirect
|
google.golang.org/protobuf v1.36.10 // indirect
|
||||||
gopkg.in/yaml.v3 v3.0.1 // indirect
|
gopkg.in/yaml.v3 v3.0.1 // indirect
|
||||||
gotest.tools/v3 v3.5.2 // indirect
|
gotest.tools/v3 v3.5.2 // indirect
|
||||||
|
|||||||
@@ -404,6 +404,25 @@ func TestHandleDashboard(t *testing.T) {
|
|||||||
assert.Equal(t, http.StatusOK, recorder.Code)
|
assert.Equal(t, http.StatusOK, recorder.Code)
|
||||||
assert.Contains(t, recorder.Body.String(), "Applications")
|
assert.Contains(t, recorder.Body.String(), "Applications")
|
||||||
})
|
})
|
||||||
|
|
||||||
|
t.Run("renders dashboard with apps without crashing on CSRFField", func(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
|
|
||||||
|
testCtx := setupTestHandlers(t)
|
||||||
|
|
||||||
|
// Create an app so the template iterates over AppStats and hits .CSRFField
|
||||||
|
createTestApp(t, testCtx, "csrf-test-app")
|
||||||
|
|
||||||
|
request := httptest.NewRequest(http.MethodGet, "/", nil)
|
||||||
|
recorder := httptest.NewRecorder()
|
||||||
|
|
||||||
|
handler := testCtx.handlers.HandleDashboard()
|
||||||
|
handler.ServeHTTP(recorder, request)
|
||||||
|
|
||||||
|
assert.Equal(t, http.StatusOK, recorder.Code,
|
||||||
|
"dashboard should not 500 when apps exist (CSRFField must be accessible)")
|
||||||
|
assert.Contains(t, recorder.Body.String(), "csrf-test-app")
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestHandleAppNew(t *testing.T) {
|
func TestHandleAppNew(t *testing.T) {
|
||||||
|
|||||||
@@ -69,7 +69,7 @@
|
|||||||
<a href="/apps/{{.App.ID}}" class="btn-text text-sm py-1 px-2">View</a>
|
<a href="/apps/{{.App.ID}}" class="btn-text text-sm py-1 px-2">View</a>
|
||||||
<a href="/apps/{{.App.ID}}/edit" class="btn-secondary text-sm py-1 px-2">Edit</a>
|
<a href="/apps/{{.App.ID}}/edit" class="btn-secondary text-sm py-1 px-2">Edit</a>
|
||||||
<form method="POST" action="/apps/{{.App.ID}}/deploy" class="inline">
|
<form method="POST" action="/apps/{{.App.ID}}/deploy" class="inline">
|
||||||
{{ .CSRFField }}
|
{{ $.CSRFField }}
|
||||||
<button type="submit" class="btn-success text-sm py-1 px-2">Deploy</button>
|
<button type="submit" class="btn-success text-sm py-1 px-2">Deploy</button>
|
||||||
</form>
|
</form>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
Reference in New Issue
Block a user