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:
Casey Lee 2023-01-15 02:30:41 -08:00 committed by GitHub
parent 767e6a8696
commit 93907931df
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
6 changed files with 121 additions and 13 deletions

View file

@ -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

View file

@ -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

1
VERSION Normal file
View file

@ -0,0 +1 @@
0.2.35

90
cmd/notices.go Normal file
View file

@ -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(&notices); err != nil {
log.Debug(err)
return nil
}
return notices
}

View file

@ -34,7 +34,8 @@ func Execute(ctx context.Context, version string) {
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),
PersistentPostRun: cleanup(input),
Version: version, Version: version,
SilenceUsage: true, SilenceUsage: true,
} }
@ -244,11 +245,20 @@ 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) {
return func(cmd *cobra.Command, _ []string) {
verbose, _ := cmd.Flags().GetBool("verbose") verbose, _ := cmd.Flags().GetBool("verbose")
if verbose { if verbose {
log.SetLevel(log.DebugLevel) log.SetLevel(log.DebugLevel)
} }
loadVersionNotices(cmd.Version)
}
}
func cleanup(inputs *Input) func(*cobra.Command, []string) {
return func(cmd *cobra.Command, _ []string) {
displayNotices(inputs)
}
} }
func parseEnvs(env []string, envs map[string]string) bool { func parseEnvs(env []string, envs map[string]string) bool {

View file

@ -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()