diff --git a/.github/workflows/pr-test.yml b/.github/workflows/pr-test.yml new file mode 100644 index 0000000..3194857 --- /dev/null +++ b/.github/workflows/pr-test.yml @@ -0,0 +1,176 @@ +# MIT License +# +# Copyright (c) 2018 sclorg team at Red Hat +# +# Upload a Python package when a release is created +# https://packaging.python.org/guides/publishing-package-distribution-releases-using-github-actions-ci-cd-workflows + +name: Test PR for container-ci-suite + +on: + issue_comment: + types: [created] + +jobs: + build: + # This job only runs for '[test]' pull request comments by owner, member + name: Schedule test on Testing Farm service for Fedora + runs-on: ubuntu-latest + if: | + github.event.issue.pull_request + && contains(github.event.comment.body, '/test') + && contains(fromJson('["OWNER","MEMBER"]'), github.event.comment.author_association) + steps: + - name: Get pull request number + id: pr_nr + run: | + PR_URL="${{ github.event.comment.issue_url }}" + echo "::set-output name=PR_NR::${PR_URL##*/}" + - name: Checkout repo + uses: actions/checkout@v2 + with: + ref: "refs/pull/${{ steps.pr_nr.outputs.PR_NR }}/head" + + - name: Get sha + id: sha + run: | + # Store SHA into outputs + echo "::set-output name=SHA::$(git rev-parse HEAD)" + + - name: Schedule a test on Testing Farm for Fedora + id: sched_test + run: | + # Update ubuntu-latest in order to install curl and jq + sudo apt-get update && sudo apt-get -y install curl jq + cat << EOF > request.json + { + "api_key": "${{ secrets.TF_PUBLIC_API_KEY }}", + "test": {"fmf": { + "url": "https://github.com/sclorg/sclorg-testing-farm", + "ref": "main", + "name": "container-ci-suite" + }}, + "environments": [{ + "arch": "x86_64", + "os": {"compose": "Fedora-34"}, + "variables": { + "REPO_URL": "$GITHUB_SERVER_URL/$GITHUB_REPOSITORY", + "REPO_NAME": "$GITHUB_REPOSITORY", + "PR_NUMBER": "${{ steps.pr_nr.outputs.PR_NR }}" + } + }] + } + EOF + cat request.json + curl ${{ secrets.TF_ENDPOINT }}/requests --data @request.json --header "Content-Type: application/json" --output response.json + cat response.json + req_id=$(jq -r .id response.json) + echo "$req_id" + # Store REQ_ID into outputs for later on usage + echo "::set-output name=REQ_ID::$req_id" + + outputs: + REQ_ID: ${{ steps.sched_test.outputs.REQ_ID }} + SHA: ${{ steps.sha.outputs.SHA }} + + running: + needs: build + name: Check running tests on Testing Farm service + runs-on: ubuntu-20.04 + outputs: + REQ_ID: ${{ steps.req_sha.outputs.REQ_ID }} + SHA: ${{ steps.req_sha.outputs.SHA }} + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + steps: + - name: Check if REQ_ID and SHA exists + id: req_sha + run: | + # Update ubuntu-20.04 in order to install curl and jq + # each job is separate machine + sudo apt-get update && sudo apt-get -y install curl jq + # Propagate REQ_ID and SHA into the finish section + echo "::set-output name=REQ_ID::${{ needs.build.outputs.REQ_ID }}" + echo "::set-output name=SHA::${{ needs.build.outputs.SHA }}" + - name: Switch to running state of Testing Farm request + id: running + run: | + # Create running.json file for query, whether job is finished or not. + cat << EOF > running.json + { + "sha": "${{ needs.build.outputs.SHA }}", + "state": "pending", + "context": "Testing Farm", + "description": "Build started", + "target_url": "http://artifacts.dev.testing-farm.io/${{ needs.build.outputs.REQ_ID }}/" + } + EOF + # Update GitHub status description to 'Build started' + curl -X POST -H "Authorization: Bearer ${{ secrets.GITHUB_TOKEN }}" -H "Accept: application/vnd.github.v3+json" \ + https://api.github.com/repos/$GITHUB_REPOSITORY/statuses/${{ needs.build.outputs.SHA }} \ + --data @running.json + - name: Check test is still running + id: still_running + run: | + CMD=${{ secrets.TF_ENDPOINT }}/requests/${{ needs.build.outputs.REQ_ID }} + curl $CMD > job.json + state=$(jq -r .state job.json) + # Wait till job is not finished. As soon as state is complete or failure then go to the finish action + while [ "$state" == "running" ] || [ "$state" == "new" ] || [ "$state" == "pending" ] || [ "$state" == "queued" ]; do + # Wait 30s. We do not need to query Testing Farm each second + sleep 30 + curl $CMD > job.json + state=$(jq -r .state job.json) + done + finish: + needs: running + name: Tests are finished - switching to proper state + runs-on: ubuntu-20.04 + steps: + - name: Check if REQ_ID exists + run: echo "${{ needs.running.outputs.REQ_ID }}" + + - name: Check if SHA exists + run: echo "${{ needs.running.outputs.SHA }}" + + - name: Get final state of Testing Farm request + id: final_state + run: | + # Update ubuntu-20.04 in order to install curl and jq + # each job is separate machine + sudo apt-get update && sudo apt-get -y install curl jq + curl ${{ secrets.TF_ENDPOINT }}/requests/${{ needs.running.outputs.REQ_ID }} > job.json + cat job.json + state=$(jq -r .state job.json) + result=$(jq -r .result.overall job.json) + new_state="success" + infra_error=" " + echo "State is $state and result is: $result" + if [ "$state" == "complete" ]; then + if [ "$result" != "passed" ]; then + new_state="failure" + fi + else + # Mark job in case of infrastructure issues. Report to Testing Farm team + infra_error=" - Infra problems" + new_state="failure" + fi + echo "New State is: $new_state" + echo "Infra state is: $infra_error" + echo "::set-output name=FINAL_STATE::$new_state" + echo "::set-output name=INFRA_STATE::$infra_error" + - name: Switch to final state of Testing Farm request + run: | + cat << EOF > final.json + { + "sha": "${{needs.running.outputs.SHA}}", + "state": "${{steps.final_state.outputs.FINAL_STATE}}", + "context": "Testing Farm", + "description": "Build finished${{steps.final_state.outputs.INFRA_STATE}}", + "target_url": "http://artifacts.dev.testing-farm.io/${{ needs.running.outputs.REQ_ID }}/" + } + EOF + cat final.json + # Switch Github status to proper state + curl -X POST -H "Authorization: Bearer ${{secrets.GITHUB_TOKEN}}" -H "Accept: application/vnd.github.v3+json" \ + https://api.github.com/repos/$GITHUB_REPOSITORY/statuses/${{ needs.running.outputs.SHA }} \ + --data @final.json diff --git a/Makefile b/Makefile index febee65..6219e62 100644 --- a/Makefile +++ b/Makefile @@ -1,15 +1,21 @@ .PHONY: build-test test test-in-container clean TEST_IMAGE_NAME = container-ci-suite-test +UNAME=$(shell uname) +ifeq ($(UNAME),Darwin) + PODMAN := /usr/local/bin/docker +else + PODMAN := /usr/bin/podman +endif build-test: - docker build --tag ${TEST_IMAGE_NAME} -f Dockerfile.tests . + $(PODMAN) build --tag ${TEST_IMAGE_NAME} -f Dockerfile.tests . test: cd tests && PYTHONPATH=$(CURDIR) pytest --color=yes -v --showlocals -test-in-container: build-test - docker run --rm --net=host -e DEPLOYMENT=test ${TEST_IMAGE_NAME} +test-in-container: + $(PODMAN) run --rm --net=host -e DEPLOYMENT=test ${TEST_IMAGE_NAME} clean: find . -name '*.pyc' -delete diff --git a/README.md b/README.md index 43d6b91..4d173ee 100644 --- a/README.md +++ b/README.md @@ -69,7 +69,7 @@ class TestDummyImage(object): * [ ] ct_clone_git_repository * [ ] ct_show_resources * [ ] ct_s2i_multistage_build -* [ ] +* [ ] ## OpenShift tests diff --git a/container_ci_suite/api.py b/container_ci_suite/api.py index c364f8a..c08b1ba 100644 --- a/container_ci_suite/api.py +++ b/container_ci_suite/api.py @@ -201,7 +201,7 @@ def scl_usage_old(self): pass def create_container(self, cid_file: str, container_args: str = "", *args): - self.cid_file_dir = Path(mkdtemp(suffix=f".test_cid_files")) + self.cid_file_dir = Path(mkdtemp(suffix=".test_cid_files")) p = Path(self.cid_file_dir) self.cid_file = p / cid_file DockerCLIWrapper.run_docker_command( diff --git a/container_ci_suite/constants.py b/container_ci_suite/constants.py index 31dcf17..47d6855 100644 --- a/container_ci_suite/constants.py +++ b/container_ci_suite/constants.py @@ -20,4 +20,4 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. -CA_FILE_PATH: str = "/etc/pki/ca-trust/source/anchors/RH-IT-Root-CA.crt" \ No newline at end of file +CA_FILE_PATH: str = "/etc/pki/ca-trust/source/anchors/RH-IT-Root-CA.crt" diff --git a/requirements.txt b/requirements.txt index 085b78e..b9d8978 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,2 +1,2 @@ pytest -flexmock \ No newline at end of file +flexmock diff --git a/tests/__init__.py b/tests/__init__.py index 4e84d14..2dbc786 100644 --- a/tests/__init__.py +++ b/tests/__init__.py @@ -20,4 +20,4 @@ # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -# SOFTWARE. \ No newline at end of file +# SOFTWARE. diff --git a/tests/test_utils.py b/tests/test_utils.py index 4bc5c6c..15334e8 100644 --- a/tests/test_utils.py +++ b/tests/test_utils.py @@ -70,8 +70,8 @@ def test_get_mount_ca_file(self): [ ("--pull-never", ""), ( - f"--pull-never -v /some/foo/bar/file:/some/foo/bar/file:Z", - f"-v /some/foo/bar/file:/some/foo/bar/file:Z", + "--pull-never -v /some/foo/bar/file:/some/foo/bar/file:Z", + "-v /some/foo/bar/file:/some/foo/bar/file:Z", ), ], ) @@ -85,7 +85,7 @@ def test_mount_point(self, s2i_args, expected_output): "s2i_args,expected_output", [ ("--pull-never", []), - (f"--pull-never -e NODE=development", ["ENV NODE=development"]), + ("--pull-never -e NODE=development", ["ENV NODE=development"]), ( "-v mount_point:mount_point:Z -e FOO=bar --env TEST=deployment", ["ENV FOO=bar", "ENV TEST=deployment"],