From d486a1e2ca505a4c22e8322b4186a8f278b8b264 Mon Sep 17 00:00:00 2001 From: James Harton Date: Mon, 28 Dec 2020 20:23:39 +1300 Subject: [PATCH] chore: set up git_ops and auto-releasing --- .gitlab-ci.yml | 136 +++++++++++++++++++++++++++++++++++------ CHANGELOG.md | 11 ++++ README.md | 4 +- config/config.exs | 37 +++-------- lib/vivid/png/shape.ex | 2 +- mix.exs | 14 +++-- mix.lock | 26 ++++---- 7 files changed, 163 insertions(+), 67 deletions(-) create mode 100644 CHANGELOG.md diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 0dd20ba..b18dda3 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1,37 +1,139 @@ -image: elixir:latest - -cache: - key: "$CI_JOB_NAME" - paths: - - deps - - _build - - /root/.mix +stages: + - build + - test + - release variables: MIX_ENV: "test" + PACKAGE_REGISTRY_URL: "${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/generic/" + HEX_HOME: "$CI_PROJECT_DIR/.hex" + MIX_HOME: "$CI_PROJECT_DIR/.mix" -before_script: - - mix local.hex --force - - mix local.rebar --force - - mix deps.get --only test +build: + image: elixir:latest + stage: build + cache: + key: "$CI_JOB_NAME" + paths: + - deps + - _build + - .hex + - .mix + script: + - mix local.hex --force + - mix local.rebar --force + - mix deps.get + - mix deps.compile + - mix git_ops.project_info -f dotenv > project_info.env + artifacts: + paths: + - _build/ + - deps/ + - .hex + - .mix + reports: + dotenv: project_info.env test: + image: elixir:latest + dependencies: + - build + stage: test script: - - mix test + - mix test credo: + image: elixir:latest + dependencies: + - build + stage: test script: - - mix credo --strict + - mix credo audit: + image: elixir:latest + dependencies: + - build + stage: test script: - mix hex.audit format: + image: elixir:latest + dependencies: + - build + stage: test script: - mix format --check-formatted -# inch: -# script: -# - mix inch --pedantic +pages: + image: elixir:latest + dependencies: + - build + stage: release + script: + - mix docs -o public + artifacts: + paths: + - public + only: + - master +git_ops: + image: elixir:latest + dependencies: + - build + stage: release + only: + refs: + - master + except: + variables: + - $CI_COMMIT_MESSAGE =~ /chore\:\ release version/ + script: + - | + export OLD_APP_VERSION=$APP_VERSION + mkdir -p artifacts + git config --global user.name "Gitlab Runner for ${GITLAB_USER_NAME}" + git config --global user.email "${GITLAB_USER_EMAIL}" + mix git_ops.release --yes || true + mix git_ops.project_info -f shell > artifacts/env + source artifacts/env + if [ "v${OLD_APP_VERSION}" != "v${APP_VERSION}" ]; then + mix hex.build -o "artifacts/${APP_NAME}-${APP_VERSION}.tar" + gzip "artifacts/${APP_NAME}-${APP_VERSION}.tar" + mix docs && tar zcvf "artifacts/${APP_NAME}-${APP_VERSION}-docs.tar.gz" doc/ + curl --header "JOB_TOKEN: ${CI_JOB_TOKEN}" --upload-file "artifacts/${APP_NAME}-${APP_VERSION}.tar.gz" "${PACKAGE_REGISTRY_URL}/${APP_NAME}/${APP_VERSION}/${APP_NAME}-${APP_VERSION}.tar.gz" + curl --header "JOB_TOKEN: ${CI_JOB_TOKEN}" --upload-file "artifacts/${APP_NAME}-${APP_VERSION}-docs.tar.gz" "${PACKAGE_REGISTRY_URL}/${APP_NAME}/${APP_VERSION}/${APP_NAME}-${APP_VERSION}-docs.tar.gz" + git push "https://project_${CI_PROJECT_ID}_bot:${RELEASE_TOKEN}@gitlab.com/${CI_PROJECT_PATH}.git" "HEAD:${CI_COMMIT_REF_NAME}" "refs/tags/v${APP_VERSION}" + fi + artifacts: + paths: + - artifacts/* + +release-gitlab: + image: registry.gitlab.com/gitlab-org/release-cli:latest + dependencies: + - build + stage: release + only: + - tags + - /^v\d+\.\d+\.\d+(-\w+)?$/ + script: + - release-cli create \ + --name "Release ${APP_NAME} ${APP_VERSION}" \ + --description "./CHANGELOG.md" \ + --tag-name "v${APP_VERSION}" \ + --assets-link "{\"name\":\"${APP_NAME}-${APP_VERSION}.tar.gz\",\"url\":\"${PACKAGE_REGISTRY_URL}/${APP_NAME}/${APP_VERSION}/${APP_NAME}-${APP_VERSION}.tar.gz\"}" \ + --assets-link "{\"name\":\"${APP_NAME}-${APP_VERSION}-docs.tar.gz\",\"url\":\"${PACKAGE_REGISTRY_URL}/${APP_NAME}/${APP_VERSION}/${APP_NAME}-${APP_VERSION}-docs.tar.gz\"}" + +release-hex: + image: elixir:latest + dependencies: + - build + stage: release + only: + - tags + - /^v\d+\.\d+\.\d+(-\w+)?$/ + script: + - mix hex.publish --yes diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..0c45320 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,11 @@ +# Change Log + +All notable changes to this project will be documented in this file. +See [Conventional Commits](Https://conventionalcommits.org) for commit guidelines. + + + +## [v0.2.0](https://gitlab.com/***PROJECT_PATH***/compare/v0.2.0...v0.2.0) (2020-12-28) + + + diff --git a/README.md b/README.md index 9501c3d..81cbcc0 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,7 @@ by adding `vivid_png` to your list of dependencies in `mix.exs`: ```elixir def deps do - [{:vivid_png, "~> 0.1.0"}] + [{:vivid_png, "~> 0.2.0"}] end ``` @@ -44,4 +44,4 @@ frame |> PNG.to_png("example.png") ``` -![example.png](https://raw.githubusercontent.com/jamesotron/vivid_png.ex/master/example.png) \ No newline at end of file +![example.png](https://raw.githubusercontent.com/jamesotron/vivid_png.ex/master/example.png) diff --git a/config/config.exs b/config/config.exs index afba940..cf21c23 100644 --- a/config/config.exs +++ b/config/config.exs @@ -1,30 +1,9 @@ -# This file is responsible for configuring your application -# and its dependencies with the aid of the Mix.Config module. -use Mix.Config +import Config -# This configuration is loaded before any dependency and is restricted -# to this project. If another project depends on this project, this -# file won't be loaded nor affect the parent project. For this reason, -# if you want to provide default values for your application for -# 3rd-party users, it should be done in your "mix.exs" file. - -# You can configure for your application as: -# -# config :vivid_png, key: :value -# -# And access this configuration in your application as: -# -# Application.get_env(:vivid_png, :key) -# -# Or configure a 3rd-party app: -# -# config :logger, level: :info -# - -# It is also possible to import configuration files, relative to this -# directory. For example, you can emulate configuration per environment -# by uncommenting the line below and defining dev.exs, test.exs and such. -# Configuration from the imported file will override the ones defined -# here (which is why it is important to import them last). -# -# import_config "#{Mix.env}.exs" +config :git_ops, + mix_project: Mix.Project.get!(), + changelog_file: "CHANGELOG.md", + repository_url: "https://gitlab.com/***PROJECT_PATH***", + manage_mix_version?: true, + manage_readme_version: "README.md", + version_tag_prefix: "v" diff --git a/lib/vivid/png/shape.ex b/lib/vivid/png/shape.ex index 0fb4fed..744207b 100644 --- a/lib/vivid/png/shape.ex +++ b/lib/vivid/png/shape.ex @@ -1,5 +1,5 @@ defmodule Vivid.PNG.ShapeToPng do - alias Vivid.{Bounds, Frame, PNG, Shape, Transform} + alias Vivid.{Bounds, Frame, PNG, RGBA, Shape, Transform} @moduledoc false diff --git a/mix.exs b/mix.exs index db38a93..0114774 100644 --- a/mix.exs +++ b/mix.exs @@ -1,10 +1,12 @@ defmodule Vivid.PNG.Mixfile do use Mix.Project + @version "0.2.0" + def project do [ app: :vivid_png, - version: "0.2.0", + version: @version, description: description(), elixir: "~> 1.3", build_embedded: Mix.env() == :prod, @@ -15,7 +17,7 @@ defmodule Vivid.PNG.Mixfile do end def application do - [applications: [:logger, :png]] + [extra_applications: [:logger]] end def description do @@ -26,7 +28,7 @@ defmodule Vivid.PNG.Mixfile do def package do [ - maintainers: ["James Harton "], + maintainers: ["James Harton "], licenses: ["MIT"], links: %{ "Source" => "https://gitlab.com/jimsy/vivid_png.ex" @@ -36,9 +38,9 @@ defmodule Vivid.PNG.Mixfile do defp deps do [ - {:ex_doc, ">= 0.0.0", only: :dev}, - {:credo, "~> 1.1", only: ~w(dev test)a, runtime: false}, - {:inch_ex, "~> 2.0", only: ~w(dev test)a, runtime: false}, + {:ex_doc, ">= 0.0.0", only: ~w[dev test]a}, + {:credo, "~> 1.1", only: ~w[dev test]a, runtime: false}, + {:git_ops, "~> 2.3", only: ~w[dev test]a, runtime: false}, {:png, "~> 0.1"}, {:vivid, "~> 0.4"} ] diff --git a/mix.lock b/mix.lock index 3b5a70d..a72fc21 100644 --- a/mix.lock +++ b/mix.lock @@ -1,14 +1,16 @@ %{ - "bunt": {:hex, :bunt, "0.2.0", "951c6e801e8b1d2cbe58ebbd3e616a869061ddadcc4863d0a2182541acae9a38", [:mix], [], "hexpm"}, - "credo": {:hex, :credo, "1.1.0", "e0c07b2fd7e2109495f582430a1bc96b2c71b7d94c59dfad120529f65f19872f", [:mix], [{:bunt, "~> 0.2.0", [hex: :bunt, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm"}, - "earmark": {:hex, :earmark, "1.3.2", "b840562ea3d67795ffbb5bd88940b1bed0ed9fa32834915125ea7d02e35888a5", [:mix], [], "hexpm"}, - "ex_doc": {:hex, :ex_doc, "0.20.2", "1bd0dfb0304bade58beb77f20f21ee3558cc3c753743ae0ddbb0fd7ba2912331", [:mix], [{:earmark, "~> 1.3", [hex: :earmark, repo: "hexpm", optional: false]}, {:makeup_elixir, "~> 0.10", [hex: :makeup_elixir, repo: "hexpm", optional: false]}], "hexpm"}, - "inch_ex": {:hex, :inch_ex, "2.0.0", "24268a9284a1751f2ceda569cd978e1fa394c977c45c331bb52a405de544f4de", [:mix], [{:bunt, "~> 0.2", [hex: :bunt, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm"}, - "jason": {:hex, :jason, "1.1.2", "b03dedea67a99223a2eaf9f1264ce37154564de899fd3d8b9a21b1a6fd64afe7", [:mix], [{:decimal, "~> 1.0", [hex: :decimal, repo: "hexpm", optional: true]}], "hexpm"}, - "makeup": {:hex, :makeup, "0.8.0", "9cf32aea71c7fe0a4b2e9246c2c4978f9070257e5c9ce6d4a28ec450a839b55f", [:mix], [{:nimble_parsec, "~> 0.5.0", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm"}, - "makeup_elixir": {:hex, :makeup_elixir, "0.13.0", "be7a477997dcac2e48a9d695ec730b2d22418292675c75aa2d34ba0909dcdeda", [:mix], [{:makeup, "~> 0.8", [hex: :makeup, repo: "hexpm", optional: false]}], "hexpm"}, - "nimble_parsec": {:hex, :nimble_parsec, "0.5.0", "90e2eca3d0266e5c53f8fbe0079694740b9c91b6747f2b7e3c5d21966bba8300", [:mix], [], "hexpm"}, - "png": {:hex, :png, "0.1.1", "57eeab907d4c2b78d4c3803bc355af025248db9ebd612e4275c3cab65b809171", [:rebar], [], "hexpm"}, - "poison": {:hex, :poison, "3.1.0", "d9eb636610e096f86f25d9a46f35a9facac35609a7591b3be3326e99a0484665", [:mix], [], "hexpm"}, - "vivid": {:hex, :vivid, "0.4.3", "ea0abddb41a1ac778392c05f11c70118a5d36d71f0dee9e4b10bcb757a54f1c2", [:mix], [], "hexpm"}, + "bunt": {:hex, :bunt, "0.2.0", "951c6e801e8b1d2cbe58ebbd3e616a869061ddadcc4863d0a2182541acae9a38", [:mix], [], "hexpm", "7af5c7e09fe1d40f76c8e4f9dd2be7cebd83909f31fee7cd0e9eadc567da8353"}, + "credo": {:hex, :credo, "1.5.4", "9914180105b438e378e94a844ec3a5088ae5875626fc945b7c1462b41afc3198", [:mix], [{:bunt, "~> 0.2.0", [hex: :bunt, repo: "hexpm", optional: false]}, {:file_system, "~> 0.2.8", [hex: :file_system, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm", "cf51af45eadc0a3f39ba13b56fdac415c91b34f7b7533a13dc13550277141bc4"}, + "earmark": {:hex, :earmark, "1.3.2", "b840562ea3d67795ffbb5bd88940b1bed0ed9fa32834915125ea7d02e35888a5", [:mix], [], "hexpm", "e3be2bc3ae67781db529b80aa7e7c49904a988596e2dbff897425b48b3581161"}, + "earmark_parser": {:hex, :earmark_parser, "1.4.12", "b245e875ec0a311a342320da0551da407d9d2b65d98f7a9597ae078615af3449", [:mix], [], "hexpm", "711e2cc4d64abb7d566d43f54b78f7dc129308a63bc103fbd88550d2174b3160"}, + "ex_doc": {:hex, :ex_doc, "0.23.0", "a069bc9b0bf8efe323ecde8c0d62afc13d308b1fa3d228b65bca5cf8703a529d", [:mix], [{:earmark_parser, "~> 1.4.0", [hex: :earmark_parser, repo: "hexpm", optional: false]}, {:makeup_elixir, "~> 0.14", [hex: :makeup_elixir, repo: "hexpm", optional: false]}], "hexpm", "f5e2c4702468b2fd11b10d39416ddadd2fcdd173ba2a0285ebd92c39827a5a16"}, + "file_system": {:hex, :file_system, "0.2.10", "fb082005a9cd1711c05b5248710f8826b02d7d1784e7c3451f9c1231d4fc162d", [:mix], [], "hexpm", "41195edbfb562a593726eda3b3e8b103a309b733ad25f3d642ba49696bf715dc"}, + "git_cli": {:hex, :git_cli, "0.3.0", "a5422f9b95c99483385b976f5d43f7e8233283a47cda13533d7c16131cb14df5", [:mix], [], "hexpm", "78cb952f4c86a41f4d3511f1d3ecb28edb268e3a7df278de2faa1bd4672eaf9b"}, + "git_ops": {:hex, :git_ops, "2.3.0", "a77f91b810d874e1abf5f415f335959a2dfc3613cbcd28c7c05b97c666339fda", [:mix], [{:git_cli, "~> 0.2", [hex: :git_cli, repo: "hexpm", optional: false]}, {:nimble_parsec, "~> 1.0", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "849bd53b7992963b3fdfebcdd0c946f4aab3f6ffbcfa5668b3e83cd5aeca0a2f"}, + "jason": {:hex, :jason, "1.2.2", "ba43e3f2709fd1aa1dce90aaabfd039d000469c05c56f0b8e31978e03fa39052", [:mix], [{:decimal, "~> 1.0 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: true]}], "hexpm", "18a228f5f0058ee183f29f9eae0805c6e59d61c3b006760668d8d18ff0d12179"}, + "makeup": {:hex, :makeup, "1.0.5", "d5a830bc42c9800ce07dd97fa94669dfb93d3bf5fcf6ea7a0c67b2e0e4a7f26c", [:mix], [{:nimble_parsec, "~> 0.5 or ~> 1.0", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "cfa158c02d3f5c0c665d0af11512fed3fba0144cf1aadee0f2ce17747fba2ca9"}, + "makeup_elixir": {:hex, :makeup_elixir, "0.15.0", "98312c9f0d3730fde4049985a1105da5155bfe5c11e47bdc7406d88e01e4219b", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}, {:nimble_parsec, "~> 1.1", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "75ffa34ab1056b7e24844c90bfc62aaf6f3a37a15faa76b07bc5eba27e4a8b4a"}, + "nimble_parsec": {:hex, :nimble_parsec, "1.1.0", "3a6fca1550363552e54c216debb6a9e95bd8d32348938e13de5eda962c0d7f89", [:mix], [], "hexpm", "08eb32d66b706e913ff748f11694b17981c0b04a33ef470e33e11b3d3ac8f54b"}, + "png": {:hex, :png, "0.2.1", "b25c17c8dcdc40096d46ae2d7c2777c63fede48fa8c8312cc708c88554049d3b", [:rebar3], [], "hexpm", "279345e07108c604871a21f1c91f716810ab559af2b20d6f302e0a98265ef72e"}, + "vivid": {:hex, :vivid, "0.4.3", "ea0abddb41a1ac778392c05f11c70118a5d36d71f0dee9e4b10bcb757a54f1c2", [:mix], [], "hexpm", "60195f5bb21d22acd2691cf01d4cc6809815b9c0cd369740d48ec9af8ddcfdf3"}, }