Skip to content

Commit bf02b49

Browse files
authored
Merge pull request #69 from fullstack-devops/feature/issue-#58
get pr by merge sha + override a release branch
2 parents d6cfa83 + be5beb1 commit bf02b49

File tree

11 files changed

+114
-66
lines changed

11 files changed

+114
-66
lines changed

docs/commands/release.md

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,9 @@ awesome-ci release <subcommand> [subcommand-option]
2929
| `-version` | overrides any version from git and, or patches the given string |
3030
| `-patchLevel` | overrides the patchLevel. make shure your following the alias definition. |
3131
| `-dry-run` | doesn't create a release. Prints out what it would do and check permissions |
32-
| `-body` | add a text (markdown) to the release body |
32+
| `-body` | add a text (markdown) to the release body eg.: `./release-template-md` |
33+
| `-merge-sha` | specify the merge sha |
34+
| `-release-branch` | set release branch (default: git default) |
3335
| `-assets` | (only available in publish) uploads the given Artifacts to a release. Eg.: `file=out/awesome-ci` |
3436
| `-releaseid` | (only available in publish) publishes an early defined release |
3537

docs/examples/github_actions.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ jobs:
5252
- name: collect infos and create release
5353
run: |
5454
awesome-ci pr info
55-
awesome-ci release create # making a draft
55+
awesome-ci release create -merge-sha $\{\{ github.sha \}\}
5656
env:
5757
GITHUB_TOKEN: $\{\{ secrets.GITHUB_TOKEN \}\}
5858

