Merge pull request #75 from floatdrop/github-enterprise-support

GitHub Enterprise Support
This commit is contained in:
Brad Rydzewski 2014-02-17 21:38:28 -08:00
commit 85e60e4ee2
16 changed files with 73 additions and 18 deletions

View file

@ -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`

View file

@ -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

View file

@ -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
}

View file

@ -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

View file

@ -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)

View file

@ -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)

View file

@ -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
` `

View file

@ -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

View file

@ -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()

View file

@ -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())

View file

@ -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
} }

View file

@ -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 {

View file

@ -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"`

View file

@ -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

View file

@ -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>

View file

@ -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");