diff --git a/.github/workflows/devel_images.yml b/.github/workflows/devel_images.yml
index dbc1a4937b..6f2bdf74c4 100644
--- a/.github/workflows/devel_images.yml
+++ b/.github/workflows/devel_images.yml
@@ -7,6 +7,7 @@ on:
branches:
- devel
- release_*
+ - feature_*
jobs:
push:
if: endsWith(github.repository, '/awx') || startsWith(github.ref, 'refs/heads/release_')
@@ -20,6 +21,12 @@ jobs:
- name: Get python version from Makefile
run: echo py_version=`make PYTHON_VERSION` >> $GITHUB_ENV
+ - name: Set lower case owner name
+ run: |
+ echo "OWNER_LC=${OWNER,,}" >>${GITHUB_ENV}
+ env:
+ OWNER: '${{ github.repository_owner }}'
+
- name: Install python ${{ env.py_version }}
uses: actions/setup-python@v2
with:
@@ -31,15 +38,18 @@ jobs:
- name: Pre-pull image to warm build cache
run: |
- docker pull ghcr.io/${{ github.repository_owner }}/awx_devel:${GITHUB_REF##*/} || :
- docker pull ghcr.io/${{ github.repository_owner }}/awx_kube_devel:${GITHUB_REF##*/} || :
+ docker pull ghcr.io/${OWNER_LC}/awx_devel:${GITHUB_REF##*/} || :
+ docker pull ghcr.io/${OWNER_LC}/awx_kube_devel:${GITHUB_REF##*/} || :
+ docker pull ghcr.io/${OWNER_LC}/awx:${GITHUB_REF##*/} || :
- name: Build images
run: |
- DEV_DOCKER_TAG_BASE=ghcr.io/${{ github.repository_owner }} COMPOSE_TAG=${GITHUB_REF##*/} make docker-compose-build
- DEV_DOCKER_TAG_BASE=ghcr.io/${{ github.repository_owner }} COMPOSE_TAG=${GITHUB_REF##*/} make awx-kube-dev-build
+ DEV_DOCKER_TAG_BASE=ghcr.io/${OWNER_LC} COMPOSE_TAG=${GITHUB_REF##*/} make docker-compose-build
+ DEV_DOCKER_TAG_BASE=ghcr.io/${OWNER_LC} COMPOSE_TAG=${GITHUB_REF##*/} make awx-kube-dev-build
+ DEV_DOCKER_TAG_BASE=ghcr.io/${OWNER_LC} COMPOSE_TAG=${GITHUB_REF##*/} make awx-kube-build
- name: Push image
run: |
- docker push ghcr.io/${{ github.repository_owner }}/awx_devel:${GITHUB_REF##*/}
- docker push ghcr.io/${{ github.repository_owner }}/awx_kube_devel:${GITHUB_REF##*/}
+ docker push ghcr.io/${OWNER_LC}/awx_devel:${GITHUB_REF##*/}
+ docker push ghcr.io/${OWNER_LC}/awx_kube_devel:${GITHUB_REF##*/}
+ docker push ghcr.io/${OWNER_LC}/awx:${GITHUB_REF##*/}
diff --git a/Makefile b/Makefile
index b677e95947..ee9251507a 100644
--- a/Makefile
+++ b/Makefile
@@ -555,10 +555,8 @@ docker-compose-build:
--cache-from=$(DEV_DOCKER_TAG_BASE)/awx_devel:$(COMPOSE_TAG) .
docker-clean:
- $(foreach container_id,$(shell docker ps -f name=tools_awx -aq && docker ps -f name=tools_receptor -aq),docker stop $(container_id); docker rm -f $(container_id);)
- if [ "$(shell docker images | grep awx_devel)" ]; then \
- docker images | grep awx_devel | awk '{print $$3}' | xargs docker rmi --force; \
- fi
+ -$(foreach container_id,$(shell docker ps -f name=tools_awx -aq && docker ps -f name=tools_receptor -aq),docker stop $(container_id); docker rm -f $(container_id);)
+ -$(foreach image_id,$(shell docker images --filter=reference='*awx_devel*' -aq),docker rmi --force $(image_id);)
docker-clean-volumes: docker-compose-clean docker-compose-container-group-clean
docker volume rm -f tools_awx_db tools_grafana_storage tools_prometheus_storage $(docker volume ls --filter name=tools_redis_socket_ -q)
@@ -592,6 +590,7 @@ VERSION:
PYTHON_VERSION:
@echo "$(PYTHON)" | sed 's:python::'
+.PHONY: Dockerfile
Dockerfile: tools/ansible/roles/dockerfile/templates/Dockerfile.j2
ansible-playbook tools/ansible/dockerfile.yml -e receptor_image=$(RECEPTOR_IMAGE)
diff --git a/awx/main/analytics/collectors.py b/awx/main/analytics/collectors.py
index 30bf730784..14d54c7ac2 100644
--- a/awx/main/analytics/collectors.py
+++ b/awx/main/analytics/collectors.py
@@ -233,7 +233,7 @@ def projects_by_scm_type(since, **kwargs):
return counts
-@register('instance_info', '1.2', description=_('Cluster topology and capacity'))
+@register('instance_info', '1.3', description=_('Cluster topology and capacity'))
def instance_info(since, include_hostnames=False, **kwargs):
info = {}
# Use same method that the TaskManager does to compute consumed capacity without querying all running jobs for each Instance
diff --git a/awx/main/conf.py b/awx/main/conf.py
index dab0543a1a..2dbf5e127e 100644
--- a/awx/main/conf.py
+++ b/awx/main/conf.py
@@ -282,6 +282,16 @@ register(
placeholder={'HTTP_PROXY': 'myproxy.local:8080'},
)
+register(
+ 'AWX_RUNNER_KEEPALIVE_SECONDS',
+ field_class=fields.IntegerField,
+ label=_('K8S Ansible Runner Keep-Alive Message Interval'),
+ help_text=_('Only applies to jobs running in a Container Group. If not 0, send a message every so-many seconds to keep connection open.'),
+ category=_('Jobs'),
+ category_slug='jobs',
+ placeholder=240, # intended to be under common 5 minute idle timeout
+)
+
register(
'GALAXY_TASK_ENV',
field_class=fields.KeyValueField,
diff --git a/awx/main/tasks/callback.py b/awx/main/tasks/callback.py
index d93e56fed5..719488caa4 100644
--- a/awx/main/tasks/callback.py
+++ b/awx/main/tasks/callback.py
@@ -85,6 +85,8 @@ class RunnerCallback:
# which generate job events from two 'streams':
# ansible-inventory and the awx.main.commands.inventory_import
# logger
+ if event_data.get('event') == 'keepalive':
+ return
if event_data.get(self.event_data_key, None):
if self.event_data_key != 'job_id':
diff --git a/awx/main/tasks/receptor.py b/awx/main/tasks/receptor.py
index 006c805943..9cb4d49efe 100644
--- a/awx/main/tasks/receptor.py
+++ b/awx/main/tasks/receptor.py
@@ -526,6 +526,10 @@ class AWXReceptorJob:
pod_spec['spec']['containers'][0]['image'] = ee.image
pod_spec['spec']['containers'][0]['args'] = ['ansible-runner', 'worker', '--private-data-dir=/runner']
+ if settings.AWX_RUNNER_KEEPALIVE_SECONDS:
+ pod_spec['spec']['containers'][0].setdefault('env', [])
+ pod_spec['spec']['containers'][0]['env'].append({'name': 'ANSIBLE_RUNNER_KEEPALIVE_SECONDS', 'value': str(settings.AWX_RUNNER_KEEPALIVE_SECONDS)})
+
# Enforce EE Pull Policy
pull_options = {"always": "Always", "missing": "IfNotPresent", "never": "Never"}
if self.task and self.task.instance.execution_environment:
diff --git a/awx/settings/defaults.py b/awx/settings/defaults.py
index 271eb4db8d..4ec9b008ae 100644
--- a/awx/settings/defaults.py
+++ b/awx/settings/defaults.py
@@ -936,6 +936,11 @@ AWX_RUNNER_OMIT_ENV_FILES = True
# Allow ansible-runner to save ansible output (may cause performance issues)
AWX_RUNNER_SUPPRESS_OUTPUT_FILE = True
+# https://github.com/ansible/ansible-runner/pull/1191/files
+# Interval in seconds between the last message and keep-alive messages that
+# ansible-runner will send
+AWX_RUNNER_KEEPALIVE_SECONDS = 0
+
# Delete completed work units in receptor
RECEPTOR_RELEASE_WORK = True
diff --git a/awx/ui/src/screens/Setting/Jobs/JobsEdit/JobsEdit.js b/awx/ui/src/screens/Setting/Jobs/JobsEdit/JobsEdit.js
index 52e216e41e..d258fdec46 100644
--- a/awx/ui/src/screens/Setting/Jobs/JobsEdit/JobsEdit.js
+++ b/awx/ui/src/screens/Setting/Jobs/JobsEdit/JobsEdit.js
@@ -150,6 +150,11 @@ function JobsEdit() {
type={options?.SCHEDULE_MAX_JOBS ? 'number' : undefined}
isRequired={Boolean(options?.SCHEDULE_MAX_JOBS)}
/>
+