diff --git a/.dockerignore b/.dockerignore
new file mode 100644
index 0000000..0f4cd25
--- /dev/null
+++ b/.dockerignore
@@ -0,0 +1,5 @@
+.github
+.gitignore
+action.yml
+docker-slimbuild
+main_test.go
diff --git a/.github/workflows/example.yml b/.github/workflows/example.yml
index c50bc49..0e5d3be 100644
--- a/.github/workflows/example.yml
+++ b/.github/workflows/example.yml
@@ -1,26 +1,41 @@
name: Sample Testing
-on: [push]
+on: [workflow_dispatch]
+
+env:
+ VER: 0.3.1
jobs:
my_job:
runs-on: stackit-docker
steps:
- - name: Checkout
- uses: actions/checkout@v6
-
- - name: Get commit hash
+ - name: First Chat Message
if: ${{ always() }}
- run: echo "::set-output name=sha8::$(echo ${FORGEJO_SHA} | cut -c1-8)"
- id: slug
-
- - name: Chat Setup
- if: ${{ always() }}
- uses: https://stackit-solutions.git.onstackit.cloud/actions/notify@v0
+ uses: https://stackit-solutions.git.onstackit.cloud/actions/notify@v${{ env.VER }}
with:
- project: ${{ forgejo.repository }}
- commit: ${{ steps.slug.outputs.sha8 }}
- branch: ${{ forgejo.ref }}
+ title: "[START] sample test (${{ forgejo.run_number }})"
+ author: ${{ forgejo.actor }}
+ giturl: ${{ forgejo.server_url }}
+ iconslug: instacart
+ # status: ${{ job.status }} # optional
+ actionid: ${{ forgejo.run_number }}
+ webhook: "${{ secrets.WEBHOOK_URL }}"
+ # event_body: "" # optional
+
+# - name: Force failure
+# run: |
+# echo "This is a force failure"
+# exit 1
+
+ - name: Second Chat Message as ThreadResponse
+ if: ${{ always() }}
+ uses: https://stackit-solutions.git.onstackit.cloud/actions/notify@v0.1.2
+ with:
+ title: "[END] sample test (${{ forgejo.run_number }})"
+ iconslug: bun
+ author: ${{ forgejo.actor }}
+ giturl: ${{ forgejo.server_url }}
status: ${{ job.status }}
- actionid: ${{ forgejo.repository }}/actions/runs/${{ forgejo.run_id }}
- webhook: "https://chat.googleapis.com/v1/spaces/AAAAYTX-Vqs/messages?key=AIzaSyDdI0hCZtE6vySjMm-WEfRq3CPzqKqqsHI&token=Iwtvo1dwg36dZgUyrUCREQGGMrO71PkIoQGafOf17Yg%3D&threadKey=git-commit"
+ actionid: ${{ forgejo.run_number }}
+ webhook: "${{ secrets.WEBHOOK_URL }}"
+ event_body: "this time I provided a body"
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
new file mode 100644
index 0000000..581badf
--- /dev/null
+++ b/.github/workflows/release.yml
@@ -0,0 +1,143 @@
+name: CI
+on:
+ push:
+ branches:
+ - '**'
+ pull_request:
+ branches:
+ - '**'
+
+env:
+ VER: 0.3.1
+
+# If a 403 error occurs, make sure to set content permission to write
+# see: https://github.com/go-semantic-release/action/issues/27
+permissions:
+ contents: write
+
+jobs:
+ lint:
+ runs-on: stackit-docker
+ steps:
+ - name: CI checkout
+ uses: actions/checkout@v6
+
+ - name: Setup GO
+ uses: actions/setup-go@v6
+ with:
+ # go-version: 1.26
+ go-version-file: 'go.mod'
+ cache-dependency-path: 'go.sum'
+
+ - name: GO Linting
+ uses: golangci/golangci-lint-action@v9
+ with:
+ version: v2.11
+
+# build:
+# runs-on: stackit-docker
+## strategy:
+## fail-fast: true
+## matrix:
+## node: [10, 12]
+# steps:
+# - uses: actions/checkout@v6
+#
+# - uses: actions/setup-node@v1
+# with:
+# node-version: ${{ matrix.node }}
+# - run: npm ci
+# - run: npm test
+ release:
+ runs-on: stackit-docker
+# needs: build
+ outputs:
+ tag: ${{ steps.create_release.outputs.tag }}
+ steps:
+ - name: "🖅 [START] release workflow"
+ if: ${{ always() }}
+ uses: https://stackit-solutions.git.onstackit.cloud/actions/notify@v${{ env.VER }}
+ with:
+ title: "[START] release workflow (${{ forgejo.run_number }})"
+ subtitle: "${{ forgejo.repostitory }}"
+ author: ${{ forgejo.actor }}
+ giturl: ${{ forgejo.server_url }}
+ iconslug: instacart
+ actionid: ${{ forgejo.run_number }}
+ webhook: "${{ secrets.WEBHOOK_URL }}"
+
+ - name: Checkout code
+ uses: actions/checkout@v6
+
+# - name: Semantic Release
+# uses: go-semantic-release/action@v1
+# id: semrel
+# with:
+# github-token: ${{ env.FORGEJO_TOKEN }}
+# allow-initial-development-versions: true
+# # update-file: package.json
+# changelog-file: CHANGELOG.md
+# changelog-generator-opt: "emojis=true"
+
+ - name: Setup Node.js
+ uses: actions/setup-node@v4
+ with:
+ node-version: '20'
+
+ - name: Create Release
+ env:
+ FORGEJO_TOKEN: ${{ secrets.FORGEJO_TOKEN }}
+ id: create_release
+ run: |
+ npx \
+ -p semantic-release \
+ -p semantic-release-replace-plugin \
+ -p @semantic-release/commit-analyzer \
+ -p @semantic-release/release-notes-generator \
+ -p @semantic-release/changelog \
+ -p @semantic-release/git \
+ semantic-release
+ echo "tag=$(git describe --tags --abbrev=0)" >> $FORGEJO_OUTPUT
+
+ - name: Login to Docker Hub
+ if: steps.create_release.outputs.tag != ''
+ uses: docker/login-action@v4
+ with:
+ registry: ${{ forgejo.server_url }}
+ username: ${{ vars.GIT_USERNAME }}
+ password: ${{ secrets.GIT_PAT }}
+
+# - name: Set up QEMU
+# if: steps.semrel.outputs.version != ''
+# uses: docker/setup-qemu-action@v4
+
+ - name: Set up Docker Buildx
+ if: steps.create_release.outputs.tag != ''
+ uses: docker/setup-buildx-action@v4
+
+ - name: Build only
+ if: steps.create_release.outputs.tag == ''
+ uses: docker/build-push-action@v7
+ with:
+ push: false
+ tags: actions/notify-slim:dev
+
+ - name: Build and push
+ if: steps.create_release.outputs.tag != ''
+ uses: docker/build-push-action@v7
+ with:
+ push: true
+ tags: stackit-solutions.git.onstackit.cloud/actions/notify-slim:${{ steps.create_release.outputs.tag }}
+
+ - name: "🖅 [END] release workflow"
+ if: ${{ always() }}
+ uses: https://stackit-solutions.git.onstackit.cloud/actions/notify@v${{ env.VER }}
+ with:
+ title: "[END] release workflow (${{ forgejo.run_number }})"
+ subtitle: "${{ forgejo.repostitory }}"
+ author: ${{ forgejo.actor }}
+ giturl: ${{ forgejo.server_url }}
+ iconslug: instacart
+ actionid: ${{ forgejo.run_number }}
+ webhook: "${{ secrets.WEBHOOK_URL }}"
+ status: 'completed'
diff --git a/.golangci.yaml b/.golangci.yaml
new file mode 100644
index 0000000..35b6ac1
--- /dev/null
+++ b/.golangci.yaml
@@ -0,0 +1,88 @@
+version: "2"
+run:
+ concurrency: 4
+output:
+ formats:
+ text:
+ print-linter-name: true
+ print-issued-lines: true
+ colors: true
+ path: stdout
+linters:
+ enable:
+ - bodyclose
+ - depguard
+ - errorlint
+ - forcetypeassert
+ - gochecknoinits
+ - gocritic
+ - gosec
+ - misspell
+ - nakedret
+ - revive
+ - sqlclosecheck
+ - wastedassign
+ disable:
+ - noctx
+ - unparam
+ settings:
+ depguard:
+ rules:
+ main:
+ list-mode: original
+ allow: []
+ deny:
+ - pkg: github.com/stretchr/testify
+ desc: Do not use a testing framework
+ gocritic:
+ disabled-checks:
+ - wrapperFunc
+ - typeDefFirst
+ - ifElseChain
+ - dupImport
+ - hugeParam
+ enabled-tags:
+ - performance
+ - style
+ - experimental
+ gosec:
+ excludes:
+ - G104
+ - G102
+ - G304
+ - G307
+ misspell:
+ locale: US
+ nakedret:
+ max-func-lines: 0
+ revive:
+ severity: error
+ rules:
+ - name: errorf
+ - name: context-as-argument
+ - name: error-return
+ - name: increment-decrement
+ - name: indent-error-flow
+ - name: superfluous-else
+ - name: unused-parameter
+ - name: unreachable-code
+ - name: atomic
+ - name: empty-lines
+ - name: early-return
+ exclusions:
+ paths: []
+ generated: lax
+ warn-unused: true
+ # Excluding configuration per-path, per-linter, per-text and per-source.
+ rules:
+ # Exclude some linters from running on tests files.
+ - path: _test\.go
+ linters:
+ - gochecknoinits
+formatters:
+ enable:
+ - gofmt
+ - goimports
+# settings:
+# goimports:
+# local-prefixes:
diff --git a/.releaserc.json b/.releaserc.json
new file mode 100644
index 0000000..8310b91
--- /dev/null
+++ b/.releaserc.json
@@ -0,0 +1,78 @@
+{
+ "branches": ["main"],
+ "tagFormat": "v${version}",
+ "plugins": [
+ "@semantic-release/commit-analyzer",
+ [
+ "semantic-release-replace-plugin",
+ {
+ "replacements": [
+ {
+ "files": ["action.yml"],
+ "from": " image: 'docker://stackit-solutions.git.onstackit.cloud/actions/notify-slim:v.*'",
+ "to": " image: 'docker://stackit-solutions.git.onstackit.cloud/actions/notify-slim:v${nextRelease.version}'",
+ "results": [
+ {
+ "file": "action.yml",
+ "hasChanged": true,
+ "numMatches": 1,
+ "numReplacements": 1
+ }
+ ],
+ "countMatches": true
+ },
+ {
+ "files": ["README.md"],
+ "from": " uses: https://stackit-solutions.git.onstackit.cloud/actions/notify@v.*",
+ "to": " uses: https://stackit-solutions.git.onstackit.cloud/actions/notify@v${nextRelease.version}",
+ "results": [
+ {
+ "file": "README.md",
+ "hasChanged": true,
+ "numMatches": 1,
+ "numReplacements": 1
+ }
+ ],
+ "countMatches": true
+ },
+ {
+ "files": [".github/workflows/example.yml"],
+ "from": " VER: .*",
+ "to": " VER: ${nextRelease.version}",
+ "results": [
+ {
+ "file": ".github/workflows/example.yml",
+ "hasChanged": true,
+ "numMatches": 1,
+ "numReplacements": 1
+ }
+ ],
+ "countMatches": true
+ },
+ {
+ "files": [".github/workflows/release.yml"],
+ "from": " VER: .*",
+ "to": " VER: ${nextRelease.version}",
+ "results": [
+ {
+ "file": ".github/workflows/release.yml",
+ "hasChanged": true,
+ "numMatches": 1,
+ "numReplacements": 1
+ }
+ ],
+ "countMatches": true
+ }
+ ]
+ }
+ ],
+ "@semantic-release/release-notes-generator",
+ "@semantic-release/changelog",
+ [
+ "@semantic-release/git",
+ {
+ "assets": ["CHANGELOG.md", "README.md", "action.yml", ".github/workflows/example.yml", ".github/workflows/release.yml"]
+ }
+ ]
+ ]
+}
diff --git a/CHANGELOG.md b/CHANGELOG.md
new file mode 100644
index 0000000..24b7be5
--- /dev/null
+++ b/CHANGELOG.md
@@ -0,0 +1,23 @@
+## [0.3.1](https://stackit-solutions.git.onstackit.cloud/actions/notify/compare/v0.3.0...v0.3.1) (2026-04-17)
+
+
+### Bug Fixes
+
+* pipeline fixes ([b195a1d](https://stackit-solutions.git.onstackit.cloud/actions/notify/commit/b195a1dcfdd7bf98eaaeb976d08260a2457da317))
+
+# [0.3.0](https://stackit-solutions.git.onstackit.cloud/actions/notify/compare/v0.2.0...v0.3.0) (2026-04-17)
+
+
+### Features
+
+* linting ([68c1f11](https://stackit-solutions.git.onstackit.cloud/actions/notify/commit/68c1f11a5cc02918166ca05e4af79712a5c0964b))
+* linting ([16a5f87](https://stackit-solutions.git.onstackit.cloud/actions/notify/commit/16a5f874b341a6d4776dbe5e46be391f1d6576d8))
+
+# [0.2.0](https://stackit-solutions.git.onstackit.cloud/actions/notify/compare/v0.1.2...v0.2.0) (2026-04-17)
+
+
+### Features
+
+* linting ([9d4e8c9](https://stackit-solutions.git.onstackit.cloud/actions/notify/commit/9d4e8c9a9dc3fcc133299e978fed191ad6052aac))
+* linting ([5b93809](https://stackit-solutions.git.onstackit.cloud/actions/notify/commit/5b938091d705e01f6467cdd6be9144e491c66502))
+* pipeline container build ([0414cf6](https://stackit-solutions.git.onstackit.cloud/actions/notify/commit/0414cf6dfb9956c85bb48f5217806841f5819716))
diff --git a/Dockerfile b/Dockerfile
index 89e372a..f3035dc 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -1,8 +1,29 @@
-FROM golang:1.13
+FROM golang:1.26 AS builder
-WORKDIR /src
+RUN apt-get update && apt-get -y install upx
+
+WORKDIR /app
+
+ENV CGO_ENABLED=0
COPY . .
-RUN go get -u github.com/sethvargo/go-githubactions/... && go build -o /bin/google-chat-action
+RUN go mod tidy && go build \
+ -a \
+ -trimpath \
+ -ldflags "-s -w -extldflags '-static'" \
+ -installsuffix cgo \
+ -tags netgo \
+ -o /bin/google-chat-action \
+ .
+
+RUN strip /bin/google-chat-action
+
+RUN upx -q -9 /bin/google-chat-action
+
+FROM scratch
+
+COPY --from=builder /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/
+
+COPY --from=builder /bin/google-chat-action /bin/google-chat-action
ENTRYPOINT ["/bin/google-chat-action"]
diff --git a/Dockerfile.big b/Dockerfile.big
new file mode 100644
index 0000000..20cd801
--- /dev/null
+++ b/Dockerfile.big
@@ -0,0 +1,10 @@
+FROM golang:1.26
+
+WORKDIR /src
+COPY . .
+
+RUN go get -u github.com/sethvargo/go-githubactions/... \
+ && go mod tidy \
+ && go build -o /bin/google-chat-action
+
+ENTRYPOINT ["/bin/google-chat-action"]
diff --git a/README.md b/README.md
index d305f27..c4e8400 100644
--- a/README.md
+++ b/README.md
@@ -13,23 +13,20 @@ jobs:
runs-on: ubuntu-latest
steps:
- - name: Checkout
- uses: actions/checkout@v6
-
- - name: Get commit hash
- if: ${{ always() }}
- run: echo "::set-output name=sha8::$(echo ${GITHUB_SHA} | cut -c1-8)"
- id: slug
-
- - name: Chat Setup
- if: ${{ always() }}
- uses: https://stackit-solutions.git.onstackit.cloud/actions/notify@v0
- with:
- project: ${{ github.repository }}
- commit: ${{ steps.slug.outputs.sha8 }}
- branch: ${{ github.ref }}
- status: ${{ job.status }}
- actionid: ${{ github.repository }}/runs/${{ github.run_id }}
- webhook: "https://chat.googleapis.com/v1/spaces/AAAAzPcAy4s/messages?key=AIzaSyDdI0hCZtE6vySjMm-WEfRq3CPzqKqqsHI&token=MmdzluicdrdkyUAV_QwB6BzlLcIhbfrwNzxVrEllaec%3D&threadKey=git-commit"
+ # ... all your steps
+ - name: Sample Chat Message
+ if: ${{ always() }} # runs als after fails
+ uses: https://stackit-solutions.git.onstackit.cloud/actions/notify@v0.3.1
+ with:
+ title: "[START] sample test (${{ forgejo.run_number }})"
+ author: ${{ forgejo.actor }}
+ giturl: ${{ forgejo.server_url }}
+ iconslug: instacart # optional
+ # status: ${{ job.status }} # optional
+ actionid: ${{ forgejo.run_number }}
+ webhook: "${{ secrets.WEBHOOK_URL }}"
+ event_body: "This is a sample TEXT
with a new line" # optional
```
+
+TODO - icon_slug
diff --git a/action.yml b/action.yml
index 977f0d0..7487391 100644
--- a/action.yml
+++ b/action.yml
@@ -1,21 +1,18 @@
name: 'Google Chat Action'
-author: 'D Ther Htun'
+author: 'D Ther Htun/ Marcel S. Henselin'
description: 'Github actions for google chat Room Bot'
branding:
icon: 'at-sign'
color: 'green'
inputs:
- project:
- description: 'Github Project Name'
+ autor:
+ description: 'Git Action Author'
required: true
- commit:
- description: 'Github Commit ID'
- required: true
- branch:
- description: 'Github Branch'
+ giturl:
+ description: 'Git Server URL'
required: true
status:
- description: 'Github Action Build Status'
+ description: 'Git Action Build Status'
required: true
actionid:
description: 'Current Running Action ID'
@@ -23,10 +20,14 @@ inputs:
webhook:
description: 'Google Chat Webhook URL'
required: true
+ event_body:
+ description: 'Google Chat Event Body'
+ required: true
runs:
using: 'docker'
- image: 'docker://dther/google-chat-action:v0.8'
+ image: 'docker://stackit-solutions.git.onstackit.cloud/actions/notify-slim:v0.1.2'
+ # image: 'Dockerfile'
args:
- ${{ inputs.project }}
- ${{ inputs.commit }}
diff --git a/docker-slimbuild b/docker-slimbuild
deleted file mode 100644
index bdc6e01..0000000
--- a/docker-slimbuild
+++ /dev/null
@@ -1,30 +0,0 @@
-FROM golang:1.13 AS builder
-
-RUN apt-get update && apt-get -y install upx
-
-#RUN mkdir -p $GOPATH/src/github.com/DTherHtun/google-chat-action
-#ADD . $GOPATH/src/github.com/DTherHtun/google-chat-action
-RUN go get -u github.com/sethvargo/go-githubactions/...
-ENV CGO_ENABLED=0
-COPY . .
-
-RUN go build \
- -a \
- -trimpath \
- -ldflags "-s -w -extldflags '-static'" \
- -installsuffix cgo \
- -tags netgo \
- -o /bin/google-chat-action \
- .
-
-RUN strip /bin/google-chat-action
-
-RUN upx -q -9 /bin/google-chat-action
-
-FROM scratch
-
-COPY --from=builder /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/
-
-COPY --from=builder /bin/google-chat-action /bin/google-chat-action
-
-ENTRYPOINT ["/bin/google-chat-action"]
diff --git a/go.mod b/go.mod
index a935e06..8e5d566 100644
--- a/go.mod
+++ b/go.mod
@@ -2,4 +2,9 @@ module google-chat-action
go 1.26.2
-require github.com/sethvargo/go-githubactions v1.3.2
+require (
+ github.com/google/go-cmp v0.7.0
+ github.com/sethvargo/go-githubactions v1.3.2
+)
+
+require github.com/google/uuid v1.6.0
diff --git a/go.sum b/go.sum
new file mode 100644
index 0000000..b8212ad
--- /dev/null
+++ b/go.sum
@@ -0,0 +1,6 @@
+github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=
+github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU=
+github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
+github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
+github.com/sethvargo/go-githubactions v1.3.2 h1:gkibLr/QjosgNWoCf1V58rTMRZw7xZtSB7dY4atbl1Y=
+github.com/sethvargo/go-githubactions v1.3.2/go.mod h1:7/4WeHgYfSz9U5vwuToCK9KPnELVHAhGtRwLREOQV80=
diff --git a/google-chat-action.png b/google-chat-action.png
index cbab7f1..fad33f0 100644
Binary files a/google-chat-action.png and b/google-chat-action.png differ
diff --git a/main.go b/main.go
index 0989c3a..7a9eafc 100644
--- a/main.go
+++ b/main.go
@@ -2,89 +2,191 @@ package main
import (
"bytes"
+ _ "embed"
"fmt"
"net/http"
+ "os"
+ "text/template"
+ "github.com/google/uuid"
"github.com/sethvargo/go-githubactions"
)
+const (
+ defaultColor = "483d8b/6495ed"
+ successColor = "006400/228b22"
+ failedColor = "8b0000/dc143c"
+)
+
+//go:embed message.tpl
+var message string
+
+type templateData struct {
+ CardID string
+ IconSlug string
+ Title string
+ SubTitle string
+ Author string
+ IconUrl string
+ Status string
+ ActionID string
+ GitURL string
+ Project string
+ Color string
+ Add string
+ EventBody string
+}
+
func main() {
- project := githubactions.GetInput("project")
- if project == "" {
- githubactions.Fatalf("Missing input 'project'")
- }
- commit := githubactions.GetInput("commit")
- if commit == "" {
- githubactions.Fatalf("Missing input 'commit'")
- }
- branch := githubactions.GetInput("branch")
- if branch == "" {
- githubactions.Fatalf("Missing input 'branch'")
- }
- status := githubactions.GetInput("status")
- if status == "" {
- githubactions.Fatalf("Missing input 'status'")
- }
- actionid := githubactions.GetInput("actionid")
- if actionid == "" {
- githubactions.Fatalf("Missing input 'actionid'")
- }
+ data := templateData{}
+ data.CardID = uuid.NewString()
+ data.Add = ""
+
+ getData(&data)
+
webhook := githubactions.GetInput("webhook")
if webhook == "" {
- githubactions.Fatalf("Missing input 'webshook'")
+ githubactions.Fatalf("Missing input 'webhook'")
+ os.Exit(1)
}
- joburl := githubactions.GetInput("joburl")
- if webhook == "" {
- githubactions.Fatalf("Missing input 'joburl'")
+ webhook = fmt.Sprintf("%s&threadKey=notify%s&messageReplyOption=REPLY_MESSAGE_FALLBACK_TO_NEW_THREAD", webhook, data.ActionID)
+
+ giturl := githubactions.GetInput("giturl")
+ if giturl == "" {
+ githubactions.Fatalf("Missing input 'giturl'")
+ os.Exit(1)
+ }
+ data.GitURL = giturl
+
+ body := githubactions.GetInput("event_body")
+ data.EventBody = body
+
+ githubactions.Infof("using URL: %s", webhook)
+
+ jsonStr, err := card(data)
+ if err != nil {
+ githubactions.Fatalf("err %s", err.Error())
+ os.Exit(1)
}
- fmt.Println("URL:> ", webhook)
- data := `{
- "cards": [
- {
- "header": {
- "title": "GitHub Action",
- "subtitle": "Build Job",
- "imageUrl": "https://github.githubassets.com/images/modules/logos_page/Octocat.png",
- "imageStyle": "IMAGE"
- },
- "sections": [
- {
- "widgets": [
- {
- "textParagraph": {
- "text": "Project: %s
Commit-id: %s
Branch: %s
Build Status: %s"
- },
- "buttons": [
- {
- "textButton": {
- "text": "Job Details",
- "onClick": {
- "openLink": {
- "url": "https://github.com/%s"
- }
- }
- }
- }
- ]
- }
- ]
- }
- ]
- }
- ]
-}`
- var jsonStr = []byte(fmt.Sprintf(data, project, commit, branch, status, actionid))
req, err := http.NewRequest("POST", webhook, bytes.NewBuffer(jsonStr))
if err != nil {
- panic(err)
+ githubactions.Fatalf("error %s", err.Error())
+ os.Exit(1)
}
req.Header.Set("Content-Type", "application/json; charset=UTF-8")
client := &http.Client{}
resp, err := client.Do(req)
if err != nil {
- panic(err)
+ githubactions.Fatalf("error %s", err.Error())
+ os.Exit(1)
}
- defer resp.Body.Close()
+ defer resp.Body.Close() //nolint:gocritic
+
fmt.Println("response Status:", resp.Status)
+ if resp.StatusCode != http.StatusOK {
+ githubactions.Infof("json: %s", jsonStr)
+ githubactions.Fatalf("response: %+v\n", resp)
+ os.Exit(1)
+ }
+}
+
+func getData(data *templateData) {
+ prj, ok := os.LookupEnv("FORGEJO_REPOSITORY")
+ if ok {
+ data.Project = prj
+ }
+
+ author := githubactions.GetInput("author")
+ if author == "" {
+ githubactions.Infof("[INFO] Missing input 'author', using default")
+ author = "STACKIT git action"
+ }
+ data.Author = author
+
+ icon := githubactions.GetInput("iconslug")
+ if icon == "" {
+ githubactions.Infof("[INFO] Missing input 'iconslug', using default")
+ icon = "git"
+ }
+ data.IconSlug = icon
+
+ title := githubactions.GetInput("title")
+ if title == "" {
+ githubactions.Infof("[INFO] Missing input 'title', using default")
+ title = "STACKIT git action"
+ }
+ data.Title = title
+
+ status := githubactions.GetInput("status")
+ if status == "" {
+ githubactions.Infof("[INFO] Missing input 'status', trying default")
+ var ok bool
+ if status, ok = os.LookupEnv("JOB_STATUS"); ok {
+ githubactions.Infof("[INFO] found job status")
+ }
+ }
+ data.Status = status
+
+ actionid := githubactions.GetInput("actionid")
+ if actionid == "" {
+ githubactions.Fatalf("Missing input 'actionid'")
+ os.Exit(1)
+ }
+ data.ActionID = actionid
+}
+
+func card(d templateData) ([]byte, error) {
+ switch d.Status {
+ case "success":
+ d.Color = successColor
+ case "failure":
+ d.Color = failedColor
+ default:
+ d.Color = defaultColor
+ }
+
+ if d.IconUrl == "" {
+ d.IconUrl = fmt.Sprintf(
+ "https://cdn.simpleicons.org/%s/%s",
+ d.IconSlug,
+ d.Color,
+ )
+ }
+
+ if d.EventBody == "" {
+ bdy := ""
+ if d.Project != "" {
+ bdy += fmt.Sprintf("Project: %s
", d.Project)
+ }
+
+ sha, ok := os.LookupEnv("FORGEJO_SHA")
+ if ok {
+ bdy += fmt.Sprintf("Commit-id: %.*s
", 8, sha)
+ }
+
+ ref, ok := os.LookupEnv("FORGEJO_REF")
+ if ok {
+ bdy += fmt.Sprintf("Branch: %s
", ref)
+ }
+
+ if d.Status != "" {
+ bdy += fmt.Sprintf("Build Status: %s", d.Status)
+ }
+
+ d.EventBody = bdy
+ }
+
+ tmpl, err := template.New("message").Parse(message)
+ if err != nil {
+ return nil, err
+ }
+
+ buf := new(bytes.Buffer)
+ err = tmpl.Execute(buf, d)
+ if err != nil {
+ return nil, err
+ }
+
+ return buf.Bytes(), nil
}
diff --git a/main_test.go b/main_test.go
new file mode 100644
index 0000000..f7e5241
--- /dev/null
+++ b/main_test.go
@@ -0,0 +1,121 @@
+package main
+
+import (
+ "encoding/json"
+ "testing"
+
+ "github.com/google/go-cmp/cmp"
+)
+
+func Test_card(t *testing.T) {
+ type args struct {
+ d templateData
+ }
+ tests := []struct {
+ name string
+ args args
+ want []byte
+ wantErr bool
+ }{
+ {
+ name: "test one",
+ args: args{
+ d: templateData{
+ CardID: "aed17996-84fc-45d5-9061-2c51535ae267",
+ Title: "test",
+ SubTitle: "first test",
+ Author: "gotest",
+ IconUrl: "https://github.githubassets.com/images/modules/logos_page/Octocat.png",
+ Project: "proj",
+ Status: "success",
+ ActionID: "123",
+ GitURL: "https://test.url",
+ Color: "c0c0c0",
+ EventBody: "no body",
+ },
+ },
+ want: []byte(`
+{
+ "cardsV2": [
+ {
+ "cardId": "notify-aed17996-84fc-45d5-9061-2c51535ae267",
+ "card": {
+ "header": {
+ "title": "test",
+ "subtitle": "first test",
+ "imageUrl": "https://github.githubassets.com/images/modules/logos_page/Octocat.png",
+ "imageAltText": "message avatar image",
+ "imageType": "SQUARE"
+ },
+ "sections": [
+ {
+ "header": "test",
+ "collapsible": true,
+ "uncollapsibleWidgetsCount": 2,
+ "widgets": [
+ {
+ "decoratedText": {
+ "startIcon": {
+ "knownIcon": "PERSON"
+ },
+ "text": "gotest"
+ }
+ },
+ {
+ "textParagraph": {
+ "text": "no body",
+ "maxLines": 2
+ }
+ },
+ {
+ "buttonList": {
+ "buttons": [
+ {
+ "text": "View Source Event",
+ "type": "FILLED",
+ "onClick": {
+ "openLink": {
+ "url": "https://test.url/proj/actions/runs/123"
+ }
+ }
+ }
+ ]
+ }
+ }
+ ]
+ }
+ ]
+ }
+ }
+ ]
+}
+`),
+ wantErr: false,
+ },
+ }
+ for _, tt := range tests {
+ t.Run(tt.name, func(t *testing.T) {
+ got, err := card(tt.args.d)
+ if (err != nil) != tt.wantErr {
+ t.Errorf("card() error = %v, wantErr %v", err, tt.wantErr)
+ return
+ }
+
+ var gotJson any
+ err = json.Unmarshal(got, &gotJson)
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ var wantJson any
+ err = json.Unmarshal(tt.want, &wantJson)
+ if err != nil {
+ t.Fatalf("error: %v\nsrc: %s", err, tt.want)
+ }
+
+ if diff := cmp.Diff(wantJson, gotJson); diff != "" {
+ t.Errorf("MakeGatewayInfo() mismatch (-want +got):\n%s", diff)
+ }
+ })
+ }
+}
diff --git a/message.tpl b/message.tpl
new file mode 100644
index 0000000..b20a0d7
--- /dev/null
+++ b/message.tpl
@@ -0,0 +1,54 @@
+{
+ "cardsV2": [
+ {
+ "cardId": "notify-{{ .CardID }}",
+ "card": {
+ "header": {
+ "title": "{{ .Title }}",
+ "subtitle": "{{ .SubTitle }}",
+ "imageUrl": "{{ .IconUrl }}",
+ "imageType": "SQUARE",
+ "imageAltText": "message avatar image"
+ },
+ "sections": [
+ {
+ "header": "{{ .Title }}",
+ "collapsible": false,
+ "uncollapsibleWidgetsCount": 2,
+ "widgets": [
+ {
+ "decoratedText": {
+ "startIcon": {
+ "knownIcon": "PERSON"
+ },
+ "text": "{{ .Author }}"
+ }
+ },
+ {
+ "textParagraph": {
+ "text": "{{ .EventBody }}",
+ "maxLines": 5
+ }
+ },
+ {
+ "buttonList": {
+ "buttons": [
+ {
+ "text": "View Source Event",
+ "type": "FILLED",
+ "onClick": {
+ "openLink": {
+ "url": "{{ .GitURL }}/{{ .Project }}/actions/runs/{{ .ActionID }}"
+ }
+ }
+ }
+ ]
+ }
+ }
+ ]
+ }
+ ]
+ }
+ }
+ ]
+}