From a3d310667bffa56be8646fdaa21091d5b8984d97 Mon Sep 17 00:00:00 2001 From: Stavros Date: Sat, 14 Mar 2026 20:24:37 +0200 Subject: [PATCH] feat: add workflow for ci --- .github/workflows/integration.yml | 79 +++++++++++++++++++++++++++++++ .github/workflows/release.yml | 2 - Makefile | 6 +++ integration/.env | 2 +- integration/integration.go | 33 +++++++++++-- 5 files changed, 115 insertions(+), 7 deletions(-) create mode 100644 .github/workflows/integration.yml diff --git a/.github/workflows/integration.yml b/.github/workflows/integration.yml new file mode 100644 index 0000000..1893b1c --- /dev/null +++ b/.github/workflows/integration.yml @@ -0,0 +1,79 @@ +name: Proxy Integration Tests + +on: + workflow_dispatch: + inputs: + build: + type: boolean + description: Build from current tag before running tests + +jobs: + determine-tag: + runs-on: ubuntu-latest + outputs: + version: ${{ steps.metadata.outputs.VERSION }} + commit_hash: ${{ steps.metadata.outputs.COMMIT_HASH }} + build_timestamp: ${{ steps.metadata.outputs.BUILD_TIMESTAMP }} + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Determine metadata + id: metadata + run: | + # Generate static metadata + echo "COMMIT_HASH=$(git rev-parse HEAD)" >> "$GITHUB_OUTPUT" + echo "BUILD_TIMESTAMP=$(date '+%Y-%m-%dT%H:%M:%S')" >> "$GITHUB_OUTPUT" + + # Determine version + if [ "${{ inputs.build }}" == "true" ]; then + echo "VERSION=development" >> "$GITHUB_OUTPUT" + else + echo "VERSION=${{ github.ref_name }}" >> "$GITHUB_OUTPUT" + fi + + integration: + runs-on: ubuntu-latest + needs: determine-tag + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Setup Go + uses: actions/setup-go@v6 + with: + go-version: "1.25.0" + + - name: Initialize submodules + run: | + git submodule init + git submodule update + + - name: Apply patches + run: | + git apply --directory paerser/ patches/nested_maps.diff + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + if: ${{ inputs.build == 'true' }} + + - name: Build + uses: docker/build-push-action@v6 + if: ${{ inputs.build == 'true' }} + with: + platforms: linux/amd64 + tags: ghcr.io/${{ github.repository_owner }}/tinyauth:${{ needs.determine-tag.outputs.version }} + outputs: type=image,push=false + cache-from: type=gha + cache-to: type=gha,mode=max + build-args: | + VERSION=${{ needs.determine-tag.outputs.version }} + COMMIT_HASH=${{ needs.determine-tag.outputs.commit_hash }} + BUILD_TIMESTAMP=${{ needs.determine-tag.outputs.build_timestamp }} + + - name: Set tinyauth version + run: | + sed -i "s/TINYAUTH_VERSION=.*/TINYAUTH_VERSION=${{ needs.determine-tag.outputs.version }}/" integration/.env + + - name: Test + run: make integration diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 781fde1..8c51856 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -15,8 +15,6 @@ jobs: steps: - name: Checkout uses: actions/checkout@v4 - with: - ref: nightly - name: Generate metadata id: metadata diff --git a/Makefile b/Makefile index dfabc34..adb361c 100644 --- a/Makefile +++ b/Makefile @@ -81,5 +81,11 @@ sql: sqlc generate # Go gen +.PHONY: generate generate: go run ./gen + +# Proxy integration tests +.PHONY: integration +integration: + go run ./integration -- --log=false diff --git a/integration/.env b/integration/.env index 2e9d6c8..9bb069a 100644 --- a/integration/.env +++ b/integration/.env @@ -13,4 +13,4 @@ WHOAMI_HOST=whoami.127.0.0.1.sslip.io ENVOY_VERSION=v1.33-latest # Tinyauth configuration -TINYAUTH_VERSION=dev +TINYAUTH_VERSION=latest diff --git a/integration/integration.go b/integration/integration.go index 72d4419..ca62914 100644 --- a/integration/integration.go +++ b/integration/integration.go @@ -10,6 +10,7 @@ import ( "net/http" "os" "os/exec" + "path" "time" ) @@ -34,14 +35,36 @@ func main() { logFlag := flag.Bool("log", false, "enable stack logging") flag.Parse() + rootFolder, err := os.Getwd() + + if err != nil { + slog.Error("fail", "error", err) + os.Exit(1) + } + + slog.Info("root folder", "folder", rootFolder) + + integrationRoot := rootFolder + + if _, err := os.Stat(path.Join(rootFolder, ".git")); err != nil { + if !errors.Is(err, os.ErrNotExist) { + slog.Error("fail", "error", err) + os.Exit(1) + } + } else { + integrationRoot = path.Join(rootFolder, "integration") + } + + slog.Info("integration root", "folder", integrationRoot) + for _, proxy := range ProxiesToTest { slog.Info("begin", "proxy", proxy) compose := fmt.Sprintf("docker-compose.%s.yml", proxy) - if _, err := os.Stat(compose); err != nil { + if _, err := os.Stat(path.Join(integrationRoot, compose)); err != nil { slog.Error("fail", "proxy", proxy, "error", err) os.Exit(1) } - if err := createInstanceAndRunTests(compose, *logFlag, proxy); err != nil { + if err := createInstanceAndRunTests(compose, *logFlag, proxy, integrationRoot); err != nil { slog.Error("fail", "proxy", proxy, "error", err) os.Exit(1) } @@ -74,11 +97,13 @@ func runTests(client *http.Client, name string) error { return nil } -func createInstanceAndRunTests(compose string, log bool, name string) error { +func createInstanceAndRunTests(compose string, log bool, name string, integrationDir string) error { ctx, cancel := context.WithCancel(context.Background()) defer cancel() - cmdArgs := []string{"compose", "-f", compose, "--env-file", EnvFile, "up", "--build", "--force-recreate", "--remove-orphans"} + composeFile := path.Join(integrationDir, compose) + envFile := path.Join(integrationDir, EnvFile) + cmdArgs := []string{"compose", "-f", composeFile, "--env-file", envFile, "up", "--build", "--force-recreate", "--remove-orphans"} cmd := exec.CommandContext(ctx, "docker", cmdArgs...) if log {