feat: add check for newer versions (#1562)
* feat: add check for newer versions * fix: support JSON logger and rever updates to go.mod * fix: keep version updated in source code * fix: lint errors * fix: revert go.*
This commit is contained in:
parent
767e6a8696
commit
93907931df
|
@ -14,7 +14,7 @@ DISABLE_LINTERS:
|
||||||
- MARKDOWN_MARKDOWN_LINK_CHECK
|
- MARKDOWN_MARKDOWN_LINK_CHECK
|
||||||
- REPOSITORY_CHECKOV
|
- REPOSITORY_CHECKOV
|
||||||
- REPOSITORY_TRIVY
|
- REPOSITORY_TRIVY
|
||||||
FILTER_REGEX_EXCLUDE: (.*testdata/*|install.sh|pkg/container/docker_cli.go|pkg/container/DOCKER_LICENSE)
|
FILTER_REGEX_EXCLUDE: (.*testdata/*|install.sh|pkg/container/docker_cli.go|pkg/container/DOCKER_LICENSE|VERSION)
|
||||||
MARKDOWN_MARKDOWNLINT_CONFIG_FILE: .markdownlint.yml
|
MARKDOWN_MARKDOWNLINT_CONFIG_FILE: .markdownlint.yml
|
||||||
PARALLEL: false
|
PARALLEL: false
|
||||||
PRINT_ALPACA: false
|
PRINT_ALPACA: false
|
||||||
|
|
5
Makefile
5
Makefile
|
@ -96,6 +96,9 @@ ifneq ($(shell git status -s),)
|
||||||
@echo "Unable to promote a dirty workspace"
|
@echo "Unable to promote a dirty workspace"
|
||||||
@exit 1
|
@exit 1
|
||||||
endif
|
endif
|
||||||
|
echo -n $(NEW_VERSION) > VERSION
|
||||||
|
git add VERSION
|
||||||
|
git commit -m "chore: bump VERSION"
|
||||||
git tag -a -m "releasing v$(NEW_VERSION)" v$(NEW_VERSION)
|
git tag -a -m "releasing v$(NEW_VERSION)" v$(NEW_VERSION)
|
||||||
git push origin v$(NEW_VERSION)
|
git push origin v$(NEW_VERSION)
|
||||||
|
|
||||||
|
@ -105,3 +108,5 @@ snapshot:
|
||||||
--rm-dist \
|
--rm-dist \
|
||||||
--single-target \
|
--single-target \
|
||||||
--snapshot
|
--snapshot
|
||||||
|
|
||||||
|
.PHONY: clean all
|
||||||
|
|
|
@ -0,0 +1,90 @@
|
||||||
|
package cmd
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/json"
|
||||||
|
"fmt"
|
||||||
|
"net/http"
|
||||||
|
"net/url"
|
||||||
|
"os"
|
||||||
|
"runtime"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
log "github.com/sirupsen/logrus"
|
||||||
|
)
|
||||||
|
|
||||||
|
type Notice struct {
|
||||||
|
Level string `json:"level"`
|
||||||
|
Message string `json:"message"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func displayNotices(input *Input) {
|
||||||
|
select {
|
||||||
|
case notices := <-noticesLoaded:
|
||||||
|
if len(notices) > 0 {
|
||||||
|
noticeLogger := log.New()
|
||||||
|
if input.jsonLogger {
|
||||||
|
noticeLogger.SetFormatter(&log.JSONFormatter{})
|
||||||
|
} else {
|
||||||
|
noticeLogger.SetFormatter(&log.TextFormatter{
|
||||||
|
DisableQuote: true,
|
||||||
|
DisableTimestamp: true,
|
||||||
|
PadLevelText: true,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
fmt.Printf("\n")
|
||||||
|
for _, notice := range notices {
|
||||||
|
level, err := log.ParseLevel(notice.Level)
|
||||||
|
if err != nil {
|
||||||
|
level = log.InfoLevel
|
||||||
|
}
|
||||||
|
noticeLogger.Log(level, notice.Message)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
case <-time.After(time.Second * 1):
|
||||||
|
log.Debugf("Timeout waiting for notices")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var noticesLoaded = make(chan []Notice)
|
||||||
|
|
||||||
|
func loadVersionNotices(version string) {
|
||||||
|
go func() {
|
||||||
|
noticesLoaded <- getVersionNotices(version)
|
||||||
|
}()
|
||||||
|
}
|
||||||
|
|
||||||
|
const NoticeURL = "https://api.nektosact.com/notices"
|
||||||
|
|
||||||
|
func getVersionNotices(version string) []Notice {
|
||||||
|
if os.Getenv("ACT_DISABLE_VERSION_CHECK") == "1" {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
noticeURL, err := url.Parse(NoticeURL)
|
||||||
|
if err != nil {
|
||||||
|
log.Error(err)
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
query := noticeURL.Query()
|
||||||
|
query.Add("os", runtime.GOOS)
|
||||||
|
query.Add("arch", runtime.GOARCH)
|
||||||
|
query.Add("version", version)
|
||||||
|
|
||||||
|
noticeURL.RawQuery = query.Encode()
|
||||||
|
|
||||||
|
resp, err := http.Get(noticeURL.String())
|
||||||
|
if err != nil {
|
||||||
|
log.Debug(err)
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
defer resp.Body.Close()
|
||||||
|
notices := []Notice{}
|
||||||
|
if err := json.NewDecoder(resp.Body).Decode(¬ices); err != nil {
|
||||||
|
log.Debug(err)
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
return notices
|
||||||
|
}
|
32
cmd/root.go
32
cmd/root.go
|
@ -30,13 +30,14 @@ import (
|
||||||
func Execute(ctx context.Context, version string) {
|
func Execute(ctx context.Context, version string) {
|
||||||
input := new(Input)
|
input := new(Input)
|
||||||
var rootCmd = &cobra.Command{
|
var rootCmd = &cobra.Command{
|
||||||
Use: "act [event name to run] [flags]\n\nIf no event name passed, will default to \"on: push\"\nIf actions handles only one event it will be used as default instead of \"on: push\"",
|
Use: "act [event name to run] [flags]\n\nIf no event name passed, will default to \"on: push\"\nIf actions handles only one event it will be used as default instead of \"on: push\"",
|
||||||
Short: "Run GitHub actions locally by specifying the event name (e.g. `push`) or an action name directly.",
|
Short: "Run GitHub actions locally by specifying the event name (e.g. `push`) or an action name directly.",
|
||||||
Args: cobra.MaximumNArgs(1),
|
Args: cobra.MaximumNArgs(1),
|
||||||
RunE: newRunCommand(ctx, input),
|
RunE: newRunCommand(ctx, input),
|
||||||
PersistentPreRun: setupLogging,
|
PersistentPreRun: setup(input),
|
||||||
Version: version,
|
PersistentPostRun: cleanup(input),
|
||||||
SilenceUsage: true,
|
Version: version,
|
||||||
|
SilenceUsage: true,
|
||||||
}
|
}
|
||||||
rootCmd.Flags().BoolP("watch", "w", false, "watch the contents of the local repo and run when files change")
|
rootCmd.Flags().BoolP("watch", "w", false, "watch the contents of the local repo and run when files change")
|
||||||
rootCmd.Flags().BoolP("list", "l", false, "list workflows")
|
rootCmd.Flags().BoolP("list", "l", false, "list workflows")
|
||||||
|
@ -244,10 +245,19 @@ func readArgsFile(file string, split bool) []string {
|
||||||
return args
|
return args
|
||||||
}
|
}
|
||||||
|
|
||||||
func setupLogging(cmd *cobra.Command, _ []string) {
|
func setup(inputs *Input) func(*cobra.Command, []string) {
|
||||||
verbose, _ := cmd.Flags().GetBool("verbose")
|
return func(cmd *cobra.Command, _ []string) {
|
||||||
if verbose {
|
verbose, _ := cmd.Flags().GetBool("verbose")
|
||||||
log.SetLevel(log.DebugLevel)
|
if verbose {
|
||||||
|
log.SetLevel(log.DebugLevel)
|
||||||
|
}
|
||||||
|
loadVersionNotices(cmd.Version)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func cleanup(inputs *Input) func(*cobra.Command, []string) {
|
||||||
|
return func(cmd *cobra.Command, _ []string) {
|
||||||
|
displayNotices(inputs)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
4
main.go
4
main.go
|
@ -2,6 +2,7 @@ package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
_ "embed"
|
||||||
"os"
|
"os"
|
||||||
"os/signal"
|
"os/signal"
|
||||||
"syscall"
|
"syscall"
|
||||||
|
@ -9,7 +10,8 @@ import (
|
||||||
"github.com/nektos/act/cmd"
|
"github.com/nektos/act/cmd"
|
||||||
)
|
)
|
||||||
|
|
||||||
var version = "v0.2.27-dev" // Manually bump after tagging next release
|
//go:embed VERSION
|
||||||
|
var version string
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
ctx := context.Background()
|
ctx := context.Background()
|
||||||
|
|
Loading…
Reference in New Issue