Conferir alteracoes durante CI e sinalizar falha ao systemd

This commit is contained in:
2026-10-20 15:12:54 +02:00
parent 6e439def02
commit de061b81aa
+9 -3
View File
@@ -262,6 +262,9 @@ class Delivery:
latest=self.git('rev-parse','refs/heads/delivery-target')
write_json(self.state/'requests'/(latest+'.json'),{'commit':latest,'reason':'newer integration during build'})
return {'status':'superseded','commit':target,'newer_commit':latest}
# A programmer may have edited the served release while CI was running.
# Recheck immediately before the atomic switch, preserving that work.
refuse_drift(self.current.resolve(),installed['hashes'])
previous=promote(self.current,release,lambda:self.health(target))
try:
self.run([self.c['php'],str(release/'artisan'),'queue:restart'],cwd=release)
@@ -274,15 +277,16 @@ class Delivery:
raise
return {key:value for key,value in info.items() if key!='hashes'}
def process(self) -> None:
def process(self) -> bool:
import fcntl
self.state.mkdir(parents=True,exist_ok=True)
for directory in ['reports','logs','processed','qa-runtime']: (self.state/directory).mkdir(exist_ok=True)
with (self.state/'delivery.lock').open('a') as lock:
fcntl.flock(lock,fcntl.LOCK_EX)
succeeded=True
for _ in range(3):
requests=sorted((self.state/'requests').glob('*.json'))
if not requests:return
if not requests:return succeeded
for path in requests:
if not SHA.fullmatch(path.stem):raise RuntimeError('Unexpected queue entry')
path.rename(self.state/'processed'/(path.stem+'-'+uuid.uuid4().hex[:8]+'.json'))
@@ -291,11 +295,13 @@ class Delivery:
try:
target=self.latest();report=self.deliver(target)
except Exception as error:
succeeded=False
report={'status':'failed','commit':target,'error':str(error),'active_release_preserved':True}
finally:self.log=None
report.update(requested_commits=[p.stem for p in requests],finished_at=datetime.datetime.now(datetime.timezone.utc).isoformat())
write_json(self.state/'reports'/((target or 'fetch-failed')+'-'+str(time.time_ns())+'.json'),report)
print(json.dumps(report),flush=True)
return succeeded
def rollback(self) -> dict:
import fcntl
@@ -329,6 +335,6 @@ def main():
if Path(config['legacy_root']).resolve()!=Path('/var/www/html/teste-investidor.tempo.co.mz'):raise SystemExit('Unexpected persistent application target')
runner=Delivery(config)
if args.rollback:print(json.dumps(runner.rollback()),flush=True)
else:runner.process()
else:raise SystemExit(0 if runner.process() else 1)
if __name__=='__main__':main()