mirror of https://github.com/portainer/portainer
				
				
				
			
		
			
				
	
	
		
			103 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			Go
		
	
	
			
		
		
	
	
			103 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			Go
		
	
	
| package update
 | |
| 
 | |
| import (
 | |
| 	"strings"
 | |
| 
 | |
| 	"github.com/pkg/errors"
 | |
| 
 | |
| 	portainer "github.com/portainer/portainer/api"
 | |
| 	"github.com/portainer/portainer/api/filesystem"
 | |
| 	"github.com/portainer/portainer/api/git"
 | |
| 	gittypes "github.com/portainer/portainer/api/git/types"
 | |
| 	"github.com/rs/zerolog/log"
 | |
| )
 | |
| 
 | |
| // UpdateGitObject updates a git object based on its config
 | |
| func UpdateGitObject(gitService portainer.GitService, objId string, gitConfig *gittypes.RepoConfig, forceUpdate, enableVersionFolder bool, projectPath string) (bool, string, error) {
 | |
| 	if gitConfig == nil {
 | |
| 		return false, "", nil
 | |
| 	}
 | |
| 
 | |
| 	log.Debug().
 | |
| 		Str("url", gitConfig.URL).
 | |
| 		Str("ref", gitConfig.ReferenceName).
 | |
| 		Str("object", objId).
 | |
| 		Msg("the object has a git config, try to poll from git repository")
 | |
| 
 | |
| 	username, password, err := git.GetCredentials(gitConfig.Authentication)
 | |
| 	if err != nil {
 | |
| 		return false, "", errors.WithMessagef(err, "failed to get credentials for %v", objId)
 | |
| 	}
 | |
| 
 | |
| 	newHash, err := gitService.LatestCommitID(gitConfig.URL, gitConfig.ReferenceName, username, password, gitConfig.TLSSkipVerify)
 | |
| 	if err != nil {
 | |
| 		return false, "", errors.WithMessagef(err, "failed to fetch latest commit id of %v", objId)
 | |
| 	}
 | |
| 
 | |
| 	hashChanged := !strings.EqualFold(newHash, gitConfig.ConfigHash)
 | |
| 
 | |
| 	if !hashChanged && !forceUpdate {
 | |
| 		log.Debug().
 | |
| 			Str("hash", newHash).
 | |
| 			Str("url", gitConfig.URL).
 | |
| 			Str("ref", gitConfig.ReferenceName).
 | |
| 			Str("object", objId).
 | |
| 			Msg("git repo is up to date")
 | |
| 
 | |
| 		return false, newHash, nil
 | |
| 	}
 | |
| 
 | |
| 	toDir := projectPath
 | |
| 	if enableVersionFolder {
 | |
| 		toDir = filesystem.JoinPaths(projectPath, newHash)
 | |
| 	}
 | |
| 
 | |
| 	cloneParams := &cloneRepositoryParameters{
 | |
| 		url:           gitConfig.URL,
 | |
| 		ref:           gitConfig.ReferenceName,
 | |
| 		toDir:         toDir,
 | |
| 		tlsSkipVerify: gitConfig.TLSSkipVerify,
 | |
| 	}
 | |
| 	if gitConfig.Authentication != nil {
 | |
| 		cloneParams.auth = &gitAuth{
 | |
| 			username: username,
 | |
| 			password: password,
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	if err := cloneGitRepository(gitService, cloneParams); err != nil {
 | |
| 		return false, "", errors.WithMessagef(err, "failed to do a fresh clone of %v", objId)
 | |
| 	}
 | |
| 
 | |
| 	log.Debug().
 | |
| 		Str("hash", newHash).
 | |
| 		Str("url", gitConfig.URL).
 | |
| 		Str("ref", gitConfig.ReferenceName).
 | |
| 		Str("object", objId).
 | |
| 		Msg("git repo cloned updated")
 | |
| 
 | |
| 	return true, newHash, nil
 | |
| }
 | |
| 
 | |
| type cloneRepositoryParameters struct {
 | |
| 	url   string
 | |
| 	ref   string
 | |
| 	toDir string
 | |
| 	auth  *gitAuth
 | |
| 	// tlsSkipVerify skips SSL verification when cloning the Git repository
 | |
| 	tlsSkipVerify bool `example:"false"`
 | |
| }
 | |
| 
 | |
| type gitAuth struct {
 | |
| 	username string
 | |
| 	password string
 | |
| }
 | |
| 
 | |
| func cloneGitRepository(gitService portainer.GitService, cloneParams *cloneRepositoryParameters) error {
 | |
| 	if cloneParams.auth != nil {
 | |
| 		return gitService.CloneRepository(cloneParams.toDir, cloneParams.url, cloneParams.ref, cloneParams.auth.username, cloneParams.auth.password, cloneParams.tlsSkipVerify)
 | |
| 	}
 | |
| 
 | |
| 	return gitService.CloneRepository(cloneParams.toDir, cloneParams.url, cloneParams.ref, "", "", cloneParams.tlsSkipVerify)
 | |
| }
 |