All checks were successful
Auto Tag Develop / tag (push) Successful in 6s
Reviewed-on: #1 Co-authored-by: tristan <tristan@yuno.malio.fr> Co-committed-by: tristan <tristan@yuno.malio.fr>
94 lines
2.6 KiB
PHP
94 lines
2.6 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace App\Service;
|
|
|
|
use Symfony\Component\DependencyInjection\Attribute\Autowire;
|
|
use Symfony\Contracts\HttpClient\HttpClientInterface;
|
|
|
|
final readonly class GiteaRegistryService
|
|
{
|
|
public function __construct(
|
|
private HttpClientInterface $httpClient,
|
|
#[Autowire('%env(GITEA_API_URL)%')]
|
|
private string $giteaApiUrl,
|
|
#[Autowire('%env(GITEA_API_TOKEN)%')]
|
|
private string $giteaApiToken,
|
|
) {}
|
|
|
|
/**
|
|
* List available tags for a container image.
|
|
*
|
|
* @param string $registryImage e.g. "gitea.malio.fr/malio-dev/sirh"
|
|
*
|
|
* @return list<string>
|
|
*/
|
|
public function listTags(string $registryImage): array
|
|
{
|
|
$parts = explode('/', $registryImage);
|
|
|
|
if (\count($parts) < 3) {
|
|
throw new \InvalidArgumentException(sprintf('Invalid registry image format: "%s". Expected "registry/owner/package".', $registryImage));
|
|
}
|
|
|
|
$owner = $parts[1];
|
|
$package = implode('/', \array_slice($parts, 2));
|
|
|
|
$bearerToken = $this->getBearerToken($owner, $package);
|
|
|
|
$url = sprintf('%s/v2/%s/%s/tags/list', $this->giteaApiUrl, $owner, $package);
|
|
|
|
$response = $this->httpClient->request('GET', $url, [
|
|
'headers' => [
|
|
'Authorization' => sprintf('Bearer %s', $bearerToken),
|
|
],
|
|
'timeout' => 10,
|
|
]);
|
|
|
|
$data = $response->toArray();
|
|
|
|
$tags = $data['tags'] ?? [];
|
|
|
|
usort($tags, function (string $a, string $b): int {
|
|
$aIsVersion = str_starts_with($a, 'v');
|
|
$bIsVersion = str_starts_with($b, 'v');
|
|
|
|
if ($aIsVersion && $bIsVersion) {
|
|
return version_compare(ltrim($b, 'v'), ltrim($a, 'v'));
|
|
}
|
|
|
|
if ($aIsVersion) {
|
|
return -1;
|
|
}
|
|
|
|
if ($bIsVersion) {
|
|
return 1;
|
|
}
|
|
|
|
return strcmp($a, $b);
|
|
});
|
|
|
|
return $tags;
|
|
}
|
|
|
|
private function getBearerToken(string $owner, string $package): string
|
|
{
|
|
$tokenUrl = sprintf(
|
|
'%s/v2/token?service=container_registry&scope=repository:%s/%s:pull',
|
|
$this->giteaApiUrl,
|
|
$owner,
|
|
$package,
|
|
);
|
|
|
|
$response = $this->httpClient->request('GET', $tokenUrl, [
|
|
'auth_basic' => [$this->giteaApiToken, ''],
|
|
'timeout' => 10,
|
|
]);
|
|
|
|
$data = $response->toArray();
|
|
|
|
return $data['token'] ?? throw new \RuntimeException('Failed to obtain bearer token from Gitea registry.');
|
|
}
|
|
}
|