chore (Litmus-Portal) : Updated E2E GitHub Action Worflow (#2880)

* Updated E2E workflow

Signed-off-by: Jonsy13 <vedant.shrotria@chaosnative.com>

* Added BUILD_IMAGE.md inside .github.

Signed-off-by: Jonsy13 <vedant.shrotria@chaosnative.com>

* Fixed the pipeline.

Signed-off-by: Jonsy13 <vedant.shrotria@chaosnative.com>

* Fixed KIND Cluster.

Signed-off-by: Jonsy13 <vedant.shrotria@chaosnative.com>
This commit is contained in:
VEDANT SHROTRIA 2021-07-14 15:58:30 +05:30 committed by GitHub
parent 445ef30c69
commit 339150646c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 132 additions and 125 deletions

View File

@ -2,15 +2,16 @@
The litmusportal runs on top of Kubernetes and is built on a set of docker containers it provides you the flexibility to build a custom image to visualize/check
your changes. Here are the components for which you can create your custom Docker images from this repository:
- GraphQL Server
- Cluster Agents: Subscriber, Event Tracker
- Cluster Agents: Subscriber, Event Tracker
- Web UI (Frontend)
Follow the given steps to build custom Docker images:
**Clone litmus repository**
- We need to clone (forked or base) the litmus repository and make the required changes (if any).
- We need to clone (forked or base) the litmus repository and make the required changes (if any).
```bash
git clone http://github.com/litmuschaos/litmus
@ -59,8 +60,6 @@ cd litmus/litmus-portal
</tr>
</table>
### For AMD64 Build
- To build only amd64 image export the variables from the above table.
@ -71,12 +70,15 @@ cd litmus/litmus-portal
OR
- Fill the ENVs from the above table in the given command and execute it.
```bash
cd ${DIRECTORY}
docker build . -f Dockerfile -t ${REPONAME}/${IMAGE_NAME}:${IMG_TAG} --build-arg TARGETARCH=amd64
docker push ${REPONAME}/${IMAGE_NAME}:${IMG_TAG}
```
```
For frontend image:
```bash
cd frontend
docker build . -f Dockerfile -t $(REPONAME)/$(IMAGE_NAME):${IMG_TAG} --build-arg TARGETARCH=amd64 --build-arg REACT_APP_KB_CHAOS_VERSION=${IMG_TAG} \
@ -84,14 +86,15 @@ docker build . -f Dockerfile -t $(REPONAME)/$(IMAGE_NAME):${IMG_TAG} --build-arg
docker push $(REPONAME)/$(IMAGE_NAME):$(IMG_TAG)
```
### For building multi-arch images
- For building multi-arch image setup [docker buildx](https://docs.docker.com/buildx/working-with-buildx/) in your system. You can also check out this [blog](https://dev.to/uditgaurav/multiarch-support-in-litmuschaos-34da) for the same.
- Once the docker buildx is setup export all the target platforms on which you want to deploy your images as a CSV Like `export PLATFORMS=linux/amd4,linux/arm64` along with the ENVs mentioned
- Once the docker buildx is setup export all the target platforms on which you want to deploy your images as a CSV Like `export PLATFORMS=linux/amd4,linux/arm64` along with the ENVs mentioned
in the above table.
- Build and push the multi-arch image using:
```bash
make push-portal-component
```
@ -101,12 +104,14 @@ make push-portal-component
OR
- Fill the ENVs from the above table in the given command and execute it.
```bash
cd ${DIRECTORY}
docker buildx build -f Dockerfile --progress plane --push --no-cache --platform ${PLATFORMS} -t ${REPONAME}/$(IMAGE_NAME):$(IMG_TAG} .
```
```
For frontend image:
```bash
cd ${DIRECTORY}
docker buildx build . -f Dockerfile --progress plane --push --no-cache --platform ${PLATFORMS} -t ${REPONAME}/${IMAGE_NAME}:${IMG_TAG} \

View File

@ -3,23 +3,9 @@ set -e
working_dir="litmus-portal"
# Array of Image Names
image_names=("litmusportal-frontend:ci" "litmusportal-server:ci" "litmusportal-auth-server:ci")
# Array of DockerFile Paths
dockerfile_paths=("frontend" "graphql-server/build" "authentication")
# Array of directories, for which images have to be build if changed
directory_array=("frontend" "graphql-server" "authentication")
declare -A MYMAP=( [frontend]="litmusportal-frontend:ci" [graphql-server]="litmusportal-server:ci" [authentication]="litmusportal-auth-server:ci" )
# Building the images on the basic of changes in paths
for i in "${!directory_array[@]}"
do
current_dir=$(echo "$working_dir/${directory_array[$i]}")
nofchanges=$(echo $changed_data | jq -r '[.[]."filename"] | join("\n")' | tr -d '"' | grep ^$current_dir | wc -l)
if [ $nofchanges != 0 ]
then
docker build $current_dir -t litmuschaos/${image_names[$i]} -f $working_dir/${dockerfile_paths[$i]}/Dockerfile
kind load docker-image litmuschaos/${image_names[$i]} --name kind
fi
done
current_dir=$(echo "$working_dir/$directory")
mkdir Images
docker build $current_dir -t litmuschaos/${MYMAP[$directory]} -f $working_dir/${directory}/Dockerfile
docker save "litmuschaos/${MYMAP[$directory]}" > Images/${directory}.tar

View File

@ -6,19 +6,13 @@ on:
- master
jobs:
tests:
if: contains(github.event.comment.html_url, '/pull/') && startsWith(github.event.comment.body, '/run')
runs-on: ubuntu-20.04
# Job for finding last commit sha of pull-request
find-latest-commit-sha:
if: contains(github.event.comment.html_url, '/pull/') && startsWith(github.event.comment.body, '/run-e2e')
runs-on: ubuntu-latest
outputs:
commit-sha: ${{ steps.getcommit.outputs.sha }}
steps:
- name: Notification for Starting Testing.
uses: peter-evans/create-or-update-comment@v1
with:
comment-id: "${{ github.event.comment.id }}"
body: |
****
**Test Status:** The testing has been started please wait for the results ...
#Using the last commit id of pull request
- uses: octokit/request-action@v2.x
id: get_PR_commits
with:
@ -31,124 +25,156 @@ jobs:
- name: set commit to output
id: getcommit
run: |
prsha=$(echo $response | jq '.[-1].sha' | tr -d '"')
echo "::set-output name=sha::$prsha"
prsha=$(echo $response | jq '.[-1].sha' | tr -d '"')
echo "::set-output name=sha::$prsha"
env:
response: ${{ steps.get_PR_commits.outputs.data }}
response: ${{ steps.get_PR_commits.outputs.data }}
find-changes:
if: contains(github.event.comment.html_url, '/pull/') && startsWith(github.event.comment.body, '/run-e2e')
runs-on: ubuntu-latest
needs: find-latest-commit-sha
# Set job outputs to values from filter step
outputs:
changed-paths: ${{ steps.filter.outputs.changes }}
steps:
- uses: actions/checkout@v2
with:
ref: ${{steps.getcommit.outputs.sha}}
ref: ${{ needs.find-latest-commit-sha.outputs.commit-sha }}
fetch-depth: 0
- uses: octokit/request-action@v2.x
if: startsWith(github.event.comment.body, '/run-e2e')
name: Getting the files changed in current Pull-Request
id: get_files
- uses: dorny/paths-filter@v2
id: filter
with:
route: GET /repos/:repo/pulls/:pull_number/files
repo: ${{ github.repository }}
pull_number: ${{ github.event.issue.number }}
ref: ${{ needs.find-latest-commit-sha.outputs.commit-sha }}
filters: |
frontend:
- 'litmus-portal/frontend/**'
graphql-server:
- 'litmus-portal/graphql-server/**'
authentication:
- 'litmus-portal/authentication/**'
docker-build-image:
if: contains(github.event.comment.html_url, '/pull/') && startsWith(github.event.comment.body, '/run-e2e')
runs-on: ubuntu-latest
needs: [find-latest-commit-sha, find-changes]
strategy:
# Matrix of changed directories for building images in parallel
matrix:
path: ${{ fromJSON(needs.find-changes.outputs.changed-paths) }}
steps:
- uses: actions/checkout@v2
with:
ref: ${{ needs.find-latest-commit-sha.outputs.commit-sha }}
fetch-depth: 0
- name: Building Docker-Image for ${{ matrix.path }}
run: |
chmod 755 ./.github/filter_and_build.sh
./.github/filter_and_build.sh
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
directory: ${{ matrix.path }}
- name: upload docker artifacts
uses: actions/upload-artifact@v2
with:
name: Docker-Images
path: Images
tests:
if: contains(github.event.comment.html_url, '/pull/') && startsWith(github.event.comment.body, '/run-e2e')
needs: [docker-build-image]
runs-on: ubuntu-20.04
steps:
- name: Checkout litmus-E2E Repository
uses: actions/checkout@v2
with:
repository: litmuschaos/litmus-e2e
path: litmus-e2e
- name: Notification for Starting Testing.
uses: peter-evans/create-or-update-comment@v1
with:
comment-id: "${{ github.event.comment.id }}"
body: |
****
**Test Status:** The testing has been started please wait for the results ...
- name: Setting up KinD Cluster
if: startsWith(github.event.comment.body, '/run-e2e')
uses: engineerd/setup-kind@v0.5.0
with:
version: "v0.7.0"
- name: Configuring and Testing the Cluster Installation
if: startsWith(github.event.comment.body, '/run-e2e')
run: |
kubectl cluster-info --context kind-kind
kind get kubeconfig --internal >$HOME/.kube/config
kubectl get nodes
kubectl get pods -n kube-system
- name: Filtering the file paths and building images on the basic of changed files
if: startsWith(github.event.comment.body, '/run-e2e')
- name: download docker artifacts
uses: actions/download-artifact@v2
with:
name: Docker-Images
path: Images
# Loading all build images of changed components in KIND Cluster
- name: loading the docker build artifacts into KIND Cluster
run: |
chmod 755 ./.github/filter_and_build.sh
./.github/filter_and_build.sh
env:
changed_data: ${{steps.get_files.outputs.data}}
ls -1 Images/*.tar | xargs --no-run-if-empty -L 1 kind load image-archive
- name: Deploying the litmus-portal for E2E testing
if: startsWith(github.event.comment.body, '/run-e2e')
run: |
wget https://raw.githubusercontent.com/litmuschaos/litmus/master/litmus-portal/cluster-k8s-manifest.yml
sed -i 's/Always/IfNotPresent/g' cluster-k8s-manifest.yml
kubectl apply -f cluster-k8s-manifest.yml
kubectl get pods -n litmus
kubectl get deployments -o wide -n litmus
kubectl wait --for=condition=Ready pods --all --namespace litmus --timeout=120s
source ./litmus-e2e/litmus/utils.sh
verify_all_components frontend,server litmus
wait_for_pods litmus 720
- name: Getting the ENV variables for using while testing
run: |
export NODE_NAME=$(kubectl -n litmus get pod -l "component=litmusportal-frontend" -o=jsonpath='{.items[*].spec.nodeName}')
export NODE_IP=$(kubectl -n litmus get nodes $NODE_NAME -o jsonpath='{.status.addresses[?(@.type=="InternalIP")].address}')
export NODE_PORT=$(kubectl -n litmus get -o jsonpath="{.spec.ports[0].nodePort}" services litmusportal-frontend-service)
export AccessURL="http://$NODE_IP:$NODE_PORT"
echo "URL=$AccessURL" >> $GITHUB_ENV
- name: Portal Authentication Tests
if: startsWith(github.event.comment.body, '/run-e2e')
run: |
export frontendPodName=$(kubectl get pods -l component=litmusportal-frontend --template '{{range .items}}{{.metadata.name}}{{"\n"}}{{end}}' -n litmus)
export frontendPodPort=$(kubectl get pod $frontendPodName --template='{{(index (index .spec.containers 0).ports 0).containerPort}}{{"\n"}}' --namespace litmus)
kubectl port-forward $frontendPodName -n litmus 3001:$frontendPodPort &
- name: Setting Dependencies
uses: actions/setup-node@v1
if: startsWith(github.event.comment.body, '/run-unit')
with:
working-directory: litmus-portal/frontend
- name: Installing Dependencies for frontend.
if: startsWith(github.event.comment.body, '/run-unit')
run: |
HUSKY_SKIP_INSTALL=1 npm i
working-directory: litmus-portal/frontend
# Step for running all frontend Cypress unit tests.
- name: Starting cypress unit tests
if: startsWith(github.event.comment.body, '/run-unit')
uses: cypress-io/github-action@v2
continue-on-error: false
with:
command: npm run unit:ci
install: false
working-directory: litmus-portal/frontend
# Cloning the litmus-e2e repo for E2E tests.
- name: Cloning the litmus-e2e Repo
if: startsWith(github.event.comment.body, '/run-e2e')
run: |
git clone https://github.com/litmuschaos/litmus-e2e.git -b litmus-portal
- name: Running basic tests (Login and Welcome Modal Tests)
if: startsWith(github.event.comment.body, '/run-e2e-AuthTests') || startsWith(github.event.comment.body, '/run-e2e')
uses: cypress-io/github-action@v2
continue-on-error: false
with:
spec: cypress/integration/Basic_Setup/**/*.spec.js
working-directory: litmus-e2e/CypressE2E/
working-directory: litmus-e2e/Cypress/
config-file: cypress.prod.json
env: true
env:
CYPRESS_BASE_URL: ${{ env.URL }}
- name: Teaming and Account Settings Tests
if: startsWith(github.event.comment.body, '/run-e2e-Settings')
uses: cypress-io/github-action@v2
continue-on-error: false
with:
spec: cypress/integration/Parallel_Tests/Account_Settings/*.spec.js
working-directory: litmus-e2e/CypressE2E/
config-file: cypress.prod.json
- name: Verifying Execution Plane components
if: always()
run: |
source ./litmus-e2e/litmus/utils.sh
verify_all_components ${COMPONENTS} litmus
wait_for_pods litmus 720
env:
COMPONENTS: subscriber,chaos-exporter,chaos-operator-ce,event-tracker,workflow-controller
- name: Run all E2E tests
if: startsWith(github.event.comment.body, '/run-e2e-all')
- name: Post Authentication Tests
if: startsWith(github.event.comment.body, '/run-e2e')
uses: cypress-io/github-action@v2
continue-on-error: false
with:
spec: cypress/integration/Parallel_Tests/**/*.spec.js
working-directory: litmus-e2e/CypressE2E
working-directory: litmus-e2e/Cypress/
config-file: cypress.prod.json
env: true
env:
CYPRESS_BASE_URL: ${{ env.URL }}
- name: Check the test run
if: |
startsWith(github.event.comment.body, '/run-unit') || startsWith(github.event.comment.body, '/run-e2e')
if: startsWith(github.event.comment.body, '/run-e2e')
run: |
echo "TEST_RUN=true" >> $GITHUB_ENV
@ -189,15 +215,5 @@ jobs:
RUN_ID: ${{ github.run_id }}
- name: Deleting KinD cluster
if: startsWith(github.event.comment.body, '/run-e2e')
if: always()
run: kind delete cluster
merge:
if: contains(github.event.comment.html_url, '/pull/') && startsWith(github.event.comment.body, '/merge')
runs-on: ubuntu-latest
steps:
- name: Add a merge label when all jobs are passed
uses: actions-ecosystem/action-add-labels@v1
with:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
labels: merge