Compare commits

..

55 Commits

Author SHA1 Message Date
5850f0b468 feat(更新镜像): 更新镜像
All checks were successful
/ build (push) Successful in 36s
2025-12-08 10:47:31 +08:00
f061d6178d fix(修复错误): 修复例子错误 2025-12-02 12:26:29 +08:00
2a282ca5c2 docs(更新文档): 更新文档 2025-12-02 11:41:16 +08:00
a3375a34a4 docs(更新文档): 更新文档 2025-12-02 11:29:12 +08:00
2090aae0cc docs(更新文档): 更新文档 2025-12-02 11:28:36 +08:00
1ebda0078c docs(更新说明): 更新说明 2025-12-02 11:16:27 +08:00
ea44ed1507 docs(更新说明): 更新说明 2025-12-02 11:08:29 +08:00
db4bc7fdc0 feat(项目描述): 更新项目描述 2025-12-02 10:59:25 +08:00
d1524949bc feat(项目说明): 更新项目说明 2025-12-02 10:56:47 +08:00
d245b6a457 feat(项目说明): 更新项目说明 2025-12-02 10:51:07 +08:00
58e013d16c feat(更新标识): 更新标识 2025-12-02 10:45:33 +08:00
415ee86119 feat(添加标识): 添加标识 2025-12-02 10:44:57 +08:00
b790581c61 feat(更新文件): 添加icon和color 2025-12-02 10:42:21 +08:00
82450d7c27 feat(更新描述): 更新描述 2025-12-02 10:40:52 +08:00
bb13514103 feat(构建文件): 添加构建文件 2025-12-02 10:35:46 +08:00
55797be1d7 feat(调整参数): 源和目的输入参数后面添加_path 2025-12-02 10:24:14 +08:00
9f9fba518b feat(加强兼容): 兼容Gitea/GitHub 2025-12-02 10:20:58 +08:00
5b7ff7204d feat(构建脚本): 迁移构建脚本 2025-11-26 17:19:50 +08:00
e2bd2e0381 feat(更新依赖): 更新依赖 2025-11-09 20:14:17 +08:00
c5e2ea06e3 feat(更新镜像): 更新镜像 2025-10-15 13:46:06 +08:00
8eb4fc49aa feat(更新镜像): 更新镜像 2025-10-09 23:59:15 +08:00
c5a7ce0691 feat(升级依赖): 升级依赖 2025-09-07 18:35:06 +08:00
e0ff4aca0b feat(更新版本): 更新版本 2025-08-14 10:54:11 +08:00
f17e12a988 feat(升级版本): 升级版本 2025-08-07 20:47:57 +08:00
e21e1b6363 feat(更新依赖): 更新依赖 2025-07-24 10:01:28 +08:00
4a754700e2 feat(刷新版本): 刷新版本 2025-07-09 09:14:03 +08:00
0f22d0991b feat(刷新版本): 刷新版本 2025-07-09 09:02:00 +08:00
7af5b8c98d feat(升级依赖): 升级依赖 2025-06-07 20:50:58 +08:00
e307db9de7 feat(升级依赖): 升级依赖 2025-05-08 14:35:02 +08:00
677cac0b33 feat(更新依赖): 更新依赖 2025-04-02 11:11:34 +08:00
4bdcf5d57e feat(更新依赖): 更新依赖 2025-03-05 18:29:06 +08:00
ec10d3093a feat(更新版本): 更新版本 2025-02-13 09:19:54 +08:00
61844be062 feat(升级依赖): 升级依赖 2025-02-11 21:49:42 +08:00
6be36afba1 feat(更新语法): 更新语法 2025-01-18 23:07:38 +08:00
c674c7c3c3 feat(更新镜像): 更新镜像 2025-01-18 22:59:05 +08:00
095ddd9165 feat(更新镜像): 更新镜像 2024-12-17 16:43:54 +08:00
67637fa55e feat(升级依赖): 升级依赖 2024-12-04 14:30:35 +08:00
a229f9eb3b feat(升级依赖): 升级依赖 2024-11-21 14:07:37 +08:00
4df67b8874 feat(更新依赖): 更新依赖 2024-11-08 21:49:22 +08:00
a470a2eab3 feat(升级依赖): 升级依赖 2024-10-08 09:59:10 +08:00
5a6d2baadf feat(升级版本): 升级版本 2024-09-12 14:58:02 +08:00
0c86408480 feat(升级依赖): 升级依赖 2024-08-15 03:44:45 +08:00
d5454ddc37 feat(更新依赖): 更新依赖 2024-07-17 10:03:17 +08:00
239c3d2ad0 feat(构建脚本): 调整构建脚本 2024-06-22 22:56:00 +08:00
969b0cbe62 feat(更新镜像): 更新镜像 2024-06-21 15:51:38 +08:00
0b233666f5 feat(更新依赖): 更新依赖 2024-06-19 14:31:33 +08:00
c7d127dff7 feat(升级依赖): 升级依赖 2024-06-05 13:51:08 +08:00
59411279eb feat(升级依赖): 升级依赖 2024-05-11 19:47:01 +08:00
e528f2ddf4 feat(更新版本): 更新版本 2024-04-07 13:38:13 +08:00
e9e86af4dd feat(更新依赖): 更新依赖 2024-03-13 16:55:55 +08:00
ab8323a34d feat(升级依赖): 升级依赖 2024-02-13 00:57:02 +08:00
1d73a5a962 feat(升级依赖): 升级依赖 2024-01-10 11:42:19 +08:00
882519753b feat(升级版本): 升级版本 2023-12-06 11:31:21 +08:00
bdaade4a18 feat(更新依赖): 更新依赖 2023-11-08 12:38:40 +08:00
83e9a70b01 feat(升级依赖): 升级依赖 2023-10-15 23:45:49 +08:00
8 changed files with 128 additions and 74 deletions

