diff --git a/.gitignore b/.gitignore index ba077a4..b28e5dc 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,3 @@ bin +*.base64 +env diff --git a/Makefile b/Makefile index 23c6045..07c778a 100644 --- a/Makefile +++ b/Makefile @@ -1,6 +1,25 @@ +#!make + +include env +export + +ifndef OC_VERSION +$(error OC_VERSION is not set) +endif + +ifndef PUBLISH_TOKEN +$(error PUBLISH_TOKEN is not set) +endif + +# PUBLISH_REPO := "na/oc-version" +PUBLISH_REPO := "ej/oc-test" +PUBLISH_BRANCH := main + +.PHONY: publish publish: - curl -X 'POST' \ - 'https://cloud.o-forge.io/api/v1/repos/core/oc-deploy/releases/2/assets?name=oc.json&token=92ad0a4b3d75ec7c5964913b7085d7ddf379247c' \ - -H 'accept: application/json' \ - -H 'Content-Type: multipart/form-data' \ - -F 'attachment=@oc.json;type=application/json' \ No newline at end of file + @echo Publication de : ${OC_VERSION} + @(cd publish && \ + PUBLISH_REPO=${PUBLISH_REPO} \ + PUBLISH_TOKEN=${PUBLISH_TOKEN} \ + PUBLISH_BRANCH=${PUBLISH_BRANCH} \ + go run main.go ${OC_VERSION}) diff --git a/publish/main.go b/publish/main.go index 2b72628..705bb27 100644 --- a/publish/main.go +++ b/publish/main.go @@ -1,27 +1,83 @@ package main import ( - "fmt" - "os" - "oc-publish/releases" + "fmt" + "os" + "io/ioutil" + "encoding/base64" + "oc-publish/releases" + "oc-publish/occonst" ) func main() { - fmt.Println(" >> oc-publish :") + version := os.Args[1] - version := os.Args[1] - fmt.Println(fmt.Sprintf(" << version : %s", version)) + fmt.Printf(" >> oc-publish :\n") - existe, _ := releases.CheckRelease(version) - fmt.Println(fmt.Sprintf(" << existe : %t ", existe)) + fmt.Printf(" << Url : %s/%s\n", occonst.PUBLISH_URL, occonst.PUBLISH_REPO) - idRelease, _ := releases.GetReleaseId(version) - fmt.Println(fmt.Sprintf(" << id : %d ", idRelease)) + fmt.Printf(" << version : %s %s\n", version, occonst.PUBLISH_BRANCH) - idAsset, _ := releases.GetAssetId(idRelease, "oc.json") - fmt.Println(fmt.Sprintf(" << idAsset : %d ", idAsset)) + vversion := fmt.Sprintf("v%s", version) + existe, _ := releases.CheckRelease(vversion) - fmt.Println(releases.CreateAsset(idRelease, "../bin/oc-deploy")) + if existe == false { + err := releases.CreateRelease(vversion, occonst.PUBLISH_BRANCH) + if err != nil { + fmt.Println(err) + os.Exit(1) + } + } + + idRelease, _ := releases.GetReleaseId(vversion) + if existe == true { + fmt.Println(fmt.Sprintf(" << Release existante : %d ", idRelease)) + } else { + fmt.Println(fmt.Sprintf(" << Release crée : %d ", idRelease)) + } + + assetname := "oc-deploy.base64" + binary := fmt.Sprintf("../bin/oc-deploy") + binary64 := fmt.Sprintf("../%s", assetname) + err := createBinaryFile(binary, binary64) + if err != nil { + fmt.Println(err) + os.Exit(1) + } + + idAsset, _ := releases.GetAssetId(idRelease, assetname) + if idAsset == 0 { + fmt.Println(fmt.Sprintf(" << Ajout Asset : %s", assetname)) + err := releases.CreateAsset(idRelease, binary64, assetname) + if err != nil { + fmt.Println(err) + os.Exit(1) + } + } else { + fmt.Println(fmt.Sprintf(" << Mise à jour : %s (idAsset=%d) ", assetname, idAsset)) + err := releases.UpdateAsset(idRelease, idAsset, binary64, assetname) + if err != nil { + fmt.Println(err) + os.Exit(1) + } + } } + + +func createBinaryFile(source string, dest string) error { + fout, _ := os.Create(dest) + defer fout.Close() + + byteValue, err := ioutil.ReadFile(source) + if err != nil { + fmt.Println("64e", err) + + return err + } + + data64 := base64.StdEncoding.EncodeToString(byteValue) + fout.Write([]byte(data64)) + return nil +} diff --git a/publish/occonst/variables.go b/publish/occonst/variables.go index aa9b07b..4908c82 100644 --- a/publish/occonst/variables.go +++ b/publish/occonst/variables.go @@ -1,6 +1,18 @@ package occonst -var PUBLISH_URL = "https://cloud.o-forge.io" -var PUBLISH_VERSION = "core/oc-deploy" +import ( + "os" +) -var PUBLISH_TOKEN = "" +var PUBLISH_URL = getenv("PUBLISH_URL", "https://cloud.o-forge.io") +var PUBLISH_REPO = getenv("PUBLISH_REPO", "core/oc-deploy") +var PUBLISH_TOKEN = getenv("PUBLISH_TOKEN", "") +var PUBLISH_BRANCH = getenv("PUBLISH_BRANCH", "main") + +func getenv(key string, defaut string) string { + value := os.Getenv(key) + if len(value) == 0 { + return defaut + } + return value +} diff --git a/publish/release.txt b/publish/release.txt new file mode 100644 index 0000000..6b1b0a2 --- /dev/null +++ b/publish/release.txt @@ -0,0 +1,6 @@ +Version %s d'OpenCloud + +``` +wget %s/%s/releases/download/%s/oc-deploy.base64 -O - | base64 -d > oc-deploy +chmod u+x ./oc-deploy +``` diff --git a/publish/releases/assets.go b/publish/releases/assets.go index 3387eb7..a500a48 100644 --- a/publish/releases/assets.go +++ b/publish/releases/assets.go @@ -6,6 +6,7 @@ import ( "path/filepath" "mime/multipart" "io" + "io/ioutil" "encoding/json" "net/http" "bytes" @@ -21,7 +22,7 @@ type assetStruct struct { func GetAssetId(idRelease int, name string) (int, error) { url := fmt.Sprintf("%s/api/v1/repos/%s/releases/%d/assets", occonst.PUBLISH_URL, - occonst.PUBLISH_VERSION, + occonst.PUBLISH_REPO, idRelease) res, err := http.Get(url) @@ -36,7 +37,6 @@ func GetAssetId(idRelease int, name string) (int, error) { var data []assetStruct err = json.Unmarshal(body, &data) - fmt.Println(err) if err != nil { return -3, err } @@ -54,48 +54,52 @@ func GetAssetId(idRelease int, name string) (int, error) { // -H 'accept: application/json' \ // -H 'Content-Type: multipart/form-data' \ // -F 'attachment=oc-deploy' -func CreateAsset(idRelease int, filename string) (int, error) { +func CreateAsset(idRelease int, filename string, name string) (error) { url := fmt.Sprintf("%s/api/v1/repos/%s/releases/%d/assets?name=%s&token=%s", occonst.PUBLISH_URL, - occonst.PUBLISH_VERSION, + occonst.PUBLISH_REPO, idRelease, - "name", + name, occonst.PUBLISH_TOKEN) - - // request, err := newfileUploadRequest(url, extraParams, "file", "/tmp/doc.pdf") err := uploadFile(url, "attachment", filename) - fmt.Println(url, err) + return err +} - // fmt.Println(url) +func UpdateAsset(idRelease int, idAsset int, filename string, name string) (error) { - // body := []byte("CONTENU") - // req, err := http.NewRequest("POST", url, bytes.NewBuffer(body)) - // if err != nil { - // return -1, err - // } - // req.Header.Add("accept", "application/json") - // req.Header.Add("Content-Type", "multipart/form-data") + url := fmt.Sprintf("%s/api/v1/repos/%s/releases/%d/assets/%d?token=%s", + occonst.PUBLISH_URL, + occonst.PUBLISH_REPO, + idRelease, + idAsset, + occonst.PUBLISH_TOKEN) - // client := &http.Client{} - // res, err := client.Do(req) - // fmt.Println(res, err) + // Create client + client := &http.Client{} - // cnt, err := io.ReadAll(res.Body) - // fmt.Println(string(cnt), err) + // Create request + req, err := http.NewRequest("DELETE", url, nil) + if err != nil { + return err + } - // if err != nil { - // return -1, err - // } + // Fetch Request + resp, err := client.Do(req) + if err != nil { + return err + } + defer resp.Body.Close() - // if err != nil { - // return -2, err - // } + // Read Response Body + respBody, err := ioutil.ReadAll(resp.Body) + if err != nil { + return err + } + fmt.Println(string(respBody)) - // defer res.Body.Close() - - return 0, nil + return CreateAsset(idRelease, filename, name) } func uploadFile(url string, paramName string, filePath string) error { @@ -104,7 +108,7 @@ func uploadFile(url string, paramName string, filePath string) error { return err } defer file.Close() - + body := &bytes.Buffer{} writer := multipart.NewWriter(body) part, err := writer.CreateFormFile(paramName, filepath.Base(filePath)) @@ -123,44 +127,19 @@ func uploadFile(url string, paramName string, filePath string) error { request.Header.Add("accept", "application/json") client := &http.Client{} response, err := client.Do(request) - + if err != nil { + fmt.Println(109, err) return err } defer response.Body.Close() - cnt, err := io.ReadAll(response.Body) - fmt.Println(string(cnt), err, writer.FormDataContentType()) - - // Handle the server response... - return nil + if response.StatusCode > 400 { + return fmt.Errorf(response.Status) } + _, err1 := io.ReadAll(response.Body) -// func newfileUploadRequest(uri string, params map[string]string, paramName, path string) (*http.Request, error) { -// file, err := os.Open(path) -// if err != nil { -// return nil, err -// } -// defer file.Close() - -// body := &bytes.Buffer{} -// writer := multipart.NewWriter(body) -// part, err := writer.CreateFormFile(paramName, filepath.Base(path)) -// if err != nil { -// return nil, err -// } -// _, err = io.Copy(part, file) - -// // for key, val := range params { -// // _ = writer.WriteField(key, val) -// // } -// // err = writer.Close() -// // if err != nil { -// // return nil, err -// // } - -// req, err := http.NewRequest("POST", uri, body) -// req.Header.Set("Content-Type", writer.FormDataContentType()) -// return req, err -// } \ No newline at end of file + // Handle the server response... + return err1 + } diff --git a/publish/releases/release.go b/publish/releases/release.go index 9bd1131..802b12f 100644 --- a/publish/releases/release.go +++ b/publish/releases/release.go @@ -3,6 +3,8 @@ package releases import ( "fmt" "io" + "io/ioutil" + "strings" "encoding/json" "net/http" @@ -15,10 +17,9 @@ type checkStruct struct { } func CheckRelease(version string) (bool, error) { - url := fmt.Sprintf("%s/api/v1/repos/%s/releases/tags/%s", + url := fmt.Sprintf("%s/api/v1/repos/%s/releases", occonst.PUBLISH_URL, - occonst.PUBLISH_VERSION, - version) + occonst.PUBLISH_REPO) res, err := http.Get(url) if err != nil { @@ -29,19 +30,25 @@ func CheckRelease(version string) (bool, error) { return false, err } - var data checkStruct + var data []checkStruct err = json.Unmarshal(body, &data) if err != nil { return false, err } - return data.Name != "", nil + for _, ele := range data { + if ele.Name == version { + return true, nil + } + } + // return data.Name != "", nil + return false, nil } func GetReleaseId(version string) (int, error) { url := fmt.Sprintf("%s/api/v1/repos/%s/releases/tags/%s", occonst.PUBLISH_URL, - occonst.PUBLISH_VERSION, + occonst.PUBLISH_REPO, version) res, err := http.Get(url) @@ -60,4 +67,60 @@ func GetReleaseId(version string) (int, error) { } return data.Id, nil -} \ No newline at end of file +} + +// curl -X 'POST' \ +// 'https://cloud.o-forge.io/api/v1/repos/na/oc-version/releases?token=sss' \ +// -H 'accept: application/json' \ +// -H 'Content-Type: application/json' \ +// -d '{ +// "body": "string", +// "draft": true, +// "name": "string", +// "prerelease": true, +// "tag_name": "string", +// "target_commitish": "string" +// }' +func CreateRelease(version string, branch string) (error) { + url := fmt.Sprintf("%s/api/v1/repos/%s/releases?token=%s", + occonst.PUBLISH_URL, + occonst.PUBLISH_REPO, + occonst.PUBLISH_TOKEN) + + releasebytes, err := ioutil.ReadFile("release.txt") + releasetxt := string(releasebytes) + releasetxt = strings.Replace(releasetxt, "\n", "\\n", -1) + releasetxt = fmt.Sprintf(releasetxt, version, occonst.PUBLISH_URL, occonst.PUBLISH_REPO, version) + + body := fmt.Sprintf(`{ + "body": "%s", + "draft": false, + "name": "%s", + "prerelease": false, + "tag_name": "%s", + "target_commitish": "%s" +}`, releasetxt, version, version, branch) + + request, err := http.NewRequest("POST", url, strings.NewReader(body)) + if err != nil { + return err + } + request.Header.Add("accept", "application/json") + request.Header.Add("Content-Type", "application/json") + + client := &http.Client{} + response, err := client.Do(request) + if err != nil { + return err + } + defer response.Body.Close() + + _, err1 := io.ReadAll(response.Body) + // cnt, err1 := io.ReadAll(response.Body) + // fmt.Println(string(cnt)) + + if err1 != nil { + return err1 + } + return nil +}