From e9d70573a7be86b5628d82f65bfac3ee62f41ea4 Mon Sep 17 00:00:00 2001 From: martin <74269598+martabal@users.noreply.github.com> Date: Tue, 14 Nov 2023 13:41:21 +0100 Subject: [PATCH 1/5] fix: v1.86 (#9) --- go.mod | 2 +- go.sum | 5 +++-- grafana/dashboard.json | 23 ++++++++++++----------- src/init.go | 5 +---- src/models/api.go | 26 +++++++++++--------------- src/prometheus/prometheus.go | 19 +++++++++---------- src/tests/prometheus_test.go | 13 ++++++------- 7 files changed, 43 insertions(+), 50 deletions(-) diff --git a/go.mod b/go.mod index c5f7ce6..606331b 100644 --- a/go.mod +++ b/go.mod @@ -15,6 +15,6 @@ require ( github.com/prometheus/client_model v0.5.0 // indirect github.com/prometheus/common v0.45.0 // indirect github.com/prometheus/procfs v0.12.0 // indirect - golang.org/x/sys v0.13.0 // indirect + golang.org/x/sys v0.14.0 // indirect google.golang.org/protobuf v1.31.0 // indirect ) diff --git a/go.sum b/go.sum index 6934ef0..02595d1 100644 --- a/go.sum +++ b/go.sum @@ -8,6 +8,7 @@ github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSs github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= +github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0= github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4= github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 h1:jWpvCLoY8Z/e3VKvlsiIGKtc+UG6U5vzxaoagmhXfyg= @@ -28,8 +29,8 @@ github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+ github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE= -golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.14.0 h1:Vz7Qs629MkJkGyHxUlRHizWJRG2j8fbQKjELVSNhy7Q= +golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8= diff --git a/grafana/dashboard.json b/grafana/dashboard.json index e6bfbfa..314ed56 100644 --- a/grafana/dashboard.json +++ b/grafana/dashboard.json @@ -15,7 +15,7 @@ "type": "grafana", "id": "grafana", "name": "Grafana", - "version": "10.1.5" + "version": "10.2.0" }, { "type": "panel", @@ -137,7 +137,7 @@ }, "textMode": "auto" }, - "pluginVersion": "10.1.5", + "pluginVersion": "10.2.0", "targets": [ { "datasource": { @@ -206,7 +206,7 @@ }, "textMode": "auto" }, - "pluginVersion": "10.1.5", + "pluginVersion": "10.2.0", "targets": [ { "datasource": { @@ -275,7 +275,7 @@ }, "textMode": "auto" }, - "pluginVersion": "10.1.5", + "pluginVersion": "10.2.0", "targets": [ { "datasource": { @@ -344,7 +344,7 @@ }, "textMode": "auto" }, - "pluginVersion": "10.1.5", + "pluginVersion": "10.2.0", "targets": [ { "datasource": { @@ -521,7 +521,7 @@ } ] }, - "pluginVersion": "10.1.5", + "pluginVersion": "10.2.0", "targets": [ { "datasource": { @@ -552,6 +552,7 @@ "mode": "palette-classic" }, "custom": { + "axisBorderShow": false, "axisCenteredZero": false, "axisColorMode": "text", "axisLabel": "", @@ -632,7 +633,7 @@ "exemplar": false, "expr": "immich_user_usage", "instant": false, - "legendFormat": "{{firstname}} {{lastname}}", + "legendFormat": "{{name}}", "range": true, "refId": "A" } @@ -651,6 +652,7 @@ "mode": "palette-classic" }, "custom": { + "axisBorderShow": false, "axisCenteredZero": false, "axisColorMode": "text", "axisLabel": "", @@ -865,7 +867,7 @@ "exemplar": false, "expr": "immich_user_usage", "instant": true, - "legendFormat": "{{firstname}} {{lastname}}", + "legendFormat": "{{name}}", "range": false, "refId": "A" } @@ -874,9 +876,8 @@ "type": "piechart" } ], - "refresh": "5m", + "refresh": "auto", "schemaVersion": 38, - "style": "dark", "tags": [], "templating": { "list": [] @@ -889,6 +890,6 @@ "timezone": "", "title": "Immich Go", "uid": "9QXCv3AVk", - "version": 4, + "version": 5, "weekStart": "" } \ No newline at end of file diff --git a/src/init.go b/src/init.go index 2ef4a20..eb9a2d4 100644 --- a/src/init.go +++ b/src/init.go @@ -28,9 +28,7 @@ func main() { log.Info("Started") http.HandleFunc("/metrics", metrics) addr := ":" + strconv.Itoa(models.GetPort()) - if models.GetPort() != DEFAULTPORT { - log.Info("Listening on port", models.GetPort()) - } + log.Info("Listening on port ", models.GetPort()) http.ListenAndServe(addr, nil) } @@ -40,7 +38,6 @@ func metrics(w http.ResponseWriter, r *http.Request) { immich.Allrequests(registry) h := promhttp.HandlerFor(registry, promhttp.HandlerOpts{}) h.ServeHTTP(w, r) - } func projectinfo() { diff --git a/src/models/api.go b/src/models/api.go index 1dc0047..edc8b11 100644 --- a/src/models/api.go +++ b/src/models/api.go @@ -6,8 +6,7 @@ type StructLogin struct { AccessToken string `json:"accessToken"` UserID string `json:"userId"` UserEmail string `json:"userEmail"` - FirstName string `json:"firstName"` - LastName string `json:"lastName"` + Name string `json:"name"` IsAdmin bool `json:"isAdmin"` ShouldChangePassword bool `json:"shouldChangePassword"` } @@ -17,12 +16,11 @@ type StructServerInfo struct { Videos int `json:"videos"` Usage int64 `json:"usage"` UsageByUser []struct { - UserID string `json:"userId"` - UserFirstName string `json:"userFirstName"` - UserLastName string `json:"userLastName"` - Photos int `json:"photos"` - Videos int `json:"videos"` - Usage int `json:"usage"` + UserID string `json:"userId"` + UserName string `json:"userName"` + Photos int `json:"photos"` + Videos int `json:"videos"` + Usage int `json:"usage"` } `json:"usageByUser"` } @@ -45,8 +43,7 @@ type StructServerVersion struct { type StructAllUsers []struct { ID string `json:"id"` Email string `json:"email"` - FirstName string `json:"firstName"` - LastName string `json:"lastName"` + Name string `json:"name"` CreatedAt time.Time `json:"createdAt"` ProfileImagePath string `json:"profileImagePath"` ShouldChangePassword bool `json:"shouldChangePassword"` @@ -56,9 +53,8 @@ type StructAllUsers []struct { } type StructCustomUser struct { - Email string - ID string - FirstName string - LastName string - IsAdmin bool + Email string + ID string + Name string + IsAdmin bool } diff --git a/src/prometheus/prometheus.go b/src/prometheus/prometheus.go index 3653e1c..0ffe08e 100644 --- a/src/prometheus/prometheus.go +++ b/src/prometheus/prometheus.go @@ -28,20 +28,20 @@ func SendBackMessagePreference(result *models.StructServerInfo, result2 *models. user_info := prometheus.NewGaugeVec(prometheus.GaugeOpts{ Name: "immich_user_info", Help: "All infos about users", - }, []string{"videos", "photos", "uid", "usage", "firstname", "lastname"}) + }, []string{"videos", "photos", "uid", "usage", "name"}) user_usage := prometheus.NewGaugeVec(prometheus.GaugeOpts{ Name: "immich_user_usage", Help: "The usage of the user", - }, []string{"uid", "firstname", "lastname"}) + }, []string{"uid", "name"}) user_photos := prometheus.NewGaugeVec(prometheus.GaugeOpts{ Name: "immich_user_photos", Help: "The number of photo of the user", - }, []string{"uid", "firstname", "lastname"}) + }, []string{"uid", "name"}) user_videos := prometheus.NewGaugeVec(prometheus.GaugeOpts{ Name: "immich_user_videos", Help: "The number of videos of the user", - }, []string{"uid", "firstname", "lastname"}) + }, []string{"uid", "name"}) r.MustRegister(user_info) r.MustRegister(user_usage) @@ -50,10 +50,10 @@ func SendBackMessagePreference(result *models.StructServerInfo, result2 *models. for i := 0; i < len((*result).UsageByUser); i++ { var myuser = GetName((*result).UsageByUser[i].UserID, result2) - user_info.With(prometheus.Labels{"videos": strconv.Itoa((*result).UsageByUser[i].Videos), "photos": strconv.Itoa((*result).UsageByUser[i].Photos), "uid": (*result).UsageByUser[i].UserID, "usage": strconv.Itoa(int((*result).UsageByUser[i].Usage)), "firstname": myuser.FirstName, "lastname": myuser.LastName}).Inc() - user_photos.With(prometheus.Labels{"uid": (*result).UsageByUser[i].UserID, "firstname": myuser.FirstName, "lastname": myuser.LastName}).Set(float64((*result).UsageByUser[i].Photos)) - user_usage.With(prometheus.Labels{"uid": (*result).UsageByUser[i].UserID, "firstname": myuser.FirstName, "lastname": myuser.LastName}).Set(float64((*result).UsageByUser[i].Usage)) - user_videos.With(prometheus.Labels{"uid": (*result).UsageByUser[i].UserID, "firstname": myuser.FirstName, "lastname": myuser.LastName}).Set(float64((*result).UsageByUser[i].Videos)) + user_info.With(prometheus.Labels{"videos": strconv.Itoa((*result).UsageByUser[i].Videos), "photos": strconv.Itoa((*result).UsageByUser[i].Photos), "uid": (*result).UsageByUser[i].UserID, "usage": strconv.Itoa(int((*result).UsageByUser[i].Usage)), "name": myuser.Name}).Inc() + user_photos.With(prometheus.Labels{"uid": (*result).UsageByUser[i].UserID, "name": myuser.Name}).Set(float64((*result).UsageByUser[i].Photos)) + user_usage.With(prometheus.Labels{"uid": (*result).UsageByUser[i].UserID, "name": myuser.Name}).Set(float64((*result).UsageByUser[i].Usage)) + user_videos.With(prometheus.Labels{"uid": (*result).UsageByUser[i].UserID, "name": myuser.Name}).Set(float64((*result).UsageByUser[i].Videos)) } } @@ -78,8 +78,7 @@ func GetName(result string, result2 *models.StructAllUsers) models.StructCustomU if (*result2)[i].ID == result { myuser.ID = (*result2)[i].ID - myuser.FirstName = (*result2)[i].FirstName - myuser.LastName = (*result2)[i].LastName + myuser.Name = (*result2)[i].Name myuser.Email = (*result2)[i].Email myuser.IsAdmin = (*result2)[i].IsAdmin } diff --git a/src/tests/prometheus_test.go b/src/tests/prometheus_test.go index 929c412..a7b260c 100644 --- a/src/tests/prometheus_test.go +++ b/src/tests/prometheus_test.go @@ -9,17 +9,16 @@ import ( func TestGetName(t *testing.T) { result2 := &models.StructAllUsers{ - {ID: "1", FirstName: "John", LastName: "Doe", Email: "john@example.com", IsAdmin: true}, - {ID: "2", FirstName: "Jane", LastName: "Smith", Email: "jane@example.com", IsAdmin: false}, + {ID: "1", Name: "John", Email: "john@example.com", IsAdmin: true}, + {ID: "2", Name: "Jane", Email: "jane@example.com", IsAdmin: false}, } result := "1" expected := models.StructCustomUser{ - ID: "1", - FirstName: "John", - LastName: "Doe", - Email: "john@example.com", - IsAdmin: true, + ID: "1", + Name: "John", + Email: "john@example.com", + IsAdmin: true, } actual := prom.GetName(result, result2) if !reflect.DeepEqual(expected, actual) { From 5784e15fa0a477d785b251066f3d5cbcc4110fed Mon Sep 17 00:00:00 2001 From: martabal <74269598+martabal@users.noreply.github.com> Date: Wed, 15 Nov 2023 00:55:08 +0100 Subject: [PATCH 2/5] chore: pump version --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 1f69380..44e2a0c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "immich-exporter", - "version": "1.0.1", + "version": "1.1.1", "description": "exporter for immich", "main": "src/main.go", "scripts": { From 0bf2b5a6ee1494cc889c91bad2a7ae01f760f0bc Mon Sep 17 00:00:00 2001 From: Pedro Pombeiro Date: Tue, 21 Nov 2023 19:51:57 +0100 Subject: [PATCH 3/5] feat: export job status counts (#10) --- src/immich/data.go | 42 ++++++++++++++++++++++++++++++------ src/models/api.go | 30 ++++++++++++++++++++++++++ src/prometheus/prometheus.go | 34 ++++++++++++++++++++++++++++- 3 files changed, 99 insertions(+), 7 deletions(-) diff --git a/src/immich/data.go b/src/immich/data.go index c5be7dd..61c5bdc 100644 --- a/src/immich/data.go +++ b/src/immich/data.go @@ -32,23 +32,30 @@ func Allrequests(r *prometheus.Registry) { func Analyze(r *prometheus.Registry) { defer wg.Done() + alljobsstatus := make(chan func() (*models.StructAllJobsStatus, error)) allusers := make(chan func() (*models.StructAllUsers, error)) serverinfo := make(chan func() (*models.StructServerInfo, error)) + defer func() { + close(serverinfo) + close(allusers) + close(alljobsstatus) + }() + wg.Add(1) + go GetAllJobsStatus(alljobsstatus) + res1, err := (<-alljobsstatus)() wg.Add(1) go GetAllUsers(allusers) - res1, err := (<-allusers)() + res2, err2 := (<-allusers)() wg.Add(1) go ServerInfo(serverinfo) - res2, err2 := (<-serverinfo)() + res3, err3 := (<-serverinfo)() - if err != nil && err2 != nil { + if err != nil && err2 != nil && err3 != nil { } else { - prom.SendBackMessagePreference(res2, res1, r) + prom.SendBackMessagePreference(res3, res2, res1, r) } - close(serverinfo) - close(allusers) } func GetAllUsers(c chan func() (*models.StructAllUsers, error)) { @@ -118,6 +125,29 @@ func ServerInfo(c chan func() (*models.StructServerInfo, error)) { } } +func GetAllJobsStatus(c chan func() (*models.StructAllJobsStatus, error)) { + defer wg.Done() + resp, err := Apirequest("/api/jobs", "GET") + if err == nil { + + if models.GetPromptError() == true { + models.SetPromptError(false) + } + body, err := ioutil.ReadAll(resp.Body) + if err != nil { + log.Fatalln(err) + } else { + + result := new(models.StructAllJobsStatus) + if err := json.Unmarshal(body, &result); err != nil { // Parse []byte to go struct pointer + log.Println(unmarshalError) + } + c <- (func() (*models.StructAllJobsStatus, error) { return result, nil }) + + } + } +} + func Apirequest(uri string, method string) (*http.Response, error) { req, err := http.NewRequest(method, models.Getbaseurl()+uri, nil) diff --git a/src/models/api.go b/src/models/api.go index edc8b11..03dc1da 100644 --- a/src/models/api.go +++ b/src/models/api.go @@ -58,3 +58,33 @@ type StructCustomUser struct { Name string IsAdmin bool } + +type StructJobStatus struct { + JobCounts struct { + Active int `json:"active"` + Completed int `json:"completed"` + Failed int `json:"failed"` + Delayed int `json:"delayed"` + Waiting int `json:"waiting"` + Paused int `json:"paused"` + } `json:"jobCounts"` + QueueStatus struct { + IsActive bool `json:"isActive"` + IsPaused bool `json:"isPaused"` + } `json:"queueStatus"` +} + +type StructAllJobsStatus struct { + ThumbnailGeneration StructJobStatus `json:"thumbnailGeneration"` + MetadataExtraction StructJobStatus `json:"metadataExtraction"` + VideoConversion StructJobStatus `json:"videoConversion"` + ObjectTagging StructJobStatus `json:"objectTagging"` + RecognizeFaces StructJobStatus `json:"recognizeFaces"` + ClipEncoding StructJobStatus `json:"clipEncoding"` + BackgroundTask StructJobStatus `json:"backgroundTask"` + StorageTemplateMigration StructJobStatus `json:"storageTemplateMigration"` + Migration StructJobStatus `json:"migration"` + Search StructJobStatus `json:"search"` + Sidecar StructJobStatus `json:"sidecar"` + Library StructJobStatus `json:"library"` +} diff --git a/src/prometheus/prometheus.go b/src/prometheus/prometheus.go index 0ffe08e..2b62a56 100644 --- a/src/prometheus/prometheus.go +++ b/src/prometheus/prometheus.go @@ -14,7 +14,12 @@ type Gauge []struct { value float64 } -func SendBackMessagePreference(result *models.StructServerInfo, result2 *models.StructAllUsers, r *prometheus.Registry) { +func SendBackMessagePreference( + result *models.StructServerInfo, + result2 *models.StructAllUsers, + result3 *models.StructAllJobsStatus, + r *prometheus.Registry, +) { gauges := Gauge{ {"total photos", "The total number of photos", float64((*result).Photos)}, @@ -43,10 +48,16 @@ func SendBackMessagePreference(result *models.StructServerInfo, result2 *models. Help: "The number of videos of the user", }, []string{"uid", "name"}) + job_count := prometheus.NewGaugeVec(prometheus.GaugeOpts{ + Name: "immich_job_count", + Help: "The item count in the job", + }, []string{"status", "job_name"}) + r.MustRegister(user_info) r.MustRegister(user_usage) r.MustRegister(user_videos) r.MustRegister(user_photos) + r.MustRegister(job_count) for i := 0; i < len((*result).UsageByUser); i++ { var myuser = GetName((*result).UsageByUser[i].UserID, result2) @@ -56,6 +67,27 @@ func SendBackMessagePreference(result *models.StructServerInfo, result2 *models. user_videos.With(prometheus.Labels{"uid": (*result).UsageByUser[i].UserID, "name": myuser.Name}).Set(float64((*result).UsageByUser[i].Videos)) } + setJobStatusCounts(job_count, "background_task", &result3.BackgroundTask) + setJobStatusCounts(job_count, "clip_encoding", &result3.ClipEncoding) + setJobStatusCounts(job_count, "library", &result3.Library) + setJobStatusCounts(job_count, "metadata_extraction", &result3.MetadataExtraction) + setJobStatusCounts(job_count, "migration", &result3.Migration) + setJobStatusCounts(job_count, "object_tagging", &result3.ObjectTagging) + setJobStatusCounts(job_count, "recognize_faces", &result3.RecognizeFaces) + setJobStatusCounts(job_count, "search", &result3.Search) + setJobStatusCounts(job_count, "sidecar", &result3.Sidecar) + setJobStatusCounts(job_count, "storage_template_migration", &result3.StorageTemplateMigration) + setJobStatusCounts(job_count, "thumbnail_generation", &result3.ThumbnailGeneration) + setJobStatusCounts(job_count, "video_conversion", &result3.VideoConversion) +} + +func setJobStatusCounts(job_count *prometheus.GaugeVec, jobName string, result *models.StructJobStatus) { + job_count.With(prometheus.Labels{"status": "active", "job_name": jobName}).Set(float64(result.JobCounts.Active)) + job_count.With(prometheus.Labels{"status": "completed", "job_name": jobName}).Set(float64(result.JobCounts.Completed)) + job_count.With(prometheus.Labels{"status": "failed", "job_name": jobName}).Set(float64(result.JobCounts.Failed)) + job_count.With(prometheus.Labels{"status": "delayed", "job_name": jobName}).Set(float64(result.JobCounts.Delayed)) + job_count.With(prometheus.Labels{"status": "waiting", "job_name": jobName}).Set(float64(result.JobCounts.Waiting)) + job_count.With(prometheus.Labels{"status": "paused", "job_name": jobName}).Set(float64(result.JobCounts.Paused)) } func SendBackMessageserverVersion(result *models.StructServerVersion, r *prometheus.Registry) { From 299192121a1407a329826ba5d49fbd257485ffac Mon Sep 17 00:00:00 2001 From: martabal <74269598+martabal@users.noreply.github.com> Date: Tue, 21 Nov 2023 19:52:57 +0100 Subject: [PATCH 4/5] chore: pump version --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 44e2a0c..2cb6898 100644 --- a/package.json +++ b/package.json @@ -1,10 +1,10 @@ { "name": "immich-exporter", - "version": "1.1.1", + "version": "1.2.0", "description": "exporter for immich", "main": "src/main.go", "scripts": { - "build" : "go build -o ./immich-exporter.out ./src && ./immich-exporter.out -e", + "build" : "go build -o ./immich-exporter.out ./src && ./immich-exporter.out", "build:env" : "go build -o ./immich-exporter.out ./src && ./immich-exporter.out -e", "dev" : "go run ./src", "dev:env" : "go run ./src -e", From 035752eca9aa097bb3cbd4e0b11407bcb214109f Mon Sep 17 00:00:00 2001 From: martabal <74269598+martabal@users.noreply.github.com> Date: Wed, 22 Nov 2023 01:25:06 +0100 Subject: [PATCH 5/5] ci: add automatic release --- .github/workflows/docker.yml | 28 ++++++++++++++++++++++++---- 1 file changed, 24 insertions(+), 4 deletions(-) diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml index 24ae2ba..287f775 100644 --- a/.github/workflows/docker.yml +++ b/.github/workflows/docker.yml @@ -1,11 +1,19 @@ name: Publish Release + on: workflow_dispatch: inputs: tags: description: "version" - required: true + required: false type: string + release: + types: + - created + push: + branches: ["main"] + pull_request: + branches: ["main"] jobs: build_docker_release: @@ -17,6 +25,16 @@ jobs: ref: "main" fetch-depth: 0 + - name: Release tag + id: releasetag + run: | + if [ -z "${{ inputs.tag }}" ]; then + latest_release_tag=$(curl -s "https://api.github.com/repos/${{ github.repository_owner }}/${{ github.event.repository.name }}/releases/latest" | jq -r .tag_name) + echo "release_tag=${latest_release_tag}" >> $GITHUB_ENV + else + echo "release_tag=${{ inputs.tag }}" >> $GITHUB_ENV + fi + - name: Docker meta id: meta uses: docker/metadata-action@v5 @@ -24,9 +42,9 @@ jobs: images: | ghcr.io/${{ github.repository_owner }}/${{ github.event.repository.name }} tags: | - type=raw,value=latest,enable=${{ github.ref == format('refs/heads/{0}', 'main') }} + type=raw,value=latest,enable=true type=sha - type=raw,value=${{ inputs.tags }} + type=raw,value=${{ steps.releasetag.outputs.release_tag }},enable=true - name: Set up QEMU uses: docker/setup-qemu-action@v3 @@ -40,6 +58,7 @@ jobs: with: username: ${{ github.repository_owner }} password: ${{ secrets.DOCKERHUB_TOKEN }} + if: ${{ github.event_name == 'release' || github.event_name == 'workflow_dispatch' }} - name: Login to GitHub Container Registry uses: docker/login-action@v3 @@ -47,12 +66,13 @@ jobs: registry: ghcr.io username: ${{ github.repository_owner }} password: ${{ secrets.GH_TOKEN }} + if: ${{ github.event_name == 'release' || github.event_name == 'workflow_dispatch' }} - name: Build and push uses: docker/build-push-action@v5 with: context: ./ platforms: linux/arm/v7,linux/amd64,linux/arm64 - push: ${{ github.event_name != 'pull_request' }} + push: ${{ github.event_name == 'release' || github.event_name == 'workflow_dispatch' }} tags: ${{ steps.meta.outputs.tags }} labels: ${{ steps.meta.outputs.labels }}