From 9b1dc4599e026202c75c4dc4d843fbce221feaa6 Mon Sep 17 00:00:00 2001 From: Uros Bajzelj Date: Thu, 20 Jan 2022 10:46:33 +0100 Subject: [PATCH] Update the GHA workflow (#50) --- .github/actions/setup-environment/action.yml | 36 ----- .github/workflows/ci.yml | 154 +++++++++++++------ 2 files changed, 105 insertions(+), 85 deletions(-) delete mode 100644 .github/actions/setup-environment/action.yml diff --git a/.github/actions/setup-environment/action.yml b/.github/actions/setup-environment/action.yml deleted file mode 100644 index a82be3f..0000000 --- a/.github/actions/setup-environment/action.yml +++ /dev/null @@ -1,36 +0,0 @@ ---- -name: "Setup the environment" -description: "This action setup the Poetry environment and load virtual environment from a cache if the cache exists." -runs: - # Using the composite action type - using: "composite" - steps: - - name: "Set up Python" - uses: "actions/setup-python@v2" - with: - python-version: "3.9" - - name: "Log: Install Poetry" - run: "echo Installing Poetry" - shell: "bash" - - name: "Install Poetry" - run: "pip install poetry" - shell: "bash" - - name: "Log: Check cache" - run: "echo Check if the cache exists" - shell: "bash" - - name: "Cache" - uses: "actions/cache@v2" - id: "cached-poetry" - with: - path: "~/.cache/pypoetry/virtualenvs/" - # The same environment is loaded until the "poetry.lock" is changed - key: "{{ runner.os }}-poetry-${{ hashFiles('./poetry.lock') }}" - - name: "Log: The cache status" - run: "if [ '${{ steps.cached-poetry.outputs.cache-hit }}' != 'true' ]; then echo 'The cache not found, installing environment using Poetry'; else echo 'The cache found, environment loaded.'; fi" - shell: "bash" - - name: "Install environment" - shell: "bash" - run: "if [ '${{ steps.cached-poetry.outputs.cache-hit }}' != 'true' ]; then poetry install; fi" - - name: "Copy creds.example.env to creds.env" - shell: "bash" - run: "cp development/creds.example.env development/creds.env" diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 69abf71..45c4166 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -1,129 +1,151 @@ --- name: "CI" -on: +on: # yamllint disable-line rule:truthy rule:comments - "push" - "pull_request" -# Enable jobs as needed +env: + PLUGIN_NAME: "nautobot-ssot-infoblox" + jobs: black: runs-on: "ubuntu-20.04" env: - INVOKE_NAUTOBOT_CHATOPS_LOCAL: "True" + INVOKE_NAUTOBOT_SSOT_INFOBLOX_LOCAL: "True" steps: - name: "Check out repository code" uses: "actions/checkout@v2" - name: "Setup environment" - uses: "./.github/actions/setup-environment" + uses: "networktocode/gh-action-setup-poetry-environment@v2" - name: "Linting: black" run: "poetry run invoke black" bandit: runs-on: "ubuntu-20.04" env: - INVOKE_NAUTOBOT_CHATOPS_LOCAL: "True" + INVOKE_NAUTOBOT_SSOT_INFOBLOX_LOCAL: "True" steps: - name: "Check out repository code" uses: "actions/checkout@v2" - name: "Setup environment" - uses: "./.github/actions/setup-environment" + uses: "networktocode/gh-action-setup-poetry-environment@v2" - name: "Linting: bandit" run: "poetry run invoke bandit" - needs: - - "black" pydocstyle: runs-on: "ubuntu-20.04" env: - INVOKE_NAUTOBOT_CHATOPS_LOCAL: "True" + INVOKE_NAUTOBOT_SSOT_INFOBLOX_LOCAL: "True" steps: - name: "Check out repository code" uses: "actions/checkout@v2" - name: "Setup environment" - uses: "./.github/actions/setup-environment" + uses: "networktocode/gh-action-setup-poetry-environment@v2" - name: "Linting: pydocstyle" run: "poetry run invoke pydocstyle" - needs: - - "black" flake8: runs-on: "ubuntu-20.04" env: - INVOKE_NAUTOBOT_CHATOPS_LOCAL: "True" + INVOKE_NAUTOBOT_SSOT_INFOBLOX_LOCAL: "True" steps: - name: "Check out repository code" uses: "actions/checkout@v2" - name: "Setup environment" - uses: "./.github/actions/setup-environment" + uses: "networktocode/gh-action-setup-poetry-environment@v2" - name: "Linting: flake8" run: "poetry run invoke flake8" - needs: - - "black" yamllint: runs-on: "ubuntu-20.04" env: - INVOKE_NAUTOBOT_CHATOPS_LOCAL: "True" + INVOKE_NAUTOBOT_SSOT_INFOBLOX_LOCAL: "True" steps: - name: "Check out repository code" uses: "actions/checkout@v2" - name: "Setup environment" - uses: "./.github/actions/setup-environment" + uses: "networktocode/gh-action-setup-poetry-environment@v2" - name: "Linting: yamllint" run: "poetry run invoke yamllint" - needs: - - "black" - build: - runs-on: "ubuntu-20.04" - steps: - - name: "Check out repository code" - uses: "actions/checkout@v2" - - name: "Setup environment" - uses: "./.github/actions/setup-environment" - - name: "Copy credentials" - run: "cp development/creds.example.env development/creds.env" - - name: "Build a container" - run: "poetry run invoke build" + pylint: needs: - "bandit" - "pydocstyle" - "flake8" - "yamllint" - pylint: + - "black" runs-on: "ubuntu-20.04" + strategy: + fail-fast: true + matrix: + python-version: ["3.7"] + nautobot-version: ["1.2.4"] + env: + INVOKE_NAUTOBOT_SSOT_INFOBLOX_PYTHON_VER: "${{ matrix.python-version }}" + INVOKE_NAUTOBOT_SSOT_INFOBLOX_NAUTOBOT_VER: "${{ matrix.nautobot-version }}" steps: - name: "Check out repository code" uses: "actions/checkout@v2" - name: "Setup environment" - uses: "./.github/actions/setup-environment" + uses: "networktocode/gh-action-setup-poetry-environment@v2" + - name: "Set up Docker Buildx" + id: "buildx" + uses: "docker/setup-buildx-action@v1" + - name: "Build" + uses: "docker/build-push-action@v2" + with: + builder: "${{ steps.buildx.outputs.name }}" + context: "./" + push: false + load: true + tags: "${{ env.PLUGIN_NAME }}/nautobot:${{ matrix.nautobot-version }}-py${{ matrix.python-version }}" + file: "./development/Dockerfile" + cache-from: "type=gha,scope=${{ matrix.nautobot-version }}-py${{ matrix.python-version }}" + cache-to: "type=gha,scope=${{ matrix.nautobot-version }}-py${{ matrix.python-version }}" + build-args: | + NAUTOBOT_VER=${{ matrix.nautobot-version }} + PYTHON_VER=${{ matrix.python-version }} - name: "Copy credentials" run: "cp development/creds.example.env development/creds.env" - - name: "Build a container" - run: "poetry run invoke build" - - name: "Linting: Pylint" + - name: "Linting: pylint" run: "poetry run invoke pylint" - needs: - - "build" unittest: + needs: + - "pylint" strategy: fail-fast: true - # If unittests need to run with any other variable put - # the variable as a list under the `matrix` matrix: - python-version: ["3.6", "3.7", "3.8", "3.9"] + python-version: ["3.7", "3.8", "3.9"] + nautobot-version: ["1.1.6", "1.2.4"] runs-on: "ubuntu-20.04" env: - INVOKE_NAUTOBOT_CHATOPS_PYTHON_VER: "${{ matrix.python-version }}" + INVOKE_NAUTOBOT_SSOT_INFOBLOX_PYTHON_VER: "${{ matrix.python-version }}" + INVOKE_NAUTOBOT_SSOT_INFOBLOX_NAUTOBOT_VER: "${{ matrix.nautobot-version }}" steps: - name: "Check out repository code" uses: "actions/checkout@v2" - name: "Setup environment" - uses: "./.github/actions/setup-environment" + uses: "networktocode/gh-action-setup-poetry-environment@v2" + - name: "Set up Docker Buildx" + id: "buildx" + uses: "docker/setup-buildx-action@v1" + - name: "Build" + uses: "docker/build-push-action@v2" + with: + builder: "${{ steps.buildx.outputs.name }}" + context: "./" + push: false + load: true + tags: "${{ env.PLUGIN_NAME }}/nautobot:${{ matrix.nautobot-version }}-py${{ matrix.python-version }}" + file: "./development/Dockerfile" + cache-from: "type=gha,scope=${{ matrix.nautobot-version }}-py${{ matrix.python-version }}" + cache-to: "type=gha,scope=${{ matrix.nautobot-version }}-py${{ matrix.python-version }}" + build-args: | + NAUTOBOT_VER=${{ matrix.nautobot-version }} + PYTHON_VER=${{ matrix.python-version }} - name: "Copy credentials" run: "cp development/creds.example.env development/creds.env" - - name: "Build a container" - run: "poetry run invoke build" - name: "Run Tests" run: "poetry run invoke unittest" - needs: - - "pylint" publish_gh: + needs: + - "unittest" name: "Publish to GitHub" runs-on: "ubuntu-20.04" if: "startsWith(github.ref, 'refs/tags/v')" @@ -150,9 +172,9 @@ jobs: tag: "${{ github.ref }}" overwrite: true file_glob: true + publish_pypi: needs: - "unittest" - publish_pypi: name: "Push Package to PyPI" runs-on: "ubuntu-20.04" if: "startsWith(github.ref, 'refs/tags/v')" @@ -176,5 +198,39 @@ jobs: with: user: "__token__" password: "${{ secrets.PYPI_API_TOKEN }}" + slack-notify: needs: - - "unittest" + - "publish_gh" + - "publish_pypi" + name: "Send notification to the Slack" + runs-on: "ubuntu-20.04" + env: + SLACK_WEBHOOK_URL: "${{ secrets.SLACK_WEBHOOK_URL }}" + SLACK_MESSAGE: >- + *NOTIFICATION: NEW-RELEASE-PUBLISHED*\n + Repository: <${{ github.server_url }}/${{ github.repository }}|${{ github.repository }}>\n + Release: <${{ github.server_url }}/${{ github.repository }}/releases/tag/${{ github.ref_name }}|${{ github.ref_name }}>\n + Published by: <${{ github.server_url }}/${{ github.actor }}|${{ github.actor }}> + steps: + - name: "Send a notification to Slack" + # ENVs cannot be used directly in job.if. This is a workaround to check + # if SLACK_WEBHOOK_URL is present. + if: "${{ env.SLACK_WEBHOOK_URL != '' }}" + uses: "slackapi/slack-github-action@v1.17.0" + with: + payload: | + { + "text": "${{ env.SLACK_MESSAGE }}", + "blocks": [ + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "${{ env.SLACK_MESSAGE }}" + } + } + ] + } + env: + SLACK_WEBHOOK_URL: "${{ secrets.SLACK_WEBHOOK_URL }}" + SLACK_WEBHOOK_TYPE: "INCOMING_WEBHOOK"