Merge pull request #75 from floatdrop/github-enterprise-support
GitHub Enterprise Support
This commit is contained in:
commit
85e60e4ee2
16 changed files with 73 additions and 18 deletions
1
Makefile
1
Makefile
|
@ -69,6 +69,7 @@ clean:
|
||||||
rm -rf usr/local/bin/drone
|
rm -rf usr/local/bin/drone
|
||||||
rm -rf usr/local/bin/droned
|
rm -rf usr/local/bin/droned
|
||||||
rm -rf drone.sqlite
|
rm -rf drone.sqlite
|
||||||
|
rm -rf /tmp/drone.sqlite
|
||||||
|
|
||||||
# creates a debian package for drone
|
# creates a debian package for drone
|
||||||
# to install `sudo dpkg -i drone.deb`
|
# to install `sudo dpkg -i drone.deb`
|
||||||
|
|
|
@ -73,9 +73,9 @@ func (r *Repo) IsGit() bool {
|
||||||
return true
|
return true
|
||||||
case strings.HasPrefix(r.Path, "ssh://git@"):
|
case strings.HasPrefix(r.Path, "ssh://git@"):
|
||||||
return true
|
return true
|
||||||
case strings.HasPrefix(r.Path, "https://github.com/"):
|
case strings.HasPrefix(r.Path, "https://github"):
|
||||||
return true
|
return true
|
||||||
case strings.HasPrefix(r.Path, "http://github.com"):
|
case strings.HasPrefix(r.Path, "http://github"):
|
||||||
return true
|
return true
|
||||||
case strings.HasSuffix(r.Path, ".git"):
|
case strings.HasSuffix(r.Path, ".git"):
|
||||||
return true
|
return true
|
||||||
|
|
|
@ -0,0 +1,23 @@
|
||||||
|
package migrate
|
||||||
|
|
||||||
|
type Rev3 struct{}
|
||||||
|
|
||||||
|
var GitHubEnterpriseSupport = &Rev3{}
|
||||||
|
|
||||||
|
func (r *Rev3) Revision() int64 {
|
||||||
|
return 201402211147
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *Rev3) Up(op Operation) error {
|
||||||
|
_, err := op.AddColumn("settings", "github_domain VARCHAR(255)")
|
||||||
|
if err {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
_, err = op.AddColumn("settings", "github_apiurl VARCHAR(255)")
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *Rev3) Down(op Operation) error {
|
||||||
|
_, err := op.DropColumns("settings", []string{"github_domain", "github_apiurl"})
|
||||||
|
return err
|
||||||
|
}
|
|
@ -49,7 +49,7 @@ insert into builds values (9, 3, 'node_0.80', 'Success', '2013-09-16 00:00:00','
|
||||||
|
|
||||||
-- insert default, dummy settings
|
-- insert default, dummy settings
|
||||||
|
|
||||||
insert into settings values (1,'','','','','','','','','','localhost:8080','http', 0);
|
insert into settings values (1,'','','github.com','https://api.github.com','','','','','','','','localhost:8080','http',0);
|
||||||
|
|
||||||
-- add public & private keys to all repositories
|
-- add public & private keys to all repositories
|
||||||
|
|
||||||
|
|
|
@ -118,6 +118,8 @@ CREATE TABLE settings (
|
||||||
id INTEGER PRIMARY KEY
|
id INTEGER PRIMARY KEY
|
||||||
,github_key VARCHAR(255)
|
,github_key VARCHAR(255)
|
||||||
,github_secret VARCHAR(255)
|
,github_secret VARCHAR(255)
|
||||||
|
,github_domain VARCHAR(255)
|
||||||
|
,github_apiurl VARCHAR(255)
|
||||||
,bitbucket_key VARCHAR(255)
|
,bitbucket_key VARCHAR(255)
|
||||||
,bitbucket_secret VARCHAR(255)
|
,bitbucket_secret VARCHAR(255)
|
||||||
,smtp_server VARCHAR(1024)
|
,smtp_server VARCHAR(1024)
|
||||||
|
|
|
@ -103,6 +103,8 @@ CREATE TABLE settings (
|
||||||
id INTEGER PRIMARY KEY
|
id INTEGER PRIMARY KEY
|
||||||
,github_key VARCHAR(255)
|
,github_key VARCHAR(255)
|
||||||
,github_secret VARCHAR(255)
|
,github_secret VARCHAR(255)
|
||||||
|
,github_domain VARCHAR(255)
|
||||||
|
,github_apiurl VARCHAR(255)
|
||||||
,bitbucket_key VARCHAR(255)
|
,bitbucket_key VARCHAR(255)
|
||||||
,bitbucket_secret VARCHAR(255)
|
,bitbucket_secret VARCHAR(255)
|
||||||
,smtp_server VARCHAR(1024)
|
,smtp_server VARCHAR(1024)
|
||||||
|
|
|
@ -10,7 +10,7 @@ const settingsTable = "settings"
|
||||||
|
|
||||||
// SQL Queries to retrieve the system settings
|
// SQL Queries to retrieve the system settings
|
||||||
const settingsStmt = `
|
const settingsStmt = `
|
||||||
SELECT id, github_key, github_secret, bitbucket_key, bitbucket_secret,
|
SELECT id, github_key, github_secret, github_domain, github_apiurl, bitbucket_key, bitbucket_secret,
|
||||||
smtp_server, smtp_port, smtp_address, smtp_username, smtp_password, hostname, scheme, open_invitations
|
smtp_server, smtp_port, smtp_address, smtp_username, smtp_password, hostname, scheme, open_invitations
|
||||||
FROM settings WHERE id = 1
|
FROM settings WHERE id = 1
|
||||||
`
|
`
|
||||||
|
|
|
@ -167,6 +167,8 @@ func AdminSettingsUpdate(w http.ResponseWriter, r *http.Request, u *User) error
|
||||||
// update github settings
|
// update github settings
|
||||||
settings.GitHubKey = r.FormValue("GitHubKey")
|
settings.GitHubKey = r.FormValue("GitHubKey")
|
||||||
settings.GitHubSecret = r.FormValue("GitHubSecret")
|
settings.GitHubSecret = r.FormValue("GitHubSecret")
|
||||||
|
settings.GitHubDomain = r.FormValue("GitHubDomain")
|
||||||
|
settings.GitHubApiUrl = r.FormValue("GitHubApiUrl")
|
||||||
|
|
||||||
// update smtp settings
|
// update smtp settings
|
||||||
settings.SmtpServer = r.FormValue("SmtpServer")
|
settings.SmtpServer = r.FormValue("SmtpServer")
|
||||||
|
@ -243,6 +245,8 @@ func InstallPost(w http.ResponseWriter, r *http.Request) error {
|
||||||
settings := Settings{}
|
settings := Settings{}
|
||||||
settings.Domain = r.FormValue("Domain")
|
settings.Domain = r.FormValue("Domain")
|
||||||
settings.Scheme = r.FormValue("Scheme")
|
settings.Scheme = r.FormValue("Scheme")
|
||||||
|
settings.GitHubApiUrl = "https://api.github.com";
|
||||||
|
settings.GitHubDomain = "github.com";
|
||||||
database.SaveSettings(&settings)
|
database.SaveSettings(&settings)
|
||||||
|
|
||||||
// add the user to the session object
|
// add the user to the session object
|
||||||
|
|
|
@ -48,8 +48,8 @@ func LinkGithub(w http.ResponseWriter, r *http.Request, u *User) error {
|
||||||
// github OAuth2 Data
|
// github OAuth2 Data
|
||||||
var oauth = oauth2.Client{
|
var oauth = oauth2.Client{
|
||||||
RedirectURL: settings.URL().String() + "/auth/login/github",
|
RedirectURL: settings.URL().String() + "/auth/login/github",
|
||||||
AccessTokenURL: "https://github.com/login/oauth/access_token",
|
AccessTokenURL: "https://" + settings.GitHubDomain + "/login/oauth/access_token",
|
||||||
AuthorizationURL: "https://github.com/login/oauth/authorize",
|
AuthorizationURL: "https://" + settings.GitHubDomain + "/login/oauth/authorize",
|
||||||
ClientId: settings.GitHubKey,
|
ClientId: settings.GitHubKey,
|
||||||
ClientSecret: settings.GitHubSecret,
|
ClientSecret: settings.GitHubSecret,
|
||||||
}
|
}
|
||||||
|
@ -72,6 +72,7 @@ func LinkGithub(w http.ResponseWriter, r *http.Request, u *User) error {
|
||||||
|
|
||||||
// create the client
|
// create the client
|
||||||
client := github.New(token.AccessToken)
|
client := github.New(token.AccessToken)
|
||||||
|
client.ApiUrl = settings.GitHubApiUrl
|
||||||
|
|
||||||
// get the user information
|
// get the user information
|
||||||
githubUser, err := client.Users.Current()
|
githubUser, err := client.Users.Current()
|
||||||
|
|
|
@ -100,8 +100,13 @@ func Hook(w http.ResponseWriter, r *http.Request) error {
|
||||||
commit.SetAuthor(hook.Commits[0].Author.Email)
|
commit.SetAuthor(hook.Commits[0].Author.Email)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// get the github settings from the database
|
||||||
|
settings := database.SettingsMust()
|
||||||
|
|
||||||
// get the drone.yml file from GitHub
|
// get the drone.yml file from GitHub
|
||||||
client := github.New(user.GithubToken)
|
client := github.New(user.GithubToken)
|
||||||
|
client.ApiUrl = settings.GitHubApiUrl
|
||||||
|
|
||||||
content, err := client.Contents.FindRef(repo.Owner, repo.Name, ".drone.yml", commit.Hash)
|
content, err := client.Contents.FindRef(repo.Owner, repo.Name, ".drone.yml", commit.Hash)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
msg := "No .drone.yml was found in this repository. You need to add one.\n"
|
msg := "No .drone.yml was found in this repository. You need to add one.\n"
|
||||||
|
@ -216,8 +221,13 @@ func PullRequestHook(w http.ResponseWriter, r *http.Request) {
|
||||||
commit.Message = hook.PullRequest.Title
|
commit.Message = hook.PullRequest.Title
|
||||||
// label := p.PullRequest.Head.Labe
|
// label := p.PullRequest.Head.Labe
|
||||||
|
|
||||||
|
// get the github settings from the database
|
||||||
|
settings := database.SettingsMust()
|
||||||
|
|
||||||
// get the drone.yml file from GitHub
|
// get the drone.yml file from GitHub
|
||||||
client := github.New(user.GithubToken)
|
client := github.New(user.GithubToken)
|
||||||
|
client.ApiUrl = settings.GitHubApiUrl
|
||||||
|
|
||||||
content, err := client.Contents.FindRef(repo.Owner, repo.Name, ".drone.yml", commit.Hash) // TODO should this really be the hash??
|
content, err := client.Contents.FindRef(repo.Owner, repo.Name, ".drone.yml", commit.Hash) // TODO should this really be the hash??
|
||||||
if err != nil {
|
if err != nil {
|
||||||
println(err.Error())
|
println(err.Error())
|
||||||
|
|
|
@ -54,6 +54,7 @@ func RepoDashboard(w http.ResponseWriter, r *http.Request, u *User, repo *Repo)
|
||||||
}
|
}
|
||||||
|
|
||||||
func RepoAdd(w http.ResponseWriter, r *http.Request, u *User) error {
|
func RepoAdd(w http.ResponseWriter, r *http.Request, u *User) error {
|
||||||
|
settings := database.SettingsMust()
|
||||||
teams, err := database.ListTeams(u.ID)
|
teams, err := database.ListTeams(u.ID)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
|
@ -61,7 +62,8 @@ func RepoAdd(w http.ResponseWriter, r *http.Request, u *User) error {
|
||||||
data := struct {
|
data := struct {
|
||||||
User *User
|
User *User
|
||||||
Teams []*Team
|
Teams []*Team
|
||||||
}{u, teams}
|
Settings *Settings
|
||||||
|
}{u, teams, settings}
|
||||||
// if the user hasn't linked their GitHub account
|
// if the user hasn't linked their GitHub account
|
||||||
// render a different template
|
// render a different template
|
||||||
if len(u.GithubToken) == 0 {
|
if len(u.GithubToken) == 0 {
|
||||||
|
@ -82,12 +84,13 @@ func RepoCreateGithub(w http.ResponseWriter, r *http.Request, u *User) error {
|
||||||
|
|
||||||
// create the GitHub client
|
// create the GitHub client
|
||||||
client := github.New(u.GithubToken)
|
client := github.New(u.GithubToken)
|
||||||
|
client.ApiUrl = settings.GitHubApiUrl
|
||||||
githubRepo, err := client.Repos.Find(owner, name)
|
githubRepo, err := client.Repos.Find(owner, name)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
repo, err := NewGitHubRepo(owner, name, githubRepo.Private)
|
repo, err := NewGitHubRepo(settings.GitHubDomain, owner, name, githubRepo.Private)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
|
@ -12,7 +12,6 @@ const (
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
HostGithub = "github.com"
|
|
||||||
HostBitbucket = "bitbucket.org"
|
HostBitbucket = "bitbucket.org"
|
||||||
HostGoogle = "code.google.com"
|
HostGoogle = "code.google.com"
|
||||||
HostCustom = "custom"
|
HostCustom = "custom"
|
||||||
|
@ -25,8 +24,8 @@ const (
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
githubRepoPattern = "git://github.com/%s/%s.git"
|
githubRepoPattern = "git://%s/%s/%s.git"
|
||||||
githubRepoPatternPrivate = "git@github.com:%s/%s.git"
|
githubRepoPatternPrivate = "git@%s:%s/%s.git"
|
||||||
bitbucketRepoPattern = "https://bitbucket.org/%s/%s.git"
|
bitbucketRepoPattern = "https://bitbucket.org/%s/%s.git"
|
||||||
bitbucketRepoPatternPrivate = "git@bitbucket.org:%s/%s.git"
|
bitbucketRepoPatternPrivate = "git@bitbucket.org:%s/%s.git"
|
||||||
)
|
)
|
||||||
|
@ -122,15 +121,15 @@ func NewRepo(host, owner, name, scm, url string) (*Repo, error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Creates a new GitHub repository
|
// Creates a new GitHub repository
|
||||||
func NewGitHubRepo(owner, name string, private bool) (*Repo, error) {
|
func NewGitHubRepo(domain, owner, name string, private bool) (*Repo, error) {
|
||||||
var url string
|
var url string
|
||||||
switch private {
|
switch private {
|
||||||
case false:
|
case false:
|
||||||
url = fmt.Sprintf(githubRepoPattern, owner, name)
|
url = fmt.Sprintf(githubRepoPattern, domain, owner, name)
|
||||||
case true:
|
case true:
|
||||||
url = fmt.Sprintf(githubRepoPatternPrivate, owner, name)
|
url = fmt.Sprintf(githubRepoPatternPrivate, domain, owner, name)
|
||||||
}
|
}
|
||||||
return NewRepo(HostGithub, owner, name, ScmGit, url)
|
return NewRepo(domain, owner, name, ScmGit, url)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Creates a new Bitbucket repository
|
// Creates a new Bitbucket repository
|
||||||
|
@ -142,7 +141,7 @@ func NewBitbucketRepo(owner, name string, private bool) (*Repo, error) {
|
||||||
case true:
|
case true:
|
||||||
url = fmt.Sprintf(bitbucketRepoPatternPrivate, owner, name)
|
url = fmt.Sprintf(bitbucketRepoPatternPrivate, owner, name)
|
||||||
}
|
}
|
||||||
return NewRepo(HostGithub, owner, name, ScmGit, url)
|
return NewRepo(HostBitbucket, owner, name, ScmGit, url)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (r *Repo) DefaultBranch() string {
|
func (r *Repo) DefaultBranch() string {
|
||||||
|
|
|
@ -17,6 +17,8 @@ type Settings struct {
|
||||||
// GitHub Consumer key and secret.
|
// GitHub Consumer key and secret.
|
||||||
GitHubKey string `meddler:"github_key"`
|
GitHubKey string `meddler:"github_key"`
|
||||||
GitHubSecret string `meddler:"github_secret"`
|
GitHubSecret string `meddler:"github_secret"`
|
||||||
|
GitHubDomain string `meddler:"github_domain"`
|
||||||
|
GitHubApiUrl string `meddler:"github_apiurl"`
|
||||||
|
|
||||||
// Bitbucket Consumer Key and secret.
|
// Bitbucket Consumer Key and secret.
|
||||||
BitbucketKey string `meddler:"bitbucket_key"`
|
BitbucketKey string `meddler:"bitbucket_key"`
|
||||||
|
|
|
@ -225,6 +225,7 @@ func updateGitHubStatus(repo *Repo, commit *Commit) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
client := github.New(user.GithubToken)
|
client := github.New(user.GithubToken)
|
||||||
|
client.ApiUrl = settings.GitHubApiUrl;
|
||||||
|
|
||||||
var url string
|
var url string
|
||||||
url = settings.URL().String() + "/" + repo.Slug + "/commit/" + commit.Hash
|
url = settings.URL().String() + "/" + repo.Slug + "/commit/" + commit.Hash
|
||||||
|
|
|
@ -44,6 +44,11 @@
|
||||||
<input class="form-control form-control-large" type="text" name="GitHubKey" value="{{.Settings.GitHubKey}}" />
|
<input class="form-control form-control-large" type="text" name="GitHubKey" value="{{.Settings.GitHubKey}}" />
|
||||||
<input class="form-control form-control-large" type="password" name="GitHubSecret" value="{{.Settings.GitHubSecret}}" />
|
<input class="form-control form-control-large" type="password" name="GitHubSecret" value="{{.Settings.GitHubSecret}}" />
|
||||||
</div>
|
</div>
|
||||||
|
<label>GitHub Settings:</label>
|
||||||
|
<div>
|
||||||
|
<input class="form-control form-control-large" type="text" name="GitHubDomain" value="{{.Settings.GitHubDomain}}" />
|
||||||
|
<input class="form-control form-control-large" type="text" name="GitHubApiUrl" value="{{.Settings.GitHubApiUrl}}" />
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="form-group hide">
|
<div class="form-group hide">
|
||||||
<div class="alert">Bitbucket OAuth Consumer Key and Secret.</div>
|
<div class="alert">Bitbucket OAuth Consumer Key and Secret.</div>
|
||||||
|
|
|
@ -25,6 +25,7 @@
|
||||||
<a class="btn btn-default pull-right" href="/auth/login/github" style="font-size: 18px;background:#f4f4f4;">Re-Link Account</a>
|
<a class="btn btn-default pull-right" href="/auth/login/github" style="font-size: 18px;background:#f4f4f4;">Re-Link Account</a>
|
||||||
</div>
|
</div>
|
||||||
<form class="form-repo" method="POST" action="/new/github.com">
|
<form class="form-repo" method="POST" action="/new/github.com">
|
||||||
|
<input type="hidden" name="domain" autocomplete="off" value="{{.Settings.GitHubDomain}}">
|
||||||
<div class="field-group">
|
<div class="field-group">
|
||||||
<div>
|
<div>
|
||||||
<label>GitHub Owner</label>
|
<label>GitHub Owner</label>
|
||||||
|
@ -85,7 +86,8 @@
|
||||||
if (this.status == 200) {
|
if (this.status == 200) {
|
||||||
var name = $("input[name=name]").val()
|
var name = $("input[name=name]").val()
|
||||||
var owner = $("input[name=owner]").val()
|
var owner = $("input[name=owner]").val()
|
||||||
window.location.pathname = "/github.com/"+owner+"/"+name
|
var domain = $("input[name=domain]").val()
|
||||||
|
window.location.pathname = "/" + domain + "/"+owner+"/"+name
|
||||||
} else {
|
} else {
|
||||||
$("#failureAlert").text("Unable to setup the Repository");
|
$("#failureAlert").text("Unable to setup the Repository");
|
||||||
$("#failureAlert").show().removeClass("hide");
|
$("#failureAlert").show().removeClass("hide");
|
||||||
|
|
Loading…
Reference in a new issue