CI (#43)

Dax created

* sync

* ci test

* ci test

* tag

* sync

* sync

* ci

* sync

* enable cgo

* sync

* add back brew

* switch to main

Change summary

.github/workflows/build.yml   | 34 +++++++++++++++++
.github/workflows/release.yml | 37 +++++++++++++++++++
.goreleaser.yml               | 72 +++++++++++++++++++++++++++++++++++++
scripts/release               | 43 ++++++++++++++++++++++
scripts/snapshot              |  3 +
5 files changed, 189 insertions(+)

Detailed changes

.github/workflows/build.yml 🔗

@@ -0,0 +1,34 @@
+name: build
+
+on:
+  workflow_dispatch:
+  push:
+    branches:
+      - main
+
+concurrency: ${{ github.workflow }}-${{ github.ref }}
+
+permissions:
+  contents: write
+  packages: write
+
+jobs:
+  build:
+    runs-on: ubuntu-latest
+    steps:
+      - uses: actions/checkout@v3
+        with:
+          fetch-depth: 0
+
+      - run: git fetch --force --tags
+
+      - uses: actions/setup-go@v5
+        with:
+          go-version: ">=1.23.2"
+
+      - run: go mod download
+      - uses: goreleaser/goreleaser-action@v6
+        with:
+          distribution: goreleaser
+          version: latest
+          args: build --snapshot --clean

.github/workflows/release.yml 🔗

@@ -0,0 +1,37 @@
+name: release
+
+on:
+  workflow_dispatch:
+  push:
+    tags:
+      - "*"
+
+concurrency: ${{ github.workflow }}-${{ github.ref }}
+
+permissions:
+  contents: write
+  packages: write
+
+jobs:
+  goreleaser:
+    runs-on: ubuntu-latest
+    steps:
+      - uses: actions/checkout@v3
+        with:
+          fetch-depth: 0
+
+      - run: git fetch --force --tags
+
+      - uses: actions/setup-go@v5
+        with:
+          go-version: ">=1.23.2"
+
+      - run: go mod download
+      - uses: goreleaser/goreleaser-action@v6
+        with:
+          distribution: goreleaser
+          version: latest
+          args: release --clean
+        env:
+          GITHUB_TOKEN: ${{ secrets.HOMEBREW_GITHUB_TOKEN }}
+          AUR_KEY: ${{ secrets.AUR_KEY }}

.goreleaser.yml 🔗

@@ -0,0 +1,72 @@
+version: 2
+project_name: opencode
+before:
+  hooks:
+builds:
+  - env:
+    goos:
+      - linux
+      - darwin
+    main: ./main.go
+
+archives:
+  - format: tar.gz
+    # this name template makes the OS and Arch compatible with the results of uname.
+    name_template: >-
+      opencode-
+      {{- if eq .Os "darwin" }}mac-
+      {{- else if eq .Os "windows" }}windows-
+      {{- else if eq .Os "linux" }}linux-{{end}}
+      {{- if eq .Arch "amd64" }}x86_64
+      {{- else if eq .Arch "#86" }}i386
+      {{- else }}{{ .Arch }}{{ end }}
+      {{- if .Arm }}v{{ .Arm }}{{ end }}
+    # use zip for windows archives
+    format_overrides:
+      - goos: windows
+        format: zip
+checksum:
+  name_template: "checksums.txt"
+snapshot:
+  name_template: "0.0.0-{{ .Timestamp }}"
+aurs:
+  - name: opencode
+    homepage: "https://github.com/opencode-ai/opencode"
+    description: "Deploy anything"
+    maintainers:
+      - "opencode <noreply@opencode.ai>"
+    license: "MIT"
+    private_key: "{{ .Env.AUR_KEY }}"
+    git_url: "ssh://aur@aur.archlinux.org/opencode-bin.git"
+    provides:
+      - opencode
+    conflicts:
+      - opencode
+    package: |-
+      install -Dm755 ./opencode "${pkgdir}/usr/bin/opencode"
+brews:
+  - repository:
+      owner: opencode-ai
+      name: homebrew-tap
+nfpms:
+  - maintainer: opencode
+    description: terminal based agent that can build anything
+    formats:
+      - deb
+      - rpm
+    file_name_template: >-
+      {{ .ProjectName }}-
+      {{- if eq .Os "darwin" }}mac
+      {{- else }}{{ .Os }}{{ end }}-{{ .Arch }}
+
+changelog:
+  sort: asc
+  filters:
+    exclude:
+      - "^docs:"
+      - "^doc:"
+      - "^test:"
+      - "^ci:"
+      - "^ignore:"
+      - "^example:"
+      - "^wip:"

scripts/release 🔗

@@ -0,0 +1,43 @@
+#!/usr/bin/env bash
+
+# Parse command line arguments
+minor=false
+while [ "$#" -gt 0 ]; do
+  case "$1" in
+    --minor) minor=true; shift 1;;
+    *) echo "Unknown parameter: $1"; exit 1;;
+  esac
+done
+
+git fetch --force --tags
+
+# Get the latest Git tag
+latest_tag=$(git tag --sort=committerdate | grep -E '[0-9]' | tail -1)
+
+# If there is no tag, exit the script
+if [ -z "$latest_tag" ]; then
+    echo "No tags found"
+    exit 1
+fi
+
+echo "Latest tag: $latest_tag"
+
+# Split the tag into major, minor, and patch numbers
+IFS='.' read -ra VERSION <<< "$latest_tag"
+
+if [ "$minor" = true ]; then
+    # Increment the minor version and reset patch to 0
+    minor_number=${VERSION[1]}
+    let "minor_number++"
+    new_version="${VERSION[0]}.$minor_number.0"
+else
+    # Increment the patch version
+    patch_number=${VERSION[2]}
+    let "patch_number++"
+    new_version="${VERSION[0]}.${VERSION[1]}.$patch_number"
+fi
+
+echo "New version: $new_version"
+
+git tag $new_version
+git push --tags

scripts/snapshot 🔗

@@ -0,0 +1,3 @@
+#!/usr/bin/env bash
+set -e
+goreleaser build --clean --snapshot --skip validate