main.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,8 @@ func init() {
5656
}
5757
releaseSet.Create.Fs = flag.NewFlagSet("release create", flag.ExitOnError)
5858
releaseSet.Create.Fs.IntVar(&releaseSet.Create.PrNumber, "prnumber", 0, "overwrite the issue number")
59+
releaseSet.Create.Fs.StringVar(&releaseSet.Create.MergeCommitSHA, "merge-sha", "", "set the merge sha")
60+
releaseSet.Create.Fs.StringVar(&releaseSet.Create.ReleaseBranch, "release-branch", "", "set release branch (default: git default)")
5961
releaseSet.Create.Fs.StringVar(&releaseSet.Create.Version, "version", "", "override version to Update")
6062
releaseSet.Create.Fs.StringVar(&releaseSet.Create.Body, "body", "", "custom release message (markdow string or file)")
6163
releaseSet.Create.Fs.StringVar(&releaseSet.Create.PatchLevel, "patchLevel", "", "predefine version to Update")
@@ -66,6 +68,8 @@ func init() {
6668
}
6769
releaseSet.Publish.Fs = flag.NewFlagSet("release publish", flag.ExitOnError)
6870
releaseSet.Publish.Fs.IntVar(&releaseSet.Publish.PrNumber, "prnumber", 0, "overwrite the issue number")
71+
releaseSet.Publish.Fs.StringVar(&releaseSet.Publish.MergeCommitSHA, "merge-sha", "", "set the merge sha")
72+
releaseSet.Publish.Fs.StringVar(&releaseSet.Publish.ReleaseBranch, "release-branch", "", "set release branch (default: git default)")
6973
releaseSet.Publish.Fs.StringVar(&releaseSet.Publish.Version, "version", "", "override version to Update")
7074
releaseSet.Publish.Fs.StringVar(&releaseSet.Publish.Body, "body", "", "custom release message (markdow string or file)")
7175
releaseSet.Publish.Fs.StringVar(&releaseSet.Publish.PatchLevel, "patchLevel", "", "predefine version to Update")
@@ -114,7 +118,7 @@ func printNoValidCommand(usage func()) {
114118
func main() {
115119
flag.Usage = func() {
116120
fmt.Println("awesome-ci makes your CI easy.")
117-
fmt.Println(" Find more information and examples at: https://github.com/eksrvb/awesome-ci")
121+
fmt.Println(" Find more information and examples at: https://github.com/fullstack-devops/awesome-ci")
118122
fmt.Println()
119123
fmt.Println("Available commands:")
120124
fmt.Println(" release")

release-template.md

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
11
## Awesome-CI
22

3-
this project is still in the beta phase. But don't be shy and use this tool in advance. If you find bugs or have improvements, please feel free to open an [issue](https://github.com/fullstack-devops/awesome-ci/issues/new/choose) :rocket:
3+
This project is still in the **beta** phase.
4+
5+
But don't be shy and use this tool in advance. If you find bugs or have improvements, please feel free to open an [issue](https://github.com/fullstack-devops/awesome-ci/issues/new/choose) :rocket:

src/acigithub/pullrequest.go

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ import (
1212
)
1313

1414
// GetPrInfos need the PullRequest-Number
15-
func GetPrInfos(prNumber int) (standardPrInfos *models.StandardPrInfos, prInfos *github.PullRequest, err error) {
15+
func GetPrInfos(prNumber int, mergeCommitSha string) (standardPrInfos *models.StandardPrInfos, prInfos *github.PullRequest, err error) {
1616
if !isgithubRepository {
1717
log.Fatalln("make shure the GITHUB_REPOSITORY is available!")
1818
}
@@ -23,6 +23,35 @@ func GetPrInfos(prNumber int) (standardPrInfos *models.StandardPrInfos, prInfos
2323
return nil, nil, fmt.Errorf("could not load any information about the given pull request %d: %v", prNumber, err)
2424
}
2525
}
26+
if mergeCommitSha != "" && prNumber == 0 {
27+
prOpts := github.PullRequestListOptions{
28+
State: "all",
29+
Sort: "updated",
30+
Direction: "desc",
31+
ListOptions: github.ListOptions{
32+
PerPage: 10,
33+
},
34+
}
35+
pullRequests, _, err := GithubClient.PullRequests.List(ctx, owner, repo, &prOpts)
36+
if err != nil {
37+
return nil, nil, fmt.Errorf("could not load any information about the given pull request %d: %v", prNumber, err)
38+
}
39+
var found int = 0
40+
for _, pr := range pullRequests {
41+
fmt.Println(*pr.MergeCommitSHA == mergeCommitSha, *pr.MergeCommitSHA)
42+
if *pr.MergeCommitSHA == mergeCommitSha {
43+
prInfos = pr
44+
found = found + 1
45+
}
46+
}
47+
if found > 1 {
48+
return nil, nil, fmt.Errorf("found more than one pull request, this should not be possible. please open an issue with all log files")
49+
}
50+
}
51+
52+
if prInfos == nil {
53+
return nil, nil, fmt.Errorf("no pull request found, please check if all resources are specified")
54+
}
2655

2756
prSHA := *prInfos.Head.SHA
2857
branchName := *prInfos.Head.Ref
@@ -62,6 +91,7 @@ func GetPrInfos(prNumber int) (standardPrInfos *models.StandardPrInfos, prInfos
6291
LatestVersion: *repositoryRelease.TagName,
6392
CurrentVersion: "",
6493
NextVersion: nextVersion,
94+
MergeCommitSha: *prInfos.MergeCommitSHA,
6595
}
6696
return
6797
}

src/acigithub/release.go

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,14 +12,16 @@ import (
1212
)
1313

1414
// CreateRelease
15-
func CreateRelease(version string, body string, draft bool) (createdRelease *github.RepositoryRelease, err error) {
15+
func CreateRelease(version string, releaseBranch string, body string, draft bool) (createdRelease *github.RepositoryRelease, err error) {
1616
if !isgithubRepository {
1717
log.Fatalln("make shure the GITHUB_REPOSITORY is available!")
1818
}
1919
owner, repo := tools.DevideOwnerAndRepo(githubRepository)
2020

2121
relName := "Release " + version
22-
defaultBranch := tools.GetDefaultBranch()
22+
if releaseBranch == "" {
23+
releaseBranch = tools.GetDefaultBranch()
24+
}
2325

2426
// get body for release
2527
if body != "" {
@@ -30,7 +32,7 @@ func CreateRelease(version string, body string, draft bool) (createdRelease *git
3032
}
3133

3234
releaseObject := github.RepositoryRelease{
33-
TargetCommitish: &defaultBranch,
35+
TargetCommitish: &releaseBranch,
3436
TagName: &version,
3537
Name: &relName,
3638
Draft: &draft,
@@ -56,7 +58,7 @@ func CreateRelease(version string, body string, draft bool) (createdRelease *git
5658
}
5759

5860
// PublishRelease
59-
func PublishRelease(version string, body string, releaseId int64, uploadArtifacts *string) (err error) {
61+
func PublishRelease(version string, releaseBranch string, body string, releaseId int64, uploadArtifacts *string) (err error) {
6062
draftFalse := false
6163
if !isgithubRepository {
6264
log.Fatalln("make shure the GITHUB_REPOSITORY is available!")
@@ -67,7 +69,7 @@ func PublishRelease(version string, body string, releaseId int64, uploadArtifact
6769
releaseIdStr, releaseIdBool := os.LookupEnv("ACI_RELEASE_ID")
6870
if !releaseIdBool {
6971
log.Println("No release found, creating one...")
70-
release, err := CreateRelease(version, body, false)
72+
release, err := CreateRelease(version, releaseBranch, body, true)
7173
if err != nil {
7274
log.Fatalln(err)
7375
}
@@ -92,7 +94,7 @@ func PublishRelease(version string, body string, releaseId int64, uploadArtifact
9294

9395
// upload any given artifacts
9496
var releaseBodyAssets string = ""
95-
if uploadArtifacts != nil {
97+
if *uploadArtifacts != "" {
9698
filesAndInfos, err := tools.GetAsstes(uploadArtifacts, false)
9799
if err != nil {
98100
return err

src/models/models.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,4 +11,5 @@ type StandardPrInfos struct {
1111
Sha string
1212
ShaShort string
1313
BranchName string
14+
MergeCommitSha string
1415
}

src/service/pullrequest.go

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -21,22 +21,17 @@ type PullRequestInfoSet struct {
2121
}
2222

2323
func PrintPRInfos(args *PullRequestInfoSet) {
24-
var prNumber int
2524
_, err := acigithub.NewGitHubClient()
2625
if err != nil {
2726
log.Fatalln(err)
2827
}
2928

30-
if args.Number == 0 {
31-
prNumber, err = evalPrNumber(&args.Number)
32-
if err != nil {
33-
log.Fatalln(err)
34-
}
35-
} else {
36-
prNumber = args.Number
29+
err = evalPrNumber(&args.Number)
30+
if err != nil {
31+
log.Fatalln(err)
3732
}
3833

39-
prInfos, _, err := acigithub.GetPrInfos(prNumber)
34+
prInfos, _, err := acigithub.GetPrInfos(args.Number, "")
4035
if err != nil {
4136
log.Fatalln(err)
4237
}

src/service/release.go

Lines changed: 46 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -19,23 +19,27 @@ type ReleaseSet struct {
1919
}
2020

2121
type ReleaseCreateSet struct {
22-
Fs *flag.FlagSet
23-
Version string
24-
PatchLevel string
25-
PrNumber int
26-
DryRun bool
27-
Body string
22+
Fs *flag.FlagSet
23+
Version string
24+
PatchLevel string
25+
PrNumber int
26+
MergeCommitSHA string
27+
ReleaseBranch string
28+
DryRun bool
29+
Body string
2830
}
2931

3032
type ReleasePublishSet struct {
31-
Fs *flag.FlagSet
32-
Version string
33-
PatchLevel string
34-
ReleaseId int64
35-
Assets string
36-
PrNumber int
37-
DryRun bool
38-
Body string
33+
Fs *flag.FlagSet
34+
Version string
35+
PatchLevel string
36+
ReleaseId int64
37+
Assets string
38+
PrNumber int
39+
MergeCommitSHA string
40+
ReleaseBranch string
41+
DryRun bool
42+
Body string
3943
}
4044

4145
func ReleaseCreate(args *ReleaseCreateSet) {
@@ -53,22 +57,28 @@ func ReleaseCreate(args *ReleaseCreateSet) {
5357
} else if args.Version != "" && args.PatchLevel == "" {
5458
version = args.Version
5559
} else {
56-
prNumber, err := evalPrNumber(&args.PrNumber)
57-
if err != nil {
58-
log.Fatalln(err)
60+
// if no merge commit sha is provided, the pull request number should either be specified or evaluated from the merge message (fallback)
61+
if args.MergeCommitSHA == "" {
62+
err := evalPrNumber(&args.PrNumber)
63+
if err != nil {
64+
log.Fatalln(err)
65+
}
5966
}
60-
prInfos, _, err := acigithub.GetPrInfos(prNumber)
67+
prInfos, _, err := acigithub.GetPrInfos(args.PrNumber, args.MergeCommitSHA)
6168
if err != nil {
6269
log.Fatalln(err)
6370
}
6471
version = prInfos.NextVersion
72+
if errEnvs := standardPrInfosToEnv(prInfos); errEnvs != nil {
73+
log.Fatalln(errEnvs)
74+
}
6575
}
6676

6777
if args.DryRun {
6878
fmt.Printf("Would create new release with version: %s\n", version)
6979
} else {
7080
fmt.Printf("Writing new release: %s\n", version)
71-
createdRelease, err := acigithub.CreateRelease(version, args.Body, true)
81+
createdRelease, err := acigithub.CreateRelease(version, args.ReleaseBranch, args.Body, true)
7282
if err != nil {
7383
log.Fatalln(err)
7484
}
@@ -91,15 +101,21 @@ func ReleasePublish(args *ReleasePublishSet) {
91101
} else if args.Version != "" && args.PatchLevel == "" {
92102
version = args.Version
93103
} else if args.ReleaseId == 0 {
94-
prNumber, err := evalPrNumber(&args.PrNumber)
95-
if err != nil {
96-
log.Fatalln(err)
104+
// if no merge commit sha is provided, the pull request number should either be specified or evaluated from the merge message (fallback)
105+
if args.MergeCommitSHA == "" {
106+
err := evalPrNumber(&args.PrNumber)
107+
if err != nil {
108+
log.Fatalln(err)
109+
}
97110
}
98-
prInfos, _, err := acigithub.GetPrInfos(prNumber)
111+
prInfos, _, err := acigithub.GetPrInfos(args.PrNumber, args.MergeCommitSHA)
99112
if err != nil {
100113
log.Fatalln(err)
101114
}
102115
version = prInfos.NextVersion
116+
if errEnvs := standardPrInfosToEnv(prInfos); errEnvs != nil {
117+
log.Fatalln(errEnvs)
118+
}
103119
}
104120

105121
if args.Assets != "" {
@@ -113,26 +129,22 @@ func ReleasePublish(args *ReleasePublishSet) {
113129
fmt.Printf("Would publishing release: %s\n", version)
114130
} else {
115131
fmt.Printf("Publishing release: %s - %d\n", version, args.ReleaseId)
116-
err = acigithub.PublishRelease(version, args.Body, args.ReleaseId, &args.Assets)
132+
err = acigithub.PublishRelease(version, args.ReleaseBranch, args.Body, args.ReleaseId, &args.Assets)
117133
if err != nil {
118134
log.Fatalln(err)
119135
}
120136
}
121137
}
122138

123-
func evalPrNumber(override *int) (prNumber int, err error) {
139+
func evalPrNumber(override *int) (err error) {
124140
if *override != 0 {
125-
return *override, nil
141+
return nil
126142
}
127143

128-
prNumber, err = getPrFromMergeMessage()
144+
*override, err = getPrFromMergeMessage()
129145
if err != nil {
130-
log.Fatalln(err)
146+
return err
131147
}
132-
133-
/* if prNumber == 0 {
134-
// tags, _, _ := CiEnvironment.Clients.GithubClient.Repositories.ListTags()
135-
} */
136148
return
137149
}
138150

@@ -146,6 +158,7 @@ func getPrFromMergeMessage() (pr int, err error) {
146158
} else {
147159
return 0, errors.New("No PR found in merge message pls make shure this regex matches: " + regex +
148160
"\nExample: Merge pull request #3 from some-orga/feature/awesome-feature" +
149-
"\nIf you like to set your patch level manually by flag: -level (feautre|bugfix)")
161+
"\nIf you like to set your patch level manually by flag: -level (feautre|bugfix)" +
162+
"\nOr use the -merge-sha option!")
150163
}
151164
}

src/service/service.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ func standardPrInfosToEnv(prInfos *models.StandardPrInfos) (err error) {
4747
envVars.Set("ACI_PATCH_LEVEL", prInfos.PatchLevel)
4848
envVars.Set("ACI_VERSION", prInfos.NextVersion)
4949
envVars.Set("ACI_LATEST_VERSION", prInfos.LatestVersion)
50+
envVars.Set("ACI_MERGE_COMMIT_SHA", prInfos.MergeCommitSha)
5051
err = envVars.SaveEnvFile()
5152
if err != nil {
5253
return err

0 commit comments

Comments
 (0)