mirror of
https://github.com/ansible-collections/community.docker.git
synced 2025-12-16 11:58:43 +00:00
Add EE support, support GHA in current_container_facts (#336)
* Try adding EE support. * Use GHA instead of AZP for EE tests. * Update changelog fragment, extend tests. * Disable current_container_facts test. * Increase verbosity. * 2.9 compatibility. * Use docker instead of podman for building EE and running tests in it. * Output some more information (helpful for debugging). * Fix GHA handling for current_container_facts. * Try to fix permissions.
This commit is contained in:
parent
ca2e46131f
commit
e12a487e6a
114
.github/workflows/ee.yml
vendored
Normal file
114
.github/workflows/ee.yml
vendored
Normal file
@ -0,0 +1,114 @@
|
|||||||
|
---
|
||||||
|
name: execution environment
|
||||||
|
on:
|
||||||
|
# Run CI against all pushes (direct commits, also merged PRs), Pull Requests
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- main
|
||||||
|
- stable-*
|
||||||
|
pull_request:
|
||||||
|
# Run CI once per day (at 04:30 UTC)
|
||||||
|
# This ensures that even if there haven't been commits that we are still testing against latest version of ansible-builder
|
||||||
|
schedule:
|
||||||
|
- cron: '30 4 * * *'
|
||||||
|
|
||||||
|
env:
|
||||||
|
NAMESPACE: community
|
||||||
|
COLLECTION_NAME: docker
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build:
|
||||||
|
name: Build and test EE (Ⓐ${{ matrix.runner_tag }})
|
||||||
|
strategy:
|
||||||
|
matrix:
|
||||||
|
runner_tag:
|
||||||
|
- devel
|
||||||
|
- stable-2.12-latest
|
||||||
|
- stable-2.11-latest
|
||||||
|
- stable-2.9-latest
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Check out code
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
with:
|
||||||
|
path: ansible_collections/${{ env.NAMESPACE }}/${{ env.COLLECTION_NAME }}
|
||||||
|
|
||||||
|
- name: Set up Python
|
||||||
|
uses: actions/setup-python@v3
|
||||||
|
with:
|
||||||
|
python-version: '3.10'
|
||||||
|
|
||||||
|
- name: Install ansible-builder and ansible-navigator
|
||||||
|
run: pip install ansible-builder ansible-navigator
|
||||||
|
|
||||||
|
- name: Verify requirements
|
||||||
|
run: ansible-builder introspect --sanitize .
|
||||||
|
|
||||||
|
- name: Make sure galaxy.yml has version entry
|
||||||
|
run: >-
|
||||||
|
python -c
|
||||||
|
'import yaml ;
|
||||||
|
f = open("galaxy.yml", "rb") ;
|
||||||
|
data = yaml.safe_load(f) ;
|
||||||
|
f.close() ;
|
||||||
|
data["version"] = data.get("version") or "0.0.1" ;
|
||||||
|
f = open("galaxy.yml", "wb") ;
|
||||||
|
f.write(yaml.dump(data).encode("utf-8")) ;
|
||||||
|
f.close() ;
|
||||||
|
'
|
||||||
|
working-directory: ansible_collections/${{ env.NAMESPACE }}/${{ env.COLLECTION_NAME }}
|
||||||
|
|
||||||
|
- name: Build collection
|
||||||
|
run: |
|
||||||
|
ansible-galaxy collection build --output-path ../../../
|
||||||
|
working-directory: ansible_collections/${{ env.NAMESPACE }}/${{ env.COLLECTION_NAME }}
|
||||||
|
|
||||||
|
- name: Create files for building execution environment
|
||||||
|
run: |
|
||||||
|
COLLECTION_FILENAME="$(ls "${{ env.NAMESPACE }}-${{ env.COLLECTION_NAME }}"-*.tar.gz)"
|
||||||
|
|
||||||
|
# EE config
|
||||||
|
cat > execution-environment.yml <<EOF
|
||||||
|
---
|
||||||
|
version: 1
|
||||||
|
build_arg_defaults:
|
||||||
|
EE_BASE_IMAGE: 'quay.io/ansible/ansible-runner:${{ matrix.runner_tag }}'
|
||||||
|
dependencies:
|
||||||
|
galaxy: requirements.yml
|
||||||
|
EOF
|
||||||
|
echo "::group::execution-environment.yml"
|
||||||
|
cat execution-environment.yml
|
||||||
|
echo "::endgroup::"
|
||||||
|
|
||||||
|
# Requirements
|
||||||
|
cat > requirements.yml <<EOF
|
||||||
|
---
|
||||||
|
collections:
|
||||||
|
- name: ${COLLECTION_FILENAME}
|
||||||
|
type: file
|
||||||
|
EOF
|
||||||
|
echo "::group::requirements.yml"
|
||||||
|
cat requirements.yml
|
||||||
|
echo "::endgroup::"
|
||||||
|
|
||||||
|
- name: Build image based on ${{ matrix.runner_tag }}
|
||||||
|
run: |
|
||||||
|
mkdir -p context/_build/
|
||||||
|
cp "${{ env.NAMESPACE }}-${{ env.COLLECTION_NAME }}"-*.tar.gz context/_build/
|
||||||
|
ansible-builder build -v 3 -t test-ee:latest --container-runtime=docker
|
||||||
|
|
||||||
|
- name: Make /var/run/docker.sock accessible by everyone
|
||||||
|
run: sudo chmod a+rw /var/run/docker.sock
|
||||||
|
|
||||||
|
- name: Run basic tests
|
||||||
|
run: >
|
||||||
|
ansible-navigator run
|
||||||
|
--mode stdout
|
||||||
|
--pull-policy never
|
||||||
|
--set-environment-variable ANSIBLE_PRIVATE_ROLE_VARS=true
|
||||||
|
--container-engine docker
|
||||||
|
--container-options=-v --container-options=/var/run/docker.sock:/var/run/docker.sock
|
||||||
|
--execution-environment-image test-ee:latest
|
||||||
|
-v
|
||||||
|
all.yml
|
||||||
|
working-directory: ansible_collections/${{ env.NAMESPACE }}/${{ env.COLLECTION_NAME }}/tests/ee
|
||||||
3
changelogs/fragments/336-ee.yml
Normal file
3
changelogs/fragments/336-ee.yml
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
minor_changes:
|
||||||
|
- "Prepare collection for inclusion in an Execution Environment by declaring its dependencies. The ``docker_stack*`` modules are not supported (https://github.com/ansible-collections/community.docker/pull/336)."
|
||||||
|
- "current_container_facts - add detection for GitHub Actions (https://github.com/ansible-collections/community.docker/pull/336)."
|
||||||
0
meta/ee-bindep.txt
Normal file
0
meta/ee-bindep.txt
Normal file
2
meta/ee-requirements.txt
Normal file
2
meta/ee-requirements.txt
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
docker
|
||||||
|
docker-compose
|
||||||
5
meta/execution-environment.yml
Normal file
5
meta/execution-environment.yml
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
---
|
||||||
|
version: 1
|
||||||
|
dependencies:
|
||||||
|
python: meta/ee-requirements.txt
|
||||||
|
system: meta/ee-bindep.txt
|
||||||
@ -50,12 +50,15 @@ ansible_facts:
|
|||||||
description:
|
description:
|
||||||
- The detected container environment.
|
- The detected container environment.
|
||||||
- Contains an empty string if no container was detected.
|
- Contains an empty string if no container was detected.
|
||||||
- Otherwise, will be one of C(docker) or C(azure_pipelines).
|
- Otherwise, will be one of C(docker), C(azure_pipelines), or C(github_actions).
|
||||||
|
- C(github_actions) is supported since community.docker 2.4.0.
|
||||||
returned: always
|
returned: always
|
||||||
type: str
|
type: str
|
||||||
# choices:
|
choices:
|
||||||
# - docker
|
- ''
|
||||||
# - azure_pipelines
|
- docker
|
||||||
|
- azure_pipelines
|
||||||
|
- github_actions
|
||||||
'''
|
'''
|
||||||
|
|
||||||
import os
|
import os
|
||||||
@ -89,6 +92,10 @@ def main():
|
|||||||
container_id = cgroup_name
|
container_id = cgroup_name
|
||||||
container_type = 'azure_pipelines'
|
container_type = 'azure_pipelines'
|
||||||
|
|
||||||
|
if cgroup_path == '/actions_job':
|
||||||
|
container_id = cgroup_name
|
||||||
|
container_type = 'github_actions'
|
||||||
|
|
||||||
module.exit_json(ansible_facts=dict(
|
module.exit_json(ansible_facts=dict(
|
||||||
ansible_module_running_in_container=container_id != '',
|
ansible_module_running_in_container=container_id != '',
|
||||||
ansible_module_container_id=container_id,
|
ansible_module_container_id=container_id,
|
||||||
|
|||||||
15
tests/ee/all.yml
Normal file
15
tests/ee/all.yml
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
- hosts: localhost
|
||||||
|
vars:
|
||||||
|
docker_test_image_alpine: quay.io/ansible/docker-test-containers:alpine3.8
|
||||||
|
tasks:
|
||||||
|
- name: Find all roles
|
||||||
|
find:
|
||||||
|
paths:
|
||||||
|
- "{{ (playbook_dir | default('.')) ~ '/roles' }}"
|
||||||
|
file_type: directory
|
||||||
|
depth: 1
|
||||||
|
register: result
|
||||||
|
- name: Include all roles
|
||||||
|
include_role:
|
||||||
|
name: "{{ item }}"
|
||||||
|
loop: "{{ result.files | map(attribute='path') | map('regex_replace', '.*/', '') | sort }}"
|
||||||
28
tests/ee/roles/current_container_facts/tasks/main.yml
Normal file
28
tests/ee/roles/current_container_facts/tasks/main.yml
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
---
|
||||||
|
- name: Retrieve information on current container
|
||||||
|
community.docker.current_container_facts:
|
||||||
|
register: result
|
||||||
|
|
||||||
|
# The following two tasks are useful if we ever have to debug why this fails.
|
||||||
|
|
||||||
|
- name: Print all Ansible facts
|
||||||
|
debug:
|
||||||
|
var: ansible_facts
|
||||||
|
|
||||||
|
- name: Read some files
|
||||||
|
slurp:
|
||||||
|
src: "{{ item }}"
|
||||||
|
loop:
|
||||||
|
- /proc/self/cpuset
|
||||||
|
- /proc/1/cgroup
|
||||||
|
- /proc/1/environ
|
||||||
|
|
||||||
|
- name: Print facts returned by module
|
||||||
|
debug:
|
||||||
|
var: result.ansible_facts
|
||||||
|
|
||||||
|
- name: Validate results
|
||||||
|
assert:
|
||||||
|
that:
|
||||||
|
- ansible_module_running_in_container
|
||||||
|
- ansible_module_container_type != ''
|
||||||
34
tests/ee/roles/docker_compose/tasks/main.yml
Normal file
34
tests/ee/roles/docker_compose/tasks/main.yml
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
---
|
||||||
|
# Create random name prefix (for containers, networks, ...)
|
||||||
|
- name: Create random container name prefix
|
||||||
|
set_fact:
|
||||||
|
cname_prefix: "{{ 'ansible-docker-test-%0x' % ((2**32) | random) }}"
|
||||||
|
|
||||||
|
- name: Create project and container names
|
||||||
|
set_fact:
|
||||||
|
pname: "{{ cname_prefix }}"
|
||||||
|
cname: "{{ cname_prefix }}-hi"
|
||||||
|
|
||||||
|
- name: Define service
|
||||||
|
set_fact:
|
||||||
|
test_service: |
|
||||||
|
version: '3'
|
||||||
|
services:
|
||||||
|
{{ cname }}:
|
||||||
|
image: "{{ docker_test_image_alpine }}"
|
||||||
|
command: '/bin/sh -c "sleep 10m"'
|
||||||
|
stop_grace_period: 1s
|
||||||
|
|
||||||
|
- name: Present
|
||||||
|
community.docker.docker_compose:
|
||||||
|
project_name: "{{ pname }}"
|
||||||
|
state: present
|
||||||
|
remove_orphans: true
|
||||||
|
definition: "{{ test_service | from_yaml }}"
|
||||||
|
|
||||||
|
- name: Absent
|
||||||
|
community.docker.docker_compose:
|
||||||
|
project_name: "{{ pname }}"
|
||||||
|
state: absent
|
||||||
|
remove_orphans: true
|
||||||
|
definition: "{{ test_service | from_yaml }}"
|
||||||
28
tests/ee/roles/docker_plain/tasks/main.yml
Normal file
28
tests/ee/roles/docker_plain/tasks/main.yml
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
---
|
||||||
|
# Create random name prefix (for containers, networks, ...)
|
||||||
|
- name: Create random container name prefix
|
||||||
|
set_fact:
|
||||||
|
cname_prefix: "{{ 'ansible-docker-test-%0x' % ((2**32) | random) }}"
|
||||||
|
|
||||||
|
- name: Make sure image is absent
|
||||||
|
community.docker.docker_image:
|
||||||
|
name: "{{ docker_test_image_alpine }}"
|
||||||
|
state: absent
|
||||||
|
|
||||||
|
- name: Make sure image is pulled
|
||||||
|
community.docker.docker_image:
|
||||||
|
name: "{{ docker_test_image_alpine }}"
|
||||||
|
source: pull
|
||||||
|
|
||||||
|
- name: Start container
|
||||||
|
community.docker.docker_container:
|
||||||
|
name: "{{ cname_prefix }}-1"
|
||||||
|
image: "{{ docker_test_image_alpine }}"
|
||||||
|
state: started
|
||||||
|
|
||||||
|
- name: Remove container
|
||||||
|
community.docker.docker_container:
|
||||||
|
name: "{{ cname_prefix }}-1"
|
||||||
|
state: absent
|
||||||
|
stop_timeout: 1
|
||||||
|
force_kill: yes
|
||||||
2
tests/ee/roles/docker_stack/tasks/main.yml
Normal file
2
tests/ee/roles/docker_stack/tasks/main.yml
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
---
|
||||||
|
# Currently the docker_stack* modules are not supported in the EE since we'd need to install the Docker CLI client
|
||||||
@ -4,4 +4,5 @@
|
|||||||
.azure-pipelines/scripts/publish-codecov.py compile-3.5!skip # Uses Python 3.6+ syntax
|
.azure-pipelines/scripts/publish-codecov.py compile-3.5!skip # Uses Python 3.6+ syntax
|
||||||
.azure-pipelines/scripts/publish-codecov.py future-import-boilerplate
|
.azure-pipelines/scripts/publish-codecov.py future-import-boilerplate
|
||||||
.azure-pipelines/scripts/publish-codecov.py metaclass-boilerplate
|
.azure-pipelines/scripts/publish-codecov.py metaclass-boilerplate
|
||||||
|
plugins/modules/current_container_facts.py validate-modules:return-syntax-error
|
||||||
plugins/modules/docker_container.py use-argspec-type-path # uses colon-separated paths, can't use type=path
|
plugins/modules/docker_container.py use-argspec-type-path # uses colon-separated paths, can't use type=path
|
||||||
|
|||||||
@ -4,4 +4,5 @@
|
|||||||
.azure-pipelines/scripts/publish-codecov.py compile-3.5!skip # Uses Python 3.6+ syntax
|
.azure-pipelines/scripts/publish-codecov.py compile-3.5!skip # Uses Python 3.6+ syntax
|
||||||
.azure-pipelines/scripts/publish-codecov.py future-import-boilerplate
|
.azure-pipelines/scripts/publish-codecov.py future-import-boilerplate
|
||||||
.azure-pipelines/scripts/publish-codecov.py metaclass-boilerplate
|
.azure-pipelines/scripts/publish-codecov.py metaclass-boilerplate
|
||||||
|
plugins/modules/current_container_facts.py validate-modules:return-syntax-error
|
||||||
plugins/modules/docker_container.py use-argspec-type-path # uses colon-separated paths, can't use type=path
|
plugins/modules/docker_container.py use-argspec-type-path # uses colon-separated paths, can't use type=path
|
||||||
|
|||||||
@ -1,2 +1,3 @@
|
|||||||
.azure-pipelines/scripts/publish-codecov.py replace-urlopen
|
.azure-pipelines/scripts/publish-codecov.py replace-urlopen
|
||||||
|
plugins/modules/current_container_facts.py validate-modules:return-syntax-error
|
||||||
plugins/modules/docker_container.py use-argspec-type-path # uses colon-separated paths, can't use type=path
|
plugins/modules/docker_container.py use-argspec-type-path # uses colon-separated paths, can't use type=path
|
||||||
|
|||||||
@ -15,7 +15,7 @@ function join {
|
|||||||
}
|
}
|
||||||
|
|
||||||
# Ensure we can write other collections to this dir
|
# Ensure we can write other collections to this dir
|
||||||
sudo chown "$(whoami)" "${PWD}/../../"
|
sudo chown -R "$(whoami)" "${PWD}/../../../"
|
||||||
|
|
||||||
test="$(join / "${args[@]:1}")"
|
test="$(join / "${args[@]:1}")"
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user