diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 98dfdc43624fe1406329bc93585571d34fa62046..9bb84585ee39ec632656a1ac64020f6c15311fa3 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -29,6 +29,7 @@ jobs: with: go-version: 1.15 - run: go build ./cmd/provider-git/ + - run: ./scripts/start-gitea.sh - run: go test -v ./... release: runs-on: ubuntu-latest diff --git a/pkg/provider/git.go b/pkg/provider/git.go index 0228ce4f59ea0599469cd93a09f6adecc2e464ff..a33e2c4d318b2e0b0f975bbadf6c5e1aed000766 100644 --- a/pkg/provider/git.go +++ b/pkg/provider/git.go @@ -8,9 +8,13 @@ import ( "github.com/Masterminds/semver/v3" "github.com/go-git/go-git/v5" + "github.com/go-git/go-git/v5/config" "github.com/go-git/go-git/v5/plumbing" "github.com/go-git/go-git/v5/plumbing/object" "github.com/go-git/go-git/v5/plumbing/storer" + "github.com/go-git/go-git/v5/plumbing/transport" + "github.com/go-git/go-git/v5/plumbing/transport/http" + "github.com/go-git/go-git/v5/plumbing/transport/ssh" "github.com/go-semantic-release/semantic-release/v2/pkg/provider" "github.com/go-semantic-release/semantic-release/v2/pkg/semrel" ) @@ -21,6 +25,8 @@ type Repository struct { defaultBranch string taggerName string taggerEmail string + remoteName string + auth transport.AuthMethod repo *git.Repository } @@ -40,6 +46,30 @@ func (repo *Repository) Init(config map[string]string) error { repo.taggerEmail = "git@go-semantic-release.xyz" } + repo.remoteName = config["remote_name"] + if repo.remoteName == "" { + repo.remoteName = "origin" + } + + if config["auth_username"] == "" { + config["auth_username"] = "git" + } + + if config["auth"] == "basic" { + repo.auth = &http.BasicAuth{ + Username: config["auth_username"], + Password: config["auth_password"], + } + } else if config["auth"] == "ssh" { + auth, err := ssh.NewPublicKeysFromFile(config["auth_username"], config["auth_private_key"], config["auth_password"]) + if err != nil { + return err + } + repo.auth = auth + } else { + repo.auth = nil + } + gitPath := config["git_path"] if gitPath == "" { gitPath = "." @@ -144,7 +174,14 @@ func (repo *Repository) CreateRelease(release *provider.CreateReleaseConfig) err if err != nil { return err } - return nil + err = repo.repo.Push(&git.PushOptions{ + RemoteName: repo.remoteName, + RefSpecs: []config.RefSpec{ + config.RefSpec(fmt.Sprintf("refs/tags/%s:refs/tags/%s", tag, tag)), + }, + Auth: repo.auth, + }) + return err } func (repo *Repository) Name() string { diff --git a/pkg/provider/git_test.go b/pkg/provider/git_test.go index 831cd3b39a2314e3dbbcebef6581c4d5994e8067..5aa188e1592fe33cd16728cab80fbbc79902f803 100644 --- a/pkg/provider/git_test.go +++ b/pkg/provider/git_test.go @@ -8,32 +8,49 @@ import ( "time" "github.com/go-git/go-git/v5" + "github.com/go-git/go-git/v5/config" "github.com/go-git/go-git/v5/plumbing" "github.com/go-git/go-git/v5/plumbing/object" + "github.com/go-git/go-git/v5/plumbing/transport/http" "github.com/go-semantic-release/semantic-release/v2/pkg/provider" "github.com/stretchr/testify/require" ) -func TestNewRepository(t *testing.T) { +var testGitPath string + +func TestGit(t *testing.T) { + var err error + testGitPath, err = setupRepo() + require.NoError(t, err) + t.Run("NewRepository", newRepository) + t.Run("GetInfo", getInfo) + t.Run("GetReleases", getReleases) + t.Run("GetCommits", getCommits) + t.Run("CreateRelease", createRelease) +} + +func newRepository(t *testing.T) { require := require.New(t) repo := &Repository{} err := repo.Init(map[string]string{}) require.EqualError(err, "repository does not exist") - gitPath, err := setupRepo() - require.NoError(err) - repo = &Repository{} err = repo.Init(map[string]string{ - "git_path": gitPath, + "git_path": testGitPath, "default_branch": "development", "tagger_name": "test", "tagger_email": "test@test.com", + "auth": "basic", + "auth_username": "test", + "auth_password": "test", }) + require.NoError(err) - require.Equal(repo.defaultBranch, "development") - require.Equal(repo.taggerName, "test") - require.Equal(repo.taggerEmail, "test@test.com") + require.Equal("development", repo.defaultBranch) + require.Equal("test", repo.taggerName) + require.Equal("test@test.com", repo.taggerEmail) + require.NotNil(repo.auth) } func setupRepo() (string, error) { @@ -45,6 +62,14 @@ func setupRepo() (string, error) { if err != nil { return "", err } + + _, err = repo.CreateRemote(&config.RemoteConfig{ + Name: "origin", + URLs: []string{"http://localhost:3000/test/test.git"}, + }) + if err != nil { + return "", err + } w, err := repo.Worktree() if err != nil { return "", err @@ -91,38 +116,51 @@ func setupRepo() (string, error) { return "", err } - return dir, nil -} - -func createRepo() (*Repository, string, error) { - gitPath, err := setupRepo() + err = repo.Push(&git.PushOptions{ + RemoteName: "origin", + RefSpecs: []config.RefSpec{ + "refs/heads/*:refs/heads/*", + "refs/tags/*:refs/tags/*", + }, + Auth: &http.BasicAuth{ + Username: "test", + Password: "test", + }, + Force: true, + }) if err != nil { - return nil, "", err + return "", err } + return dir, nil +} +func createRepo() (*Repository, error) { repo := &Repository{} - err = repo.Init(map[string]string{ - "git_path": gitPath, + err := repo.Init(map[string]string{ + "git_path": testGitPath, + "auth": "basic", + "auth_username": "test", + "auth_password": "test", }) if err != nil { - return nil, "", err + return nil, err } - return repo, gitPath, nil + return repo, nil } -func TestGetInfo(t *testing.T) { +func getInfo(t *testing.T) { require := require.New(t) - repo, _, err := createRepo() + repo, err := createRepo() require.NoError(err) repoInfo, err := repo.GetInfo() require.NoError(err) require.Equal("master", repoInfo.DefaultBranch) } -func TestGetCommits(t *testing.T) { +func getCommits(t *testing.T) { require := require.New(t) - repo, _, err := createRepo() + repo, err := createRepo() require.NoError(err) commits, err := repo.GetCommits("", "master") require.NoError(err) @@ -133,12 +171,12 @@ func TestGetCommits(t *testing.T) { } } -func TestGithubCreateRelease(t *testing.T) { +func createRelease(t *testing.T) { require := require.New(t) - repo, gitPath, err := createRepo() + repo, err := createRepo() require.NoError(err) - gRepo, err := git.PlainOpen(gitPath) + gRepo, err := git.PlainOpen(testGitPath) require.NoError(err) head, err := gRepo.Head() require.NoError(err) @@ -159,9 +197,9 @@ func TestGithubCreateRelease(t *testing.T) { require.Equal("new feature\n", tagObj.Message) } -func TestGetReleases(t *testing.T) { +func getReleases(t *testing.T) { require := require.New(t) - repo, _, err := createRepo() + repo, err := createRepo() require.NoError(err) releases, err := repo.GetReleases("")