From a5d76d8d5a76968c8e0dd27fdd169c674788a276 Mon Sep 17 00:00:00 2001 From: Uday Hiwarale Date: Sun, 12 Apr 2020 00:59:35 +0530 Subject: [PATCH] release-v1 --- Dockerfile | 11 +++ README.md | 49 +++++++++++ action.yml | 43 +++++++++ assets/release.png | Bin 0 -> 48325 bytes entrypoint.go | 215 +++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 318 insertions(+) create mode 100644 Dockerfile create mode 100644 README.md create mode 100644 action.yml create mode 100644 assets/release.png create mode 100644 entrypoint.go diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..3b9203f --- /dev/null +++ b/Dockerfile @@ -0,0 +1,11 @@ +# Debian GNU/Linux 10 (1.13.10-buster) +FROM golang:1.13.10-buster + +# copy entrypoint file +COPY entrypoint.go /usr/bin/entrypoint.go + +# change mode of the entrypoint file +RUN chmod +x /usr/bin/entrypoint.go + +# set entrypoint command +ENTRYPOINT [ "go", "run", "/usr/bin/entrypoint.go" ] \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..39da8d4 --- /dev/null +++ b/README.md @@ -0,0 +1,49 @@ +# GitHub Action: go-build-action +This actions generates cross-platform executable files from a Go module. + +![release](/assets/release.png) + +# Workflow setup + +```yaml +# workflow name +name: Generate release-artifacts + +# on events +on: + release: + types: + - created + +# workflow tasks +jobs: + generate: + name: Generate cross-platform builds + runs-on: ubuntu-latest + steps: + - name: Checkout the repository + uses: actions/checkout@v2 + - name: Generate build files + uses: thatisuday/go-cross-build@v1 + with: + platforms: 'linux/amd64, darwin/amd64, windows/amd64' + package: 'demo' + name: 'program' + compress: 'true' + dest: 'dist' +``` + +### option: **platforms** +The `platforms` option specifies comma-separated platform names to create binary-executable files for. To see the list of supported platforms, use `go tool dist list` command. + +### option: **package** +If the module (_repository_) itself is a Go package, then `package` option value should be an empty string (''). If the repository contains a package directory, then `package` value should be the directory name. + +### option: **compress** +The `compress` option if set to `'true'` will generate **compressed-tar** archive files for the each platform-build file. The resulting archive file also contains `README.md` and `LICENSE` file if they exist inside the root of the repository. In this mode, the binary executable file name is taken from the `name` option value. + +### option: **name** +The `name` option sets a prefix for the build filenames. In compression mode, this prefix is applied to archive files and binary executable filename is set to this value. + +### option: **dest** +The `dest` option sets the output directory for the build files. This should be a relative directory without leading `./`. \ No newline at end of file diff --git a/action.yml b/action.yml new file mode 100644 index 0000000..4423943 --- /dev/null +++ b/action.yml @@ -0,0 +1,43 @@ +# action name +name: 'go-cross-build' + +# action author +author: 'Uday Hiwarale ' + +# action description +description: 'Generates cross-platform executable files from a Go module.' + +# action input values +inputs: + platforms: + description: 'Comma-separated list of "/" combinations.' + default: 'linux/386,linux/amd64' + required: false + package: + description: 'Package (directory) in the module to build. By default, builds the module directory.' + default: '' + required: false + compress: + description: 'Compress each build file inside a ".tar.gz" archive.' + default: 'false' + required: false + name: + description: 'Binary executable filename and filenames prefix for the build files.' + default: 'program' + required: false + dest: + description: 'Destination directory inside workspace to output build-artifacts.' + default: 'build' + required: false + +# action runner (golang:latest image) +runs: + using: 'docker' + image: 'Dockerfile' + env: + GO111MODULE: 'on' + +# branding +branding: + icon: terminal + color: green diff --git a/assets/release.png b/assets/release.png new file mode 100644 index 0000000000000000000000000000000000000000..8e194aea5fa2fb345b2c95a73381681543bf0728 GIT binary patch literal 48325 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