View File

@@ -1,33 +0,0 @@
kind: pipeline
type: docker
name: default
node:
region: cn
steps:
- name: build
pull: if-not-exists
image: ccr.ccs.tencentyun.com/xiaoqidun/goenv
commands:
- CGO_ENABLED=0 go build -o gocos -trimpath -ldflags "-s -w -buildid=" gocos.go
- name: docker-cn
pull: if-not-exists
image: plugins/docker
settings:
repo: ccr.ccs.tencentyun.com/xiaoqidun/gocos
registry: ccr.ccs.tencentyun.com
username:
from_secret: docker_username
password:
from_secret: docker_password
dockerfile: Dockerfile
- name: docker-hk
pull: if-not-exists
image: plugins/docker
settings:
repo: hkccr.ccs.tencentyun.com/xiaoqidun/gocos
registry: hkccr.ccs.tencentyun.com
username:
from_secret: docker_username
password:
from_secret: docker_password
dockerfile: Dockerfile

View File

@@ -0,0 +1,39 @@
on: [push, workflow_dispatch]
jobs:
build:
runs-on: cn
steps:
- name: checkout
uses: actions/checkout@v6
- name: docker goenv
uses: docker://ccr.ccs.tencentyun.com/xiaoqidun/goenv:latest
with:
args: sh -c "GOAMD64=v3 CGO_ENABLED=0 go build -o gocos -trimpath -ldflags '-s -w -buildid=' gocos.go"
- name: docker setup
uses: docker/setup-buildx-action@v3
with:
driver-opts: |
"env.http_proxy=${{ env.HTTP_PROXY }}"
"env.https_proxy=${{ env.HTTPS_PROXY }}"
"env.no_proxy=${{ env.NO_PROXY }}"
- name: docker login
uses: docker/login-action@v3
with:
registry: ccr.ccs.tencentyun.com
username: ${{ secrets.docker_username }}
password: ${{ secrets.docker_password }}
- name: docker login
uses: docker/login-action@v3
with:
registry: hkccr.ccs.tencentyun.com
username: ${{ secrets.docker_username }}
password: ${{ secrets.docker_password }}
- name: docker build
uses: docker/build-push-action@v6
with:
context: .
push: true
provenance: false
tags: |
ccr.ccs.tencentyun.com/xiaoqidun/gocos:latest
hkccr.ccs.tencentyun.com/xiaoqidun/gocos:latest

View File

@@ -1,11 +1,10 @@
# 基础镜像 # 基础镜像
FROM alpine:3.18.4 FROM alpine:3.23.0
# 作者信息 # 作者信息
LABEL MAINTAINER="xiaoqidun@gmail.com" LABEL authors="xiaoqidun"
# 复制程序 # 复制程序
COPY gocos /bin/gocos COPY gocos /bin/gocos
# 启动命令 # 启动命令
ENTRYPOINT /bin/gocos ENTRYPOINT ["/bin/gocos"]

View File

