@@ -21,6 +21,7 @@ import axios from "axios";
2121import semver from "semver" ;
2222import logger from "../logger" ;
2323import { constraintsLabel } from "./constraints" ;
24+ import { getLatestTaggedRelease } from "../scorekeeper/jobs/specificJobs" ;
2425
2526export const checkOnline = async ( candidate : any ) : Promise < boolean > => {
2627 try {
@@ -89,43 +90,66 @@ export const checkLatestClientVersion = async (
8990) : Promise < boolean > => {
9091 try {
9192 const skipClientUpgrade = config . constraints ?. skipClientUpgrade || false ;
92- if ( ! skipClientUpgrade ) {
93- if ( candidate ?. implementation == "Kagome Node" ) {
94- await setLatestClientReleaseValidity ( candidate . stash , true ) ;
95- return true ;
93+ if ( skipClientUpgrade || candidate ?. implementation === "Kagome Node" ) {
94+ // Skip the check if the node is a Kagome Client or if skipping client upgrade is enabled
95+ await setLatestClientReleaseValidity ( candidate . stash , true ) ;
96+ return true ;
97+ }
98+
99+ // The latest release that is manually set in the config (set if there's reasons for people to downgrade)
100+ const forceLatestRelease = config . constraints . forceClientVersion ;
101+
102+ // Get the latest release from the db or github
103+ let latestRelease = await getLatestRelease ( ) ;
104+ if ( ! latestRelease ) {
105+ logger . info (
106+ `No latest release found, fetching from GitHub` ,
107+ constraintsLabel ,
108+ ) ;
109+ latestRelease = await getLatestTaggedRelease ( ) ;
110+ logger . info (
111+ `Latest release fetched from GitHub: ${ latestRelease } ` ,
112+ constraintsLabel ,
113+ ) ;
114+ }
115+
116+ // Check if there is a latest release and if the current time is past the grace window
117+ const isPastGraceWindow =
118+ latestRelease &&
119+ Date . now ( ) > latestRelease . publishedAt + Constants . SIXTEEN_HOURS ;
120+
121+ if ( latestRelease && isPastGraceWindow ) {
122+ const nodeVersion = semver . coerce ( candidate . version ) ;
123+ const latestVersion = forceLatestRelease
124+ ? semver . clean ( forceLatestRelease )
125+ : semver . clean ( latestRelease . name ) ;
126+
127+ logger . info (
128+ `Checking latest client version: ${ nodeVersion } >= ${ latestVersion } ` ,
129+ constraintsLabel ,
130+ ) ;
131+
132+ // If cannot parse the version, set the release as invalid
133+ if ( ! nodeVersion || ! latestVersion ) {
134+ await setLatestClientReleaseValidity ( candidate . stash , false ) ;
135+ return false ;
96136 }
97137
98- const forceLatestRelease = config . constraints . forceClientVersion ;
99- const latestRelease = await getLatestRelease ( ) ;
100- if (
101- candidate . version &&
102- latestRelease &&
103- Date . now ( ) > latestRelease . publishedAt + Constants . SIXTEEN_HOURS
104- ) {
105- const nodeVersion = semver . coerce ( candidate . version ) ;
106- const latestVersion = forceLatestRelease
107- ? semver . clean ( forceLatestRelease )
108- : semver . clean ( latestRelease . name ) ;
109- if ( ! nodeVersion || ! latestVersion ) {
110- await setLatestClientReleaseValidity ( candidate . stash , false ) ;
111- return false ;
112- }
138+ const isUpgraded = semver . gte ( nodeVersion , latestVersion ) ;
113139
114- const isUpgraded = semver . gte ( nodeVersion , latestVersion ) ;
115- if ( ! isUpgraded ) {
116- await setLatestClientReleaseValidity ( candidate . stash , false ) ;
117- return false ;
118- } else {
119- await setLatestClientReleaseValidity ( candidate . stash , true ) ;
120- return true ;
121- }
122- } else {
140+ // If they are not upgrade, set the validity as invalid
141+ if ( ! isUpgraded ) {
123142 await setLatestClientReleaseValidity ( candidate . stash , false ) ;
124143 return false ;
125144 }
126- } else {
145+
146+ // If the current version is the latest release, set the release as valid
127147 await setLatestClientReleaseValidity ( candidate . stash , true ) ;
128148 return true ;
149+ } else {
150+ // If there is no latest release or if not past the grace window, set the release as invalid
151+ await setLatestClientReleaseValidity ( candidate . stash , false ) ;
152+ return false ;
129153 }
130154 } catch ( e ) {
131155 logger . error (
0 commit comments