@@ -7,6 +7,8 @@ const goImg = "golang:1.11";
7
7
const gopath = "/go" ;
8
8
const localPath = gopath + `/src/github.com/${ projectOrg } /${ projectName } ` ;
9
9
10
+ const releaseTagRegex = / ^ r e f s \/ t a g s \/ ( v [ 0 - 9 ] + (?: \. [ 0 - 9 ] + ) * (?: \- .+ ) ? ) $ / ;
11
+
10
12
// **********************************************
11
13
// Event Handlers
12
14
// **********************************************
@@ -15,6 +17,20 @@ events.on("exec", (e, p) => {
15
17
return test ( e , p ) . run ( ) ;
16
18
} )
17
19
20
+ events . on ( "push" , ( e , p ) => {
21
+ let matchStr = e . revision . ref . match ( releaseTagRegex ) ;
22
+
23
+ if ( matchStr ) {
24
+ // This is an official release with a semantically versioned tag
25
+ let matchTokens = Array . from ( matchStr ) ;
26
+ let version = matchTokens [ 1 ] ;
27
+ return test ( e , p ) . run ( )
28
+ . then ( ( ) => {
29
+ githubRelease ( p , version ) . run ( ) ;
30
+ } ) ;
31
+ }
32
+ } )
33
+
18
34
events . on ( "check_suite:requested" , runSuite ) ;
19
35
events . on ( "check_suite:rerequested" , runSuite ) ;
20
36
events . on ( "check_run:rerequested" , checkRequested ) ;
@@ -112,6 +128,40 @@ function checkRequested(e, p) {
112
128
}
113
129
}
114
130
131
+ // githubRelease creates a new release on GitHub, named by the provided tag
132
+ function githubRelease ( p , tag ) {
133
+ if ( ! p . secrets . ghToken ) {
134
+ throw new Error ( "Project must have 'secrets.ghToken' set" ) ;
135
+ }
136
+
137
+ var job = new Job ( "release" , goImg ) ;
138
+ job . mountPath = localPath ;
139
+ parts = p . repo . name . split ( "/" , 2 ) ;
140
+
141
+ job . env = {
142
+ "GITHUB_USER" : parts [ 0 ] ,
143
+ "GITHUB_REPO" : parts [ 1 ] ,
144
+ "GITHUB_TOKEN" : p . secrets . ghToken ,
145
+ } ;
146
+
147
+ job . tasks = [
148
+ "go get github.com/aktau/github-release" ,
149
+ `cd ${ localPath } ` ,
150
+ `last_tag=$(git describe --tags ${ tag } ^ --abbrev=0 --always)` ,
151
+ `github-release release \
152
+ -t ${ tag } \
153
+ -n "${ parts [ 1 ] } ${ tag } " \
154
+ -d "$(git log --no-merges --pretty=format:'- %s %H (%aN)' HEAD ^$last_tag)" \
155
+ || echo "release ${ tag } exists"`
156
+ ] ;
157
+
158
+ console . log ( job . tasks ) ;
159
+ console . log ( `release at https://github.com/${ p . repo . name } /releases/tag/${ tag } ` ) ;
160
+
161
+ return job ;
162
+ }
163
+
164
+
115
165
// **********************************************
116
166
// Classes/Helpers
117
167
// **********************************************
0 commit comments