Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
33 commits
Select commit Hold shift + click to select a range
6b4e220
Merge pull request #159 from qubernetic/chore/backmerge-v1.0.0
q-soriarty Apr 3, 2026
20846c4
chore(deps): bump github.com/spf13/pflag from 1.0.9 to 1.0.10
dependabot[bot] Apr 7, 2026
88f81af
ci: bump codecov/codecov-action from 5 to 6
dependabot[bot] Apr 7, 2026
ccb89e9
ci: bump actions/upload-pages-artifact from 4 to 5
dependabot[bot] Apr 14, 2026
4577bba
ci: bump actions/github-script from 8 to 9
dependabot[bot] Apr 14, 2026
b135a72
chore: add Docker Compose dev environment
q-soriarty Apr 16, 2026
491bc1f
chore: replace Makefile with justfile and compose-based devcontainer
q-soriarty Apr 16, 2026
c9a3d87
docs: update dev workflow for Aurora-DX and remove Makefile
q-soriarty Apr 16, 2026
219e1f6
ci: replace make commands with direct go commands
q-soriarty Apr 16, 2026
5600726
Merge pull request #185 from qubernetic/chore/184-aurora-dx-devenv
q-soriarty Apr 16, 2026
7b90582
Merge pull request #179 from qubernetic/dependabot/go_modules/develop…
q-soriarty Apr 16, 2026
3403b39
Merge pull request #180 from qubernetic/dependabot/github_actions/dev…
q-soriarty Apr 16, 2026
3d2d84a
Merge pull request #182 from qubernetic/dependabot/github_actions/dev…
q-soriarty Apr 16, 2026
9d96876
Merge pull request #183 from qubernetic/dependabot/github_actions/dev…
q-soriarty Apr 16, 2026
4cfa1eb
chore(deps): bump Go from 1.26.1 to 1.26.2
q-soriarty Apr 16, 2026
9b3464f
Merge pull request #187 from qubernetic/chore/186-bump-go-1.26.2
q-soriarty Apr 16, 2026
23d5145
ci: update bump-go workflow to also update Dockerfile
q-soriarty Apr 16, 2026
bc905ad
Merge pull request #189 from qubernetic/ci/188-bump-go-update-dockerfile
q-soriarty Apr 16, 2026
047dc74
ci: add winget-releaser workflow and document winget installation
q-soriarty Apr 16, 2026
de949bc
Merge pull request #190 from qubernetic/ci/18-winget-releaser
q-soriarty Apr 16, 2026
9976a03
ci: add scheduled weekly integration test with auto issue on failure
q-soriarty Apr 16, 2026
ffbab48
Merge pull request #192 from qubernetic/ci/134-scheduled-integration
q-soriarty Apr 16, 2026
4c66566
ci: add COPR package publishing for Fedora/RHEL
q-soriarty Apr 16, 2026
dc0bea9
Merge pull request #193 from qubernetic/ci/164-copr-package
q-soriarty Apr 16, 2026
718a8d1
ci: add AUR package publishing for Arch Linux
q-soriarty Apr 16, 2026
da4f628
Merge pull request #194 from qubernetic/ci/161-aur-package
q-soriarty Apr 16, 2026
ffe3202
ci: add Snap package publishing for Ubuntu/Linux
q-soriarty Apr 16, 2026
3598e8b
Merge pull request #195 from qubernetic/ci/162-snap-package
q-soriarty Apr 16, 2026
bc10156
fix: correct workflow issues and maintainer email
q-soriarty Apr 16, 2026
4634cae
Merge pull request #197 from qubernetic/fix/196-workflow-issues
q-soriarty Apr 16, 2026
1602c9f
docs: update installation instructions with all package managers
q-soriarty Apr 16, 2026
d98cb56
Merge pull request #198 from qubernetic/docs/191-install-methods
q-soriarty Apr 16, 2026
fa0f1e9
chore(release): prepare v1.1.0
q-soriarty Apr 16, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 8 additions & 17 deletions .devcontainer/devcontainer.json
Original file line number Diff line number Diff line change
@@ -1,19 +1,10 @@
{
"name": "Copia CLI",
"image": "mcr.microsoft.com/devcontainers/base:ubuntu",
"features": {
"ghcr.io/devcontainers/features/go:1": {
"version": "1.26.1",
"golangciLintVersion": "latest"
},
"ghcr.io/devcontainers/features/github-cli:1": {},
"ghcr.io/devcontainers/features/node:1": {
"version": "lts"
}
},
"mounts": [
"source=${localEnv:HOME}/.claude,target=/home/vscode/.claude,type=bind,consistency=cached"
],
"dockerComposeFile": ["../docker-compose.yml", "../docker-compose.dev.yaml"],
"service": "go",
"workspaceFolder": "/app",
"postCreateCommand": "git config --global --add safe.directory /app && go mod download",
"forwardPorts": [],
"customizations": {
"vscode": {
"extensions": [
Expand All @@ -24,9 +15,9 @@
"go.toolsManagement.autoUpdate": true,
"go.testOnSave": true,
"go.lintTool": "golangci-lint",
"editor.formatOnSave": true
"editor.formatOnSave": true,
"security.workspace.trust.startupPrompt": "never"
}
}
},
"postCreateCommand": "npm install -g @anthropic-ai/claude-code && ([ -f go.sum ] && go mod download || true)"
}
}
5 changes: 5 additions & 0 deletions .envrc.example
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
export COMPOSE_PROJECT_NAME=copia-cli

