ci: add ci

Carlos Alexandro Becker created

Change summary

.github/workflows/build.yml           |  9 +++
.github/workflows/dependabot-sync.yml | 17 ++++++
.github/workflows/lint-sync.yml       | 14 +++++
.github/workflows/lint.yml            |  8 ++
.github/workflows/nightly.yml         | 35 ++++++++++++
.github/workflows/release.yml         | 38 +++++++++++++
.goreleaser.yaml                      | 79 +++++++++++++++++++++++++++++
7 files changed, 200 insertions(+)

Detailed changes

.github/workflows/build.yml 🔗

@@ -0,0 +1,9 @@
+name: build
+on: [push, pull_request]
+
+jobs:
+  build:
+    uses: charmbracelet/meta/.github/workflows/build.yml@main
+    with:
+      go-version: ""
+      go-version-file: ./go.mod

.github/workflows/dependabot-sync.yml 🔗

@@ -0,0 +1,17 @@
+name: dependabot-sync
+on:
+  schedule:
+    - cron: "0 0 * * 0" # every Sunday at midnight
+  workflow_dispatch: # allows manual triggering
+
+permissions:
+  contents: write
+  pull-requests: write
+
+jobs:
+  dependabot-sync:
+    uses: charmbracelet/meta/.github/workflows/dependabot-sync.yml@main
+    with:
+      repo_name: ${{ github.event.repository.name }}
+    secrets:
+      gh_token: ${{ secrets.PERSONAL_ACCESS_TOKEN }}

.github/workflows/lint-sync.yml 🔗

@@ -0,0 +1,14 @@
+name: lint-sync
+on:
+  schedule:
+    # every Sunday at midnight
+    - cron: "0 0 * * 0"
+  workflow_dispatch: # allows manual triggering
+
+permissions:
+  contents: write
+  pull-requests: write
+
+jobs:
+  lint:
+    uses: charmbracelet/meta/.github/workflows/lint-sync.yml@main

.github/workflows/lint.yml 🔗

@@ -0,0 +1,8 @@
+name: lint
+on:
+  push:
+  pull_request:
+
+jobs:
+  lint:
+    uses: charmbracelet/meta/.github/workflows/lint.yml@main

.github/workflows/nightly.yml 🔗

@@ -0,0 +1,35 @@
+name: deploy development
+
+on:
+  push:
+    branches:
+      - main
+
+jobs:
+  goreleaser:
+    uses: charmbracelet/meta/.github/workflows/nightly.yml@main
+    with:
+      go_version: stable
+      upload_artifacts: false
+    secrets:
+      docker_username: ${{ secrets.DOCKERHUB_USERNAME }}
+      docker_token: ${{ secrets.DOCKERHUB_TOKEN }}
+      goreleaser_key: ${{ secrets.GORELEASER_KEY }}
+      gh_pat: ${{ secrets.PERSONAL_ACCESS_TOKEN }}
+
+  deploy:
+    name: Run deploy workflow
+    runs-on: ubuntu-latest
+    needs: [goreleaser]
+    steps:
+      - uses: benc-uk/workflow-dispatch@v1
+        with:
+          workflow: Update
+          repo: charmbracelet/infra-dev
+          ref: main
+          token: ${{ secrets.PERSONAL_ACCESS_TOKEN }}
+          inputs: |
+            {
+              "app": "fur
+              "image": "ghcr.io/charmbracelet/fur:${{ github.sha }}-devel"
+            }

.github/workflows/release.yml 🔗

@@ -0,0 +1,38 @@
+name: deploy production
+
+on:
+  push:
+    tags:
+      - v*.*.*
+
+concurrency:
+  group: goreleaser
+  cancel-in-progress: true
+
+jobs:
+  goreleaser:
+    uses: charmbracelet/meta/.github/workflows/goreleaser.yml@main
+    with:
+      go_version: stable
+    secrets:
+      docker_username: ${{ secrets.DOCKERHUB_USERNAME }}
+      docker_token: ${{ secrets.DOCKERHUB_TOKEN }}
+      goreleaser_key: ${{ secrets.GORELEASER_KEY }}
+      gh_pat: ${{ secrets.PERSONAL_ACCESS_TOKEN }}
+
+  deploy:
+    name: Run deploy workflow
+    runs-on: ubuntu-latest
+    needs: [goreleaser]
+    steps:
+      - uses: benc-uk/workflow-dispatch@v1
+        with:
+          workflow: Update
+          repo: charmbracelet/infra-prod
+          ref: main
+          token: ${{ secrets.PERSONAL_ACCESS_TOKEN }}
+          inputs: |
+            {
+              "app": "fur",
+              "image": "ghcr.io/charmbracelet/fur:${{ github.ref_name }}"
+            }

