GetLatestGitHubRelease fetches the latest version and release body from GitHub releases with a timeout.
(ctx context.Context, logger *zap.Logger)
| 509 | |
| 510 | // GetLatestGitHubRelease fetches the latest version and release body from GitHub releases with a timeout. |
| 511 | func GetLatestGitHubRelease(ctx context.Context, logger *zap.Logger) (GitHubRelease, error) { |
| 512 | // GitHub repository details |
| 513 | repoOwner := "keploy" |
| 514 | repoName := "keploy" |
| 515 | |
| 516 | apiURL := fmt.Sprintf("https://api.github.com/repos/%s/%s/releases/latest", repoOwner, repoName) |
| 517 | |
| 518 | client := http.Client{ |
| 519 | Timeout: 4 * time.Second, |
| 520 | } |
| 521 | |
| 522 | req, err := http.NewRequestWithContext(ctx, "GET", apiURL, nil) |
| 523 | if err != nil { |
| 524 | return GitHubRelease{}, err |
| 525 | } |
| 526 | |
| 527 | resp, err := client.Do(req) |
| 528 | if err != nil { |
| 529 | var netErr net.Error |
| 530 | if errors.As(err, &netErr) && netErr.Timeout() { |
| 531 | return GitHubRelease{}, ErrGitHubAPIUnresponsive |
| 532 | } |
| 533 | return GitHubRelease{}, err |
| 534 | } |
| 535 | defer func() { |
| 536 | if err := resp.Body.Close(); err != nil { |
| 537 | LogError(logger, err, "failed to close response body") |
| 538 | } |
| 539 | }() |
| 540 | |
| 541 | var release GitHubRelease |
| 542 | if err := json.NewDecoder(resp.Body).Decode(&release); err != nil { |
| 543 | return GitHubRelease{}, err |
| 544 | } |
| 545 | return release, nil |
| 546 | } |
| 547 | |
| 548 | // FindDockerCmd checks if the cli is related to docker or not, it also returns if it is a docker compose file |
| 549 | // ExtractCommandFromArgs parses os.Args to find the value of -c or --command flag. |