github.com/google/go-github/v42@v42.0.0/example/newfilewithappauth/main.go (about) 1 // Copyright 2021 The go-github AUTHORS. All rights reserved. 2 // 3 // Use of this source code is governed by a BSD-style 4 // license that can be found in the LICENSE file. 5 6 // newfilewithappauth demonstrates the functionality of GitHub's app authentication 7 // methods by fetching an installation access token and reauthenticating to GitHub 8 // with OAuth configurations. 9 package main 10 11 import ( 12 "context" 13 "io/ioutil" 14 "log" 15 "net/http" 16 "time" 17 18 "github.com/bradleyfalzon/ghinstallation/v2" 19 "github.com/google/go-github/v42/github" 20 "golang.org/x/oauth2" 21 ) 22 23 func main() { 24 const gitHost = "https://git.api.com" 25 26 privatePem, err := ioutil.ReadFile("path/to/pem") 27 if err != nil { 28 log.Fatalf("failed to read pem: %v", err) 29 } 30 31 itr, err := ghinstallation.NewAppsTransport(http.DefaultTransport, 10, privatePem) 32 if err != nil { 33 log.Fatalf("faild to create app transport: %v\n", err) 34 } 35 itr.BaseURL = gitHost 36 37 //create git client with app transport 38 client, err := github.NewEnterpriseClient( 39 gitHost, 40 gitHost, 41 &http.Client{ 42 Transport: itr, 43 Timeout: time.Second * 30, 44 }) 45 if err != nil { 46 log.Fatalf("faild to create git client for app: %v\n", err) 47 } 48 49 installations, _, err := client.Apps.ListInstallations(context.Background(), &github.ListOptions{}) 50 if err != nil { 51 log.Fatalf("failed to list installations: %v\n", err) 52 } 53 54 //capture our installationId for our app 55 //we need this for the access token 56 var installID int64 57 for _, val := range installations { 58 installID = val.GetID() 59 } 60 61 token, _, err := client.Apps.CreateInstallationToken( 62 context.Background(), 63 installID, 64 &github.InstallationTokenOptions{}) 65 if err != nil { 66 log.Fatalf("failed to create installation token: %v\n", err) 67 } 68 69 ts := oauth2.StaticTokenSource( 70 &oauth2.Token{AccessToken: token.GetToken()}, 71 ) 72 oAuthClient := oauth2.NewClient(context.Background(), ts) 73 74 //create new git hub client with accessToken 75 apiClient, err := github.NewEnterpriseClient(gitHost, gitHost, oAuthClient) 76 if err != nil { 77 log.Fatalf("failed to create new git client with token: %v\n", err) 78 } 79 80 _, resp, err := apiClient.Repositories.CreateFile( 81 context.Background(), 82 "repoOwner", 83 "sample-repo", 84 "example/foo.txt", 85 &github.RepositoryContentFileOptions{ 86 Content: []byte("foo"), 87 Message: github.String("sample commit"), 88 SHA: nil, 89 }) 90 if err != nil { 91 log.Fatalf("failed to create new file: %v\n", err) 92 } 93 94 log.Printf("file written status code: %v", resp.StatusCode) 95 }