n(7wQL@h6l|$COc<`6 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%0AVW~ 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 E2lf{|WdHyG literal 0 HcmV?d00001 diff --git a/entrypoint.go b/entrypoint.go new file mode 100644 index 0000000..1d878ba --- /dev/null +++ b/entrypoint.go @@ -0,0 +1,215 @@ +package main + +import ( + "fmt" + "os" + "os/exec" + "path/filepath" + "strings" +) + +/*************************************/ + +// check if file exists (relative to the current directory) +func fileExists(path string) bool { + + // get current directory + cwd, _ := os.Getwd() + + // get an absolute path of the file + absPath := filepath.Join(cwd, path) + + // access file information + if _, err := os.Stat(absPath); err != nil { + return !os.IsNotExist(err) // return `false` if doesn't exist + } + + // file exists + return true +} + +// copy file using `cp` command +func copyFile(src, dest string) { + if err := exec.Command("cp", src, dest).Run(); err != nil { + fmt.Println("An error occurred during copy operation:", src, "=>", dest) + os.Exit(1) + } +} + +/*************************************/ + +// build the package for a platform +func build(packageName, destDir string, platform map[string]string, compress bool) { + + // platform config + platformKernel := platform["kernel"] + platformArch := platform["arch"] + + // binary executable file path + inputName := os.Getenv("INPUT_NAME") + + // build file name (same as the `inputName` if compression is enabled) + buildFileName := fmt.Sprintf("%s-%s-%s", inputName, platformKernel, platformArch) + if compress { + buildFileName = inputName + } + + // append `.exe` file-extension for windows + if platformKernel == "windows" { + buildFileName += ".exe" + } + + // workspace directory + workspaceDir := os.Getenv("GITHUB_WORKSPACE") + + // destination directory path + destDirPath := filepath.Join(workspaceDir, destDir) + + // join destination path + buildFilePath := filepath.Join(destDirPath, buildFileName) + + // package directory local path + var packagePath string + if packageName == "" { + packagePath = "." + } else { + packagePath = "./" + packageName + } + + /*------------*/ + + // command-line options for the `go build` command + buildOptions := []string{"build", "-buildmode", "exe", "-o", buildFilePath, packagePath} + + // generate `go build` command + buildCmd := exec.Command("go", buildOptions...) + + // set environment variables + buildCmd.Env = append(os.Environ(), []string{ + fmt.Sprintf("GOOS=%s", platformKernel), + fmt.Sprintf("GOARCH=%s", platformArch), + }...) + + // execute `go build` command + fmt.Println("Creating a build using :", buildCmd.String()) + if output, err := buildCmd.Output(); err != nil { + fmt.Println("An error occurred during build:", err) + os.Exit(1) + } else { + fmt.Printf("%s\n", output) + } + + /*------------------------------*/ + + // create a compressed `.tar.gz` file + if compress { + + // compressed gzip file name + gzFileName := fmt.Sprintf("%s-%s-%s.tar.gz", inputName, platformKernel, platformArch) + + /*------------*/ + + // file to compress (default: build file) + includeFiles := []string{buildFileName} + + // copy "README.md" file inside destination directory + if fileExists("README.md") { + copyFile("README.md", filepath.Join(destDirPath, "README.md")) + includeFiles = append(includeFiles, "README.md") + } + + // copy "LICENSE" file inside destination directory + if fileExists("LICENSE") { + copyFile("LICENSE", filepath.Join(destDirPath, "LICENSE")) + includeFiles = append(includeFiles, "LICENSE") + } + + /*------------*/ + + // command-line options for the `tar` command + tarOptions := append([]string{"-cvzf", gzFileName}, includeFiles...) + + // generate `tar` command + tarCmd := exec.Command("tar", tarOptions...) + + // set working directory for the command + tarCmd.Dir = destDirPath + + // execute `tar` command + fmt.Println("Compressing build file using:", tarCmd.String()) + if err := tarCmd.Run(); err != nil { + fmt.Println("An error occurred during compression:", err) + os.Exit(1) + } + + /*------------*/ + + // generate cleanup command + cleanCmd := exec.Command("rm", append([]string{"-f"}, includeFiles...)...) + + // set working directory for the command + cleanCmd.Dir = destDirPath + + // start cleanup process + fmt.Println("Performing cleanup operation using:", cleanCmd.String()) + if err := cleanCmd.Run(); err != nil { + fmt.Println("An error occurred during cleaup:", err) + os.Exit(1) + } + + } +} + +/*************************************/ + +func main() { + + // get input variables from action + inputPlatforms := os.Getenv("INPUT_PLATFORMS") + inputPackage := os.Getenv("INPUT_PACKAGE") + inputCompress := os.Getenv("INPUT_COMPRESS") + inputDest := os.Getenv("INPUT_DEST") + + // package name to build + packageName := strings.ReplaceAll(inputPackage, " ", "") + + // destination directory + destDir := strings.ReplaceAll(inputDest, " ", "") + + // split platform names by comma (`,`) + platforms := strings.Split(inputPlatforms, ",") + + // should compress build file + compress := false + if strings.ToLower(inputCompress) == "true" { + compress = true + } + + // for each platform, execute `build` function + for _, platform := range platforms { + + // split platform by `/` (and clean all whitespaces) + platformSpec := strings.Split(strings.ReplaceAll(platform, " ", ""), "/") + + // create a `map` of `kernel` and `arch` + platformMap := map[string]string{ + "kernel": platformSpec[0], + "arch": platformSpec[1], + } + + // execute `build` function + build(packageName, destDir, platformMap, compress) + } + + /*------------*/ + + // list files inside destination directory + if output, err := exec.Command("ls", "-alh", destDir).Output(); err != nil { + fmt.Println("An error occurred during ls operation:", err) + os.Exit(1) + } else { + fmt.Println("--- BUILD FILES ---") + fmt.Printf("%s\n", output) + } + +}