@@ -1,8 +1,30 @@
# GoCOS # GoCOS
腾讯云对象存储(COS)Drone CI插件[AWS S3](http://plugins.drone.io/drone-plugins/drone-s3/)的COS实现 通过Gitea/Drone CI上传文件到腾讯云对象存储
# Drone CI配置例子 # Gitea配置例子
```yaml
on: [ push, workflow_dispatch ]
jobs:
default:
runs-on: ubuntu-latest
steps:
- name: checkout
uses: actions/checkout@v6
- name: upload to cos
uses: xiaoqidun/gocos@main
with:
secret_id: ${{ secrets.secret_id }}
secret_key: ${{ secrets.secret_key }}
bucket_url: ${{ secrets.bucket_url }}
source_path: build/release
target_path: build/release
strip_prefix: build/release
```
# Drone配置例子
```yml ```yml
kind: pipeline kind: pipeline
@@ -10,8 +32,8 @@ type: docker
name: default name: default
steps: steps:
- name: upload - name: upload to cos
image: ccr.ccs.tencentyun.com/xiaoqidun/gocos image: ccr.ccs.tencentyun.com/xiaoqidun/gocos:latest
settings: settings:
secret_id: secret_id:
from_secret: secret_id from_secret: secret_id
@@ -19,12 +41,12 @@ steps:
from_secret: secret_key from_secret: secret_key
bucket_url: bucket_url:
from_secret: bucket_url from_secret: bucket_url
source: build/release source_path: build/release
target: build/release target_path: build/release
strip_prefix: build/release strip_prefix: build/release
``` ```
# Drone CI配置说明 # 输入参数说明
### secret_id ### secret_id
@@ -38,11 +60,11 @@ API密钥管理获得的SecretKey
存储桶概览中的访问域名 存储桶概览中的访问域名
### source ### source_path
DroneCI中文件的源位置 构建环境中文件的源位置
### target ### target_path
存储桶中文件的目标位置 存储桶中文件的目标位置

28
action.yml Normal file
View File

@@ -0,0 +1,28 @@
name: '上传文件到腾讯云对象存储xiaoqidun'
description: '上传文件到腾讯云对象存储xiaoqidun'
author: 'xiaoqidun'
inputs:
secret_id:
description: 'API密钥管理获得的SecretId'
required: true
secret_key:
description: 'API密钥管理获得的SecretKey'
required: true
bucket_url:
description: '存储桶概览中的访问域名'
required: true
source_path:
description: '构建环境中文件的源位置'
required: true
target_path:
description: '存储桶中文件的目标位置'
required: true
strip_prefix:
description: '从文件的源位置剔除前缀'
required: false
runs:
using: 'docker'
image: 'docker://ccr.ccs.tencentyun.com/xiaoqidun/gocos:latest'
branding:
icon: 'upload-cloud'
color: 'blue'

4
go.mod
View File

@@ -1,8 +1,8 @@
module github.com/xiaoqidun/gocos module github.com/xiaoqidun/gocos
go 1.21.2 go 1.25.5
require github.com/tencentyun/cos-go-sdk-v5 v0.7.43 require github.com/tencentyun/cos-go-sdk-v5 v0.7.71
require ( require (
github.com/clbanning/mxj v1.8.4 // indirect github.com/clbanning/mxj v1.8.4 // indirect

9
go.sum
View File

@@ -1,7 +1,7 @@
github.com/QcloudApi/qcloud_sign_golang v0.0.0-20141224014652-e4130a326409/go.mod h1:1pk82RBxDY/JZnPQrtqHlUFfCctgdorsd9M06fMynOM=
github.com/clbanning/mxj v1.8.4 h1:HuhwZtbyvyOw+3Z1AowPkU87JkJUSv751ELWaiTpj8I= github.com/clbanning/mxj v1.8.4 h1:HuhwZtbyvyOw+3Z1AowPkU87JkJUSv751ELWaiTpj8I=
github.com/clbanning/mxj v1.8.4/go.mod h1:BVjHeAH+rl9rs6f+QIpeRl0tfu10SXn1pUSa5PVGJng= github.com/clbanning/mxj v1.8.4/go.mod h1:BVjHeAH+rl9rs6f+QIpeRl0tfu10SXn1pUSa5PVGJng=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/golang-jwt/jwt/v5 v5.2.3/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk=
github.com/google/go-querystring v1.0.0 h1:Xkwi/a1rcvNg1PPYe5vI8GbeBY/jrVuDX5ASuANWTrk= github.com/google/go-querystring v1.0.0 h1:Xkwi/a1rcvNg1PPYe5vI8GbeBY/jrVuDX5ASuANWTrk=
github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck=
github.com/google/uuid v1.1.1 h1:Gkbcsh/GbpXz7lPftLA3P6TYMwjCLYm83jiFQZF/3gY= github.com/google/uuid v1.1.1 h1:Gkbcsh/GbpXz7lPftLA3P6TYMwjCLYm83jiFQZF/3gY=
@@ -11,9 +11,12 @@ github.com/mitchellh/mapstructure v1.4.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RR
github.com/mozillazg/go-httpheader v0.2.1 h1:geV7TrjbL8KXSyvghnFm+NyTux/hxwueTSrwhe88TQQ= github.com/mozillazg/go-httpheader v0.2.1 h1:geV7TrjbL8KXSyvghnFm+NyTux/hxwueTSrwhe88TQQ=
github.com/mozillazg/go-httpheader v0.2.1/go.mod h1:jJ8xECTlalr6ValeXYdOF8fFUISeBAdw6E61aqQma60= github.com/mozillazg/go-httpheader v0.2.1/go.mod h1:jJ8xECTlalr6ValeXYdOF8fFUISeBAdw6E61aqQma60=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/rs/dnscache v0.0.0-20230804202142-fc85eb664529/go.mod h1:qe5TWALJ8/a1Lqznoc5BDHpYX/8HU60Hm2AwRmqzxqA=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.563/go.mod h1:7sCQWVkxcsR38nffDW057DRGk8mUjK1Ing/EFOK8s8Y= github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.563/go.mod h1:7sCQWVkxcsR38nffDW057DRGk8mUjK1Ing/EFOK8s8Y=
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/kms v1.0.563/go.mod h1:uom4Nvi9W+Qkom0exYiJ9VWJjXwyxtPYTkKkaLMlfE0= github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/kms v1.0.563/go.mod h1:uom4Nvi9W+Qkom0exYiJ9VWJjXwyxtPYTkKkaLMlfE0=
github.com/tencentyun/cos-go-sdk-v5 v0.7.43 h1:aPCPWy85T3C3Ga3hn7va2DC4c0hAf8Dx0kpKj/uB/vw= github.com/tencentyun/cos-go-sdk-v5 v0.7.71 h1:dV0doQK6k0MTdNIIWqP23ESvlPPI1ZZCCIBZGjsWR2Y=
github.com/tencentyun/cos-go-sdk-v5 v0.7.43/go.mod h1:LUFnaqRmGk6pEHOaRmdn2dCZR2j0cSsM5xowWFPTPao= github.com/tencentyun/cos-go-sdk-v5 v0.7.71/go.mod h1:STbTNaNKq03u+gscPEGOahKzLcGSYOj6Dzc5zNay7Pg=
github.com/tencentyun/qcloud-cos-sts-sdk v0.0.0-20250515025012-e0eec8a5d123/go.mod h1:b18KQa4IxHbxeseW1GcZox53d7J0z39VNONTxvvlkXw=
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=

View File

@@ -3,7 +3,6 @@ package main
import ( import (
"context" "context"
"errors" "errors"
"github.com/tencentyun/cos-go-sdk-v5"
"io/fs" "io/fs"
"log" "log"
"net/http" "net/http"
@@ -13,14 +12,16 @@ import (
"strings" "strings"
"time" "time"
_ "time/tzdata" _ "time/tzdata"
"github.com/tencentyun/cos-go-sdk-v5"
) )
const ( const (
SecretID = "secret_id" SecretID = "secret_id"
SecretKey = "secret_key" SecretKey = "secret_key"
BucketURL = "bucket_url" BucketURL = "bucket_url"
Source = "source" SourcePath = "source_path"
Target = "target" TargetPath = "target_path"
StripPrefix = "strip_prefix" StripPrefix = "strip_prefix"
PathSeparator = "/" PathSeparator = "/"
) )
@@ -31,25 +32,20 @@ func ErrExit(err error) {
} }
func GetConfig(key string) string { func GetConfig(key string) string {
key = "PLUGIN_" + strings.ToUpper(key) key = strings.ToUpper(key)
if val := os.Getenv("INPUT_" + key); val != "" {
return val
}
if val := os.Getenv("PLUGIN_" + key); val != "" {
return val
}
return os.Getenv(key) return os.Getenv(key)
} }
func VarIsEmpty(a ...interface{}) bool { func StrIsEmpty(a ...string) bool {
for _, v := range a { for _, v := range a {
switch v := v.(type) { if v == "" {
case string: return true
if "" == v {
return true
}
case []byte:
if 0 == len(v) {
return true
}
case []string:
if 0 == len(v) {
return true
}
} }
} }
return false return false
@@ -69,12 +65,12 @@ func main() {
secretID = GetConfig(SecretID) secretID = GetConfig(SecretID)
secretKey = GetConfig(SecretKey) secretKey = GetConfig(SecretKey)
bucketURL = GetConfig(BucketURL) bucketURL = GetConfig(BucketURL)
source = GetConfig(Source) source = GetConfig(SourcePath)
target = GetConfig(Target) target = GetConfig(TargetPath)
stripPrefix = GetConfig(StripPrefix) stripPrefix = GetConfig(StripPrefix)
) )
if VarIsEmpty(secretID, secretKey, bucketURL, source, target) { if StrIsEmpty(secretID, secretKey, bucketURL, source, target) {
ErrExit(errors.New("input error")) ErrExit(errors.New("missing input parameter"))
} }
sourceFiles := make([]string, 0, 0) sourceFiles := make([]string, 0, 0)
if err = filepath.WalkDir(source, func(path string, d fs.DirEntry, err error) error { if err = filepath.WalkDir(source, func(path string, d fs.DirEntry, err error) error {