gitea源码

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. // Copyright 2022 The Gitea Authors. All rights reserved.
  2. // SPDX-License-Identifier: MIT
  3. package container
  4. import (
  5. "context"
  6. "time"
  7. packages_model "code.gitea.io/gitea/models/packages"
  8. container_model "code.gitea.io/gitea/models/packages/container"
  9. "code.gitea.io/gitea/modules/optional"
  10. container_module "code.gitea.io/gitea/modules/packages/container"
  11. packages_service "code.gitea.io/gitea/services/packages"
  12. "github.com/opencontainers/go-digest"
  13. )
  14. // Cleanup removes expired container data
  15. func Cleanup(ctx context.Context, olderThan time.Duration) error {
  16. if err := cleanupExpiredBlobUploads(ctx, olderThan); err != nil {
  17. return err
  18. }
  19. return cleanupExpiredUploadedBlobs(ctx, olderThan)
  20. }
  21. // cleanupExpiredBlobUploads removes expired blob uploads
  22. func cleanupExpiredBlobUploads(ctx context.Context, olderThan time.Duration) error {
  23. pbus, err := packages_model.FindExpiredBlobUploads(ctx, olderThan)
  24. if err != nil {
  25. return err
  26. }
  27. for _, pbu := range pbus {
  28. if err := RemoveBlobUploadByID(ctx, pbu.ID); err != nil {
  29. return err
  30. }
  31. }
  32. return nil
  33. }
  34. // cleanupExpiredUploadedBlobs removes expired uploaded blobs not referenced by a manifest
  35. func cleanupExpiredUploadedBlobs(ctx context.Context, olderThan time.Duration) error {
  36. pfs, err := container_model.SearchExpiredUploadedBlobs(ctx, olderThan)
  37. if err != nil {
  38. return err
  39. }
  40. for _, pf := range pfs {
  41. if err := packages_service.DeletePackageFile(ctx, pf); err != nil {
  42. return err
  43. }
  44. }
  45. pvs, _, err := packages_model.SearchVersions(ctx, &packages_model.PackageSearchOptions{
  46. Type: packages_model.TypeContainer,
  47. Version: packages_model.SearchValue{
  48. ExactMatch: true,
  49. Value: container_module.UploadVersion,
  50. },
  51. IsInternal: optional.Some(true),
  52. HasFiles: optional.Some(false),
  53. })
  54. if err != nil {
  55. return err
  56. }
  57. for _, pv := range pvs {
  58. if err := packages_model.DeleteAllProperties(ctx, packages_model.PropertyTypeVersion, pv.ID); err != nil {
  59. return err
  60. }
  61. if err := packages_model.DeleteVersionByID(ctx, pv.ID); err != nil {
  62. return err
  63. }
  64. }
  65. return nil
  66. }
  67. func ShouldBeSkipped(ctx context.Context, pcr *packages_model.PackageCleanupRule, p *packages_model.Package, pv *packages_model.PackageVersion) (bool, error) {
  68. // Always skip the "latest" tag
  69. if pv.LowerVersion == "latest" {
  70. return true, nil
  71. }
  72. // Check if the version is a digest (or untagged)
  73. if digest.Digest(pv.LowerVersion).Validate() == nil {
  74. // Check if there is another manifest referencing this version
  75. has, err := packages_model.ExistVersion(ctx, &packages_model.PackageSearchOptions{
  76. PackageID: p.ID,
  77. Properties: map[string]string{
  78. container_module.PropertyManifestReference: pv.LowerVersion,
  79. },
  80. })
  81. if err != nil {
  82. return false, err
  83. }
  84. // Skip it if the version is referenced
  85. if has {
  86. return true, nil
  87. }
  88. }
  89. return false, nil
  90. }