From 5f291899b1ece342c1e531371d63b8048fe9abbf Mon Sep 17 00:00:00 2001 From: loganhz Date: Wed, 22 Apr 2020 19:50:48 +0800 Subject: [PATCH] Bug fix --- .drone.yml | 87 ++++++++++++++++++++++++++++++++++++++++++ Dockerfile.dapper | 9 ++++- README.md | 33 ++++++++++++++++ package/Dockerfile | 2 +- pkg/apis/cron.go | 76 +++++++++++++++++++++--------------- pkg/apis/mysql.go | 13 ++----- pkg/server/limit_ip.go | 5 --- scripts/ci | 7 ++-- scripts/entry | 1 + 9 files changed, 182 insertions(+), 51 deletions(-) create mode 100644 .drone.yml diff --git a/.drone.yml b/.drone.yml new file mode 100644 index 0000000..e68c2b7 --- /dev/null +++ b/.drone.yml @@ -0,0 +1,87 @@ +kind: pipeline +name: default + +steps: +- name: build + pull: default + image: rancher/dapper:v0.4.2 + commands: + - dapper ci + privileged: true + volumes: + - name: docker + path: /var/run/docker.sock + when: + event: + - push + - pull_request + - tag + +- name: github_binary_release + image: plugins/github-release + settings: + api_key: + from_secret: github_token + prerelease: true + checksum: + - sha256 + checksum_file: CHECKSUMsum-amd64.txt + checksum_flatten: true + files: + - "dist/artifacts/*" + when: + ref: + - refs/head/master + - refs/tags/* + event: + - tag + +- name: docker-publish-head + image: plugins/docker + settings: + build_args: + - ARCH=amd64 + custom_dns: 1.1.1.1 + dockerfile: package/Dockerfile + tag: latest + password: + from_secret: docker_password + repo: cnrancher/pdf-sender + username: + from_secret: docker_username + when: + ref: + include: + - "refs/heads/master" + event: + - push + +- name: docker-publish + image: plugins/docker + settings: + build_args: + - ARCH=amd64 + custom_dns: 1.1.1.1 + dockerfile: package/Dockerfile + password: + from_secret: docker_password + repo: cnrancher/pdf-sender + tag: "${DRONE_TAG}" + username: + from_secret: docker_username + when: + event: + - tag + +volumes: +- name: docker + host: + path: /var/run/docker.sock + +node: + instance: agent-amd64 + +trigger: + event: + exclude: + - promote \ No newline at end of file diff --git a/Dockerfile.dapper b/Dockerfile.dapper index c2e494d..04e8833 100644 --- a/Dockerfile.dapper +++ b/Dockerfile.dapper @@ -13,6 +13,11 @@ RUN go get -d github.com/alecthomas/gometalinter && \ go install github.com/alecthomas/gometalinter && \ gometalinter --install && \ rm -rf /go/src /go/pkg +# use go mod, and vendor exists,no need to get dependence +#RUN go get -d github.com/rancher/trash && \ +# git -C /go/src/github.com/rancher/trash checkout -b current v0.2.6 && \ +# go install github.com/rancher/trash && \ +# rm -rf /go/src /go/pkg ENV DAPPER_ENV REPO TAG DRONE_TAG ENV DAPPER_SOURCE /go/src/github.com/rancher/pdf-sender/ @@ -23,5 +28,5 @@ ENV HOME ${DAPPER_SOURCE} ENV GO111MODULE on WORKDIR ${DAPPER_SOURCE} -ENTRYPOINT ["./scripts/entry"] -CMD ["ci"] +ENTRYPOINT ["sh", "./scripts/entry"] +CMD ["ci"] \ No newline at end of file diff --git a/README.md b/README.md index e69de29..fc9a097 100644 --- a/README.md +++ b/README.md @@ -0,0 +1,33 @@ +# 环境变量配置: + +SMTP_RANCHER_TO: 定期接收消息邮箱 + +SMTP_USER: 服务邮箱用户名 +SMTP_PWD: 服务邮箱用户密码 +SMTP_ENDPOINT: SMTP端点 +SMTP_PORT: 服务邮箱端口 + +DB_HOST_IP: 数据库地址 +DB_USERNAME: 数据库用户名 +DB_PASSWORD: 数据库密码 +DB_NAME: 数据库名 + +ALI_REGION_ID: 阿里云区域 +ALI_ACCESS_KEYID: 阿里云访问令牌 +ALI_ACCESS_SECRET: 阿里云访问令牌密钥 +ALI_SIGN_NAME: 阿里云短信签名 +ALI_TEMPLATE_CODE: 阿里云短信模板 + +# 建表SQL语句: + +CREATE TABLE `user` ( + `uid` int(11) NOT NULL AUTO_INCREMENT, + `name` varchar(255) DEFAULT NULL, + `company` varchar(255) DEFAULT NULL, + `position` varchar(255) DEFAULT NULL, + `phone` varchar(255) DEFAULT NULL, + `email` varchar(255) DEFAULT NULL, + `savetime` datetime DEFAULT NULL, + `status` tinyint(1) DEFAULT NULL, + PRIMARY KEY (`uid`) +) ENGINE=InnoDB AUTO_INCREMENT=77 DEFAULT CHARSET=utf8mb4; \ No newline at end of file diff --git a/package/Dockerfile b/package/Dockerfile index 4ac27d8..fdd4e2f 100644 --- a/package/Dockerfile +++ b/package/Dockerfile @@ -1,3 +1,3 @@ FROM alpine:3 -COPY bin/pdf-sender/pdf-sender +COPY bin/pdf-sender /pdf-sender CMD ["/pdf-sender"] diff --git a/pkg/apis/cron.go b/pkg/apis/cron.go index c36c1f5..152d4ba 100644 --- a/pkg/apis/cron.go +++ b/pkg/apis/cron.go @@ -14,31 +14,36 @@ import ( var ( SMTPRancherTo = os.Getenv("SMTP_RANCHER_TO") + CronJob = os.Getenv("CRON") + + yesterday string + today string + count int ) func CollectInformation() { c := cron.New() logrus.Infof("Collect information start") - // cstSh, _ := time.LoadLocation("Asia/Shanghai") - // c.AddFunc("@every 0h0m10s", func() { fmt.Println(time.Now().In(cstSh).Format("2006-01-02 15:04:05")) }) - c.AddFunc("@every 0h0m10s", func() { - excelName := DBSelect() - SendInformation(excelName) + _, err := c.AddFunc(CronJob, func() { + DBSelect() + SendInformation() }) - // c.AddFunc("CRON_TZ=Asia/Shanghai 30 09 * * *", func() { - // excelName := DBSelect() - // SendInformation(excelName) - // }) + if err != nil { + logrus.Errorf("Failed cron add function : %v", err) + } + c.Start() } -func SendInformation(excelName string) { +func SendInformation() { m := gomail.NewMessage() m.SetAddressHeader("From", "no-reply@rancher.cn", "Rancher Labs 中国") m.SetHeader("To", SMTPRancherTo) - m.SetHeader("Subject", excelName+"用户信息") - m.Attach("excel/" + excelName + ".xlsx") + m.SetHeader("Subject", yesterday+"用户信息") + m.SetBody("text/plain", `从 `+yesterday+` 08:00 ~ `+today+` 08:00,一共有 `+strconv.Itoa(count)+` 人下载了中文文档。`) + + m.Attach("/tmp/" + yesterday + ".xlsx") d := gomail.NewDialer(SMTPEndpoint, 587, SMTPUser, SMTPPwd) @@ -50,11 +55,11 @@ func SendInformation(excelName string) { } -func DBSelect() string { +func DBSelect() { xlsx := excelize.NewFile() - index := xlsx.NewSheet("用户信息表") + index := xlsx.GetSheetIndex("Sheet1") data := map[string]string{ "A1": "名字", @@ -63,46 +68,55 @@ func DBSelect() string { "D1": "手机号", "E1": "电子邮箱", "F1": "保存时间", - "G1": "邮件发送状态", + "G1": "邮箱是否有效", + } + + stmt, err := DB.Prepare("SELECT * FROM user WHERE date(savetime) = date_sub(curdate(),interval 1 day)") + if err != nil { + logrus.Errorf("Failed to prepare SQL statement : %v", err) } + defer stmt.Close() - rows, err := DB.Query("SELECT * FROM " + dbtable + " WHERE date(savetime) = date_sub(curdate(),interval 1 day)") + rows, err := stmt.Query() if nil != err { logrus.Errorf("Failed to query : %v", err) } defer rows.Close() - var count int = 1 + count = 0 for rows.Next() { count++ var user types.User + row := count + 1 err := rows.Scan(&user.UID, &user.Name, &user.Company, &user.Position, &user.Phone, &user.Email, &user.SaveTime, &user.Status) if err != nil { logrus.Errorf("Failed rows scan : %v", err) } - data["A"+strconv.Itoa(count)] = user.Name - data["B"+strconv.Itoa(count)] = user.Company - data["C"+strconv.Itoa(count)] = user.Position - data["D"+strconv.Itoa(count)] = user.Phone - data["E"+strconv.Itoa(count)] = user.Email - data["F"+strconv.Itoa(count)] = user.SaveTime.Format("2006-01-02 15:04:05") - data["G"+strconv.Itoa(count)] = strconv.FormatBool(user.Status) + data["A"+strconv.Itoa(row)] = user.Name + data["B"+strconv.Itoa(row)] = user.Company + data["C"+strconv.Itoa(row)] = user.Position + data["D"+strconv.Itoa(row)] = user.Phone + data["E"+strconv.Itoa(row)] = user.Email + data["F"+strconv.Itoa(row)] = user.SaveTime.Format("2006-01-02 15:04:05") + data["G"+strconv.Itoa(row)] = strconv.FormatBool(user.Status) } for k, v := range data { - xlsx.SetCellValue("用户信息表", k, v) + xlsx.SetCellValue("Sheet1", k, v) } xlsx.SetActiveSheet(index) - d, _ := time.ParseDuration("-24h") - - excelName := time.Now().Add(d).Format("2006-01-02") - err = xlsx.SaveAs("excel/" + excelName + ".xlsx") + d, err := time.ParseDuration("-24h") + if err != nil { + logrus.Errorf("Failed time parsed duration : %v", err) + } + + yesterday = time.Now().Add(d).Format("2006-01-02") + today = time.Now().Format("2006-01-02") + err = xlsx.SaveAs("/tmp/" + yesterday + ".xlsx") if err != nil { logrus.Errorf("Failed to save excel : %v", err) } - - return excelName } diff --git a/pkg/apis/mysql.go b/pkg/apis/mysql.go index b840b09..abdaef8 100644 --- a/pkg/apis/mysql.go +++ b/pkg/apis/mysql.go @@ -20,12 +20,11 @@ var ( dbusername = os.Getenv("DB_USERNAME") dbpassword = os.Getenv("DB_PASSWORD") dbname = os.Getenv("DB_NAME") - dbtable = os.Getenv("DB_TABLE") ) func ConnectMysql() { - dbinfo := strings.Join([]string{dbusername, ":", dbpassword, "@tcp(", dbhostsip, ")/", dbname, "?charset=utf8&parseTime=true&loc=Local&time_zone='%2B8:00'"}, "") + dbinfo := strings.Join([]string{dbusername, ":", dbpassword, "@tcp(", dbhostsip, ")/", dbname, "?charset=utf8&parseTime=true"}, "") logrus.Infof(dbinfo) err := errors.New("") @@ -47,20 +46,16 @@ func ConnectMysql() { } func DBSave(user *types.User) { - tx, err := DB.Begin() - if nil != err { - logrus.Errorf("Failed to open transaction : %v", err) - } - stmt, err := tx.Prepare("INSERT INTO " + dbtable + "(name, company, position, phone, email, savetime, status) values(?,?,?,?,?,?,?)") + stmt, err := DB.Prepare("INSERT INTO user(name, company, position, phone, email, savetime, status) values(?,?,?,?,?,?,?)") if nil != err { logrus.Errorf("Failed to prepare SQL statement : %v", err) } + defer stmt.Close() + _, err = stmt.Exec(user.Name, user.Company, user.Position, user.Phone, user.Email, time.Now(), user.Status) if nil != err { logrus.Errorf("Failed to executes SQL : %v", err) } - - tx.Commit() } diff --git a/pkg/server/limit_ip.go b/pkg/server/limit_ip.go index 97a3e9e..93fbd73 100644 --- a/pkg/server/limit_ip.go +++ b/pkg/server/limit_ip.go @@ -1,16 +1,11 @@ package server import ( - "net/http" "sync" "golang.org/x/time/rate" ) -func okHandler(w http.ResponseWriter, r *http.Request) { - w.Write([]byte("alles gut")) -} - type IPRateLimiter struct { ips map[string]*rate.Limiter mu *sync.RWMutex diff --git a/scripts/ci b/scripts/ci index 4db5c91..0b40d77 100644 --- a/scripts/ci +++ b/scripts/ci @@ -3,7 +3,8 @@ set -e cd $(dirname $0) -# ./test -# ./validate +chmod +x ./build +chmod +x ./package + ./build -./package +./package \ No newline at end of file diff --git a/scripts/entry b/scripts/entry index b882c26..37c7b41 100644 --- a/scripts/entry +++ b/scripts/entry @@ -3,6 +3,7 @@ set -e mkdir -p bin dist if [ -e ./scripts/$1 ]; then + chmod +x ./scripts/"$@" ./scripts/"$@" else exec "$@"