# Copia API credentials (for integration tests)
# export COPIA_TOKEN=your-token-here
# export COPIA_HOST=https://app.copia.io
63 changes: 63 additions & 0 deletions .github/workflows/aur.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
name: Publish to AUR

on:
release:
types: [released]

jobs:
aur:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6

- name: Extract version
id: version
run: echo "version=${GITHUB_REF_NAME#v}" >> "$GITHUB_OUTPUT"

- name: Get checksums
id: checksums
run: |
gh release download "${{ github.ref_name }}" --pattern "checksums.txt" --output checksums.txt
echo "sha256_x86_64=$(grep 'linux_amd64.tar.gz' checksums.txt | cut -d' ' -f1)" >> "$GITHUB_OUTPUT"
echo "sha256_aarch64=$(grep 'linux_arm64.tar.gz' checksums.txt | cut -d' ' -f1)" >> "$GITHUB_OUTPUT"
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}

- name: Generate PKGBUILD
run: |
VERSION=${{ steps.version.outputs.version }}
SHA_X86=${{ steps.checksums.outputs.sha256_x86_64 }}
SHA_ARM=${{ steps.checksums.outputs.sha256_aarch64 }}
cat > PKGBUILD <<PKGEOF
# Maintainer: Qubernetic <info@qubernetic.com>
pkgname=copia-cli-bin
pkgver=${VERSION}
pkgrel=1
pkgdesc="CLI for Copia — source control for industrial automation"
arch=('x86_64' 'aarch64')
url="https://github.com/qubernetic/copia-cli"
license=('AGPL-3.0-only')
provides=('copia-cli')
conflicts=('copia-cli')

source_x86_64=("\${url}/releases/download/v\${pkgver}/copia-cli_\${pkgver}_linux_amd64.tar.gz")
source_aarch64=("\${url}/releases/download/v\${pkgver}/copia-cli_\${pkgver}_linux_arm64.tar.gz")
sha256sums_x86_64=('${SHA_X86}')
sha256sums_aarch64=('${SHA_ARM}')

package() {
install -Dm755 copia-cli "\${pkgdir}/usr/bin/copia-cli"
install -Dm644 LICENSE "\${pkgdir}/usr/share/licenses/\${pkgname}/LICENSE"
}
PKGEOF
sed -i 's/^ //' PKGBUILD

- name: Publish to AUR
uses: KSXGitHub/github-actions-deploy-aur@v3
with:
pkgname: copia-cli-bin
pkgbuild: ./PKGBUILD
commit_username: qubernetic
commit_email: info@qubernetic.com
ssh_private_key: ${{ secrets.AUR_SSH_PRIVATE_KEY }}
commit_message: "Update to ${{ steps.version.outputs.version }}"
10 changes: 8 additions & 2 deletions .github/workflows/bump-go.yml
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,10 @@ jobs:
with:
ref: develop

- uses: actions/setup-go@v6
with:
go-version: stable

