diff --git a/.gitignore b/.gitignore index 2a4ff89..ba07ed8 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,113 @@ -*.swp +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +env/ +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +*.egg-info/ +.installed.cfg +*.egg + +# PyInstaller +# Usually these files are written by a python script from a packager +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +.hypothesis/ .kitchen .kitchen.local.yml +kitchen.local.yml + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# pyenv +.python-version + +# celery beat schedule file +celerybeat-schedule + +# SageMath parsed files +*.sage.py + +# dotenv +.env + +# virtualenv +.venv +venv/ +ENV/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ + +# Bundler +Gemfile.lock + +# copied `.md` files used for conversion to `.rst` using `m2r` +docs/*.md + +# Vim +*.sw? diff --git a/.kitchen.yml b/.kitchen.yml deleted file mode 100644 index 4b89c12..0000000 --- a/.kitchen.yml +++ /dev/null @@ -1,38 +0,0 @@ ---- -driver: - name: vagrant - -platforms: - - name: debian-jessie64 - driver_config: - box: ssplatt/salt-deb-8 - -provisioner: - name: salt_solo - salt_version: 2015.8.8 - data_path: test/shared - is_file_root: true - pillars-from-files: - apt.sls: pillar.example - pillars: - top.sls: - base: - '*': - - apt - grains: - os_family: Debian - -suites: - - name: repositories - provisioner: - state_top: - base: - '*': - - apt.repositories - - apt.update - - name: preferences - provisioner: - state_top: - base: - '*': - - apt.preferences diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000..1895415 --- /dev/null +++ b/.travis.yml @@ -0,0 +1,68 @@ +stages: + - test + - commitlint + - name: release + if: branch = master AND type != pull_request + +sudo: required +cache: bundler +language: ruby + +services: + - docker + +# Make sure the instances listed below match up with +# the `platforms` defined in `kitchen.yml` +# NOTE: Please try to select up to six instances that add some meaningful +# testing of the formula's behaviour. If possible, try to refrain from +# the classical "chosing all the instances because I want to test on +# another/all distro/s" trap: it will just add time to the testing (see +# the discussion on #121). As an example, the set chosen below covers +# the most used distros families, systemd and non-systemd and the latest +# three supported Saltstack versions with python2 and 3." +# As for `kitchen.yml`, that should still contain all of the platforms, +# to allow for comprehensive local testing +# Ref: https://github.com/saltstack-formulas/template-formula/issues/118 +# Ref: https://github.com/saltstack-formulas/template-formula/issues/121 +env: + matrix: + - INSTANCE: repositories-debian-9-2019-2-py3 + - INSTANCE: repositories-ubuntu-1804-2019-2-py3 + - INSTANCE: preferences-debian-9-2019-2-py3 + - INSTANCE: preferences-ubuntu-1804-2019-2-py3 + +script: + - bundle exec kitchen verify ${INSTANCE} + +jobs: + include: + # Define the commitlint stage + - stage: commitlint + language: node_js + node_js: lts/* + before_install: skip + script: + - npm install @commitlint/config-conventional -D + - npm install @commitlint/travis-cli -D + - commitlint-travis + # Define the release stage that runs semantic-release + - stage: release + language: node_js + node_js: lts/* + before_install: skip + script: + # Update `AUTHORS.md` + - export MAINTAINER_TOKEN=${GH_TOKEN} + - go get github.com/myii/maintainer + - maintainer contributor + + # Install all dependencies required for `semantic-release` + - npm install @semantic-release/changelog@3 -D + - npm install @semantic-release/exec@3 -D + - npm install @semantic-release/git@7 -D + deploy: + provider: script + skip_cleanup: true + script: + # Run `semantic-release` + - npx semantic-release@15 diff --git a/FORMULA b/FORMULA new file mode 100644 index 0000000..9598448 --- /dev/null +++ b/FORMULA @@ -0,0 +1,9 @@ +name: apt +os: Debian, Ubuntu, Raspbian +os_family: Debian +version: 0.2.0 +release: 1 +minimum_version: 2017.7 +summary: Apt formula +description: Formula to configure APT and related resources +top_level_dir: apt diff --git a/Gemfile b/Gemfile new file mode 100644 index 0000000..3b36de3 --- /dev/null +++ b/Gemfile @@ -0,0 +1,6 @@ +source "https://rubygems.org" + +gem 'kitchen-docker', '>= 2.9' +gem 'kitchen-salt', '>= 0.6.0' +gem 'kitchen-inspec', '>= 1.1' + diff --git a/LICENSE b/LICENSE index d919c41..3e21c72 100644 --- a/LICENSE +++ b/LICENSE @@ -1,4 +1,4 @@ - Copyright (c) 2013-2015 Salt Stack Formulas + Copyright (c) 2014 Salt Stack Formulas Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/README.rst b/README.rst deleted file mode 100644 index a1d725d..0000000 --- a/README.rst +++ /dev/null @@ -1,68 +0,0 @@ -apt -=== - -Formulas to update, upgrade, and dist-upgrade within apt. - -.. note:: - - See the full `Salt Formulas installation and usage instructions - `_. - -Available states -================ - -.. contents:: - :local: - -``apt.dist_upgrade`` --------------------- - -Runs ``apt-get -y dist-upgrade``. - -``apt.update`` --------------- - -Runs ``apt-get -y update``. - -``apt.upgrade`` ---------------- - -Runs ``apt-get -y upgrade``. - -``apt.repositories`` --------------------- - -Allows you to configure and manage repositories from pillar. Check ``pillar.example`` -to see possible values. If used and no repositories are provided, sane default -values from ``map.jinja`` are used. - -Check https://wiki.debian.org/SourcesList for an explanation about the resulting -files structure. - -``apt.preferences`` -------------------- - -Allows you to configure and manage apt's preferences from pillar. Check -``pillar.example`` to see possible values. If used and no repositories are -provided, sane default values from ``map.jinja`` are used. - -Check https://wiki.debian.org/AptPreferences?action=show&redirect=preferences -and ``man 5 apt_preferences`` for an explanation about the resulting files structure. - -``apt.ppa`` ------------ -Installs ``python-software-properties`` -(``$ /usr/bin/apt-add-repository ppa:user/repository``). - -``apt.unattended`` ------------------- -Installs and configures ``unattended-upgrades`` - -``apt.transports.debtorrent`` -------------------------------- -Installs ``apt-transport-debtorrent``. - -``apt.transports.https`` --------------------------- -Installs ``apt-transport-https``. - diff --git a/apt/map.jinja b/apt/map.jinja index 528675b..d77073e 100644 --- a/apt/map.jinja +++ b/apt/map.jinja @@ -20,27 +20,26 @@ 'default_url': 'http://deb.debian.org/debian/', 'default_keyring_package': 'debian-archive-keyring', 'repositories': { - 'sane_default': { - 'distro': distribution, - 'url': 'http://deb.debian.org/debian/', - 'arch': arch, - 'comps': ['main'], - }, - 'security-stable': { - 'distro': distribution ~ '/updates', - 'url': 'http://security.debian.org/', - 'arch': arch, - 'comps': ['main'], - }, - 'default-updates': { - 'distro': distribution ~ '-updates', - 'url': 'http://deb.debian.org/debian/', - 'arch': arch, - 'comps': ['main'], - }, + 'sane_default': { + 'distro': distribution, + 'url': 'http://deb.debian.org/debian/', + 'arch': arch, + 'comps': ['main'], + }, + 'security-stable': { + 'distro': distribution ~ '/updates', + 'url': 'http://security.debian.org/', + 'arch': arch, + 'comps': ['main'], + }, + 'default-updates': { + 'distro': distribution ~ '-updates', + 'url': 'http://deb.debian.org/debian/', + 'arch': arch, + 'comps': ['main'], + }, }, }, - 'Ubuntu': { 'pkgs': ['unattended-upgrades'], 'confd_dir': '/etc/apt/apt.conf.d', @@ -60,28 +59,28 @@ 'default_url': 'http://archive.ubuntu.com/ubuntu/', 'default_keyring_package': 'ubuntu-keyring', 'repositories': { - 'default': { - 'distro': distribution, - 'url': 'http://archive.ubuntu.com/ubuntu/', - 'arch': arch, - 'comps': ['main'], - }, - 'default-security': { - 'distro': distribution ~ '-security', - 'url': 'http://security.ubuntu.com/ubuntu/', - 'arch': arch, - 'comps': ['main'], - }, - - 'default-updates': { - 'distro': distribution ~ '-updates', - 'url': 'http://archive.ubuntu.com/ubuntu/', - 'arch': arch, - 'comps': ['main'], - }, - + 'default': { + 'distro': distribution, + 'url': 'http://archive.ubuntu.com/ubuntu/', + 'arch': arch, + 'comps': ['main'], + }, + 'default-security': { + 'distro': distribution ~ '-security', + 'url': 'http://security.ubuntu.com/ubuntu/', + 'arch': arch, + 'comps': ['main'], + }, + 'default-updates': { + 'distro': distribution ~ '-updates', + 'url': 'http://archive.ubuntu.com/ubuntu/', + 'arch': arch, + 'comps': ['main'], + }, }, }, - -}, grain='os', merge=salt['pillar.get']('apt:lookup'), default='Debian') %} - +}, grain='os', merge=salt['grains.filter_by']({ + 'Mint': { + 'keyring_package': 'linuxmint-keyring' + }, +}, grain='oscodename', merge=salt['pillar.get']('apt:lookup'), default='Debian')) %} diff --git a/bin/kitchen b/bin/kitchen new file mode 100755 index 0000000..1cd44f3 --- /dev/null +++ b/bin/kitchen @@ -0,0 +1,29 @@ +#!/usr/bin/env ruby +# frozen_string_literal: true + +# +# This file was generated by Bundler. +# +# The application 'kitchen' is installed as part of a gem, and +# this file is here to facilitate running it. +# + +require "pathname" +ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile", + Pathname.new(__FILE__).realpath) + +bundle_binstub = File.expand_path("../bundle", __FILE__) + +if File.file?(bundle_binstub) + if File.read(bundle_binstub, 300) =~ /This file was generated by Bundler/ + load(bundle_binstub) + else + abort("Your `bin/bundle` was not generated by Bundler, so this binstub cannot run. +Replace `bin/bundle` by running `bundle binstubs bundler --force`, then run this command again.") + end +end + +require "rubygems" +require "bundler/setup" + +load Gem.bin_path("test-kitchen", "kitchen") diff --git a/commitlint.config.js b/commitlint.config.js new file mode 100644 index 0000000..2f9d1aa --- /dev/null +++ b/commitlint.config.js @@ -0,0 +1,3 @@ +module.exports = { + extends: ['@commitlint/config-conventional'], +}; diff --git a/docs/CONTRIBUTING.rst b/docs/CONTRIBUTING.rst new file mode 100644 index 0000000..5da9ae8 --- /dev/null +++ b/docs/CONTRIBUTING.rst @@ -0,0 +1,158 @@ +.. _contributing: + +How to contribute +================= + +This document will eventually outline all aspects of guidance to make your contributing experience a fruitful and enjoyable one. +What it already contains is information about *commit message formatting* and how that directly affects the numerous automated processes that are used for this repo. +It also covers how to contribute to this *formula's documentation*. + +.. contents:: **Table of Contents** + +Overview +-------- + +Submitting a pull request is more than just code! +To achieve a quality product, the *tests* and *documentation* need to be updated as well. +An excellent pull request will include these in the changes, wherever relevant. + +Commit message formatting +------------------------- + +Since every type of change requires making Git commits, +we will start by covering the importance of ensuring that all of your commit +messages are in the correct format. + +Automation of multiple processes +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +This formula uses `semantic-release `_ for automating numerous processes such as bumping the version number appropriately, creating new tags/releases and updating the changelog. +The entire process relies on the structure of commit messages to determine the version bump, which is then used for the rest of the automation. + +Full details are available in the upstream docs regarding the `Angular Commit Message Conventions `_. +The key factor is that the first line of the commit message must follow this format: + +.. code-block:: + + type(scope): subject + + +* E.g. ``docs(contributing): add commit message formatting instructions``. + +Besides the version bump, the changelog and release notes are formatted accordingly. +So based on the example above: + +.. + + .. raw:: html + +

