Repository: nautobot/nautobot-app-golden-config (language: python)

Issue:
CI fix
Fixes #317 


Discussion / hints:

Fix patch:
diff --git a/development/Dockerfile b/development/Dockerfile
index bd12cf41..3620f83d 100644
--- a/development/Dockerfile
+++ b/development/Dockerfile
@@ -1,44 +1,73 @@
+# -------------------------------------------------------------------------------------
+# Nautobot Plugin Development Dockerfile Template
+# Version: 0.0.1
+#
+# Plugins that need to add additional steps or packages can do in the section below.
+# -------------------------------------------------------------------------------------
+# !!! USE CAUTION WHEN MODIFYING LINES BELOW
+
+# Accepts a desired Nautobot version as build argument, default to 1.4.0
 ARG NAUTOBOT_VER="1.4.0"
-ARG PYTHON_VER=3.7
 
-FROM ghcr.io/nautobot/nautobot-dev:${NAUTOBOT_VER}-py${PYTHON_VER}
+# Accepts a desired Python version as build argument, default to 3.7
+ARG PYTHON_VER="3.7"
 
-# Make the value available after the FROM directive
-ARG NAUTOBOT_VER
-ENV prometheus_multiproc_dir=/prom_cache
+# Retrieve published development image of Nautobot base which should include most CI dependencies
+FROM ghcr.io/nautobot/nautobot-dev:${NAUTOBOT_VER}-py${PYTHON_VER}
 
+# Runtime argument and environment setup
 ARG NAUTOBOT_ROOT=/opt/nautobot
 
+ENV prometheus_multiproc_dir=/prom_cache
 ENV NAUTOBOT_ROOT ${NAUTOBOT_ROOT}
 
-WORKDIR $NAUTOBOT_ROOT
-
-# Configure poetry
+# Don't need virtual environments in container, parallelized installer has inconsistent behavior
 RUN poetry config virtualenvs.create false \
     && poetry config installer.parallel false
 
+# !!! USE CAUTION WHEN MODIFYING LINES ABOVE
 # -------------------------------------------------------------------------------------
-# Install Nautobot Plugin
+# Plugin-specific system build/test dependencies.
+# 
+# Example: LDAP requires `libldap2-dev` to be apt-installed before the Python package.
 # -------------------------------------------------------------------------------------
-WORKDIR /tmp/install
+# --> Start safe to modify section
 
-# Copy in only pyproject.toml/poetry.lock to help with caching this layer if no updates to dependencies
-COPY poetry.lock pyproject.toml /tmp/install/
+# Uncomment the line below if you are apt-installing any package.
+# RUN apt update
+# RUN apt install libldap2-dev
 
-# Add the requested Nautobot version to pyproject
-# to install the correct version based on the NAUTOBOT_VER argument
-# Otherwise Poetry will override the version in this container
-# with the one in the poetry.lock
-RUN poetry add nautobot=${NAUTOBOT_VER}
-
-# --no-root declares not to install the project package since we're wanting to take advantage of caching dependency installation
-# and the project is copied in and installed after this step
-RUN poetry install --no-interaction --no-ansi --no-root
+# --> Stop safe to modify section
+# -------------------------------------------------------------------------------------
+# Install Nautobot Plugin
+# -------------------------------------------------------------------------------------
+# !!! USE CAUTION WHEN MODIFYING LINES BELOW
 
-# Copy in the rest of the source code and install local Nautobot plugin
+# Copy in the source code
 WORKDIR /source
 COPY . /source
-RUN cp /tmp/install/* /source/
-RUN poetry install --no-interaction --no-ansi
+
+# Get container's installed Nautobot version as a forced constraint
+# NAUTOBOT_VER may be a branch name and not a published release therefor we need to get the installed version
+#  so pip can use it to recognize local constraints.
+RUN pip show nautobot | grep "^Version: " | sed -e 's/Version: /nautobot==/' > constraints.txt
+
+# Use Poetry to grab dev dependencies from the lock file
+# Can be improved in Poetry 1.2 which allows `poetry install --only dev`
+#
+# We can't use the entire freeze as it takes forever to resolve with rigidly fixed non-direct dependencies,
+#   especially those that are only direct to Nautobot but the container included versions slightly mismatch
+RUN poetry export -f requirements.txt --without-hashes --output poetry_freeze_base.txt
+RUN poetry export -f requirements.txt --dev --without-hashes --output poetry_freeze_all.txt
+RUN sort poetry_freeze_base.txt poetry_freeze_all.txt | uniq -u > poetry_freeze_dev.txt
+
+# Install all local project as editable, constrained on Nautobot version, to get any additional
+#   direct dependencies of the plugin
+RUN pip install -c constraints.txt -e .
+
+# Install any dev dependencies frozen from Poetry
+# Can be improved in Poetry 1.2 which allows `poetry install --only dev`
+RUN pip install -c constraints.txt -r poetry_freeze_dev.txt
 
 COPY development/nautobot_config.py ${NAUTOBOT_ROOT}/nautobot_config.py
+# !!! USE CAUTION WHEN MODIFYING LINES ABOVE


Test patch:
diff --git a/.github/workflows/upstream_testing.yml b/.github/workflows/upstream_testing.yml
new file mode 100644
index 00000000..4b6c5000
--- /dev/null
+++ b/.github/workflows/upstream_testing.yml
@@ -0,0 +1,13 @@
+---
+name: "Nautobot Upstream Testing"
+
+on: # yamllint disable-line rule:truthy rule:comments
+  schedule:
+    - cron: "0 4 */2 * *"  # every other day at midnight
+
+jobs:
+  upstream-test:
+    uses: "nautobot/nautobot/.github/workflows/plugin_upstream_testing_base.yml@develop"
+    with:  # Below could potentially be collapsed into a single argument if a concrete relationship between both is enforced
+      invoke_context_name: "NAUTOBOT_GOLDEN_CONFIG"
+      plugin_name: "nautobot-golden-config"