diff --git a/.github/workflows/integration.yaml b/.github/workflows/integration.yaml new file mode 100644 index 00000000000..ae5478dcd08 --- /dev/null +++ b/.github/workflows/integration.yaml @@ -0,0 +1,202 @@ +name: integration + +concurrency: + group: community-aws-integration-${{ github.sha }} + cancel-in-progress: true + +on: + pull_request_target: + +env: + integration_jobs: 22 + +jobs: + safe-to-test: + if: ${{ github.event.label.name == 'safe to test' }} || ${{ github.event.action != 'labeled' }} + uses: abikouo/github_actions/.github/workflows/safe-to-test.yml@safe_to_test_v2 + splitter: + runs-on: ubuntu-latest + needs: + - safe-to-test + env: + amazon_dir: "./amazon" + community_dir: "./community" + outputs: + test_targets: ${{ steps.display.outputs.test_targets }} + steps: + - name: Checkout repository + uses: ansible-network/github_actions/.github/actions/checkout_dependency@main + with: + path: ${{ env.community_dir }} + ref: ${{ github.event.pull_request.head.sha }} + fetch-depth: "0" + + - name: Checkout dependency (amazon.aws) + uses: ansible-network/github_actions/.github/actions/checkout_dependency@main + with: + repository: ansible-collections/amazon.aws + path: ${{ env.amazon_dir }} + ref: ${{ github.event.pull_request.base.ref }} + fetch-depth: "0" + + - name: list changes for pull request + id: splitter + uses: ansible-network/github_actions/.github/actions/ansible_test_splitter@main + with: + total_jobs: ${{ integration_jobs }} + collections_to_test: | + ${{ env.community_dir }} + ${{ env.amazon_dir }} + + - name: display targets + id: display + run: echo "test_targets=${{ steps.splitter.outputs.test_targets }}" >> $GITHUB_OUTPUT + shell: bash + build_jobs: + runs-on: ubuntu-latest + if: ${{ needs.splitter.outputs.test_targets != '' }} + needs: + - splitter + outputs: + test_matrix: ${{ steps.compute-matrix.outputs.test_matrix }} + test_targets: ${{ needs.splitter.outputs.test_targets }} + steps: + - name: Compute matrix + id: compute-matrix + run: | + import os, json + ids=[ + item.split(":", maxsplit=1)[0].split('-', maxsplit=1)[1] + for item in os.environ.get('TEST_TARGETS').split(';') if item.split(':', maxsplit=1)[1] + ] + output_path = os.environ.get('GITHUB_OUTPUT') + with open(output_path, "a", encoding="utf-8") as fw: + fw.write(f'job_ids={json.dumps(ids)}\n') + shell: python + env: + TEST_TARGETS: ${{ needs.splitter.outputs.test_targets }} + integration: + needs: + - build_jobs + env: + test_targets: ${{ needs.build_jobs.outputs.test_targets }} + amazon_dir: "./amazon" + community_dir: "./community" + if: >- + contains(github.event.pull_request.labels.*.name, 'run-integration-beta') && + needs.build_jobs.outputs.test_matrix != '' + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + ansible-version: + - milestone + python-version: + - "3.9" + collection: + - amazon.aws + - community.aws + workflow-id: ${{ fromJson(needs.build_jobs.outputs.job_ids) }} + name: "integration-${{ matrix.collection }}-py${{ matrix.python-version }}-${{ matrix.ansible-version }}-${{ matrix.workflow-id }}" + steps: + - name: Read ansible-test targets + id: read-targets + run: | + python -c "import os; splitter_d={x.split(':', maxsplit=1)[0]:x.split(':', maxsplit=1)[1] for x in os.environ.get('TEST_TARGETS').split(';')}; context=os.environ.get('TEST_CONTEXT'); result=splitter_d.get(context); result and print(f'ansible_test_targets={result}')" >> $GITHUB_OUTPUT + shell: bash + env: + TEST_CONTEXT: "${{ matrix.collection }}-${{ matrix.workflow-id }}" + TEST_TARGETS: "${{ env.test_targets }}" + + - name: Install ansible-core (${{ matrix.ansible-version }}) + run: python3 -m pip install https://github.com/ansible/ansible/archive/${{ matrix.ansible-version }}.tar.gz --disable-pip-version-check + + # install community.aws collection + - name: Checkout the collection repository + uses: ansible-network/github_actions/.github/actions/checkout_dependency@main + with: + path: ${{ env.community_dir }} + ref: ${{ github.event.pull_request.head.sha }} + fetch-depth: "0" + + - name: Set up Python ${{ matrix.python-version }} + uses: actions/setup-python@v4 + with: + python-version: ${{ matrix.python-version }} + + - name: Pre install collections dependencies first so the collection install does not + run: ansible-galaxy collection install --pre true -p /home/runner/collections/ + + - name: Read collection metadata from galaxy.yml + id: identify + uses: ansible-network/github_actions/.github/actions/identify_collection@main + with: + source_path: ${{ env.community_dir }} + + - name: Build and install the collection + uses: ansible-network/github_actions/.github/actions/build_install_collection@main + with: + install_python_dependencies: true + source_path: ${{ env.community_dir }} + collection_path: ${{ steps.identify.outputs.collection_path }} + tar_file: ${{ steps.identify.outputs.tar_file }} + ansible_version: ${{ matrix.ansible-version }} + + # install amazon.aws collection + - name: Checkout the collection repository + uses: ansible-network/github_actions/.github/actions/checkout_dependency@main + with: + repository: ansible-collections/amazon.aws + path: ${{ env.amazon_dir }} + ref: ${{ github.event.pull_request.base.ref }} + fetch-depth: "0" + + - name: Pre install collections dependencies first so the collection install does not + run: ansible-galaxy collection install --pre true -p /home/runner/collections/ + + - name: Read collection metadata from galaxy.yml + id: identify + uses: ansible-network/github_actions/.github/actions/identify_collection@main + with: + source_path: ${{ env.amazon_dir }} + + - name: Build and install the collection + uses: ansible-network/github_actions/.github/actions/build_install_collection@main + with: + install_python_dependencies: true + source_path: ${{ env.amazon_dir }} + collection_path: ${{ steps.identify.outputs.collection_path }} + tar_file: ${{ steps.identify.outputs.tar_file }} + ansible_version: ${{ matrix.ansible-version }} + + - name: Determines path to the collection being tested + id: collection-path + run: | + if [ "${COLLECTION_TO_TEST}" == "amazon.aws" ]; then + echo "path=${AMAZON_COLLECTION_PATH}" >> $GITHUB_OUTPUT + else + echo "path=${COMMUNITY_COLLECTION_PATH}" >> $GITHUB_OUTPUT + fi + env: + COLLECTION_TO_TEST: ${{ matrix.collection }} + AMAZON_COLLECTION_PATH: ${{ steps.install-amazon.outputs.collection_path }} + COMMUNITY_COLLECTION_PATH: ${{ steps.install-community.outputs.collection_path }} + + - name: Create AWS/sts session credentials + uses: ansible-network/github_actions/.github/actions/ansible_aws_test_provider@main + with: + collection_path: ${{ steps.collection-path.outputs.path }} + ansible_core_ci_key: ${{ secrets.ANSIBLE_CORE_CI_KEY }} + + - name: Run integration tests + uses: ansible-network/github_actions/.github/actions/ansible_test_integration@main + with: + collection_path: ${{ steps.collection-path.outputs.path }} + python_version: ${{ matrix.python-version }} + ansible_version: ${{ matrix.ansible-version }} + ansible_test_requirement_files: | + requirements.txt + test-requirements.txt + tests/integration/requirements.txt + ansible_test_constraint_files: tests/integration/constraints.txt + ansible_test_targets: ${{ steps.read-targets.outputs.ansible_test_targets }} \ No newline at end of file