--- date: "2019-02-12:00:00+02:00" title: "Magefile" draft: false type: "doc" menu: sidebar: parent: "development" --- # Mage Vikunja uses [Mage](https://magefile.org/) to script common development tasks and even releasing. Mage is a pure go solution which allows for greater flexibility and things like better paralelization. This document explains what taks are available and what they do. {{< table_of_contents >}} ## Installation To use mage, you'll need to install the mage cli. To install it, run the following command: ``` go install github.com/magefile/mage ``` ## Categories There are multiple categories of subcommands in the magefile: * `build`: Contains commands to build a single binary * `check`: Contains commands to statically check the source code * `release`: Contains commands to release Vikunja with everything that's required * `test`: Contains commands to run all kinds of tests * `dev`: Contains commands to run development tasks * `misc`: Commands which do not belong in either of the other categories ## CI These tasks are automatically run in our CI every time someone pushes to master or you update a pull request: * `mage check:lint` * `mage check:fmt` * `mage check:ineffassign` * `mage check:misspell` * `mage check:goconst` * `mage build:generate` * `mage build:build` ## Build ### Build Vikunja {{< highlight bash >}} mage build:build {{< /highlight >}} Builds a `vikunja`-binary in the root directory of the repo for the platform it is run on. ### Statically compile all templates into the binary {{< highlight bash >}} mage build:generate {{< /highlight >}} This generates static code with all templates, meaning no template need to be referenced at runtime. ### clean {{< highlight bash >}} mage build:clean {{< /highlight >}} Cleans all build, executable and bindata files ## Check All check sub-commands exit with a status code of 1 if the check fails. Various code-checks are available: * `mage check:all`: Runs fmt-check, lint, got-swag, misspell-check, ineffasign-check, gocyclo-check, static-check, gosec-check, goconst-check all in parallel * `mage check:fmt`: Checks if the code is properly formatted with go fmt * `mage check:go-sec`: Checks the source code for potential security issues by scanning the Go AST using the [gosec tool](https://github.com/securego/gosec) * `mage check:goconst`: Checks for repeated strings that could be replaced by a constant using [goconst](https://github.com/jgautheron/goconst/) * `mage check:gocyclo`: Checks for the cyclomatic complexity of the source code using [gocyclo](https://github.com/fzipp/gocyclo) * `mage check:got-swag`: Checks if the swagger docs need to be re-generated from the code annotations * `mage check:ineffassign`: Checks the source code for ineffectual assigns using [ineffassign](https://github.com/gordonklaus/ineffassign) * `mage check:lint`: Runs golint on all packages * `mage check:misspell`: Checks the source code for misspellings * `mage check:static`: Statically analyzes the source code about a range of different problems using [staticcheck](https://staticcheck.io/docs/) ## Release ### Build Releases {{< highlight bash >}} mage release {{< /highlight >}} Builds binaries for all platforms and zips them with a copy of the `templates/` folder. All built zip files are stored into `dist/zips/`. Binaries are stored in `dist/binaries/`, binaries bundled with `templates` are stored in `dist/releases/`. All cross-platform binaries built using this series of commands are built with the help of [xgo](https://github.com/techknowlogick/xgo). The mage command will automatically install the binary to be able to use it. `mage release:release` is a shortcut to execute `mage release:dirs release:windows release:linux release:darwin release:copy release:check release:os-package release:zip`. * `mage release:dirs` creates all directories needed * `mage release:windows`/`release:linux`/`release:darwin` execute xgo to build for their respective platforms * `mage release:copy` bundles binaries with a copy of the `LICENSE` and sample config files to then be zipped * `mage release:check` creates sha256 checksums for each binary which will be included in the zip file * `mage release:os-package` bundles a binary with the `sha256` checksum file, a sample `config.yml` and a copy of the license in a folder for each architecture * `mage release:compress` compresses all build binaries with `upx` to save space * `mage release:zip` paclages a zip file for the files created by `release:os-package` ### Build debian packages {{< highlight bash >}} mage release:deb {{< /highlight >}} Will build a `.deb` package into the current folder. You need to have [fpm](https://fpm.readthedocs.io/en/latest/intro.html) installed to be able to do this. ### Make a debian repo {{< highlight bash >}} mage release:reprepro {{< /highlight >}} Takes an already built debian package and creates a debian repo structure around it. Used to be run inside a [docker container](https://git.kolaente.de/konrad/reprepro-docker) in the CI process when releasing. ## Test ### unit {{< highlight bash >}} mage test:unit {{< /highlight >}} Runs all tests except integration tests. ### coverage {{< highlight bash >}} mage test:coverage {{< /highlight >}} Runs all tests except integration tests and generates a `coverage.html` file to inspect the code coverage. ### integration {{< highlight bash >}} mage test:integration {{< /highlight >}} Runs all integration tests. ## Dev ### Create a new migration {{< highlight bash >}} mage dev:create-migration {{< /highlight >}} Creates a new migration with the current date. Will ask for the name of the struct you want to create a migration for. ## Misc ### Format the code {{< highlight bash >}} mage fmt {{< /highlight >}} Formats all source code using `go fmt`. ### Generate swagger definitions from code comments {{< highlight bash >}} mage do-the-swag {{< /highlight >}} Generates swagger definitions from the comment annotations in the code.