.goreleaser.yaml 🔗

@@ -0,0 +1,79 @@
+# This is an example .goreleaser.yml file with some sensible defaults.
+# Make sure to check the documentation at https://goreleaser.com
+
+# The lines below are called `modelines`. See `:help modeline`
+# Feel free to remove those if you don't want/need to use them.
+# yaml-language-server: $schema=https://goreleaser.com/static/schema-pro.json
+# vim: set ts=2 sw=2 tw=0 fo=cnqoj
+
+version: 2
+pro: true
+
+before:
+  hooks:
+    - go mod tidy
+
+builds:
+  - binary: fur
+    env:
+      - CGO_ENABLED=0
+    main: .
+    ldflags: -s -w -X main.Version=v{{ .Version }} -X main.CommitSHA={{ .Commit }} -X main.CommitDate={{ .CommitDate }}
+    targets:
+      - linux_amd64
+      - linux_arm64
+
+checksum:
+  name_template: "checksums.txt"
+
+snapshot:
+  version_template: "{{ incpatch .Version }}-snapshot"
+
+nightly:
+  version_template: "{{ incpatch .Version }}-devel"
+
+dockers:
+  - image_templates:
+      - "ghcr.io/charmbracelet/{{ .ProjectName }}:v{{ .Version }}-arm64"
+    goarch: arm64
+    build_flag_templates:
+      - --platform=linux/arm64
+      - --label=org.opencontainers.image.title={{ .ProjectName }}
+      - --label=org.opencontainers.image.source={{ .GitURL }}
+      - --label=org.opencontainers.image.version=v{{ .Version }}
+      - --label=org.opencontainers.image.created={{ .Date }}
+      - --label=org.opencontainers.image.revision={{ .FullCommit }}
+      - --label=org.opencontainers.image.licenses=MIT
+    dockerfile: goreleaser.dockerfile
+    use: buildx
+  - image_templates:
+      - "ghcr.io/charmbracelet/{{ .ProjectName }}:v{{ .Version }}-amd64"
+    goarch: amd64
+    build_flag_templates:
+      - --platform=linux/amd64
+      - --label=org.opencontainers.image.title={{ .ProjectName }}
+      - --label=org.opencontainers.image.source={{ .GitURL }}
+      - --label=org.opencontainers.image.version=v{{ .Version }}
+      - --label=org.opencontainers.image.created={{ .Date }}
+      - --label=org.opencontainers.image.revision={{ .FullCommit }}
+      - --label=org.opencontainers.image.licenses=MIT
+    dockerfile: goreleaser.dockerfile
+    use: buildx
+
+docker_manifests:
+  - name_template: "{{ if not .IsNightly }}ghcr.io/charmbracelet/{{ .ProjectName }}:latest{{ end }}"
+    image_templates:
+      - "ghcr.io/charmbracelet/{{ .ProjectName }}:v{{ .Version }}-amd64"
+      - "ghcr.io/charmbracelet/{{ .ProjectName }}:v{{ .Version }}-arm64"
+  - name_template: "ghcr.io/charmbracelet/{{ .ProjectName }}:v{{ .Version }}"
+    image_templates:
+      - "ghcr.io/charmbracelet/{{ .ProjectName }}:v{{ .Version }}-amd64"
+      - "ghcr.io/charmbracelet/{{ .ProjectName }}:v{{ .Version }}-arm64"
+  - name_template: "ghcr.io/charmbracelet/{{ .ProjectName }}:{{ .Commit }}{{ if .IsNightly }}-devel{{ end }}"
+    image_templates:
+      - "ghcr.io/charmbracelet/{{ .ProjectName }}:v{{ .Version }}-amd64"
+      - "ghcr.io/charmbracelet/{{ .ProjectName }}:v{{ .Version }}-arm64"
+  - name_template: "{{ if .IsNightly }}ghcr.io/charmbracelet/{{ .ProjectName }}:nightly{{ end }}"
+    image_templates:
+      - "ghcr.io/charmbracelet/{{ .ProjectName }}:v{{ .Version }}-amd64"
+      - "ghcr.io/charmbracelet/{{ .ProjectName }}:v{{ .Version }}-arm64"