diff --git a/.github/workflows/test.yml b/.github/workflows/ci.yml similarity index 56% rename from .github/workflows/test.yml rename to .github/workflows/ci.yml index 31b4859..501b2b4 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/ci.yml @@ -1,4 +1,4 @@ -name: Test +name: CI on: push: @@ -12,7 +12,7 @@ permissions: contents: read jobs: - test: + ci: runs-on: ubuntu-latest services: dind: @@ -31,4 +31,13 @@ jobs: - uses: golangci/golangci-lint-action@v3 with: version: v1.54 - - run: go test -race -coverprofile=coverage.txt -covermode=atomic ./... + - name: Gitea 1.20 & Woodpecker 1.0 + run: go test -race -coverprofile=coverage.txt -covermode=atomic ./... + env: + GITEA_IMAGE: gitea/gitea:1.20 + WOODPECKER_IMAGE: woodpeckerci/woodpecker-server:v1.0 + - name: Forgejo 1.20 & Woodpecker 1.0 + run: go test -race -coverprofile=coverage.txt -covermode=atomic ./... + env: + GITEA_IMAGE: codeberg.org/forgejo/forgejo:1.20 + WOODPECKER_IMAGE: woodpeckerci/woodpecker-server:v1.0 diff --git a/internal/internal_test.go b/internal/internal_test.go index f0b7045..00e1ebc 100644 --- a/internal/internal_test.go +++ b/internal/internal_test.go @@ -26,8 +26,6 @@ import ( "golang.org/x/oauth2" ) -const resourceExpInSec = 120 - var ( giteaClient *gitea.Client woodpeckerClient woodpecker.Client @@ -55,13 +53,13 @@ func TestMain(m *testing.M) { _ = resourceWoodpecker.Close() }) + woodpeckerClient = newWoodpeckerClient(resourceWoodpecker.httpURL, resourceWoodpecker.token) + // set required envs _ = os.Setenv("TF_ACC", "1") _ = os.Setenv("WOODPECKER_SERVER", resourceWoodpecker.httpURL.String()) _ = os.Setenv("WOODPECKER_TOKEN", resourceWoodpecker.token) - woodpeckerClient = newWoodpeckerClient(resourceWoodpecker.httpURL, resourceWoodpecker.token) - code := m.Run() // LIFO @@ -94,6 +92,8 @@ func newDockerNetwork(pool *dockertest.Pool) *dockertest.Network { return network } +const giteaContainerExpInSec = 120 + type giteaResource struct { docker *dockertest.Resource httpURL *urlpkg.URL @@ -102,9 +102,10 @@ type giteaResource struct { } func runGitea(pool *dockertest.Pool, network *dockertest.Network) giteaResource { + repo, tag := getGiteaRepoTag() gitea, err := pool.RunWithOptions(&dockertest.RunOptions{ - Repository: "gitea/gitea", - Tag: "1.20", + Repository: repo, + Tag: tag, Networks: []*dockertest.Network{network}, Env: []string{ "GITEA__security__INSTALL_LOCK=true", @@ -119,7 +120,7 @@ func runGitea(pool *dockertest.Pool, network *dockertest.Network) giteaResource log.Fatalf("couldn't run gitea: %s", err) } - if err = gitea.Expire(resourceExpInSec); err != nil { + if err = gitea.Expire(giteaContainerExpInSec); err != nil { log.Fatal(err) } @@ -171,6 +172,16 @@ func (r giteaResource) Close() error { return r.docker.Close() } +const defaultGiteaImage = "gitea/gitea:1.20" + +func getGiteaRepoTag() (string, string) { + val := os.Getenv("GITEA_IMAGE") + if val == "" { + val = defaultGiteaImage + } + return docker.ParseRepositoryTag(val) +} + func createGiteaUser(pool *dockertest.Pool, gitea *dockertest.Resource) *urlpkg.Userinfo { username := strings.ReplaceAll(uuid.NewString(), "-", "") password := uuid.NewString() @@ -224,6 +235,8 @@ type woodpeckerResource struct { token string } +const woodpeckerContainerExpInSec = 120 + func runWoodpecker( pool *dockertest.Pool, network *dockertest.Network, @@ -245,9 +258,10 @@ func runWoodpecker( log.Fatalln("couldn't create oauth2 app:", err) } + repo, tag := getWoodpeckerRepoTag() woodpecker, err := pool.RunWithOptions(&dockertest.RunOptions{ - Repository: "woodpeckerci/woodpecker-server", - Tag: "v1.0.2", + Repository: repo, + Tag: tag, Networks: []*dockertest.Network{network}, PortBindings: map[docker.Port][]docker.PortBinding{ "8000/tcp": { @@ -281,7 +295,7 @@ func runWoodpecker( log.Fatalf("couldn't run woodpecker: %s", err) } - if err = woodpecker.Expire(resourceExpInSec); err != nil { + if err = woodpecker.Expire(woodpeckerContainerExpInSec); err != nil { log.Fatal(err) } @@ -324,6 +338,16 @@ func (r woodpeckerResource) Close() error { return r.docker.Close() } +const defaultWoodpeckerImage = "woodpeckerci/woodpecker-server:v1.0.2" + +func getWoodpeckerRepoTag() (string, string) { + val := os.Getenv("WOODPECKER_IMAGE") + if val == "" { + val = defaultWoodpeckerImage + } + return docker.ParseRepositoryTag(val) +} + type woodpeckerTokenProvider struct { client *http.Client oauthApp *gitea.Oauth2 @@ -444,7 +468,9 @@ func (p woodpeckerTokenProvider) do(req *http.Request) *http.Response { log.Fatalf("request to %s failed: %s", req.URL.String(), err) } if resp.StatusCode/100 != 2 { // accept only 2XX requests - log.Fatalf("request to %s failed", req.URL.String()) + b, _ := io.ReadAll(resp.Body) + _ = resp.Body.Close() + log.Fatalf("request to %s failed (status code = %d): %s", req.URL.String(), resp.StatusCode, b) } return resp @@ -461,7 +487,7 @@ func (p woodpeckerTokenProvider) getCSRFTokenFromCookies(cookies []*http.Cookie) func (p woodpeckerTokenProvider) readCSRFTokenFromWoodpeckerWebConfig(r io.Reader) string { defer func() { - // discard the remaining bytes + // discard remaining bytes _, _ = io.Copy(io.Discard, r) }() diff --git a/internal/provider.go b/internal/provider.go index c1925ab..7d1b0cd 100644 --- a/internal/provider.go +++ b/internal/provider.go @@ -64,12 +64,12 @@ func (p *woodpeckerProvider) Resources(_ context.Context) []func() resource.Reso } func (p *woodpeckerProvider) Configure(ctx context.Context, req provider.ConfigureRequest, resp *provider.ConfigureResponse) { - cfg := p.createProviderConfiguration(ctx, req, resp) + cfg := newProviderConfig(ctx, req, resp) if resp.Diagnostics.HasError() { return } - p.client = p.createClient(ctx, cfg, resp) + p.client = newClient(ctx, cfg, resp) resp.DataSourceData = p.client resp.ResourceData = p.client @@ -80,7 +80,7 @@ type providerConfig struct { Token types.String `tfsdk:"token"` } -func (p *woodpeckerProvider) createProviderConfiguration( +func newProviderConfig( ctx context.Context, req provider.ConfigureRequest, resp *provider.ConfigureResponse, @@ -120,7 +120,7 @@ func (p *woodpeckerProvider) createProviderConfiguration( return config } -func (p *woodpeckerProvider) createClient( +func newClient( ctx context.Context, config providerConfig, resp *provider.ConfigureResponse, diff --git a/internal/provider_test.go b/internal/provider_test.go index f348cdd..291b105 100644 --- a/internal/provider_test.go +++ b/internal/provider_test.go @@ -9,12 +9,10 @@ import ( "github.com/hashicorp/terraform-plugin-go/tfprotov6" ) -//nolint:unused var testAccProtoV6ProviderFactories = map[string]func() (tfprotov6.ProviderServer, error){ "woodpecker": providerserver.NewProtocol6WithError(internal.NewProvider("test")()), } -//nolint:unused func testAccPreCheck(t *testing.T) { t.Helper()