local PythonVersion(pyversion='3.9') = { name: 'python' + std.strReplace(pyversion, '.', '') + '-pytest', image: 'python:' + pyversion, environment: { PY_COLORS: 1, }, commands: [ 'pip install poetry poetry-dynamic-versioning -qq', 'poetry config experimental.new-installer false', 'poetry install -E ansible-core', 'poetry run pytest', 'poetry version', 'poetry run ansible-later --help', ], depends_on: [ 'fetch', ], }; local PipelineLint = { kind: 'pipeline', name: 'lint', platform: { os: 'linux', arch: 'amd64', }, steps: [ { name: 'yapf', image: 'python:3.11', environment: { PY_COLORS: 1, }, commands: [ 'git fetch -tq', 'pip install poetry poetry-dynamic-versioning -qq', 'poetry config experimental.new-installer false', 'poetry install', 'poetry run yapf -dr ./ansiblelater', ], }, { name: 'flake8', image: 'python:3.11', environment: { PY_COLORS: 1, }, commands: [ 'git fetch -tq', 'pip install poetry poetry-dynamic-versioning -qq', 'poetry install -E ansible-core', 'poetry run flake8 ./ansiblelater', ], }, ], trigger: { ref: ['refs/heads/main', 'refs/tags/**', 'refs/pull/**'], }, }; local PipelineTest = { kind: 'pipeline', name: 'test', platform: { os: 'linux', arch: 'amd64', }, steps: [ { name: 'fetch', image: 'python:3.11', commands: [ 'git fetch -tq', ], }, PythonVersion(pyversion='3.9'), PythonVersion(pyversion='3.10'), PythonVersion(pyversion='3.11'), { name: 'codecov', image: 'python:3.11', environment: { PY_COLORS: 1, CODECOV_TOKEN: { from_secret: 'codecov_token' }, }, commands: [ 'pip install codecov -qq', 'codecov --required -X gcov', ], depends_on: [ 'python39-pytest', 'python310-pytest', 'python311-pytest', ], }, ], depends_on: [ 'lint', ], trigger: { ref: ['refs/heads/main', 'refs/tags/**', 'refs/pull/**'], }, }; local PipelineSecurity = { kind: 'pipeline', name: 'security', platform: { os: 'linux', arch: 'amd64', }, steps: [ { name: 'bandit', image: 'python:3.11', environment: { PY_COLORS: 1, }, commands: [ 'git fetch -tq', 'pip install poetry poetry-dynamic-versioning -qq', 'poetry install -E ansible-core', 'poetry run bandit -r ./ansiblelater -x ./ansiblelater/test', ], }, ], depends_on: [ 'test', ], trigger: { ref: ['refs/heads/main', 'refs/tags/**', 'refs/pull/**'], }, }; local PipelineBuildPackage = { kind: 'pipeline', name: 'build-package', platform: { os: 'linux', arch: 'amd64', }, steps: [ { name: 'build', image: 'python:3.11', commands: [ 'git fetch -tq', 'pip install poetry poetry-dynamic-versioning -qq', 'poetry build', ], }, { name: 'checksum', image: 'alpine', commands: [ 'cd dist/ && sha256sum * > ../sha256sum.txt', ], }, { name: 'changelog-generate', image: 'thegeeklab/git-chglog', commands: [ 'git fetch -tq', 'git-chglog --no-color --no-emoji -o CHANGELOG.md ${DRONE_TAG:---next-tag unreleased unreleased}', ], }, { name: 'changelog-format', image: 'thegeeklab/alpine-tools', commands: [ 'prettier CHANGELOG.md', 'prettier -w CHANGELOG.md', ], }, { name: 'publish-github', image: 'plugins/github-release', settings: { overwrite: true, api_key: { from_secret: 'github_token' }, files: ['dist/*', 'sha256sum.txt'], title: '${DRONE_TAG}', note: 'CHANGELOG.md', }, when: { ref: ['refs/tags/**'], }, }, { name: 'publish-pypi', image: 'python:3.11', commands: [ 'git fetch -tq', 'pip install poetry poetry-dynamic-versioning -qq', 'poetry publish -n', ], environment: { POETRY_HTTP_BASIC_PYPI_USERNAME: { from_secret: 'pypi_username' }, POETRY_HTTP_BASIC_PYPI_PASSWORD: { from_secret: 'pypi_password' }, }, when: { ref: ['refs/tags/**'], }, }, ], depends_on: [ 'security', ], trigger: { ref: ['refs/heads/main', 'refs/tags/**', 'refs/pull/**'], }, }; local PipelineBuildContainer = { kind: 'pipeline', name: 'build-container', platform: { os: 'linux', arch: 'amd64', }, steps: [ { name: 'build', image: 'python:3.11', commands: [ 'git fetch -tq', 'pip install poetry poetry-dynamic-versioning -qq', 'poetry build', ], }, { name: 'dryrun', image: 'thegeeklab/drone-docker-buildx:23', settings: { dry_run: true, dockerfile: 'Dockerfile.multiarch', repo: 'thegeeklab/${DRONE_REPO_NAME}', platforms: [ 'linux/amd64', 'linux/arm64', ], provenance: false, }, depends_on: ['build'], when: { ref: ['refs/pull/**'], }, }, { name: 'publish-dockerhub', image: 'thegeeklab/drone-docker-buildx:23', settings: { auto_tag: true, dockerfile: 'Dockerfile.multiarch', repo: 'thegeeklab/${DRONE_REPO_NAME}', username: { from_secret: 'docker_username' }, password: { from_secret: 'docker_password' }, platforms: [ 'linux/amd64', 'linux/arm64', ], provenance: false, }, when: { ref: ['refs/heads/main', 'refs/tags/**'], }, depends_on: ['dryrun'], }, { name: 'publish-quay', image: 'thegeeklab/drone-docker-buildx:23', settings: { auto_tag: true, dockerfile: 'Dockerfile.multiarch', registry: 'quay.io', repo: 'quay.io/thegeeklab/${DRONE_REPO_NAME}', username: { from_secret: 'quay_username' }, password: { from_secret: 'quay_password' }, platforms: [ 'linux/amd64', 'linux/arm64', ], provenance: false, }, when: { ref: ['refs/heads/main', 'refs/tags/**'], }, depends_on: ['dryrun'], }, ], depends_on: [ 'security', ], trigger: { ref: ['refs/heads/main', 'refs/tags/**', 'refs/pull/**'], }, }; local PipelineDocs = { kind: 'pipeline', name: 'docs', platform: { os: 'linux', arch: 'amd64', }, concurrency: { limit: 1, }, steps: [ { name: 'assets', image: 'thegeeklab/alpine-tools', commands: [ 'make doc', ], }, { name: 'markdownlint', image: 'thegeeklab/markdownlint-cli', commands: [ "markdownlint 'docs/content/**/*.md' 'README.md' 'CONTRIBUTING.md'", ], }, { name: 'spellcheck', image: 'thegeeklab/alpine-tools', commands: [ "spellchecker --files 'docs/content/**/*.md' 'README.md' -d .dictionary -p spell indefinite-article syntax-urls --no-suggestions", ], environment: { FORCE_COLOR: true, NPM_CONFIG_LOGLEVEL: 'error', }, }, { name: 'testbuild', image: 'thegeeklab/hugo:0.105.0', commands: [ 'hugo --panicOnWarning -s docs/ -b http://localhost:8000/', ], }, { name: 'link-validation', image: 'thegeeklab/link-validator', commands: [ 'link-validator --color=always --rate-limit 10', ], environment: { LINK_VALIDATOR_BASE_DIR: 'docs/public', LINK_VALIDATOR_RETRIES: '3', }, }, { name: 'build', image: 'thegeeklab/hugo:0.105.0', commands: [ 'hugo --panicOnWarning -s docs/', ], }, { name: 'beautify', image: 'thegeeklab/alpine-tools', commands: [ "html-beautify -r -f 'docs/public/**/*.html'", ], environment: { FORCE_COLOR: true, NPM_CONFIG_LOGLEVEL: 'error', }, }, { name: 'publish', image: 'thegeeklab/drone-s3-sync', settings: { access_key: { from_secret: 's3_access_key' }, bucket: 'geekdocs', delete: true, endpoint: 'https://sp.rknet.org', path_style: true, secret_key: { from_secret: 's3_secret_access_key' }, source: 'docs/public/', strip_prefix: 'docs/public/', target: '/${DRONE_REPO_NAME}', }, when: { ref: ['refs/heads/main', 'refs/tags/**'], }, }, ], depends_on: [ 'build-package', 'build-container', ], trigger: { ref: ['refs/heads/main', 'refs/tags/**', 'refs/pull/**'], }, }; local PipelineNotifications = { kind: 'pipeline', name: 'notifications', platform: { os: 'linux', arch: 'amd64', }, steps: [ { name: 'pushrm-dockerhub', image: 'chko/docker-pushrm:1', environment: { DOCKER_PASS: { from_secret: 'docker_password', }, DOCKER_USER: { from_secret: 'docker_username', }, PUSHRM_FILE: 'README.md', PUSHRM_SHORT: 'Another best practice scanner for Ansible roles and playbooks', PUSHRM_TARGET: 'thegeeklab/${DRONE_REPO_NAME}', }, when: { status: ['success'], }, }, { name: 'pushrm-quay', image: 'chko/docker-pushrm:1', environment: { APIKEY__QUAY_IO: { from_secret: 'quay_token', }, PUSHRM_FILE: 'README.md', PUSHRM_TARGET: 'quay.io/thegeeklab/${DRONE_REPO_NAME}', }, when: { status: ['success'], }, }, { name: 'matrix', image: 'thegeeklab/drone-matrix', settings: { homeserver: { from_secret: 'matrix_homeserver' }, roomid: { from_secret: 'matrix_roomid' }, template: 'Status: **{{ .Build.Status }}**
Build: [{{ .Repo.Owner }}/{{ .Repo.Name }}]({{ .Build.Link }}){{ if .Build.Branch }} ({{ .Build.Branch }}){{ end }} by {{ .Commit.Author }}
Message: {{ .Commit.Message.Title }}', username: { from_secret: 'matrix_username' }, password: { from_secret: 'matrix_password' }, }, when: { status: ['success', 'failure'], }, }, ], depends_on: [ 'docs', ], trigger: { ref: ['refs/heads/main', 'refs/tags/**'], status: ['success', 'failure'], }, }; [ PipelineLint, PipelineTest, PipelineSecurity, PipelineBuildPackage, PipelineBuildContainer, PipelineDocs, PipelineNotifications, ]