Compare commits

..

2 Commits

Author SHA1 Message Date
Simon
19eae96ef2 Merge a33b782c54 into f7d28b486c 2024-11-05 20:33:24 +00:00
simonhammes
a33b782c54 Add allowFailure option
Implements #189
2024-11-05 21:32:34 +01:00
14 changed files with 540 additions and 577 deletions

View File

@@ -1,19 +1,21 @@
name: Release
name: Main
on:
push:
tags:
- "v*.*.*"
- 'v*.*.*'
jobs:
docker:
runs-on: ubuntu-latest
steps:
- uses: docker/setup-qemu-action@v4
- uses: docker/setup-buildx-action@v4
- name: Set up QEMU
uses: docker/setup-qemu-action@v2
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v2
- name: Docker Labels
id: meta
uses: docker/metadata-action@v6
uses: crazy-max/ghaction-docker-meta@v4
with:
images: cupcakearmy/autorestic
tags: |
@@ -21,12 +23,12 @@ jobs:
type=semver,pattern={{major}}.{{minor}}
type=semver,pattern={{major}}
- name: Login to DockerHub
uses: docker/login-action@v4
uses: docker/login-action@v2
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
- name: Build and push
uses: docker/build-push-action@v6
uses: docker/build-push-action@v3
with:
platforms: linux/amd64,linux/arm64
push: true
@@ -35,9 +37,10 @@ jobs:
release:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- uses: jdx/mise-action@v3
- run: mise run build
- uses: actions/checkout@v3
- uses: actions/setup-go@v3
with:
go-version: '^1.21'
- name: Build
run: go run build/build.go
- name: Release

View File

@@ -2,28 +2,23 @@ name: CI
on:
pull_request:
push:
branches:
- main
- master
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
env:
MISE_EXPERIMENTAL: true
branches: [master]
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- uses: jdx/mise-action@v3
- run: mise run test
- uses: actions/checkout@v3
- uses: actions/setup-go@v3
with:
go-version: '^1.21'
- run: go test -v ./...
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- uses: jdx/mise-action@v3
- run: mise run build
- uses: actions/checkout@v3
- uses: actions/setup-go@v3
with:
go-version: '^1.21'
- run: go build -v .

View File

@@ -1,4 +1,4 @@
FROM golang:1.25-alpine as builder
FROM golang:1.23-alpine as builder
WORKDIR /app
COPY go.* .
@@ -6,7 +6,7 @@ RUN go mod download
COPY . .
RUN go build
FROM restic/restic:0.17.3
FROM restic/restic:0.17.2
RUN apk add --no-cache rclone bash curl docker-cli
COPY --from=builder /app/autorestic /usr/bin/autorestic
ENTRYPOINT []

View File

