Skip to content

Commit ec2bde6

Browse files
authored
Merge pull request #49 from bitrise-io/file-permission-logging
[ACI-2110] Add file create error context debug logging
2 parents 2b0743b + 7ba7494 commit ec2bde6

File tree

4 files changed

+51
-10
lines changed

4 files changed

+51
-10
lines changed

cmd/restoreXcodeDerivedDataFiles.go

Lines changed: 20 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
package cmd
22

33
import (
4+
"context"
45
"errors"
56
"fmt"
67
"os"
8+
"os/user"
79
"strings"
810
"time"
911

10-
"context"
11-
1212
xa "github.com/bitrise-io/bitrise-build-cache-cli/internal/analytics"
1313
"github.com/bitrise-io/bitrise-build-cache-cli/internal/build_cache/kv"
1414
"github.com/bitrise-io/bitrise-build-cache-cli/internal/config/common"
@@ -34,6 +34,8 @@ var restoreXcodeDerivedDataFilesCmd = &cobra.Command{
3434
RunE: func(cmd *cobra.Command, _ []string) error {
3535
logger := log.NewLogger()
3636
logger.EnableDebugLog(isDebugLogMode)
37+
logCurrentUserInfo(logger)
38+
3739
logger.TInfof("Restore Xcode DerivedData from Bitrise Build Cache")
3840

3941
logger.Infof("(i) Debug mode and verbose logs: %t", isDebugLogMode)
@@ -52,7 +54,7 @@ var restoreXcodeDerivedDataFilesCmd = &cobra.Command{
5254
return fmt.Errorf("read auth config from environments: %w", err)
5355
}
5456

55-
op, cmdError := restoreXcodeDerivedDataFilesCmdFn(cmd.Context(), authConfig, CacheMetadataPath, projectRoot, cacheKey, logger, tracker, startT, os.Getenv)
57+
op, cmdError := restoreXcodeDerivedDataFilesCmdFn(cmd.Context(), authConfig, CacheMetadataPath, projectRoot, cacheKey, logger, tracker, startT, os.Getenv, isDebugLogMode)
5658
if op != nil {
5759
if cmdError != nil {
5860
errStr := cmdError.Error()
@@ -86,7 +88,7 @@ func init() {
8688
}
8789

8890
func restoreXcodeDerivedDataFilesCmdFn(ctx context.Context, authConfig common.CacheAuthConfig, cacheMetadataPath, projectRoot, providedCacheKey string, logger log.Logger,
89-
tracker xcode.StepAnalyticsTracker, startT time.Time, envProvider func(string) string) (*xa.CacheOperation, error) {
91+
tracker xcode.StepAnalyticsTracker, startT time.Time, envProvider func(string) string, isDebugLogMode bool) (*xa.CacheOperation, error) {
9092
kvClient, err := createKVClient(ctx, authConfig, envProvider, logger)
9193
if err != nil {
9294
return nil, fmt.Errorf("create kv client: %w", err)
@@ -125,7 +127,7 @@ func restoreXcodeDerivedDataFilesCmdFn(ctx context.Context, authConfig common.Ca
125127
tracker.LogMetadataLoaded(metadataRestoredT.Sub(startT), string(cacheKeyType), len(metadata.ProjectFiles.Files)+len(metadata.ProjectFiles.Directories), filesUpdated, metadataSize)
126128

127129
logger.TInfof("Downloading DerivedData files")
128-
stats, err := xcode.DownloadCacheFilesFromBuildCache(ctx, metadata.DerivedData, kvClient, logger)
130+
stats, err := xcode.DownloadCacheFilesFromBuildCache(ctx, metadata.DerivedData, kvClient, logger, isDebugLogMode)
129131
ddDownloadedT := time.Now()
130132
tracker.LogDerivedDataDownloaded(ddDownloadedT.Sub(metadataRestoredT), stats)
131133
fillCacheOperationWithDownloadStats(op, stats)
@@ -144,7 +146,7 @@ func restoreXcodeDerivedDataFilesCmdFn(ctx context.Context, authConfig common.Ca
144146

145147
if len(metadata.XcodeCacheDir.Files) > 0 {
146148
logger.TInfof("Downloading Xcode cache files")
147-
if _, err := xcode.DownloadCacheFilesFromBuildCache(ctx, metadata.XcodeCacheDir, kvClient, logger); err != nil {
149+
if _, err := xcode.DownloadCacheFilesFromBuildCache(ctx, metadata.XcodeCacheDir, kvClient, logger, isDebugLogMode); err != nil {
148150
return op, fmt.Errorf("download Xcode cache files: %w", err)
149151
}
150152

@@ -227,3 +229,15 @@ func logCacheMetadata(md *xcode.Metadata, logger log.Logger) {
227229
logger.Infof(" Build Cache CLI version: %s", md.BuildCacheCLIVersion)
228230
logger.Infof(" Metadata version: %d", md.MetadataVersion)
229231
}
232+
233+
func logCurrentUserInfo(logger log.Logger) {
234+
currentUser, err := user.Current()
235+
if err != nil {
236+
logger.Debugf("Error getting current user: %v", err)
237+
}
238+
239+
logger.Debugf("Current user info:")
240+
logger.Debugf(" UID: %s", currentUser.Uid)
241+
logger.Debugf(" GID: %s", currentUser.Gid)
242+
logger.Debugf(" Username: %s", currentUser.Username)
243+
}

cmd/saveXcodeDerivedDataFiles.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@ var saveXcodeDerivedDataFilesCmd = &cobra.Command{
2727
RunE: func(cmd *cobra.Command, _ []string) error {
2828
logger := log.NewLogger()
2929
logger.EnableDebugLog(isDebugLogMode)
30+
logCurrentUserInfo(logger)
31+
3032
logger.TInfof("Save Xcode DerivedData into Bitrise Build Cache")
3133

3234
logger.Infof("(i) Debug mode and verbose logs: %t", isDebugLogMode)

internal/xcode/download.go

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import (
77
"io"
88
"os"
99
"path/filepath"
10+
"syscall"
1011

1112
"google.golang.org/grpc/codes"
1213
"google.golang.org/grpc/status"
@@ -21,7 +22,7 @@ var ErrCacheNotFound = errors.New("no cache archive found for the provided keys"
2122
func DownloadFileFromBuildCache(ctx context.Context, fileName, key string, kvClient *kv.Client, logger log.Logger) error {
2223
logger.Debugf("Downloading %s", fileName)
2324

24-
return downloadFile(ctx, kvClient, fileName, key, 0)
25+
return downloadFile(ctx, kvClient, fileName, key, 0, logger, false)
2526
}
2627

2728
func DownloadStreamFromBuildCache(ctx context.Context, destination io.Writer, key string, kvClient *kv.Client, logger log.Logger) error {
@@ -30,7 +31,7 @@ func DownloadStreamFromBuildCache(ctx context.Context, destination io.Writer, ke
3031
return downloadStream(ctx, destination, kvClient, key)
3132
}
3233

33-
func downloadFile(ctx context.Context, client *kv.Client, filePath, key string, fileMode os.FileMode) error {
34+
func downloadFile(ctx context.Context, client *kv.Client, filePath, key string, fileMode os.FileMode, logger log.Logger, isDebugLogMode bool) error {
3435
dir := filepath.Dir(filePath)
3536
if err := os.MkdirAll(dir, os.ModePerm); err != nil {
3637
return fmt.Errorf("create directory: %w", err)
@@ -41,6 +42,10 @@ func downloadFile(ctx context.Context, client *kv.Client, filePath, key string,
4142
}
4243
file, err := os.OpenFile(filePath, os.O_RDWR|os.O_CREATE|os.O_TRUNC, fileMode)
4344
if err != nil {
45+
if isDebugLogMode {
46+
logFilePathDebugInfo(filePath, logger)
47+
}
48+
4449
return fmt.Errorf("create %q: %w", filePath, err)
4550
}
4651
defer file.Close()
@@ -66,3 +71,23 @@ func downloadStream(ctx context.Context, destination io.Writer, client *kv.Clien
6671

6772
return nil
6873
}
74+
75+
func logFilePathDebugInfo(filePath string, logger log.Logger) {
76+
fileInfo, err := os.Stat(filePath)
77+
if err == nil {
78+
logger.Debugf(" File already exists - permissions: %s\n", fileInfo.Mode().String())
79+
80+
if stat, ok := fileInfo.Sys().(*syscall.Stat_t); ok {
81+
logger.Debugf(" Owner UID: %d Owner GID: %d\n", stat.Uid, stat.Gid)
82+
}
83+
}
84+
85+
dirPath := filepath.Dir(filePath)
86+
dirInfo, err := os.Stat(dirPath)
87+
if err == nil {
88+
logger.Debugf(" Containing dir permissions: %s\n", dirInfo.Mode().String())
89+
if stat, ok := dirInfo.Sys().(*syscall.Stat_t); ok {
90+
logger.Debugf(" Owner UID: %d Owner GID: %d\n", stat.Uid, stat.Gid)
91+
}
92+
}
93+
}

internal/xcode/download_multi.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ type DownloadFilesStats struct {
2727
LargestFileSize int64
2828
}
2929

30-
func DownloadCacheFilesFromBuildCache(ctx context.Context, dd FileGroupInfo, kvClient *kv.Client, logger log.Logger) (DownloadFilesStats, error) {
30+
func DownloadCacheFilesFromBuildCache(ctx context.Context, dd FileGroupInfo, kvClient *kv.Client, logger log.Logger, isDebugLogMode bool) (DownloadFilesStats, error) {
3131
var largestFileSize int64
3232
for _, file := range dd.Files {
3333
if file.Size > largestFileSize {
@@ -55,7 +55,7 @@ func DownloadCacheFilesFromBuildCache(ctx context.Context, dd FileGroupInfo, kvC
5555

5656
const retries = 3
5757
err := retry.Times(retries).Wait(3 * time.Second).TryWithAbort(func(_ uint) (error, bool) {
58-
err := downloadFile(ctx, kvClient, file.Path, file.Hash, file.Mode)
58+
err := downloadFile(ctx, kvClient, file.Path, file.Hash, file.Mode, logger, isDebugLogMode)
5959
if errors.Is(err, ErrCacheNotFound) {
6060
return err, true
6161
} else if err != nil {

0 commit comments

Comments
 (0)