diff --git a/.github/workflows/example.yml b/.github/workflows/example.yml
index a1cb447..0e5d3be 100644
--- a/.github/workflows/example.yml
+++ b/.github/workflows/example.yml
@@ -1,34 +1,38 @@
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
- if: ${{ always() }}
- run: echo "::set-output name=sha8::$(echo ${FORGEJO_SHA} | cut -c1-8)"
- id: slug
-
- name: First Chat Message
if: ${{ always() }}
- uses: https://stackit-solutions.git.onstackit.cloud/actions/notify@v0.1.2
+ uses: https://stackit-solutions.git.onstackit.cloud/actions/notify@v${{ env.VER }}
with:
+ title: "[START] sample test (${{ forgejo.run_number }})"
author: ${{ forgejo.actor }}
giturl: ${{ forgejo.server_url }}
- # status: ${{ job.status }}
+ 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 }}
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 20cd801..f3035dc 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -1,10 +1,29 @@
-FROM golang:1.26
+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 mod tidy \
- && 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/docker-slimbuild b/docker-slimbuild
deleted file mode 100644
index 6a8459c..0000000
--- a/docker-slimbuild
+++ /dev/null
@@ -1,31 +0,0 @@
-FROM golang:1.26 AS builder
-
-RUN apt-get update && apt-get -y install upx
-
-WORKDIR /app
-#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 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/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 12cb578..7a9eafc 100644
--- a/main.go
+++ b/main.go
@@ -42,6 +42,56 @@ func main() {
data.CardID = uuid.NewString()
data.Add = ""
+ getData(&data)
+
+ webhook := githubactions.GetInput("webhook")
+ if webhook == "" {
+ githubactions.Fatalf("Missing input 'webhook'")
+ os.Exit(1)
+ }
+ 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)
+ }
+
+ req, err := http.NewRequest("POST", webhook, bytes.NewBuffer(jsonStr))
+ if err != nil {
+ 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 {
+ githubactions.Fatalf("error %s", err.Error())
+ os.Exit(1)
+ }
+ 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
@@ -84,56 +134,6 @@ func main() {
os.Exit(1)
}
data.ActionID = actionid
-
- webhook := githubactions.GetInput("webhook")
- if webhook == "" {
- githubactions.Fatalf("Missing input 'webhook'")
- os.Exit(1)
- }
- 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)
- // fmt.Println("URL:> ", webhook)
-
- // var jsonStr = []byte(fmt.Sprintf(data, project, commit, branch, status, actionid))
-
- jsonStr, err := card(data)
- if err != nil {
- githubactions.Fatalf("error %s", err.Error())
- os.Exit(1)
- }
-
- // log.Printf("retrieved data: %s", string(jsonStr))
-
- req, err := http.NewRequest("POST", webhook, bytes.NewBuffer(jsonStr))
- if err != nil {
- 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 {
- githubactions.Fatalf("error %s", err.Error())
- os.Exit(1)
- }
- defer resp.Body.Close()
- 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 card(d templateData) ([]byte, error) {
diff --git a/main_test.go b/main_test.go
index 5c04597..f7e5241 100644
--- a/main_test.go
+++ b/main_test.go
@@ -27,8 +27,6 @@ func Test_card(t *testing.T) {
Author: "gotest",
IconUrl: "https://github.githubassets.com/images/modules/logos_page/Octocat.png",
Project: "proj",
- Commit: "12345",
- Branch: "main",
Status: "success",
ActionID: "123",
GitURL: "https://test.url",
@@ -115,9 +113,6 @@ func Test_card(t *testing.T) {
t.Fatalf("error: %v\nsrc: %s", err, tt.want)
}
- //if !reflect.DeepEqual(wantJson, gotJson) {
- // t.Errorf("card() got = %v, want %v", gotJson, wantJson)
- //}
if diff := cmp.Diff(wantJson, gotJson); diff != "" {
t.Errorf("MakeGatewayInfo() mismatch (-want +got):\n%s", diff)
}
diff --git a/message.tpl b/message.tpl
index 3a50378..b20a0d7 100644
--- a/message.tpl
+++ b/message.tpl
@@ -27,7 +27,7 @@
{
"textParagraph": {
"text": "{{ .EventBody }}",
- "maxLines": 2
+ "maxLines": 5
}
},
{