@@ -18,11 +18,9 @@ var backupCmd = &cobra.Command{
err := lock.Lock()
CheckErr(err)
defer lock.Unlock()
dry, _ := cmd.Flags().GetBool("dry-run")
selected, err := internal.GetAllOrSelected(cmd, false)
CheckErr(err)
errors := 0
for _, name := range selected {
var splitted = strings.Split(name, "@")
@@ -31,7 +29,7 @@ var backupCmd = &cobra.Command{
specificBackend = splitted[1]
}
location, _ := internal.GetLocation(splitted[0])
errs := location.Backup(false, dry, specificBackend)
errs := location.Backup(false, specificBackend)
for _, err := range errs {
colors.Error.Printf("%s\n\n", err)
errors++
@@ -46,5 +44,4 @@ var backupCmd = &cobra.Command{
func init() {
rootCmd.AddCommand(backupCmd)
internal.AddFlagsToCommand(backupCmd, false)
backupCmd.Flags().Bool("dry-run", false, "do not write changes, show what would be affected")
}

View File

@@ -1 +1 @@
v24
v22.7.0

View File

@@ -1,2 +0,0 @@
[settings]
idiomatic_version_file_enable_tools = ["node", "pnpm"]

View File

@@ -5,11 +5,11 @@
"start": "NEXT_TELEMETRY_DISABLED=1 next start"
},
"dependencies": {
"next": "^14.2.35",
"next": "^14.2.7",
"nextra": "^2.13.4",
"nextra-theme-docs": "^2.13.4",
"react": "^18.3.1",
"react-dom": "^18.3.1"
},
"packageManager": "pnpm@10.33.0"
"packageManager": "pnpm@9.9.0"
}

View File

@@ -1,14 +1,11 @@
# Backup
```bash
autorestic backup [-l, --location] [-a, --all] [--dry-run]
autorestic backup [-l, --location] [-a, --all]
```
Performs a backup of all locations if the `-a` flag is passed. To only backup some locations pass one or more `-l` or `--location` flags.
The `--dry-run` flag will do a dry run showing what would have been deleted, but won't touch the actual data.
```bash
# All
autorestic backup -a

970
docs/pnpm-lock.yaml generated

File diff suppressed because it is too large Load Diff

2
go.mod
View File

@@ -1,6 +1,6 @@
module github.com/cupcakearmy/autorestic
go 1.26.1
go 1.21
require (
github.com/blang/semver/v4 v4.0.0

View File

@@ -24,6 +24,7 @@ type Backend struct {
Path string `mapstructure:"path,omitempty" yaml:"path,omitempty"`
Key string `mapstructure:"key,omitempty" yaml:"key,omitempty"`
RequireKey bool `mapstructure:"requireKey,omitempty" yaml:"requireKey,omitempty"`
AllowFailure bool `mapstructure:"allowFailure,omitempty" yaml:"allowFailure,omitempty"`
Env map[string]string `mapstructure:"env,omitempty" yaml:"env,omitempty"`
Rest BackendRest `mapstructure:"rest,omitempty" yaml:"rest,omitempty"`
Options Options `mapstructure:"options,omitempty" yaml:"options,omitempty"`

View File

@@ -188,34 +188,18 @@ func CheckConfig() error {
if !CheckIfResticIsCallable() {
return fmt.Errorf(`%s was not found. Install either with "autorestic install" or manually`, flags.RESTIC_BIN)
}
cwd, _ := GetPathRelativeToConfig(".")
for name, location := range c.Locations {
location.name = name
// Hooks before location validation
options := ExecuteOptions{
Command: "bash",
Dir: cwd,
Envs: map[string]string{
"AUTORESTIC_LOCATION": location.name,
},
}
if err := location.ExecuteHooks(location.Hooks.PreValidate, options); err != nil {
return err
}
if err := location.validate(); err != nil {
return err
}
}
for name, backend := range c.Backends {
backend.name = name
if err := backend.validate(); err != nil {
return err
}
}
for name, location := range c.Locations {
location.name = name
if err := location.validate(); err != nil {
return err
}
}
return nil
}

View File

@@ -168,7 +168,7 @@ func (l Location) getLocationTags() string {
return buildTag("location", l.name)
}
func (l Location) Backup(cron bool, dry bool, specificBackend string) []error {
func (l Location) Backup(cron bool, specificBackend string) []error {
var errors []error
var backends []string
colors.PrimaryPrint(" Backing up location \"%s\" ", l.name)
@@ -228,9 +228,6 @@ func (l Location) Backup(cron bool, dry bool, specificBackend string) []error {
if cron {
cmd = append(cmd, "--tag", buildTag("cron"))
}
if dry {
cmd = append(cmd, "--dry-run")
}
cmd = append(cmd, "--tag", l.getLocationTags())
backupOptions := ExecuteOptions{
Envs: env,
@@ -270,6 +267,13 @@ func (l Location) Backup(cron bool, dry bool, specificBackend string) []error {
// If error save it and continue
if err != nil {
if backend.AllowFailure {
colors.Faint.Printf("skipping backend \"%s\" since allowFailure was set to \"true\"\n", to)
if flags.VERBOSE {
colors.Error.Printf("reason: %s", out)
}
continue
}
colors.Error.Println(out)
errors = append(errors, fmt.Errorf("%s@%s:\n%s%s", l.name, backend.name, out, err))
continue
@@ -450,7 +454,7 @@ func (l Location) RunCron() error {
now := time.Now()
if now.After(next) {
lock.SetCron(l.name, now.Unix())
errs := l.Backup(true, false, "")
errs := l.Backup(true, "")
if len(errs) > 0 {
return fmt.Errorf("Failed to backup location \"%s\":\n%w", l.name, errors.Join(errs...))
}

View File

@@ -1,14 +0,0 @@
[tools]
go = "latest"
restic = "latest"
[tasks]
build = { description = "Build the project", run = "go build -v ." }
test = { description = "Run tests", run = "go test -v ./..." }
coverage = { description = "Generate coverage report", run = "go test -coverprofile=coverage.out ./... && go tool cover -func=coverage.out && go tool cover -html=coverage.out -o coverage.html", depends = [
"test"
] }
clean = { run = "rm -f coverage.*", description = "Clean up coverage files" }