Documentation

+ + * **contributing:** add commit message formatting instructions + + +* The ``type`` translates into a ``Documentation`` sub-heading. +* The ``(scope):`` will be shown in bold text without the brackets. +* The ``subject`` follows the ``scope`` as standard text. + +Linting commit messages in Travis CI +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +This formula uses `commitlint `_ for checking commit messages during CI testing. +This ensures that they are in accordance with the ``semantic-release`` settings. + +For more details about the default settings, refer back to the ``commitlint`` `reference rules `_. + +Relationship between commit type and version bump +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +This formula applies some customisations to the defaults, as outlined in the table below, +based upon the `type `_ of the commit: + +.. list-table:: + :name: commit-type-vs-version-bump + :header-rows: 1 + :stub-columns: 0 + :widths: 1,2,3,1,1 + + * - Type + - Heading + - Description + - Bump (default) + - Bump (custom) + * - ``build`` + - Build System + - Changes related to the build system + - – + - + * - ``chore`` + - – + - Changes to the build process or auxiliary tools and libraries such as + documentation generation + - – + - + * - ``ci`` + - Continuous Integration + - Changes to the continuous integration configuration + - – + - + * - ``docs`` + - Documentation + - Documentation only changes + - – + - 0.0.1 + * - ``feat`` + - Features + - A new feature + - 0.1.0 + - + * - ``fix`` + - Bug Fixes + - A bug fix + - 0.0.1 + - + * - ``perf`` + - Performance Improvements + - A code change that improves performance + - 0.0.1 + - + * - ``refactor`` + - Code Refactoring + - A code change that neither fixes a bug nor adds a feature + - – + - 0.0.1 + * - ``revert`` + - Reverts + - A commit used to revert a previous commit + - – + - 0.0.1 + * - ``style`` + - Styles + - Changes that do not affect the meaning of the code (white-space, + formatting, missing semi-colons, etc.) + - – + - 0.0.1 + * - ``test`` + - Tests + - Adding missing or correcting existing tests + - – + - 0.0.1 + +Use ``BREAKING CHANGE`` to trigger a ``major`` version change +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Adding ``BREAKING CHANGE`` to the footer of the extended description of the commit message will **always** trigger a ``major`` version change, no matter which type has been used. +This will be appended to the changelog and release notes as well. +To preserve good formatting of these notes, the following format is prescribed: + +* ``BREAKING CHANGE: .`` + +An example of that: + +.. code-block:: git + + ... + + BREAKING CHANGE: With the removal of all of the `.sls` files under + `template package`, this formula no longer supports the installation of + packages. diff --git a/docs/README.rst b/docs/README.rst new file mode 100644 index 0000000..b476bdf --- /dev/null +++ b/docs/README.rst @@ -0,0 +1,145 @@ +.. _readme: + +apt +=== + +|img_travis| |img_sr| + +.. |img_travis| image:: https://travis-ci.com/saltstack-formulas/apt-formula.svg?branch=master + :alt: Travis CI Build Status + :scale: 100% + :target: https://travis-ci.com/saltstack-formulas/apt-formula +.. |img_sr| image:: https://img.shields.io/badge/%20%20%F0%9F%93%A6%F0%9F%9A%80-semantic--release-e10079.svg + :alt: Semantic Release + :scale: 100% + :target: https://github.com/semantic-release/semantic-release + +A formula to configure and manage update, upgrade, and dist-upgrade within apt. + +.. contents:: **Table of Contents** + +General notes +------------- + +See the full `SaltStack Formulas installation and usage instructions +`_. + +If you are interested in writing or contributing to formulas, please pay attention to the `Writing Formula Section +`_. + +If you want to use this formula, please pay attention to the ``FORMULA`` file and/or ``git tag``, +which contains the currently released version. This formula is versioned according to `Semantic Versioning `_. + +See `Formula Versioning Section `_ for more details. + +Contributing to this repo +------------------------- + +**Commit message formatting is significant!!** + +Please see :ref:`How to contribute ` for more details. + +Available states +---------------- + +.. contents:: + :local: + +``apt.dist_upgrade`` +^^^^^^^^^^^^^^^^^^^^ + +Runs ``apt-get -y dist-upgrade``. + +``apt.update`` +^^^^^^^^^^^^^^ + +Runs ``apt-get -y update``. + +``apt.upgrade`` +^^^^^^^^^^^^^^^ + +Runs ``apt-get -y upgrade``. + +``apt.repositories`` +^^^^^^^^^^^^^^^^^^^^ + +Allows you to configure and manage repositories from pillar. Check ``pillar.example`` +to see possible values. If used and no repositories are provided, sane default +values from ``map.jinja`` are used. + +Check https://wiki.debian.org/SourcesList for an explanation about the resulting +files structure. + +``apt.preferences`` +^^^^^^^^^^^^^^^^^^^ + +Allows you to configure and manage apt's preferences from pillar. Check +``pillar.example`` to see possible values. If used and no repositories are +provided, sane default values from ``map.jinja`` are used. + +Check https://wiki.debian.org/AptPreferences?action=show&redirect=preferences +and ``man 5 apt_preferences`` for an explanation about the resulting files structure. + +``apt.ppa`` +^^^^^^^^^^^ +Installs ``python-software-properties`` +(``$ /usr/bin/apt-add-repository ppa:user/repository``). + +``apt.unattended`` +^^^^^^^^^^^^^^^^^^ +Installs and configures ``unattended-upgrades`` + +``apt.transports.debtorrent`` +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Installs ``apt-transport-debtorrent``. + +``apt.transports.https`` +^^^^^^^^^^^^^^^^^^^^^^^^ +Installs ``apt-transport-https``. **Note that `apt-transport-https` has been deprecated +since Debian 9 and it's now a dummy package** + +Testing +------- + +Linux testing is done with ``kitchen-salt``. + +Requirements +^^^^^^^^^^^^ + +* Ruby +* Docker + +.. code-block:: bash + + $ gem install bundler + $ bundle install + $ bin/kitchen test [platform] + +Where ``[platform]`` is the platform name defined in ``kitchen.yml``, +e.g. ``debian-9-2019-2-py3``. + +``bin/kitchen converge`` +^^^^^^^^^^^^^^^^^^^^^^^^ + +Creates the docker instance and runs the ``apt`` main state, ready for testing. + +``bin/kitchen verify`` +^^^^^^^^^^^^^^^^^^^^^^ + +Runs the ``inspec`` tests on the actual instance. + +``bin/kitchen destroy`` +^^^^^^^^^^^^^^^^^^^^^^^ + +Removes the docker instance. + +``bin/kitchen test`` +^^^^^^^^^^^^^^^^^^^^ + +Runs all of the stages above in one go: i.e. ``destroy`` + ``converge`` + ``verify`` + ``destroy``. + +``bin/kitchen login`` +^^^^^^^^^^^^^^^^^^^^^ + +Gives you SSH access to the instance for manual testing. + diff --git a/kitchen.yml b/kitchen.yml new file mode 100644 index 0000000..697b5f6 --- /dev/null +++ b/kitchen.yml @@ -0,0 +1,67 @@ +# -*- coding: utf-8 -*- +# vim: ft=yaml +--- +# For help on this file's format, see https://kitchen.ci/ +driver: + name: docker + use_sudo: false + privileged: true + run_command: /lib/systemd/systemd + +# Make sure the platforms listed below match up with +# the `env.matrix` instances defined in `.travis.yml` +platforms: + - name: debian-9-2019-2-py3 + driver: + image: netmanagers/salt-2019.2-py3:debian-9 + - name: ubuntu-1804-2019-2-py3 + driver: + image: netmanagers/salt-2019.2-py3:ubuntu-18.04 + +provisioner: + name: salt_solo + log_level: info + salt_install: none + require_chef: false + formula: apt + salt_copy_filter: + - .kitchen + - .git + pillars: + top.sls: + base: + '*': + - apt + +verifier: + # https://www.inspec.io/ + name: inspec + sudo: true + # cli, documentation, html, progress, json, json-min, json-rspec, junit + reporter: + - cli + +suites: + - name: repositories + provisioner: + state_top: + base: + '*': + - apt.repositories + - apt.update + pillars_from_files: + apt.sls: test/salt/pillar/repositories.pillar.sls + verifier: + inspec_tests: + - path: test/integration/repositories + - name: preferences + provisioner: + state_top: + base: + '*': + - apt.preferences + pillars_from_files: + apt.sls: test/salt/pillar/preferences.pillar.sls + verifier: + inspec_tests: + - path: test/integration/preferences diff --git a/pillar.example b/pillar.example index 204d978..1fb1288 100644 --- a/pillar.example +++ b/pillar.example @@ -1,3 +1,6 @@ +# -*- coding: utf-8 -*- +# vim: ft=yaml +--- apt: # Set the right keyring for the distro (ie ubuntu-keyring or ...) keyring_package: debian-archive-keyring diff --git a/pre-commit_semantic-release.sh b/pre-commit_semantic-release.sh new file mode 100755 index 0000000..9d34d74 --- /dev/null +++ b/pre-commit_semantic-release.sh @@ -0,0 +1,30 @@ +#!/bin/sh + +############################################################################### +# (A) Update `FORMULA` with `${nextRelease.version}` +############################################################################### +sed -i -e "s_^\(version:\).*_\1 ${1}_" FORMULA + + +############################################################################### +# (B) Use `m2r` to convert automatically produced `.md` docs to `.rst` +############################################################################### + +# Install `m2r` +sudo -H pip install m2r + +# Copy and then convert the `.md` docs +cp *.md docs/ +cd docs/ +m2r --overwrite *.md + +# Change excess `H1` headings to `H2` in converted `CHANGELOG.rst` +sed -i -e '/^=.*$/s/=/-/g' CHANGELOG.rst +sed -i -e '1,4s/-/=/g' CHANGELOG.rst + +# Use for debugging output, when required +# cat AUTHORS.rst +# cat CHANGELOG.rst + +# Return back to the main directory +cd .. diff --git a/release-rules.js b/release-rules.js new file mode 100644 index 0000000..c63c850 --- /dev/null +++ b/release-rules.js @@ -0,0 +1,18 @@ +// No release is triggered for the types commented out below. +// Commits using these types will be incorporated into the next release. +// +// NOTE: Any changes here must be reflected in `CONTRIBUTING.md`. +module.exports = [ + {breaking: true, release: 'major'}, + // {type: 'build', release: 'patch'}, + // {type: 'chore', release: 'patch'}, + // {type: 'ci', release: 'patch'}, + {type: 'docs', release: 'patch'}, + {type: 'feat', release: 'minor'}, + {type: 'fix', release: 'patch'}, + {type: 'perf', release: 'patch'}, + {type: 'refactor', release: 'patch'}, + {type: 'revert', release: 'patch'}, + {type: 'style', release: 'patch'}, + {type: 'test', release: 'patch'}, +]; diff --git a/release.config.js b/release.config.js new file mode 100644 index 0000000..afa0cb1 --- /dev/null +++ b/release.config.js @@ -0,0 +1,106 @@ +module.exports = { + branch: 'master', + plugins: [ + ['@semantic-release/commit-analyzer', { + preset: 'angular', + releaseRules: './release-rules.js', + }], + '@semantic-release/release-notes-generator', + ['@semantic-release/changelog', { + changelogFile: 'CHANGELOG.md', + changelogTitle: '# Changelog', + }], + ['@semantic-release/exec', { + prepareCmd: 'sh ./pre-commit_semantic-release.sh ${nextRelease.version}', + }], + ['@semantic-release/git', { + assets: ['*.md', 'docs/*.rst', 'FORMULA'], + }], + '@semantic-release/github', + ], + generateNotes: { + preset: 'angular', + writerOpts: { + // Required due to upstream bug preventing all types being displayed. + // Bug: https://github.com/conventional-changelog/conventional-changelog/issues/317 + // Fix: https://github.com/conventional-changelog/conventional-changelog/pull/410 + transform: (commit, context) => { + const issues = [] + + commit.notes.forEach(note => { + note.title = `BREAKING CHANGES` + }) + + // NOTE: Any changes here must be reflected in `CONTRIBUTING.md`. + if (commit.type === `feat`) { + commit.type = `Features` + } else if (commit.type === `fix`) { + commit.type = `Bug Fixes` + } else if (commit.type === `perf`) { + commit.type = `Performance Improvements` + } else if (commit.type === `revert`) { + commit.type = `Reverts` + } else if (commit.type === `docs`) { + commit.type = `Documentation` + } else if (commit.type === `style`) { + commit.type = `Styles` + } else if (commit.type === `refactor`) { + commit.type = `Code Refactoring` + } else if (commit.type === `test`) { + commit.type = `Tests` + } else if (commit.type === `build`) { + commit.type = `Build System` + // } else if (commit.type === `chore`) { + // commit.type = `Maintenance` + } else if (commit.type === `ci`) { + commit.type = `Continuous Integration` + } else { + return + } + + if (commit.scope === `*`) { + commit.scope = `` + } + + if (typeof commit.hash === `string`) { + commit.hash = commit.hash.substring(0, 7) + } + + if (typeof commit.subject === `string`) { + let url = context.repository + ? `${context.host}/${context.owner}/${context.repository}` + : context.repoUrl + if (url) { + url = `${url}/issues/` + // Issue URLs. + commit.subject = commit.subject.replace(/#([0-9]+)/g, (_, issue) => { + issues.push(issue) + return `[#${issue}](${url}${issue})` + }) + } + if (context.host) { + // User URLs. + commit.subject = commit.subject.replace(/\B@([a-z0-9](?:-?[a-z0-9/]){0,38})/g, (_, username) => { + if (username.includes('/')) { + return `@${username}` + } + + return `[@${username}](${context.host}/${username})` + }) + } + } + + // remove references that already appear in the subject + commit.references = commit.references.filter(reference => { + if (issues.indexOf(reference.issue) === -1) { + return true + } + + return false + }) + + return commit + }, + }, + }, +}; diff --git a/test/integration/preferences/serverspec/preferences_spec.rb b/test/integration/preferences/controls/preferences_spec.rb similarity index 80% rename from test/integration/preferences/serverspec/preferences_spec.rb rename to test/integration/preferences/controls/preferences_spec.rb index 2c8667b..148cd1f 100644 --- a/test/integration/preferences/serverspec/preferences_spec.rb +++ b/test/integration/preferences/controls/preferences_spec.rb @@ -1,48 +1,47 @@ -require_relative '../../../kitchen/data/spec_helper' - -describe 'apt.preferences' do +control 'Apt preferences' do + title 'should be configured' describe file('/etc/apt/preferences') do - it { should_not exist } + it { should exist } + its(:size) { should eq 0 } end describe file('/etc/apt/preferences.d') do it { should be_directory } - it { should be_mode 755 } it { should be_owned_by 'root' } it { should be_grouped_into 'root' } + its('mode') { should cmp '0755' } end describe file('/etc/apt/preferences.d/00-rspamd') do it { should exist } - it { should be_mode 644 } it { should be_owned_by 'root' } it { should be_grouped_into 'root' } + its('mode') { should cmp '0644' } its(:content) { should match("Package: rspamd\nPin: origin rspamd.com\nPin-Priority: 650\n") } end describe file('/etc/apt/preferences.d/01-all') do it { should exist } - it { should be_mode 644 } it { should be_owned_by 'root' } it { should be_grouped_into 'root' } + its('mode') { should cmp '0644' } its(:content) { should match("Package: *\nPin: release stable\nPin-Priority: 610\n") } end describe file('/etc/apt/preferences.d/02-all') do it { should exist } - it { should be_mode 644 } it { should be_owned_by 'root' } it { should be_grouped_into 'root' } + its('mode') { should cmp '0644' } its(:content) { should match("Package: *\nPin: release testing\nPin-Priority: 600\n") } end describe file('/etc/apt/preferences.d/03-all') do it { should exist } - it { should be_mode 644 } it { should be_owned_by 'root' } it { should be_grouped_into 'root' } + its('mode') { should cmp '0644' } its(:content) { should match("Package: *\nPin: release unstable\nPin-Priority: 50\n") } end - end diff --git a/test/integration/preferences/inspec.yml b/test/integration/preferences/inspec.yml new file mode 100644 index 0000000..a32e354 --- /dev/null +++ b/test/integration/preferences/inspec.yml @@ -0,0 +1,8 @@ +name: preferences +title: Apt Formula +maintainer: Saltstack-formulas org +license: Apache-2.0 +summary: Verify that the apt preferences are configured correctly +supports: + - os-name: debian + - os-name: ubuntu diff --git a/test/integration/repositories/controls/repositories_spec.rb b/test/integration/repositories/controls/repositories_spec.rb new file mode 100644 index 0000000..3031d22 --- /dev/null +++ b/test/integration/repositories/controls/repositories_spec.rb @@ -0,0 +1,41 @@ +control 'Apt repositories' do + title 'should be configured' + + if os[:name] == 'ubuntu' + keyring_package = 'ubuntu-keyring' + else + keyring_package = 'debian-archive-keyring' + end + + describe package(keyring_package) do + it { should be_installed } + end + + describe file('/etc/apt/sources.list') do + it { should exist } + its(:size) { should eq 0 } + end + + describe file('/etc/apt/sources.list.d') do + it { should be_directory } + it { should be_owned_by 'root' } + it { should be_grouped_into 'root' } + its('mode') { should cmp '0755' } + end + + describe file('/etc/apt/sources.list.d/spotify-binary.list') do + it { should exist } + it { should be_owned_by 'root' } + it { should be_grouped_into 'root' } + its('mode') { should cmp '0644' } + its(:content) { should match(%r{deb \[arch=amd64\] http://repository.spotify.com stable non-free}) } + end + + describe file('/etc/apt/sources.list.d/heroku-binary.list') do + it { should exist } + it { should be_owned_by 'root' } + it { should be_grouped_into 'root' } + its('mode') { should cmp '0644' } + its(:content) { should match(%r{deb \[arch=amd64\] https://cli-assets.heroku.com/apt ./}) } + end +end diff --git a/test/integration/repositories/inspec.yml b/test/integration/repositories/inspec.yml new file mode 100644 index 0000000..7fa5acb --- /dev/null +++ b/test/integration/repositories/inspec.yml @@ -0,0 +1,8 @@ +name: repositories +title: Apt Formula +maintainer: Saltstack-formulas org +license: Apache-2.0 +summary: Verify that the apt repositories are configured correctly +supports: + - os-name: debian + - os-name: ubuntu diff --git a/test/integration/repositories/serverspec/repositories_spec.rb b/test/integration/repositories/serverspec/repositories_spec.rb deleted file mode 100644 index 5a19b55..0000000 --- a/test/integration/repositories/serverspec/repositories_spec.rb +++ /dev/null @@ -1,36 +0,0 @@ -require_relative '../../../kitchen/data/spec_helper' - -describe 'apt.repositories' do - - describe package('debian-archive-keyring') do - it { should be_installed } - end - - describe file('/etc/apt/sources.list') do - it { should exist } - its(:size) { should eq 0 } - end - - describe file('/etc/apt/sources.list.d') do - it { should be_directory } - it { should be_mode 755 } - it { should be_owned_by 'root' } - it { should be_grouped_into 'root' } - end - - describe file('/etc/apt/sources.list.d/debian-jessie-source.list') do - it { should exist } - it { should be_mode 644 } - it { should be_owned_by 'root' } - it { should be_grouped_into 'root' } - its(:content) { should match('deb-src http://httpredir.debian.org/debian jessie contrib non-free main') } - end - - describe file('/etc/apt/sources.list.d/dropbox-binary.list') do - it { should exist } - it { should be_mode 644 } - it { should be_owned_by 'root' } - it { should be_grouped_into 'root' } - its(:content) { should match(%r{deb \[arch=i386,amd64\] http://linux.dropbox.com/debian jessie main}) } - end -end diff --git a/test/salt/pillar/preferences.pillar.sls b/test/salt/pillar/preferences.pillar.sls new file mode 100644 index 0000000..f207765 --- /dev/null +++ b/test/salt/pillar/preferences.pillar.sls @@ -0,0 +1,18 @@ +apt: + remove_preferences: true + clean_preferences_d: true + + preferences: + 00-rspamd: + package: rspamd + pin: origin rspamd.com + priority: 650 + 01-all: + pin: release stable + priority: 610 + 02-all: + pin: release testing + priority: 600 + 03-all: + pin: release unstable + priority: 50 diff --git a/test/salt/pillar/repositories.pillar.sls b/test/salt/pillar/repositories.pillar.sls new file mode 100644 index 0000000..142b878 --- /dev/null +++ b/test/salt/pillar/repositories.pillar.sls @@ -0,0 +1,19 @@ +apt: + remove_sources_list: true + clean_sources_list_d: true + + repositories: + spotify: + distro: stable + url: http://repository.spotify.com + arch: [amd64] + comps: [non-free] + keyid: 931FF8E79F0876134EDDBDCCA87FF9DF48BF1C90 + keyserver: keyserver.ubuntu.com + heroku: + distro: ./ + url: https://cli-assets.heroku.com/apt + arch: [amd64] + comps: [] + key_url: https://cli-assets.heroku.com/apt/release.key + diff --git a/test/shared/spec_helper.rb b/test/shared/spec_helper.rb deleted file mode 100644 index d62fc6d..0000000 --- a/test/shared/spec_helper.rb +++ /dev/null @@ -1,9 +0,0 @@ -require "serverspec" -require "pathname" - -# Set backend type -set :backend, :exec - -RSpec.configure do |c| - c.path = "/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" -end