forked from rgburke/grv
/
update_latest_release.go
134 lines (106 loc) · 3.67 KB
/
update_latest_release.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
package main
import (
"context"
"log"
"os"
"github.com/google/go-github/github"
"golang.org/x/oauth2"
)
const (
githubAPITokenEnvironmentVariable = "GITHUB_API_TOKEN"
repoUser = "rgburke"
repoName = "grv"
repoTagName = "latest"
repoReleaseFileName = "grv_latest_linux64"
binaryFilePath = "grv"
)
var ctx = context.Background()
func main() {
log.Printf("Starting release update")
client := createClient()
deleteExistingRelease(client)
deleteExistingTag(client)
newRelease := createNewRelease(client)
attachBinaryToRelease(client, newRelease)
log.Printf("Successfully completed release update")
}
func createClient() *github.Client {
log.Printf("Creating github client")
githubAPIToken := os.Getenv(githubAPITokenEnvironmentVariable)
if githubAPIToken == "" {
log.Fatalf("Environment variable %v is not set", githubAPITokenEnvironmentVariable)
}
ts := oauth2.StaticTokenSource(
&oauth2.Token{AccessToken: githubAPIToken},
)
tc := oauth2.NewClient(ctx, ts)
return github.NewClient(tc)
}
func deleteExistingRelease(client *github.Client) {
log.Printf("Fetching existing release")
oldRelease, resp, err := client.Repositories.GetReleaseByTag(ctx, repoUser, repoName, repoTagName)
if resp != nil && resp.StatusCode == 404 {
log.Printf("Release doesn't exist")
} else if err != nil {
log.Fatalf("Unable to fetch release: %v", err)
} else if oldRelease != nil {
log.Printf("Deleting release %v", oldRelease.GetName())
_, err = client.Repositories.DeleteRelease(ctx, repoUser, repoName, oldRelease.GetID())
if err != nil {
log.Fatalf("Failed to delete release: %v", err)
}
}
}
func deleteExistingTag(client *github.Client) {
log.Printf("Fetching existing tag")
ref, resp, err := client.Git.GetRef(ctx, repoUser, repoName, "tags/"+repoTagName)
if resp != nil && resp.StatusCode == 404 {
log.Printf("Tag doesn't exist")
} else if err != nil {
log.Fatalf("Unable to fetch tag: %v", err)
} else if ref != nil {
log.Printf("Deleting tag %v", ref.GetRef())
_, err = client.Git.DeleteRef(ctx, repoUser, repoName, ref.GetRef())
if err != nil {
log.Fatalf("Failed to delete tag: %v", err)
}
}
}
func createNewRelease(client *github.Client) *github.RepositoryRelease {
log.Printf("Creating new release")
repoReleaseTag := repoTagName
repoReleaseBranch := "master"
repoReleaseName := "Latest Build"
repoReleaseBody := "Auto-generated build of the latest code on master.\n**Note:** This is a pre-release binary and no guarantees are made that it's in a usable or stable state"
repoReleaseDraft := false
repoReleasePreRelease := true
newRelease := &github.RepositoryRelease{
TagName: &repoReleaseTag,
TargetCommitish: &repoReleaseBranch,
Name: &repoReleaseName,
Body: &repoReleaseBody,
Draft: &repoReleaseDraft,
Prerelease: &repoReleasePreRelease,
}
newRelease, _, err := client.Repositories.CreateRelease(ctx, repoUser, repoName, newRelease)
if err != nil {
log.Fatalf("Failed to create new release: %v", err)
}
log.Printf("Created release")
return newRelease
}
func attachBinaryToRelease(client *github.Client, newRelease *github.RepositoryRelease) {
log.Printf("Attaching binary to release")
uploadOptions := &github.UploadOptions{
Name: repoReleaseFileName,
}
file, err := os.Open(binaryFilePath)
if err != nil {
log.Fatalf("Unable to open binary: %v", err)
}
_, _, err = client.Repositories.UploadReleaseAsset(ctx, repoUser, repoName, newRelease.GetID(), uploadOptions, file)
if err != nil {
log.Fatalf("Failed to upload binary: %v", err)
}
log.Printf("Binary attached to release")
}