- name: Check latest Go version
id: check
run: |
Expand All @@ -30,11 +34,12 @@ jobs:
echo "needs_update=false" >> "$GITHUB_OUTPUT"
fi

- name: Update go.mod
- name: Update Go version
if: steps.check.outputs.needs_update == 'true'
run: |
go mod edit -go=${{ steps.check.outputs.latest }}
go mod tidy
sed -i "s|^FROM golang:.*-alpine|FROM golang:${{ steps.check.outputs.latest }}-alpine|" Dockerfile

- name: Create Pull Request
if: steps.check.outputs.needs_update == 'true'
Expand All @@ -44,8 +49,9 @@ jobs:
commit-message: "chore(deps): bump Go from ${{ steps.check.outputs.current }} to ${{ steps.check.outputs.latest }}"
title: "chore(deps): bump Go from ${{ steps.check.outputs.current }} to ${{ steps.check.outputs.latest }}"
body: |
Auto-generated PR to update Go version in go.mod.
Auto-generated PR to update Go version.

- Current: `${{ steps.check.outputs.current }}`
- Latest: `${{ steps.check.outputs.latest }}`
- Files: `go.mod`, `Dockerfile`
base: develop
6 changes: 3 additions & 3 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -19,13 +19,13 @@ jobs:
go-version: "1.26"

- name: Build
run: make build
run: go build -ldflags "-s -w" -o bin/copia-cli ./cmd/copia-cli

- name: Test
run: go test -coverprofile=coverage.out ./...

- name: Upload coverage to Codecov
uses: codecov/codecov-action@v5
uses: codecov/codecov-action@v6
with:
files: coverage.out
token: ${{ secrets.CODECOV_TOKEN }}
Expand Down Expand Up @@ -57,7 +57,7 @@ jobs:
go-version: "1.26"

- name: Integration tests
run: make integration
run: go test -tags=integration ./...
env:
COPIA_TEST_TOKEN: ${{ secrets.COPIA_TEST_TOKEN }}
COPIA_TEST_HOST: ${{ secrets.COPIA_TEST_HOST }}
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/close-linked-issues.yml
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ jobs:
pull-requests: read
steps:
- name: Close linked issues
uses: actions/github-script@v8
uses: actions/github-script@v9
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
script: |
Expand Down
42 changes: 42 additions & 0 deletions .github/workflows/copr.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
name: Publish to COPR

on:
release:
types: [released]

jobs:
copr:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6

- name: Install copr-cli
run: |
sudo apt-get update
sudo apt-get install -y python3-pip rpm
pip3 install copr-cli

- name: Configure copr-cli
run: |
mkdir -p ~/.config
printf '[copr-cli]\nlogin = %s\nusername = %s\ntoken = %s\ncopr_url = https://copr.fedorainfracloud.org\n' \
"${{ secrets.COPR_LOGIN }}" "${{ secrets.COPR_USERNAME }}" "${{ secrets.COPR_TOKEN }}" \
> ~/.config/copr

- name: Extract version
id: version
run: echo "version=${GITHUB_REF_NAME#v}" >> "$GITHUB_OUTPUT"

- name: Build SRPM
run: |
VERSION=${{ steps.version.outputs.version }}
curl -sL "https://github.com/${{ github.repository }}/archive/v${VERSION}/${GITHUB_REPOSITORY##*/}-${VERSION}.tar.gz" \
-o rpmbuild/copia-cli-${VERSION}.tar.gz
rpmbuild -bs rpmbuild/copia-cli.spec \
--define "version ${VERSION}" \
--define "_sourcedir $(pwd)/rpmbuild" \
--define "_srcrpmdir $(pwd)/rpmbuild"

- name: Submit to COPR
run: |
copr-cli build copia-cli rpmbuild/copia-cli-*.src.rpm
2 changes: 1 addition & 1 deletion .github/workflows/docs.yml
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ jobs:
destination: ./_site

- name: Upload Pages artifact
uses: actions/upload-pages-artifact@v4
uses: actions/upload-pages-artifact@v5

deploy:
needs: build
Expand Down
41 changes: 41 additions & 0 deletions .github/workflows/integration-scheduled.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
name: Scheduled Integration Test

on:
schedule:
- cron: "0 6 * * 1" # Weekly, Monday 6:00 UTC
workflow_dispatch:

permissions:
contents: read
issues: write

jobs:
integration:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- uses: actions/setup-go@v6
with:
go-version: "1.26"

- name: Integration tests
run: go test -tags=integration -v ./...
env:
COPIA_TEST_TOKEN: ${{ secrets.COPIA_TEST_TOKEN }}
COPIA_TEST_HOST: ${{ secrets.COPIA_TEST_HOST }}
COPIA_TEST_OWNER: ${{ secrets.COPIA_TEST_OWNER }}
COPIA_TEST_REPO: ${{ secrets.COPIA_TEST_REPO }}

- name: Create issue on failure
if: failure()
uses: actions/github-script@v9
with:
script: |
const date = new Date().toISOString().split('T')[0];
const runUrl = `${context.serverUrl}/${context.repo.owner}/${context.repo.repo}/actions/runs/${context.runId}`;
await github.rest.issues.create({
...context.repo,
title: `ci: scheduled integration test failure (${date})`,
body: `The scheduled integration test failed.\n\nWorkflow run: ${runUrl}\n\nThis may indicate a Copia API change.`,
labels: ['bug']
});
23 changes: 23 additions & 0 deletions .github/workflows/snap.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
name: Publish to Snap Store

on:
release:
types: [released]

jobs:
snap:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
with:
fetch-depth: 0

- uses: snapcore/action-build@v1
id: build

- uses: snapcore/action-publish@v1
env:
SNAPCRAFT_STORE_CREDENTIALS: ${{ secrets.SNAPCRAFT_STORE_CREDENTIALS }}
with:
snap: ${{ steps.build.outputs.snap }}
release: stable
16 changes: 16 additions & 0 deletions .github/workflows/winget.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
name: Publish to WinGet

on:
release:
types: [released]

jobs:
publish:
runs-on: ubuntu-slim
steps:
- uses: vedantmgoyal9/winget-releaser@main
with:
identifier: Qubernetic.copia-cli
installers-regex: '\.zip$'
max-versions-to-keep: 5
token: ${{ secrets.WINGET_TOKEN }}
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ thumbs.db

# Secrets
.env*
!.envrc.example

# Test
*.test
Expand Down
2 changes: 1 addition & 1 deletion .goreleaser.yml
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,7 @@ nfpms:
package_name: copia-cli
vendor: Qubernetic
homepage: "https://github.com/qubernetic/copia-cli"
maintainer: "Qubernetic <hello@qubernetic.io>"
maintainer: "Qubernetic <info@qubernetic.com>"
description: "CLI for Copia — source control for industrial automation"
license: AGPL-3.0
formats:
Expand Down
35 changes: 35 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,41 @@ 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.1.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).

## [1.1.0] - 2026-04-16

### Added

- WinGet automated publishing on release (#18, #190)
- COPR package for Fedora/RHEL — `dnf copr enable qubernetic/copia-cli` (#164, #193)
- AUR package for Arch Linux — `yay -S copia-cli-bin` (#161, #194)
- Snap package for Ubuntu/Linux — `snap install copia-cli --classic` (#162, #195)
- Scheduled weekly integration test with auto issue on failure (#134, #192)
- Tag protection ruleset for `v*` release tags (#149)

### Changed

- Dev environment migrated to Aurora-DX: Docker Compose + justfile, Makefile removed (#184, #185)
- Bump-go workflow now also updates Dockerfile (#188, #189)
- Installation docs updated with all new package managers (#191, #198)
- Maintainer email updated to info@qubernetic.com (#196, #197)

### Fixed

- AUR workflow: pkgbuild input expects file path, not inline content (#196)
- COPR workflow: heredoc indentation broke INI parser (#196)
- WinGet workflow: use ubuntu-slim per official docs (#196)
- Bump-go workflow: add setup-go step for go mod tidy (#196)

### Dependencies

- Go 1.26.1 → 1.26.2 (#186, #187)
- github.com/spf13/pflag 1.0.9 → 1.0.10 (#179)
- actions/github-script 8 → 9 (#183)
- actions/upload-pages-artifact 4 → 5 (#182)
- codecov/codecov-action 5 → 6 (#180)

---

## [1.0.0] - 2026-04-03

### Highlights
Expand Down
Loading
Loading