Setup CI for release (#1052)
* Setup CI for release * Initial commit of CHANGELOG.md * Pin vale and markdownlint-cli to current versions * Update branch name for CI * Pull request workflow job
This commit is contained in:
parent
dd7710ca5b
commit
1793cc3757
26
.github/workflows/_filechange_checker.yml
vendored
26
.github/workflows/_filechange_checker.yml
vendored
@ -3,9 +3,12 @@ name: Filechange Checker
|
|||||||
on:
|
on:
|
||||||
workflow_call:
|
workflow_call:
|
||||||
outputs:
|
outputs:
|
||||||
fileschanged:
|
srcfileschanged:
|
||||||
description: "'true' if src/** or .github/workflows/** files have changed in the branch"
|
description: "'true' if src/** or .github/workflows/** files have changed in the branch"
|
||||||
value: ${{ jobs.file-change-check.outputs.fileschanged }}
|
value: ${{ jobs.file-change-check.outputs.srcfileschanged }}
|
||||||
|
docfileschanged:
|
||||||
|
description: "'true' if docs/** or src/** or .github/workflows/** files have changed in the branch"
|
||||||
|
value: ${{ jobs.file-change-check.outputs.docfileschanged }}
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
file-change-check:
|
file-change-check:
|
||||||
@ -14,7 +17,8 @@ jobs:
|
|||||||
contents: read
|
contents: read
|
||||||
pull-requests: read
|
pull-requests: read
|
||||||
outputs:
|
outputs:
|
||||||
fileschanged: ${{ steps.checker.outputs.fileschanged }}
|
srcfileschanged: ${{ steps.srcchecker.outputs.srcfileschanged }}
|
||||||
|
docfileschanged: ${{ steps.docchecker.outputs.docfileschanged }}
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v3
|
||||||
|
|
||||||
@ -27,11 +31,21 @@ jobs:
|
|||||||
filters: |
|
filters: |
|
||||||
src:
|
src:
|
||||||
- 'src/**'
|
- 'src/**'
|
||||||
|
docs:
|
||||||
|
- 'docs/**'
|
||||||
actions:
|
actions:
|
||||||
- '.github/workflows/**'
|
- '.github/workflows/**'
|
||||||
- name: Check dorny for changes in specified filepaths
|
|
||||||
id: checker
|
- name: Check dorny for changes in src filepaths
|
||||||
|
id: srcchecker
|
||||||
if: steps.dornycheck.outputs.src == 'true' || steps.dornycheck.outputs.actions == 'true'
|
if: steps.dornycheck.outputs.src == 'true' || steps.dornycheck.outputs.actions == 'true'
|
||||||
run: |
|
run: |
|
||||||
echo "src or workflow file changes occurred"
|
echo "src or workflow file changes occurred"
|
||||||
echo ::set-output name=fileschanged::true
|
echo ::set-output name=srcfileschanged::true
|
||||||
|
|
||||||
|
- name: Check dorny for changes in docs related filepaths
|
||||||
|
id: docchecker
|
||||||
|
if: steps.dornycheck.outputs.src == 'true' || steps.dornycheck.outputs.docs == 'true' || steps.dornycheck.outputs.actions == 'true'
|
||||||
|
run: |
|
||||||
|
echo "docs, src or workflow file changes occurred"
|
||||||
|
echo ::set-output name=docfileschanged::true
|
||||||
264
.github/workflows/ci.yml
vendored
264
.github/workflows/ci.yml
vendored
@ -1,19 +1,22 @@
|
|||||||
name: CI Tests
|
name: Build/Release Corso
|
||||||
on:
|
on:
|
||||||
push:
|
workflow_dispatch: # TODO(meain): post-merge: verify manual dispatch
|
||||||
branches: [main]
|
|
||||||
pull_request:
|
pull_request:
|
||||||
branches: [ main ]
|
branches: [ main ]
|
||||||
|
push:
|
||||||
|
branches: [ main ]
|
||||||
|
tags: [ 'v*.*.*' ]
|
||||||
|
|
||||||
permissions:
|
permissions:
|
||||||
# required to retrieve AWS credentials
|
# required to retrieve AWS credentials
|
||||||
id-token: write
|
id-token: write
|
||||||
contents: write
|
contents: write
|
||||||
|
packages: write
|
||||||
pull-requests: read
|
pull-requests: read
|
||||||
|
|
||||||
# cancel currently running jobs if a new version of the branch is pushed
|
# cancel currently running jobs if a new version of the branch is pushed
|
||||||
concurrency:
|
concurrency:
|
||||||
group: ci-linting-${{ github.workflow }}-${{ github.ref }}
|
group: ci-${{ github.workflow }}-${{ github.ref }}
|
||||||
cancel-in-progress: true
|
cancel-in-progress: true
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
@ -21,11 +24,11 @@ jobs:
|
|||||||
# ----------------------------------------------------------------------------------------------------
|
# ----------------------------------------------------------------------------------------------------
|
||||||
# --- Prechecks and Checkouts ------------------------------------------------------------------------
|
# --- Prechecks and Checkouts ------------------------------------------------------------------------
|
||||||
# ----------------------------------------------------------------------------------------------------
|
# ----------------------------------------------------------------------------------------------------
|
||||||
precheck:
|
Precheck:
|
||||||
uses: alcionai/corso/.github/workflows/_filechange_checker.yml@main
|
uses: alcionai/corso/.github/workflows/_filechange_checker.yml@main
|
||||||
|
|
||||||
checkout:
|
Checkout:
|
||||||
needs: precheck
|
needs: [Precheck]
|
||||||
environment: Testing
|
environment: Testing
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
defaults:
|
defaults:
|
||||||
@ -34,20 +37,90 @@ jobs:
|
|||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v3
|
||||||
|
|
||||||
|
# single setup and sum cache handling here.
|
||||||
|
# the results will cascade onto both testing and linting.
|
||||||
- name: Setup Golang with cache
|
- name: Setup Golang with cache
|
||||||
if: needs.precheck.outputs.fileschanged == 'true'
|
|
||||||
uses: ./.github/actions/go-setup-cache
|
uses: ./.github/actions/go-setup-cache
|
||||||
|
if: startsWith(github.ref, 'refs/tags/') || github.ref == 'refs/heads/main' || needs.precheck.outputs.docfileschanged == 'true'
|
||||||
with:
|
with:
|
||||||
go-version-file: src/go.mod
|
go-version-file: src/go.mod
|
||||||
|
|
||||||
|
# ----------------------------------------------------------------------------------------------------
|
||||||
|
# --- Generate CLI docs ------------------------------------------------------------------------------
|
||||||
|
# ----------------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
Generate-CLI-Docs:
|
||||||
|
needs: [Precheck, Checkout]
|
||||||
|
environment: Testing
|
||||||
|
if: startsWith(github.ref, 'refs/tags/') || github.ref == 'refs/heads/main' || needs.precheck.outputs.srcfileschanged == 'true'
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v3
|
||||||
|
|
||||||
|
- name: Setup Golang with cache
|
||||||
|
uses: magnetikonline/action-golang-cache@v3
|
||||||
|
with:
|
||||||
|
go-version-file: src/go.mod
|
||||||
|
|
||||||
|
# run the markdown generator
|
||||||
|
- name: Generate Markdown
|
||||||
|
working-directory: ./src
|
||||||
|
run: |
|
||||||
|
go run ./cmd/mdgen/mdgen.go generate
|
||||||
|
|
||||||
|
# migrate generated md files into /docs/docs/cli
|
||||||
|
- name: Move CLI .md to Docs
|
||||||
|
run: |
|
||||||
|
mkdir -p ./docs/docs/cli
|
||||||
|
mv ./src/cmd/mdgen/cli_markdown/* ./docs/docs/cli/
|
||||||
|
rm -R ./src/cmd/mdgen/cli_markdown/
|
||||||
|
|
||||||
|
- uses: actions/upload-artifact@master
|
||||||
|
name: Upload cli docs as artifacts
|
||||||
|
if: startsWith(github.ref, 'refs/tags/') || github.ref == 'refs/heads/main'
|
||||||
|
with:
|
||||||
|
name: cli-docs
|
||||||
|
path: docs/docs/cli
|
||||||
|
|
||||||
|
# ----------------------------------------------------------------------------------------------------
|
||||||
|
# --- Docs Linting -----------------------------------------------------------------------------------
|
||||||
|
# ----------------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
Docs-Linting:
|
||||||
|
needs: [Generate-CLI-Docs]
|
||||||
|
environment: Testing
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
if: startsWith(github.ref, 'refs/tags/') || github.ref == 'refs/heads/main' || needs.precheck.outputs.docfileschanged == 'true'
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v3
|
||||||
|
|
||||||
|
- name: Install dependencies for docs lint
|
||||||
|
run: |
|
||||||
|
wget https://github.com/errata-ai/vale/releases/download/v2.20.2/vale_2.20.2_Linux_64-bit.tar.gz # NOTE: update in Dockerfile when updating
|
||||||
|
mkdir bin && tar -xvzf vale_2.20.2_Linux_64-bit.tar.gz -C bin
|
||||||
|
echo "$PWD/bin" >> $GITHUB_PATH
|
||||||
|
npm i -g markdownlint-cli@0.32.2 # NOTE: update in Dockerfile when updating
|
||||||
|
|
||||||
|
- uses: actions/download-artifact@master
|
||||||
|
name: Download cli docs from build step
|
||||||
|
with:
|
||||||
|
name: cli-docs
|
||||||
|
path: docs/docs/cli
|
||||||
|
|
||||||
|
- name: Run docs lint
|
||||||
|
run: |
|
||||||
|
cd docs && make -o genclidocs check
|
||||||
|
|
||||||
# ----------------------------------------------------------------------------------------------------
|
# ----------------------------------------------------------------------------------------------------
|
||||||
# --- Integration and Unit Testing -------------------------------------------------------------------
|
# --- Integration and Unit Testing -------------------------------------------------------------------
|
||||||
# ----------------------------------------------------------------------------------------------------
|
# ----------------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
Test-Suite:
|
Test-Suite:
|
||||||
needs: [precheck, checkout]
|
needs: [Precheck, Checkout]
|
||||||
environment: Testing
|
environment: Testing
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
if: startsWith(github.ref, 'refs/tags/') || github.ref == 'refs/heads/main' || needs.precheck.outputs.srcfileschanged == 'true'
|
||||||
defaults:
|
defaults:
|
||||||
run:
|
run:
|
||||||
working-directory: src
|
working-directory: src
|
||||||
@ -55,7 +128,6 @@ jobs:
|
|||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v3
|
||||||
|
|
||||||
- name: Setup Golang with cache
|
- name: Setup Golang with cache
|
||||||
if: needs.precheck.outputs.fileschanged == 'true'
|
|
||||||
uses: magnetikonline/action-golang-cache@v3
|
uses: magnetikonline/action-golang-cache@v3
|
||||||
with:
|
with:
|
||||||
go-version-file: src/go.mod
|
go-version-file: src/go.mod
|
||||||
@ -64,21 +136,18 @@ jobs:
|
|||||||
|
|
||||||
# Install gotestfmt
|
# Install gotestfmt
|
||||||
- name: Set up gotestfmt
|
- name: Set up gotestfmt
|
||||||
if: needs.precheck.outputs.fileschanged == 'true'
|
|
||||||
run: go install github.com/haveyoudebuggedit/gotestfmt/v2/cmd/gotestfmt@latest
|
run: go install github.com/haveyoudebuggedit/gotestfmt/v2/cmd/gotestfmt@latest
|
||||||
|
|
||||||
# AWS creds
|
# AWS creds
|
||||||
- name: Configure AWS credentials from Test account
|
- name: Configure AWS credentials from Test account
|
||||||
if: needs.precheck.outputs.fileschanged == 'true'
|
|
||||||
uses: aws-actions/configure-aws-credentials@v1
|
uses: aws-actions/configure-aws-credentials@v1
|
||||||
with:
|
with:
|
||||||
role-to-assume: arn:aws:iam::951767375776:role/corso-testing-role
|
role-to-assume: ${{ secrets.AWS_IAM_ROLE }}
|
||||||
role-session-name: integration-testing
|
role-session-name: integration-testing
|
||||||
aws-region: us-east-1
|
aws-region: us-east-1
|
||||||
|
|
||||||
# run the tests
|
# run the tests
|
||||||
- name: Integration Tests
|
- name: Integration Tests
|
||||||
if: needs.precheck.outputs.fileschanged == 'true'
|
|
||||||
env:
|
env:
|
||||||
CLIENT_ID: ${{ secrets.CLIENT_ID }}
|
CLIENT_ID: ${{ secrets.CLIENT_ID }}
|
||||||
CLIENT_SECRET: ${{ secrets.CLIENT_SECRET }}
|
CLIENT_SECRET: ${{ secrets.CLIENT_SECRET }}
|
||||||
@ -95,11 +164,11 @@ jobs:
|
|||||||
|
|
||||||
# Upload the original go test log as an artifact for later review.
|
# Upload the original go test log as an artifact for later review.
|
||||||
- name: Upload test log
|
- name: Upload test log
|
||||||
if: failure() && needs.precheck.outputs.fileschanged == 'true'
|
if: failure()
|
||||||
uses: actions/upload-artifact@v3
|
uses: actions/upload-artifact@v3
|
||||||
with:
|
with:
|
||||||
name: test-log
|
name: test-log
|
||||||
path: src/testlog/gotest.log
|
path: testlog/gotest.log
|
||||||
if-no-files-found: error
|
if-no-files-found: error
|
||||||
retention-days: 14
|
retention-days: 14
|
||||||
|
|
||||||
@ -108,9 +177,10 @@ jobs:
|
|||||||
# ----------------------------------------------------------------------------------------------------
|
# ----------------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
Linting:
|
Linting:
|
||||||
needs: [precheck, checkout]
|
needs: [Precheck, Checkout]
|
||||||
environment: Testing
|
environment: Testing
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
if: startsWith(github.ref, 'refs/tags/') || github.ref == 'refs/heads/main' || needs.precheck.outputs.srcfileschanged == 'true'
|
||||||
defaults:
|
defaults:
|
||||||
run:
|
run:
|
||||||
working-directory: src
|
working-directory: src
|
||||||
@ -118,13 +188,11 @@ jobs:
|
|||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v3
|
||||||
|
|
||||||
- name: Setup Golang with cache
|
- name: Setup Golang with cache
|
||||||
if: needs.precheck.outputs.fileschanged == 'true'
|
|
||||||
uses: magnetikonline/action-golang-cache@v3
|
uses: magnetikonline/action-golang-cache@v3
|
||||||
with:
|
with:
|
||||||
go-version-file: src/go.mod
|
go-version-file: src/go.mod
|
||||||
|
|
||||||
- name: Go Lint
|
- name: Go Lint
|
||||||
if: needs.precheck.outputs.fileschanged == 'true'
|
|
||||||
uses: golangci/golangci-lint-action@v3
|
uses: golangci/golangci-lint-action@v3
|
||||||
with:
|
with:
|
||||||
version: v1.45.2
|
version: v1.45.2
|
||||||
@ -133,9 +201,163 @@ jobs:
|
|||||||
|
|
||||||
# check licenses
|
# check licenses
|
||||||
- name: Get go-licenses
|
- name: Get go-licenses
|
||||||
if: needs.precheck.outputs.fileschanged == 'true'
|
|
||||||
run: go install github.com/google/go-licenses@latest
|
run: go install github.com/google/go-licenses@latest
|
||||||
|
|
||||||
- name: Run go-licenses
|
- name: Run go-licenses
|
||||||
if: needs.precheck.outputs.fileschanged == 'true'
|
|
||||||
run: go-licenses check github.com/alcionai/corso/src --ignore github.com/alcionai/corso/src
|
run: go-licenses check github.com/alcionai/corso/src --ignore github.com/alcionai/corso/src
|
||||||
|
|
||||||
|
# ----------------------------------------------------------------------------------------------------
|
||||||
|
# --- Publish steps ----------------------------------------------------------------------------------
|
||||||
|
# ----------------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
SetEnv:
|
||||||
|
environment: Testing
|
||||||
|
if: startsWith(github.ref, 'refs/tags/') || github.ref == 'refs/heads/main'
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
outputs:
|
||||||
|
environment: ${{ steps.set-env.outputs.environment }}
|
||||||
|
steps:
|
||||||
|
- name: Figure out environment
|
||||||
|
id: set-env
|
||||||
|
run: |
|
||||||
|
if ${{ startsWith(github.ref, 'refs/tags/') }}; then
|
||||||
|
echo "set-output name=environment::Production"
|
||||||
|
echo "::set-output name=environment::Production"
|
||||||
|
else
|
||||||
|
echo "set-output name=environment::Testing"
|
||||||
|
echo "::set-output name=environment::Testing"
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
Publish-Binary:
|
||||||
|
needs: [Test-Suite, Linting, Docs-Linting, SetEnv]
|
||||||
|
environment: ${{ needs.SetEnv.outputs.environment }}
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
if: startsWith(github.ref, 'refs/tags/') || github.ref == 'refs/heads/main'
|
||||||
|
defaults:
|
||||||
|
run:
|
||||||
|
working-directory: src
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v3
|
||||||
|
with:
|
||||||
|
fetch-depth: 0 # needed to pull changelog
|
||||||
|
|
||||||
|
- name: Setup Golang with cache
|
||||||
|
uses: magnetikonline/action-golang-cache@v3
|
||||||
|
with:
|
||||||
|
go-version-file: src/go.mod
|
||||||
|
|
||||||
|
- name: Run GoReleaser
|
||||||
|
uses: goreleaser/goreleaser-action@v3 # TODO(meain): make sure release builds work
|
||||||
|
with:
|
||||||
|
version: latest
|
||||||
|
args: release --rm-dist --timeout 500m
|
||||||
|
workdir: src
|
||||||
|
env:
|
||||||
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
|
||||||
|
- name: Upload assets
|
||||||
|
uses: actions/upload-artifact@v3
|
||||||
|
with:
|
||||||
|
name: corso
|
||||||
|
path: src/dist/*
|
||||||
|
|
||||||
|
Publish-Docs:
|
||||||
|
needs: [Test-Suite, Linting, Docs-Linting, SetEnv]
|
||||||
|
environment: ${{ needs.SetEnv.outputs.environment }}
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
if: startsWith(github.ref, 'refs/tags/') || github.ref == 'refs/heads/main'
|
||||||
|
defaults:
|
||||||
|
run:
|
||||||
|
working-directory: docs
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v3
|
||||||
|
|
||||||
|
- uses: actions/download-artifact@master
|
||||||
|
name: Download cli docs from build step
|
||||||
|
with:
|
||||||
|
name: cli-docs
|
||||||
|
path: docs/docs/cli
|
||||||
|
|
||||||
|
- name: Configure AWS credentials from Test account
|
||||||
|
uses: aws-actions/configure-aws-credentials@v1
|
||||||
|
with:
|
||||||
|
role-to-assume: ${{ secrets.AWS_IAM_ROLE }}
|
||||||
|
role-session-name: integration-testing
|
||||||
|
aws-region: us-east-1
|
||||||
|
|
||||||
|
- name: Build docs
|
||||||
|
run: |
|
||||||
|
npm ci
|
||||||
|
CORSO_DOCS_BASEURL="/preview/" npm run build # TODO: update base url once finalized
|
||||||
|
|
||||||
|
# TODO(meain): post-merge: validate push to prod env
|
||||||
|
- name: Push docs
|
||||||
|
run: |
|
||||||
|
echo "$DOCS_BUCKET" | base64
|
||||||
|
aws s3 sync build "s3://${{ secrets.DOCS_S3_BUCKET }}/preview"
|
||||||
|
|
||||||
|
- name: Invalidate cloudfront
|
||||||
|
run: |
|
||||||
|
aws cloudfront create-invalidation --distribution-id ${{ secrets.DOCS_CF_DISTRIBUTION }} --paths "/*"
|
||||||
|
|
||||||
|
Publish-Image:
|
||||||
|
needs: [Test-Suite, Linting, Docs-Linting, SetEnv]
|
||||||
|
environment: ${{ needs.SetEnv.outputs.environment }}
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
if: startsWith(github.ref, 'refs/tags/') || github.ref == 'refs/heads/main'
|
||||||
|
defaults:
|
||||||
|
run:
|
||||||
|
working-directory: build
|
||||||
|
env:
|
||||||
|
imageName: ghcr.io/alcionai/corso
|
||||||
|
PLATFORMS: linux/amd64,linux/arm64
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v3
|
||||||
|
|
||||||
|
- name: Build Corso Binaries
|
||||||
|
run: >
|
||||||
|
./build.sh
|
||||||
|
--platforms ${{ env.PLATFORMS }}
|
||||||
|
|
||||||
|
# apparently everyone uses this step
|
||||||
|
- name: Set up QEMU
|
||||||
|
uses: docker/setup-qemu-action@v2
|
||||||
|
|
||||||
|
# setup Docker build action
|
||||||
|
- name: Set up Docker Buildx
|
||||||
|
id: buildx
|
||||||
|
uses: docker/setup-buildx-action@v2
|
||||||
|
|
||||||
|
# retrieve credentials for ghcr.io
|
||||||
|
- name: Login to Github Packages
|
||||||
|
uses: docker/login-action@v2
|
||||||
|
with:
|
||||||
|
registry: ghcr.io
|
||||||
|
username: ${{ github.actor }}
|
||||||
|
password: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
|
||||||
|
- name: Extract metadata (tags, labels) for Docker
|
||||||
|
id: meta
|
||||||
|
uses: docker/metadata-action@v4
|
||||||
|
with:
|
||||||
|
images: ${{ env.imageName }} # TODO(meain): post-merge: validate push with tag
|
||||||
|
tags: |
|
||||||
|
type=ref,event=tag
|
||||||
|
type=sha,format=short,prefix=
|
||||||
|
|
||||||
|
# deploy the image
|
||||||
|
- name: Build image and push to GitHub Container Registry
|
||||||
|
uses: docker/build-push-action@v3
|
||||||
|
with:
|
||||||
|
context: .
|
||||||
|
file: ./build/Dockerfile
|
||||||
|
platforms: ${{ env.PLATFORMS }}
|
||||||
|
push: true
|
||||||
|
tags: ${{ steps.meta.outputs.tags }}
|
||||||
|
labels: ${{ steps.meta.outputs.labels }}
|
||||||
|
# use the github cache
|
||||||
|
cache-from: type=gha
|
||||||
|
cache-to: type=gha,mode=max
|
||||||
58
.github/workflows/docgen.yml
vendored
58
.github/workflows/docgen.yml
vendored
@ -1,58 +0,0 @@
|
|||||||
name: Document Generation
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
branches: [main]
|
|
||||||
|
|
||||||
permissions:
|
|
||||||
contents: write
|
|
||||||
pull-requests: write
|
|
||||||
deployments: write
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
precheck:
|
|
||||||
uses: alcionai/corso/.github/workflows/_filechange_checker.yml@main
|
|
||||||
|
|
||||||
Generate-Markdown:
|
|
||||||
needs: precheck
|
|
||||||
if: needs.precheck.outputs.fileschanged == 'true'
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v3
|
|
||||||
with:
|
|
||||||
ref: ${{ github.event.pull_request.head.ref }}
|
|
||||||
|
|
||||||
- name: Setup Golang with cache
|
|
||||||
uses: magnetikonline/action-golang-cache@v3
|
|
||||||
with:
|
|
||||||
go-version-file: src/go.mod
|
|
||||||
|
|
||||||
# run the markdown generator
|
|
||||||
- name: Generate Markdown
|
|
||||||
working-directory: ./src
|
|
||||||
run: |
|
|
||||||
go run ./cmd/mdgen/mdgen.go generate
|
|
||||||
|
|
||||||
# migrate generated md files into /docs/docs/cli
|
|
||||||
- name: Move CLI .md to Docs
|
|
||||||
run: |
|
|
||||||
mkdir -p ./docs/docs/cli
|
|
||||||
mv ./src/cmd/mdgen/cli_markdown/* ./docs/docs/cli/
|
|
||||||
rm -R ./src/cmd/mdgen/cli_markdown/
|
|
||||||
|
|
||||||
# make a PR for the docs_autogen branch
|
|
||||||
- name: Make a PR For the `docs_autogen` Branch
|
|
||||||
uses: peter-evans/create-pull-request@v4
|
|
||||||
with:
|
|
||||||
commit-message: "Documentation Auto-Generation"
|
|
||||||
branch: docs_autogen
|
|
||||||
delete-branch: true
|
|
||||||
base: main
|
|
||||||
title: "Docs Auto-Generation"
|
|
||||||
|
|
||||||
# make sure it gets approved
|
|
||||||
- name: Auto approve
|
|
||||||
if: steps.cpr.outputs.pull-request-operation == 'created'
|
|
||||||
uses: juliangruber/approve-pull-request-action@v1
|
|
||||||
with:
|
|
||||||
github-token: ${{ secrets.GITHUB_TOKEN }}
|
|
||||||
number: ${{ steps.cpr.outputs.pull-request-number }}
|
|
||||||
74
.github/workflows/image.yml
vendored
74
.github/workflows/image.yml
vendored
@ -1,74 +0,0 @@
|
|||||||
name: Publish Docker Container Images
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
branches: [main]
|
|
||||||
|
|
||||||
permissions:
|
|
||||||
contents: read
|
|
||||||
packages: write
|
|
||||||
pull-requests: read
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
precheck:
|
|
||||||
uses: alcionai/corso/.github/workflows/_filechange_checker.yml@main
|
|
||||||
|
|
||||||
Per-SHA-Image:
|
|
||||||
needs: precheck
|
|
||||||
if: needs.precheck.outputs.fileschanged == 'true'
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
defaults:
|
|
||||||
run:
|
|
||||||
working-directory: build
|
|
||||||
env:
|
|
||||||
PLATFORMS: linux/amd64,linux/arm64
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v3
|
|
||||||
|
|
||||||
- name: Build Corso Binaries
|
|
||||||
run: >
|
|
||||||
./build.sh
|
|
||||||
--platforms ${{ env.PLATFORMS }}
|
|
||||||
|
|
||||||
# - name: Build Corso Binaries Locally
|
|
||||||
# run: >
|
|
||||||
# ./multiplatform-binary.sh
|
|
||||||
# --platforms ${{ env.PLATFORMS }}
|
|
||||||
|
|
||||||
# apparently everyone uses this step
|
|
||||||
- name: Set up QEMU
|
|
||||||
uses: docker/setup-qemu-action@v2
|
|
||||||
|
|
||||||
# setup Docker buld action
|
|
||||||
- name: Set up Docker Buildx
|
|
||||||
id: buildx
|
|
||||||
uses: docker/setup-buildx-action@v2
|
|
||||||
|
|
||||||
# retrieve credentials for ghcr.io
|
|
||||||
- name: Login to Github Packages
|
|
||||||
uses: docker/login-action@v2
|
|
||||||
with:
|
|
||||||
registry: ghcr.io
|
|
||||||
username: ${{ github.actor }}
|
|
||||||
password: ${{ secrets.GITHUB_TOKEN }}
|
|
||||||
|
|
||||||
- id: hash
|
|
||||||
run: echo "::set-output name=sha_short::$(git rev-parse --short HEAD)"
|
|
||||||
|
|
||||||
# deploy the image
|
|
||||||
- name: Build image and push to GitHub Container Registry
|
|
||||||
env:
|
|
||||||
imageName: ghcr.io/alcionai/corso
|
|
||||||
uses: docker/build-push-action@v3
|
|
||||||
with:
|
|
||||||
context: .
|
|
||||||
file: ./build/Dockerfile
|
|
||||||
platforms: ${{ env.PLATFORMS }}
|
|
||||||
push: true
|
|
||||||
tags: ${{ env.imageName }}:latest,${{ env.imageName }}:${{ steps.hash.outputs.sha_short }}
|
|
||||||
# use the github cache
|
|
||||||
cache-from: type=gha
|
|
||||||
cache-to: type=gha,mode=max
|
|
||||||
|
|
||||||
# check the image digest
|
|
||||||
- name: Image digest
|
|
||||||
run: echo ${{ steps.docker_build.outputs.digest }}
|
|
||||||
2
.github/workflows/load_test.yml
vendored
2
.github/workflows/load_test.yml
vendored
@ -41,7 +41,7 @@ jobs:
|
|||||||
- name: Configure AWS credentials from Test account
|
- name: Configure AWS credentials from Test account
|
||||||
uses: aws-actions/configure-aws-credentials@v1
|
uses: aws-actions/configure-aws-credentials@v1
|
||||||
with:
|
with:
|
||||||
role-to-assume: arn:aws:iam::951767375776:role/corso-testing-role
|
role-to-assume: ${{ secrets.AWS_IAM_ROLE }}
|
||||||
role-session-name: integration-testing
|
role-session-name: integration-testing
|
||||||
aws-region: us-east-1
|
aws-region: us-east-1
|
||||||
|
|
||||||
|
|||||||
5
.github/workflows/weekly_cleanup.yml
vendored
5
.github/workflows/weekly_cleanup.yml
vendored
@ -11,15 +11,16 @@ permissions:
|
|||||||
jobs:
|
jobs:
|
||||||
S3-Test-Cleanup:
|
S3-Test-Cleanup:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
environment: Testing
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Configure AWS credentials from Test account
|
- name: Configure AWS credentials from Test account
|
||||||
uses: aws-actions/configure-aws-credentials@v1
|
uses: aws-actions/configure-aws-credentials@v1
|
||||||
with:
|
with:
|
||||||
role-to-assume: arn:aws:iam::951767375776:role/corso-testing-role
|
role-to-assume: ${{ secrets.AWS_IAM_ROLE }}
|
||||||
role-session-name: integration-testing
|
role-session-name: integration-testing
|
||||||
aws-region: us-east-1
|
aws-region: us-east-1
|
||||||
|
|
||||||
- name: Delete all files in the test bucket
|
- name: Delete all files in the test bucket
|
||||||
run: |
|
run: |
|
||||||
aws s3 rm s3://test-corso-repo-init --recursive
|
aws s3 rm s3://${{ secrets.CI_TESTS_S3_BUCKET }} --recursive
|
||||||
10
CHANGELOG.md
Normal file
10
CHANGELOG.md
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
# Changelog
|
||||||
|
All notable changes to this project will be documented in this file.
|
||||||
|
|
||||||
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
||||||
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
||||||
|
|
||||||
|
## [Unreleased]
|
||||||
|
|
||||||
|
[Unreleased]: https://github.com/https://github.com/alcionai/corso/compare/...HEAD
|
||||||
|
|
||||||
1
docs/.gitignore
vendored
1
docs/.gitignore
vendored
@ -5,6 +5,7 @@
|
|||||||
/build
|
/build
|
||||||
|
|
||||||
# Generated files
|
# Generated files
|
||||||
|
docs/cli
|
||||||
.docusaurus
|
.docusaurus
|
||||||
.cache-loader
|
.cache-loader
|
||||||
.vscode
|
.vscode
|
||||||
|
|||||||
@ -9,13 +9,13 @@ RUN apt-get -y update && apt-get -y install gpg emacs curl git make \
|
|||||||
&& apt-get autoclean \
|
&& apt-get autoclean \
|
||||||
&& node --version \
|
&& node --version \
|
||||||
&& npm --version \
|
&& npm --version \
|
||||||
&& cd /tmp && curl -O -L https://github.com/errata-ai/vale/releases/download/v2.20.1/vale_2.20.1_Linux_64-bit.tar.gz \
|
&& cd /tmp && curl -O -L https://github.com/errata-ai/vale/releases/download/v2.20.1/vale_2.20.1_Linux_64-bit.tar.gz \ # NOTE: update in CI when updating
|
||||||
&& tar -xvzf vale_2.20.1_Linux_64-bit.tar.gz -C /usr/bin vale
|
&& tar -xvzf vale_2.20.1_Linux_64-bit.tar.gz -C /usr/bin vale \
|
||||||
|
&& npm install -g markdownlint-cli@0.32.2 # NOTE: update in CI when updating
|
||||||
|
|
||||||
WORKDIR /usr/src
|
WORKDIR /usr/src
|
||||||
COPY package.json package-lock.json* ./
|
COPY package.json package-lock.json* ./
|
||||||
RUN npm ci \
|
RUN npm ci \
|
||||||
&& npm install -g markdownlint-cli \
|
|
||||||
&& npm cache clean --force \
|
&& npm cache clean --force \
|
||||||
&& rm -f package.json package-lock.json*
|
&& rm -f package.json package-lock.json*
|
||||||
ENV PATH /usr/src/node_modules/.bin:$PATH
|
ENV PATH /usr/src/node_modules/.bin:$PATH
|
||||||
|
|||||||
@ -1,41 +0,0 @@
|
|||||||
---
|
|
||||||
title: corso backup create exchange
|
|
||||||
hide_title: true
|
|
||||||
---
|
|
||||||
## corso backup create exchange
|
|
||||||
|
|
||||||
Backup M365 Exchange service data
|
|
||||||
|
|
||||||
```bash
|
|
||||||
corso backup create exchange --user <userId or email> | '*' [flags]
|
|
||||||
```
|
|
||||||
|
|
||||||
### Examples
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# Backup all Exchange data for Alice
|
|
||||||
corso backup create exchange --user alice@example.com
|
|
||||||
|
|
||||||
# Backup only Exchange contacts for Alice and Bob
|
|
||||||
corso backup create exchange --user alice@example.com,bob@example.com --data contacts
|
|
||||||
|
|
||||||
# Backup all Exchange data for all M365 users
|
|
||||||
corso backup create exchange --user '*'
|
|
||||||
```
|
|
||||||
|
|
||||||
### Flags
|
|
||||||
|
|
||||||
|Flag|Short|Default|Help|
|
|
||||||
|:----|:-----|:-------|:----|
|
|
||||||
|`--user`||``|Backup Exchange data by user ID; accepts '*' to select all users|
|
|
||||||
|`--data`||``|Select one or more types of data to backup: email, contacts, or events|
|
|
||||||
|`--help`|`-h`|`false`|help for exchange|
|
|
||||||
|
|
||||||
### Global and inherited flags
|
|
||||||
|
|
||||||
|Flag|Short|Default|Help|
|
|
||||||
|:----|:-----|:-------|:----|
|
|
||||||
|`--config-file`||`$HOME/.corso.toml`|config file location (default is $HOME/.corso.toml)|
|
|
||||||
|`--json`||`false`|output data in JSON format|
|
|
||||||
|`--log-level`||`info`|set the log level to debug|info|warn|error|
|
|
||||||
|`--no-stats`||`false`|disable anonymous usage statistics gathering|
|
|
||||||
@ -1,40 +0,0 @@
|
|||||||
---
|
|
||||||
title: corso backup create onedrive
|
|
||||||
hide_title: true
|
|
||||||
---
|
|
||||||
## corso backup create onedrive
|
|
||||||
|
|
||||||
Backup M365 OneDrive service data
|
|
||||||
|
|
||||||
```bash
|
|
||||||
corso backup create onedrive --user <userId or email> | '*' [flags]
|
|
||||||
```
|
|
||||||
|
|
||||||
### Examples
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# Backup OneDrive data for Alice
|
|
||||||
corso backup create onedrive --user alice@example.com
|
|
||||||
|
|
||||||
# Backup OneDrive for Alice and Bob
|
|
||||||
corso backup create onedrive --user alice@example.com,bob@example.com
|
|
||||||
|
|
||||||
# Backup all OneDrive data for all M365 users
|
|
||||||
corso backup create onedrive --user '*'
|
|
||||||
```
|
|
||||||
|
|
||||||
### Flags
|
|
||||||
|
|
||||||
|Flag|Short|Default|Help|
|
|
||||||
|:----|:-----|:-------|:----|
|
|
||||||
|`--user`||``|Backup OneDrive data by user ID; accepts '*' to select all users. <div class='required'>Required</div>|
|
|
||||||
|`--help`|`-h`|`false`|help for onedrive|
|
|
||||||
|
|
||||||
### Global and inherited flags
|
|
||||||
|
|
||||||
|Flag|Short|Default|Help|
|
|
||||||
|:----|:-----|:-------|:----|
|
|
||||||
|`--config-file`||`$HOME/.corso.toml`|config file location (default is $HOME/.corso.toml)|
|
|
||||||
|`--json`||`false`|output data in JSON format|
|
|
||||||
|`--log-level`||`info`|set the log level to debug|info|warn|error|
|
|
||||||
|`--no-stats`||`false`|disable anonymous usage statistics gathering|
|
|
||||||
@ -1,34 +0,0 @@
|
|||||||
---
|
|
||||||
title: corso backup delete exchange
|
|
||||||
hide_title: true
|
|
||||||
---
|
|
||||||
## corso backup delete exchange
|
|
||||||
|
|
||||||
Delete backed-up M365 Exchange service data
|
|
||||||
|
|
||||||
```bash
|
|
||||||
corso backup delete exchange --backup <backupId> [flags]
|
|
||||||
```
|
|
||||||
|
|
||||||
### Examples
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# Delete Exchange backup with ID 1234abcd-12ab-cd34-56de-1234abcd
|
|
||||||
corso backup delete exchange --backup 1234abcd-12ab-cd34-56de-1234abcd
|
|
||||||
```
|
|
||||||
|
|
||||||
### Flags
|
|
||||||
|
|
||||||
|Flag|Short|Default|Help|
|
|
||||||
|:----|:-----|:-------|:----|
|
|
||||||
|`--backup`|||ID of the backup to delete. <div class='required'>Required</div>|
|
|
||||||
|`--help`|`-h`|`false`|help for exchange|
|
|
||||||
|
|
||||||
### Global and inherited flags
|
|
||||||
|
|
||||||
|Flag|Short|Default|Help|
|
|
||||||
|:----|:-----|:-------|:----|
|
|
||||||
|`--config-file`||`$HOME/.corso.toml`|config file location (default is $HOME/.corso.toml)|
|
|
||||||
|`--json`||`false`|output data in JSON format|
|
|
||||||
|`--log-level`||`info`|set the log level to debug|info|warn|error|
|
|
||||||
|`--no-stats`||`false`|disable anonymous usage statistics gathering|
|
|
||||||
@ -1,34 +0,0 @@
|
|||||||
---
|
|
||||||
title: corso backup delete onedrive
|
|
||||||
hide_title: true
|
|
||||||
---
|
|
||||||
## corso backup delete onedrive
|
|
||||||
|
|
||||||
Delete backed-up M365 OneDrive service data
|
|
||||||
|
|
||||||
```bash
|
|
||||||
corso backup delete onedrive --backup <backupId> [flags]
|
|
||||||
```
|
|
||||||
|
|
||||||
### Examples
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# Delete OneDrive backup with ID 1234abcd-12ab-cd34-56de-1234abcd
|
|
||||||
corso backup delete onedrive --backup 1234abcd-12ab-cd34-56de-1234abcd
|
|
||||||
```
|
|
||||||
|
|
||||||
### Flags
|
|
||||||
|
|
||||||
|Flag|Short|Default|Help|
|
|
||||||
|:----|:-----|:-------|:----|
|
|
||||||
|`--backup`|||ID of the backup to delete. <div class='required'>Required</div>|
|
|
||||||
|`--help`|`-h`|`false`|help for onedrive|
|
|
||||||
|
|
||||||
### Global and inherited flags
|
|
||||||
|
|
||||||
|Flag|Short|Default|Help|
|
|
||||||
|:----|:-----|:-------|:----|
|
|
||||||
|`--config-file`||`$HOME/.corso.toml`|config file location (default is $HOME/.corso.toml)|
|
|
||||||
|`--json`||`false`|output data in JSON format|
|
|
||||||
|`--log-level`||`info`|set the log level to debug|info|warn|error|
|
|
||||||
|`--no-stats`||`false`|disable anonymous usage statistics gathering|
|
|
||||||
@ -1,63 +0,0 @@
|
|||||||
---
|
|
||||||
title: corso backup details exchange
|
|
||||||
hide_title: true
|
|
||||||
---
|
|
||||||
## corso backup details exchange
|
|
||||||
|
|
||||||
Shows the details of a M365 Exchange service backup
|
|
||||||
|
|
||||||
```bash
|
|
||||||
corso backup details exchange --backup <backupId> [flags]
|
|
||||||
```
|
|
||||||
|
|
||||||
### Examples
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# Explore Alice's items in backup 1234abcd-12ab-cd34-56de-1234abcd
|
|
||||||
corso backup details exchange --backup 1234abcd-12ab-cd34-56de-1234abcd --user alice@example.com
|
|
||||||
|
|
||||||
# Explore Alice's emails with subject containing "Hello world" in folder "Inbox" from a specific backup
|
|
||||||
corso backup details exchange --backup 1234abcd-12ab-cd34-56de-1234abcd \
|
|
||||||
--user alice@example.com --email-subject "Hello world" --email-folder Inbox
|
|
||||||
|
|
||||||
# Explore Bobs's events occurring after start of 2022 from a specific backup
|
|
||||||
corso backup details exchange --backup 1234abcd-12ab-cd34-56de-1234abcd \
|
|
||||||
--user bob@example.com --event-starts-after 2022-01-01T00:00:00
|
|
||||||
|
|
||||||
# Explore Alice's contacts with name containing Andy from a specific backup
|
|
||||||
corso backup details exchange --backup 1234abcd-12ab-cd34-56de-1234abcd \
|
|
||||||
--user alice@example.com --contact-name Andy
|
|
||||||
```
|
|
||||||
|
|
||||||
### Flags
|
|
||||||
|
|
||||||
|Flag|Short|Default|Help|
|
|
||||||
|:----|:-----|:-------|:----|
|
|
||||||
|`--backup`|||ID of the backup to explore. <div class='required'>Required</div>|
|
|
||||||
|`--user`||``|Select backup details by user ID; accepts '*' to select all users.|
|
|
||||||
|`--email`||``|Select backup details for emails by email ID; accepts '*' to select all emails.|
|
|
||||||
|`--email-folder`||``|Select backup details for emails within a folder; accepts '*' to select all email folders.|
|
|
||||||
|`--email-subject`|||Select backup details for emails with a subject containing this value.|
|
|
||||||
|`--email-sender`|||Select backup details for emails from a specific sender.|
|
|
||||||
|`--email-received-after`|||Select backup details for emails received after this datetime.|
|
|
||||||
|`--email-received-before`|||Select backup details for emails received before this datetime.|
|
|
||||||
|`--event`||``|Select backup details for events by event ID; accepts '*' to select all events.|
|
|
||||||
|`--event-calendar`||``|Select backup details for events under a calendar; accepts '*' to select all events.|
|
|
||||||
|`--event-subject`|||Select backup details for events with a subject containing this value.|
|
|
||||||
|`--event-organizer`|||Select backup details for events from a specific organizer.|
|
|
||||||
|`--event-recurs`|||Select backup details for recurring events. Use `--event-recurs false` to select non-recurring events.|
|
|
||||||
|`--event-starts-after`|||Select backup details for events starting after this datetime.|
|
|
||||||
|`--event-starts-before`|||Select backup details for events starting before this datetime.|
|
|
||||||
|`--contact`||``|Select backup details for contacts by contact ID; accepts '*' to select all contacts.|
|
|
||||||
|`--contact-folder`||``|Select backup details for contacts within a folder; accepts '*' to select all contact folders.|
|
|
||||||
|`--contact-name`|||Select backup details for contacts whose contact name contains this value.|
|
|
||||||
|`--help`|`-h`|`false`|help for exchange|
|
|
||||||
|
|
||||||
### Global and inherited flags
|
|
||||||
|
|
||||||
|Flag|Short|Default|Help|
|
|
||||||
|:----|:-----|:-------|:----|
|
|
||||||
|`--config-file`||`$HOME/.corso.toml`|config file location (default is $HOME/.corso.toml)|
|
|
||||||
|`--json`||`false`|output data in JSON format|
|
|
||||||
|`--log-level`||`info`|set the log level to debug|info|warn|error|
|
|
||||||
|`--no-stats`||`false`|disable anonymous usage statistics gathering|
|
|
||||||
@ -1,48 +0,0 @@
|
|||||||
---
|
|
||||||
title: corso backup details onedrive
|
|
||||||
hide_title: true
|
|
||||||
---
|
|
||||||
## corso backup details onedrive
|
|
||||||
|
|
||||||
Shows the details of a M365 OneDrive service backup
|
|
||||||
|
|
||||||
```bash
|
|
||||||
corso backup details onedrive --backup <backupId> [flags]
|
|
||||||
```
|
|
||||||
|
|
||||||
### Examples
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# Explore Alice's files from backup 1234abcd-12ab-cd34-56de-1234abcd
|
|
||||||
corso backup details onedrive --backup 1234abcd-12ab-cd34-56de-1234abcd --user alice@example.com
|
|
||||||
|
|
||||||
# Explore Alice or Bob's files with name containing "Fiscal 22" in folder "Reports"
|
|
||||||
corso backup details onedrive --backup 1234abcd-12ab-cd34-56de-1234abcd \
|
|
||||||
--user alice@example.com,bob@example.com --file-name "Fiscal 22" --folder "Reports"
|
|
||||||
|
|
||||||
# Explore Alice's files created before end of 2015 from a specific backup
|
|
||||||
corso backup details onedrive --backup 1234abcd-12ab-cd34-56de-1234abcd \
|
|
||||||
--user alice@example.com --file-created-before 2015-01-01T00:00:00
|
|
||||||
```
|
|
||||||
|
|
||||||
### Flags
|
|
||||||
|
|
||||||
|Flag|Short|Default|Help|
|
|
||||||
|:----|:-----|:-------|:----|
|
|
||||||
|`--backup`|||ID of the backup to explore. <div class='required'>Required</div>|
|
|
||||||
|`--folder`||``|Select backup details by OneDrive folder; defaults to root.|
|
|
||||||
|`--file`||``|Select backup details by file name or ID.|
|
|
||||||
|`--file-created-after`|||Select backup details for files created after this datetime.|
|
|
||||||
|`--file-created-before`|||Select backup details for files created before this datetime.|
|
|
||||||
|`--file-modified-after`|||Select backup details for files modified after this datetime.|
|
|
||||||
|`--file-modified-before`|||Select backup details for files modified before this datetime.|
|
|
||||||
|`--help`|`-h`|`false`|help for onedrive|
|
|
||||||
|
|
||||||
### Global and inherited flags
|
|
||||||
|
|
||||||
|Flag|Short|Default|Help|
|
|
||||||
|:----|:-----|:-------|:----|
|
|
||||||
|`--config-file`||`$HOME/.corso.toml`|config file location (default is $HOME/.corso.toml)|
|
|
||||||
|`--json`||`false`|output data in JSON format|
|
|
||||||
|`--log-level`||`info`|set the log level to debug|info|warn|error|
|
|
||||||
|`--no-stats`||`false`|disable anonymous usage statistics gathering|
|
|
||||||
@ -1,27 +0,0 @@
|
|||||||
---
|
|
||||||
title: corso backup list exchange
|
|
||||||
hide_title: true
|
|
||||||
---
|
|
||||||
## corso backup list exchange
|
|
||||||
|
|
||||||
List the history of M365 Exchange service backups
|
|
||||||
|
|
||||||
```bash
|
|
||||||
corso backup list exchange [flags]
|
|
||||||
```
|
|
||||||
|
|
||||||
|
|
||||||
### Flags
|
|
||||||
|
|
||||||
|Flag|Short|Default|Help|
|
|
||||||
|:----|:-----|:-------|:----|
|
|
||||||
|`--help`|`-h`|`false`|help for exchange|
|
|
||||||
|
|
||||||
### Global and inherited flags
|
|
||||||
|
|
||||||
|Flag|Short|Default|Help|
|
|
||||||
|:----|:-----|:-------|:----|
|
|
||||||
|`--config-file`||`$HOME/.corso.toml`|config file location (default is $HOME/.corso.toml)|
|
|
||||||
|`--json`||`false`|output data in JSON format|
|
|
||||||
|`--log-level`||`info`|set the log level to debug|info|warn|error|
|
|
||||||
|`--no-stats`||`false`|disable anonymous usage statistics gathering|
|
|
||||||
@ -1,27 +0,0 @@
|
|||||||
---
|
|
||||||
title: corso backup list onedrive
|
|
||||||
hide_title: true
|
|
||||||
---
|
|
||||||
## corso backup list onedrive
|
|
||||||
|
|
||||||
List the history of M365 OneDrive service backups
|
|
||||||
|
|
||||||
```bash
|
|
||||||
corso backup list onedrive [flags]
|
|
||||||
```
|
|
||||||
|
|
||||||
|
|
||||||
### Flags
|
|
||||||
|
|
||||||
|Flag|Short|Default|Help|
|
|
||||||
|:----|:-----|:-------|:----|
|
|
||||||
|`--help`|`-h`|`false`|help for onedrive|
|
|
||||||
|
|
||||||
### Global and inherited flags
|
|
||||||
|
|
||||||
|Flag|Short|Default|Help|
|
|
||||||
|:----|:-----|:-------|:----|
|
|
||||||
|`--config-file`||`$HOME/.corso.toml`|config file location (default is $HOME/.corso.toml)|
|
|
||||||
|`--json`||`false`|output data in JSON format|
|
|
||||||
|`--log-level`||`info`|set the log level to debug|info|warn|error|
|
|
||||||
|`--no-stats`||`false`|disable anonymous usage statistics gathering|
|
|
||||||
@ -1,27 +0,0 @@
|
|||||||
---
|
|
||||||
title: corso env
|
|
||||||
hide_title: true
|
|
||||||
---
|
|
||||||
## corso env
|
|
||||||
|
|
||||||
A guide to using environment variables in Corso.
|
|
||||||
|
|
||||||
```bash
|
|
||||||
corso env [flags]
|
|
||||||
```
|
|
||||||
|
|
||||||
|
|
||||||
### Flags
|
|
||||||
|
|
||||||
|Flag|Short|Default|Help|
|
|
||||||
|:----|:-----|:-------|:----|
|
|
||||||
|`--help`|`-h`|`false`|help for env|
|
|
||||||
|
|
||||||
### Global and inherited flags
|
|
||||||
|
|
||||||
|Flag|Short|Default|Help|
|
|
||||||
|:----|:-----|:-------|:----|
|
|
||||||
|`--config-file`||`$HOME/.corso.toml`|config file location (default is $HOME/.corso.toml)|
|
|
||||||
|`--json`||`false`|output data in JSON format|
|
|
||||||
|`--log-level`||`info`|set the log level to debug|info|warn|error|
|
|
||||||
|`--no-stats`||`false`|disable anonymous usage statistics gathering|
|
|
||||||
@ -1,42 +0,0 @@
|
|||||||
---
|
|
||||||
title: corso repo connect s3
|
|
||||||
hide_title: true
|
|
||||||
---
|
|
||||||
## corso repo connect s3
|
|
||||||
|
|
||||||
Ensures a connection to an existing S3 repository.
|
|
||||||
|
|
||||||
```bash
|
|
||||||
corso repo connect s3 --bucket <bucket> [flags]
|
|
||||||
```
|
|
||||||
|
|
||||||
### Examples
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# Connect to a Corso repo in AWS S3 bucket named "my-bucket"
|
|
||||||
corso repo connect s3 --bucket my-bucket
|
|
||||||
|
|
||||||
# Connect to a Corso repo in AWS S3 bucket named "my-bucket" using a prefix
|
|
||||||
corso repo connect s3 --bucket my-bucket --prefix my-prefix
|
|
||||||
|
|
||||||
# Connect to a Corso repo in an S3 compliant storage provider
|
|
||||||
corso repo connect s3 --bucket my-bucket --endpoint https://my-s3-server-endpoint
|
|
||||||
```
|
|
||||||
|
|
||||||
### Flags
|
|
||||||
|
|
||||||
|Flag|Short|Default|Help|
|
|
||||||
|:----|:-----|:-------|:----|
|
|
||||||
|`--bucket`|||Name of S3 bucket for repo. <div class='required'>Required</div>|
|
|
||||||
|`--prefix`|||Repo prefix within bucket.|
|
|
||||||
|`--endpoint`||`s3.amazonaws.com`|S3 service endpoint.|
|
|
||||||
|`--help`|`-h`|`false`|help for s3|
|
|
||||||
|
|
||||||
### Global and inherited flags
|
|
||||||
|
|
||||||
|Flag|Short|Default|Help|
|
|
||||||
|:----|:-----|:-------|:----|
|
|
||||||
|`--config-file`||`$HOME/.corso.toml`|config file location (default is $HOME/.corso.toml)|
|
|
||||||
|`--json`||`false`|output data in JSON format|
|
|
||||||
|`--log-level`||`info`|set the log level to debug|info|warn|error|
|
|
||||||
|`--no-stats`||`false`|disable anonymous usage statistics gathering|
|
|
||||||
@ -1,42 +0,0 @@
|
|||||||
---
|
|
||||||
title: corso repo init s3
|
|
||||||
hide_title: true
|
|
||||||
---
|
|
||||||
## corso repo init s3
|
|
||||||
|
|
||||||
Bootstraps a new S3 repository and connects it to your m356 account.
|
|
||||||
|
|
||||||
```bash
|
|
||||||
corso repo init s3 --bucket <bucket> [flags]
|
|
||||||
```
|
|
||||||
|
|
||||||
### Examples
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# Create a new Corso repo in AWS S3 bucket named "my-bucket"
|
|
||||||
corso repo init s3 --bucket my-bucket
|
|
||||||
|
|
||||||
# Create a new Corso repo in AWS S3 bucket named "my-bucket" using a prefix
|
|
||||||
corso repo init s3 --bucket my-bucket --prefix my-prefix
|
|
||||||
|
|
||||||
# Create a new Corso repo in an S3 compliant storage provider
|
|
||||||
corso repo init s3 --bucket my-bucket --endpoint https://my-s3-server-endpoint
|
|
||||||
```
|
|
||||||
|
|
||||||
### Flags
|
|
||||||
|
|
||||||
|Flag|Short|Default|Help|
|
|
||||||
|:----|:-----|:-------|:----|
|
|
||||||
|`--bucket`|||Name of S3 bucket for repo. <div class='required'>Required</div>|
|
|
||||||
|`--prefix`|||Repo prefix within bucket.|
|
|
||||||
|`--endpoint`||`s3.amazonaws.com`|S3 service endpoint.|
|
|
||||||
|`--help`|`-h`|`false`|help for s3|
|
|
||||||
|
|
||||||
### Global and inherited flags
|
|
||||||
|
|
||||||
|Flag|Short|Default|Help|
|
|
||||||
|:----|:-----|:-------|:----|
|
|
||||||
|`--config-file`||`$HOME/.corso.toml`|config file location (default is $HOME/.corso.toml)|
|
|
||||||
|`--json`||`false`|output data in JSON format|
|
|
||||||
|`--log-level`||`info`|set the log level to debug|info|warn|error|
|
|
||||||
|`--no-stats`||`false`|disable anonymous usage statistics gathering|
|
|
||||||
@ -1,62 +0,0 @@
|
|||||||
---
|
|
||||||
title: corso restore exchange
|
|
||||||
hide_title: true
|
|
||||||
---
|
|
||||||
## corso restore exchange
|
|
||||||
|
|
||||||
Restore M365 Exchange service data
|
|
||||||
|
|
||||||
```bash
|
|
||||||
corso restore exchange --backup <backupId> [flags]
|
|
||||||
```
|
|
||||||
|
|
||||||
### Examples
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# Restore emails with ID 98765abcdef and 12345abcdef from a specific backup
|
|
||||||
corso restore exchange --backup 1234abcd-12ab-cd34-56de-1234abcd --email 98765abcdef,12345abcdef
|
|
||||||
|
|
||||||
# Restore Alice's emails with subject containing "Hello world" in "Inbox" from a specific backup
|
|
||||||
corso restore exchange --backup 1234abcd-12ab-cd34-56de-1234abcd \
|
|
||||||
--user alice@example.com --email-subject "Hello world" --email-folder Inbox
|
|
||||||
|
|
||||||
# Restore Bobs's entire calendar from a specific backup
|
|
||||||
corso restore exchange --backup 1234abcd-12ab-cd34-56de-1234abcd \
|
|
||||||
--user bob@example.com --event-calendar Calendar
|
|
||||||
|
|
||||||
# Restore contact with ID abdef0101 from a specific backup
|
|
||||||
corso restore exchange --backup 1234abcd-12ab-cd34-56de-1234abcd --contact abdef0101
|
|
||||||
```
|
|
||||||
|
|
||||||
### Flags
|
|
||||||
|
|
||||||
|Flag|Short|Default|Help|
|
|
||||||
|:----|:-----|:-------|:----|
|
|
||||||
|`--backup`|||ID of the backup to restore. <div class='required'>Required</div>|
|
|
||||||
|`--user`||``|Restore data by user ID; accepts '*' to select all users.|
|
|
||||||
|`--email`||``|Restore emails by ID; accepts '*' to select all emails.|
|
|
||||||
|`--email-folder`||``|Restore emails within a folder; accepts '*' to select all email folders.|
|
|
||||||
|`--email-subject`|||Restore emails with a subject containing this value.|
|
|
||||||
|`--email-sender`|||Restore emails from a specific sender.|
|
|
||||||
|`--email-received-after`|||Restore emails received after this datetime.|
|
|
||||||
|`--email-received-before`|||Restore emails received before this datetime.|
|
|
||||||
|`--event`||``|Restore events by event ID; accepts '*' to select all events.|
|
|
||||||
|`--event-calendar`||``|Restore events under a calendar; accepts '*' to select all event calendars.|
|
|
||||||
|`--event-subject`|||Restore events with a subject containing this value.|
|
|
||||||
|`--event-organizer`|||Restore events from a specific organizer.|
|
|
||||||
|`--event-recurs`|||Restore recurring events. Use `--event-recurs false` to restore non-recurring events.|
|
|
||||||
|`--event-starts-after`|||Restore events starting after this datetime.|
|
|
||||||
|`--event-starts-before`|||Restore events starting before this datetime.|
|
|
||||||
|`--contact`||``|Restore contacts by contact ID; accepts '*' to select all contacts.|
|
|
||||||
|`--contact-folder`||``|Restore contacts within a folder; accepts '*' to select all contact folders.|
|
|
||||||
|`--contact-name`|||Restore contacts whose contact name contains this value.|
|
|
||||||
|`--help`|`-h`|`false`|help for exchange|
|
|
||||||
|
|
||||||
### Global and inherited flags
|
|
||||||
|
|
||||||
|Flag|Short|Default|Help|
|
|
||||||
|:----|:-----|:-------|:----|
|
|
||||||
|`--config-file`||`$HOME/.corso.toml`|config file location (default is $HOME/.corso.toml)|
|
|
||||||
|`--json`||`false`|output data in JSON format|
|
|
||||||
|`--log-level`||`info`|set the log level to debug|info|warn|error|
|
|
||||||
|`--no-stats`||`false`|disable anonymous usage statistics gathering|
|
|
||||||
@ -1,49 +0,0 @@
|
|||||||
---
|
|
||||||
title: corso restore onedrive
|
|
||||||
hide_title: true
|
|
||||||
---
|
|
||||||
## corso restore onedrive
|
|
||||||
|
|
||||||
Restore M365 OneDrive service data
|
|
||||||
|
|
||||||
```bash
|
|
||||||
corso restore onedrive --backup <backupId> [flags]
|
|
||||||
```
|
|
||||||
|
|
||||||
### Examples
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# Restore file with ID 98765abcdef
|
|
||||||
corso restore onedrive --backup 1234abcd-12ab-cd34-56de-1234abcd --file 98765abcdef
|
|
||||||
|
|
||||||
# Restore Alice's file named "FY2021 Planning.xlsx in "Documents/Finance Reports" from a specific backup
|
|
||||||
corso restore onedrive --backup 1234abcd-12ab-cd34-56de-1234abcd \
|
|
||||||
--user alice@example.com --file "FY2021 Planning.xlsx" --folder "Documents/Finance Reports"
|
|
||||||
|
|
||||||
# Restore all files from Bob's folder that were created before 2020 when captured in a specific backup
|
|
||||||
corso restore onedrive --backup 1234abcd-12ab-cd34-56de-1234abcd
|
|
||||||
--user bob@example.com --folder "Documents/Finance Reports" --file-created-before 2020-01-01T00:00:00
|
|
||||||
```
|
|
||||||
|
|
||||||
### Flags
|
|
||||||
|
|
||||||
|Flag|Short|Default|Help|
|
|
||||||
|:----|:-----|:-------|:----|
|
|
||||||
|`--backup`|||ID of the backup to restore. <div class='required'>Required</div>|
|
|
||||||
|`--user`||``|Restore data by user ID; accepts '*' to select all users.|
|
|
||||||
|`--folder`||``|Restore items by OneDrive folder; defaults to root|
|
|
||||||
|`--file`||``|Restore items by file name or ID|
|
|
||||||
|`--file-created-after`|||Restore files created after this datetime|
|
|
||||||
|`--file-created-before`|||Restore files created before this datetime|
|
|
||||||
|`--file-modified-after`|||Restore files modified after this datetime|
|
|
||||||
|`--file-modified-before`|||Restore files modified before this datetime|
|
|
||||||
|`--help`|`-h`|`false`|help for onedrive|
|
|
||||||
|
|
||||||
### Global and inherited flags
|
|
||||||
|
|
||||||
|Flag|Short|Default|Help|
|
|
||||||
|:----|:-----|:-------|:----|
|
|
||||||
|`--config-file`||`$HOME/.corso.toml`|config file location (default is $HOME/.corso.toml)|
|
|
||||||
|`--json`||`false`|output data in JSON format|
|
|
||||||
|`--log-level`||`info`|set the log level to debug|info|warn|error|
|
|
||||||
|`--no-stats`||`false`|disable anonymous usage statistics gathering|
|
|
||||||
@ -9,7 +9,7 @@ const config = {
|
|||||||
title: 'Corso Documentation',
|
title: 'Corso Documentation',
|
||||||
tagline: 'Free, Secure, and Open-Source Backup for Microsoft 365',
|
tagline: 'Free, Secure, and Open-Source Backup for Microsoft 365',
|
||||||
url: 'https://corsobackup.io',
|
url: 'https://corsobackup.io',
|
||||||
baseUrl: '/',
|
baseUrl: process.env.CORSO_DOCS_BASEURL || '/',
|
||||||
onBrokenLinks: 'throw',
|
onBrokenLinks: 'throw',
|
||||||
onBrokenMarkdownLinks: 'throw',
|
onBrokenMarkdownLinks: 'throw',
|
||||||
favicon: 'img/corso_logo.svg',
|
favicon: 'img/corso_logo.svg',
|
||||||
|
|||||||
@ -6,3 +6,4 @@ datetime
|
|||||||
(?i)OneDrive
|
(?i)OneDrive
|
||||||
[Rr]epo
|
[Rr]epo
|
||||||
env
|
env
|
||||||
|
src
|
||||||
1
src/.gitignore
vendored
Normal file
1
src/.gitignore
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
dist/
|
||||||
30
src/.goreleaser.yaml
Normal file
30
src/.goreleaser.yaml
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
builds:
|
||||||
|
# https://goreleaser.com/customization/build/#builds
|
||||||
|
- env:
|
||||||
|
- CGO_ENABLED=0
|
||||||
|
goos:
|
||||||
|
- linux
|
||||||
|
- windows
|
||||||
|
- darwin
|
||||||
|
goarch: # other options: 386, arm
|
||||||
|
- amd64
|
||||||
|
- arm64
|
||||||
|
ignore:
|
||||||
|
- goos: windows
|
||||||
|
goarch: arm64
|
||||||
|
archives:
|
||||||
|
- replacements:
|
||||||
|
darwin: Darwin
|
||||||
|
linux: Linux
|
||||||
|
windows: Windows
|
||||||
|
386: i386
|
||||||
|
amd64: x86_64
|
||||||
|
checksum:
|
||||||
|
name_template: 'checksums.txt'
|
||||||
|
snapshot:
|
||||||
|
name_template: "{{ incpatch .Version }}-next"
|
||||||
|
changelog:
|
||||||
|
sort: asc
|
||||||
|
|
||||||
|
# yaml-language-server: $schema=https://goreleaser.com/static/schema.json
|
||||||
|
# vim: set ts=2 sw=2 tw=0 fo=cnqoj
|
||||||
Loading…
x
Reference in New Issue
Block a user