code.gitea.io/gitea@v1.21.7/services/cron/tasks_extended.go (about)

     1  // Copyright 2020 The Gitea Authors. All rights reserved.
     2  // SPDX-License-Identifier: MIT
     3  
     4  package cron
     5  
     6  import (
     7  	"context"
     8  	"time"
     9  
    10  	activities_model "code.gitea.io/gitea/models/activities"
    11  	asymkey_model "code.gitea.io/gitea/models/asymkey"
    12  	"code.gitea.io/gitea/models/system"
    13  	user_model "code.gitea.io/gitea/models/user"
    14  	"code.gitea.io/gitea/modules/git"
    15  	issue_indexer "code.gitea.io/gitea/modules/indexer/issues"
    16  	"code.gitea.io/gitea/modules/setting"
    17  	"code.gitea.io/gitea/modules/updatechecker"
    18  	repo_service "code.gitea.io/gitea/services/repository"
    19  	archiver_service "code.gitea.io/gitea/services/repository/archiver"
    20  	user_service "code.gitea.io/gitea/services/user"
    21  )
    22  
    23  func registerDeleteInactiveUsers() {
    24  	RegisterTaskFatal("delete_inactive_accounts", &OlderThanConfig{
    25  		BaseConfig: BaseConfig{
    26  			Enabled:    false,
    27  			RunAtStart: false,
    28  			Schedule:   "@annually",
    29  		},
    30  		OlderThan: time.Minute * time.Duration(setting.Service.ActiveCodeLives),
    31  	}, func(ctx context.Context, _ *user_model.User, config Config) error {
    32  		olderThanConfig := config.(*OlderThanConfig)
    33  		return user_service.DeleteInactiveUsers(ctx, olderThanConfig.OlderThan)
    34  	})
    35  }
    36  
    37  func registerDeleteRepositoryArchives() {
    38  	RegisterTaskFatal("delete_repo_archives", &BaseConfig{
    39  		Enabled:    false,
    40  		RunAtStart: false,
    41  		Schedule:   "@annually",
    42  	}, func(ctx context.Context, _ *user_model.User, _ Config) error {
    43  		return archiver_service.DeleteRepositoryArchives(ctx)
    44  	})
    45  }
    46  
    47  func registerGarbageCollectRepositories() {
    48  	type RepoHealthCheckConfig struct {
    49  		BaseConfig
    50  		Timeout time.Duration
    51  		Args    []string `delim:" "`
    52  	}
    53  	RegisterTaskFatal("git_gc_repos", &RepoHealthCheckConfig{
    54  		BaseConfig: BaseConfig{
    55  			Enabled:    false,
    56  			RunAtStart: false,
    57  			Schedule:   "@every 72h",
    58  		},
    59  		Timeout: time.Duration(setting.Git.Timeout.GC) * time.Second,
    60  		Args:    setting.Git.GCArgs,
    61  	}, func(ctx context.Context, _ *user_model.User, config Config) error {
    62  		rhcConfig := config.(*RepoHealthCheckConfig)
    63  		// the git args are set by config, they can be safe to be trusted
    64  		return repo_service.GitGcRepos(ctx, rhcConfig.Timeout, git.ToTrustedCmdArgs(rhcConfig.Args))
    65  	})
    66  }
    67  
    68  func registerRewriteAllPublicKeys() {
    69  	RegisterTaskFatal("resync_all_sshkeys", &BaseConfig{
    70  		Enabled:    false,
    71  		RunAtStart: false,
    72  		Schedule:   "@every 72h",
    73  	}, func(ctx context.Context, _ *user_model.User, _ Config) error {
    74  		return asymkey_model.RewriteAllPublicKeys(ctx)
    75  	})
    76  }
    77  
    78  func registerRewriteAllPrincipalKeys() {
    79  	RegisterTaskFatal("resync_all_sshprincipals", &BaseConfig{
    80  		Enabled:    false,
    81  		RunAtStart: false,
    82  		Schedule:   "@every 72h",
    83  	}, func(ctx context.Context, _ *user_model.User, _ Config) error {
    84  		return asymkey_model.RewriteAllPrincipalKeys(ctx)
    85  	})
    86  }
    87  
    88  func registerRepositoryUpdateHook() {
    89  	RegisterTaskFatal("resync_all_hooks", &BaseConfig{
    90  		Enabled:    false,
    91  		RunAtStart: false,
    92  		Schedule:   "@every 72h",
    93  	}, func(ctx context.Context, _ *user_model.User, _ Config) error {
    94  		return repo_service.SyncRepositoryHooks(ctx)
    95  	})
    96  }
    97  
    98  func registerReinitMissingRepositories() {
    99  	RegisterTaskFatal("reinit_missing_repos", &BaseConfig{
   100  		Enabled:    false,
   101  		RunAtStart: false,
   102  		Schedule:   "@every 72h",
   103  	}, func(ctx context.Context, _ *user_model.User, _ Config) error {
   104  		return repo_service.ReinitMissingRepositories(ctx)
   105  	})
   106  }
   107  
   108  func registerDeleteMissingRepositories() {
   109  	RegisterTaskFatal("delete_missing_repos", &BaseConfig{
   110  		Enabled:    false,
   111  		RunAtStart: false,
   112  		Schedule:   "@every 72h",
   113  	}, func(ctx context.Context, user *user_model.User, _ Config) error {
   114  		return repo_service.DeleteMissingRepositories(ctx, user)
   115  	})
   116  }
   117  
   118  func registerRemoveRandomAvatars() {
   119  	RegisterTaskFatal("delete_generated_repository_avatars", &BaseConfig{
   120  		Enabled:    false,
   121  		RunAtStart: false,
   122  		Schedule:   "@every 72h",
   123  	}, func(ctx context.Context, _ *user_model.User, _ Config) error {
   124  		return repo_service.RemoveRandomAvatars(ctx)
   125  	})
   126  }
   127  
   128  func registerDeleteOldActions() {
   129  	RegisterTaskFatal("delete_old_actions", &OlderThanConfig{
   130  		BaseConfig: BaseConfig{
   131  			Enabled:    false,
   132  			RunAtStart: false,
   133  			Schedule:   "@every 168h",
   134  		},
   135  		OlderThan: 365 * 24 * time.Hour,
   136  	}, func(ctx context.Context, _ *user_model.User, config Config) error {
   137  		olderThanConfig := config.(*OlderThanConfig)
   138  		return activities_model.DeleteOldActions(ctx, olderThanConfig.OlderThan)
   139  	})
   140  }
   141  
   142  func registerUpdateGiteaChecker() {
   143  	type UpdateCheckerConfig struct {
   144  		BaseConfig
   145  		HTTPEndpoint string
   146  	}
   147  	RegisterTaskFatal("update_checker", &UpdateCheckerConfig{
   148  		BaseConfig: BaseConfig{
   149  			Enabled:    true,
   150  			RunAtStart: false,
   151  			Schedule:   "@every 168h",
   152  		},
   153  		HTTPEndpoint: "https://dl.gitea.com/gitea/version.json",
   154  	}, func(ctx context.Context, _ *user_model.User, config Config) error {
   155  		updateCheckerConfig := config.(*UpdateCheckerConfig)
   156  		return updatechecker.GiteaUpdateChecker(updateCheckerConfig.HTTPEndpoint)
   157  	})
   158  }
   159  
   160  func registerDeleteOldSystemNotices() {
   161  	RegisterTaskFatal("delete_old_system_notices", &OlderThanConfig{
   162  		BaseConfig: BaseConfig{
   163  			Enabled:    false,
   164  			RunAtStart: false,
   165  			Schedule:   "@every 168h",
   166  		},
   167  		OlderThan: 365 * 24 * time.Hour,
   168  	}, func(ctx context.Context, _ *user_model.User, config Config) error {
   169  		olderThanConfig := config.(*OlderThanConfig)
   170  		return system.DeleteOldSystemNotices(ctx, olderThanConfig.OlderThan)
   171  	})
   172  }
   173  
   174  func registerGCLFS() {
   175  	if !setting.LFS.StartServer {
   176  		return
   177  	}
   178  	type GCLFSConfig struct {
   179  		OlderThanConfig
   180  		LastUpdatedMoreThanAgo   time.Duration
   181  		NumberToCheckPerRepo     int64
   182  		ProportionToCheckPerRepo float64
   183  	}
   184  
   185  	RegisterTaskFatal("gc_lfs", &GCLFSConfig{
   186  		OlderThanConfig: OlderThanConfig{
   187  			BaseConfig: BaseConfig{
   188  				Enabled:    false,
   189  				RunAtStart: false,
   190  				Schedule:   "@every 24h",
   191  			},
   192  			// Only attempt to garbage collect lfs meta objects older than a week as the order of git lfs upload
   193  			// and git object upload is not necessarily guaranteed. It's possible to imagine a situation whereby
   194  			// an LFS object is uploaded but the git branch is not uploaded immediately, or there are some rapid
   195  			// changes in new branches that might lead to lfs objects becoming temporarily unassociated with git
   196  			// objects.
   197  			//
   198  			// It is likely that a week is potentially excessive but it should definitely be enough that any
   199  			// unassociated LFS object is genuinely unassociated.
   200  			OlderThan: 24 * time.Hour * 7,
   201  		},
   202  		// Only GC things that haven't been looked at in the past 3 days
   203  		LastUpdatedMoreThanAgo:   24 * time.Hour * 3,
   204  		NumberToCheckPerRepo:     100,
   205  		ProportionToCheckPerRepo: 0.6,
   206  	}, func(ctx context.Context, _ *user_model.User, config Config) error {
   207  		gcLFSConfig := config.(*GCLFSConfig)
   208  		return repo_service.GarbageCollectLFSMetaObjects(ctx, repo_service.GarbageCollectLFSMetaObjectsOptions{
   209  			AutoFix:                 true,
   210  			OlderThan:               time.Now().Add(-gcLFSConfig.OlderThan),
   211  			UpdatedLessRecentlyThan: time.Now().Add(-gcLFSConfig.LastUpdatedMoreThanAgo),
   212  		})
   213  	})
   214  }
   215  
   216  func registerRebuildIssueIndexer() {
   217  	RegisterTaskFatal("rebuild_issue_indexer", &BaseConfig{
   218  		Enabled:    false,
   219  		RunAtStart: false,
   220  		Schedule:   "@annually",
   221  	}, func(ctx context.Context, _ *user_model.User, config Config) error {
   222  		return issue_indexer.PopulateIssueIndexer(ctx)
   223  	})
   224  }
   225  
   226  func initExtendedTasks() {
   227  	registerDeleteInactiveUsers()
   228  	registerDeleteRepositoryArchives()
   229  	registerGarbageCollectRepositories()
   230  	registerRewriteAllPublicKeys()
   231  	registerRewriteAllPrincipalKeys()
   232  	registerRepositoryUpdateHook()
   233  	registerReinitMissingRepositories()
   234  	registerDeleteMissingRepositories()
   235  	registerRemoveRandomAvatars()
   236  	registerDeleteOldActions()
   237  	registerUpdateGiteaChecker()
   238  	registerDeleteOldSystemNotices()
   239  	registerGCLFS()
   240  	registerRebuildIssueIndexer()
   241  }