From c7ec278c4fd885f0087de71727cad1465c154522 Mon Sep 17 00:00:00 2001 From: Mei Date: Wed, 8 Sep 2021 17:35:47 -0700 Subject: [PATCH 1/2] Add github actions ci pipeline --- .github/workflows/ci_build_test.yaml | 164 +++++++++++++++++++++++++++ README.md | 1 - ci_scripts/deploy_connector.sh | 27 +++++ ci_scripts/install_dep.sh | 5 + ci_scripts/k8s-splunk.yml | 31 +++++ 5 files changed, 227 insertions(+), 1 deletion(-) create mode 100644 .github/workflows/ci_build_test.yaml create mode 100755 ci_scripts/deploy_connector.sh create mode 100755 ci_scripts/install_dep.sh create mode 100644 ci_scripts/k8s-splunk.yml diff --git a/.github/workflows/ci_build_test.yaml b/.github/workflows/ci_build_test.yaml new file mode 100644 index 0000000..e273ff4 --- /dev/null +++ b/.github/workflows/ci_build_test.yaml @@ -0,0 +1,164 @@ +name: CI Build Test + +on: + pull_request: + branches-ignore: + - /^release\/.*/ + - main + +jobs: + build: + runs-on: ubuntu-latest + steps: + - name: Checkout code + uses: actions/checkout@v2 + + - name: Set up Ruby 2.6.1 + uses: ruby/setup-ruby@v1 + with: + ruby-version: 2.6.1 + + - name: Install dependencies + run: | + sudo ci_scripts/install_dep.sh + + - name: Builder + run: | + rake build -t -v + cp -R pkg /tmp + + - name: Cache pkg + uses: actions/cache@v1 + with: + path: /tmp + key: ${{ runner.os }}-build + + unit-test: + runs-on: ubuntu-20.04 + needs: + - build + steps: + - name: Checkout + uses: actions/checkout@v2 + + - name: Install dependencies + run: | + sudo ci_scripts/install_dep.sh + + - uses: actions/cache@v2 + with: + path: /tmp + key: ${{ runner.os }}-build + + - name: Run unit tests + run: | + bundle exec rake test -t -v + + func-test: + needs: + - unit-test + runs-on: ubuntu-20.04 + env: + CI_SPLUNK_PORT: 8089 + CI_SPLUNK_USERNAME: admin + CI_SPLUNK_HEC_TOKEN: a6b5e77f-d5f6-415a-bd43-930cecb12959 + CI_SPLUNK_PASSWORD: helloworld + CI_INDEX_EVENTS: ci_events + CI_INDEX_OBJECTS: ci_objects + CI_INDEX_METRICS: ci_metrics + KUBERNETES_VERSION: v1.15.2 + MINIKUBE_VERSION: v1.21.0 + GITHUB_ACTIONS: true + + steps: + - name: Checkout + uses: actions/checkout@v2 + + - name: Build kubernetes-metrics image + run: | + sed -i 's/VERSION=$VERSION -t splunk\/k8s-metrics:$TAG .\/docker/VERSION=$VERSION -t k8s-metrics:$TAG .\/docker/' docker/build.sh + sudo docker/build.sh $GITHUB_RUN_ID + docker image ls + + - name: Setup Minikube + run: | + # Install Kubectl + curl -Lo kubectl https://storage.googleapis.com/kubernetes-release/release/${KUBERNETES_VERSION}/bin/linux/amd64/kubectl + chmod +x kubectl + sudo mv kubectl /usr/local/bin/ + mkdir -p ${HOME}/.kube + touch ${HOME}/.kube/config + # Install Minikube + curl -Lo minikube https://storage.googleapis.com/minikube/releases/${MINIKUBE_VERSION}/minikube-linux-amd64 + chmod +x minikube + sudo mv minikube /usr/local/bin/ + # Start Minikube and Wait + minikube start --driver=docker --container-runtime=docker --cpus 2 --memory 4096 --kubernetes-version=${KUBERNETES_VERSION} --no-vtx-check + export JSONPATH='{range .items[*]}{@.metadata.name}:{range @.status.conditions[*]}{@.type}={@.status};{end}{end}' + until kubectl get nodes -o jsonpath="$JSONPATH" 2>&1 | grep -q "Ready=True"; do + sleep 1; + done + + - name: Install Splunk + run: | + # Wait until minikube is ready + kubectl apply -f https://docs.projectcalico.org/v3.14/manifests/calico.yaml + export JSONPATH='{range .items[*]}{@.metadata.name}:{range @.status.conditions[*]}{@.type}={@.status};{end}{end}' + until kubectl get nodes -o jsonpath="$JSONPATH" 2>&1 | grep -q "Ready=True"; do + echo "wait for minikube ready ..." + sleep 1; + done + kubectl get nodes + # Install Splunk on minikube + kubectl apply -f ci_scripts/k8s-splunk.yml + # Wait until splunk is ready + until kubectl logs splunk --tail=2 | grep -q 'Ansible playbook complete'; do + sleep 1; + done + export CI_SPLUNK_HOST=$(kubectl get pod splunk --template={{.status.podIP}}) + # Setup Indexes + curl -k -u $CI_SPLUNK_USERNAME:$CI_SPLUNK_PASSWORD https://$CI_SPLUNK_HOST:$CI_SPLUNK_PORT/services/data/indexes -d name=$CI_INDEX_EVENTS -d datatype=event + curl -k -u $CI_SPLUNK_USERNAME:$CI_SPLUNK_PASSWORD https://$CI_SPLUNK_HOST:$CI_SPLUNK_PORT/services/data/indexes -d name=$CI_INDEX_OBJECTS -d datatype=event + curl -k -u $CI_SPLUNK_USERNAME:$CI_SPLUNK_PASSWORD https://$CI_SPLUNK_HOST:$CI_SPLUNK_PORT/services/data/indexes -d name=$CI_INDEX_METRICS -d datatype=metric + curl -k -u $CI_SPLUNK_USERNAME:$CI_SPLUNK_PASSWORD https://$CI_SPLUNK_HOST:$CI_SPLUNK_PORT/services/data/indexes -d name=default-events -d datatype=event + curl -k -u $CI_SPLUNK_USERNAME:$CI_SPLUNK_PASSWORD https://$CI_SPLUNK_HOST:$CI_SPLUNK_PORT/services/data/indexes -d name=ns-anno -d datatype=event + curl -k -u $CI_SPLUNK_USERNAME:$CI_SPLUNK_PASSWORD https://$CI_SPLUNK_HOST:$CI_SPLUNK_PORT/services/data/indexes -d name=pod-anno -d datatype=event + # Enable HEC services + curl -X POST -u $CI_SPLUNK_USERNAME:$CI_SPLUNK_PASSWORD -k https://$CI_SPLUNK_HOST:$CI_SPLUNK_PORT/servicesNS/nobody/splunk_httpinput/data/inputs/http/http/enable + # Create new HEC token + curl -X POST -u $CI_SPLUNK_USERNAME:$CI_SPLUNK_PASSWORD -k -d "name=splunk_hec_token&token=a6b5e77f-d5f6-415a-bd43-930cecb12959&disabled=0&index=default-events&indexes=default-events,$CI_INDEX_METRICS,$CI_INDEX_OBJECTS,$CI_INDEX_EVENTS,ns-anno,pod-anno" https://$CI_SPLUNK_HOST:$CI_SPLUNK_PORT/servicesNS/nobody/splunk_httpinput/data/inputs/http + # Restart Splunk + curl -k -u $CI_SPLUNK_USERNAME:$CI_SPLUNK_PASSWORD https://$CI_SPLUNK_HOST:$CI_SPLUNK_PORT/services/server/control/restart -X POST + + - name: Deploy k8s connector + run: | + export CI_SPLUNK_HOST=$(kubectl get pod splunk --template={{.status.podIP}}) + ci_scripts/deploy_connector.sh + + - name: Deploy log generator + run: | + cd /opt/splunk-connect-for-kubernetes + kubectl apply -f test/test_setup.yaml + sleep 60 + + - uses: actions/setup-python@v2 + with: + python-version: 3.7 + + - name: Run functional tests + run: | + echo "check the pods" + kubectl get pods -A + cd /opt/splunk-connect-for-kubernetes + kubectl get nodes + export PYTHONWARNINGS="ignore:Unverified HTTPS request" + export CI_SPLUNK_HOST=$(kubectl get pod splunk --template={{.status.podIP}}) + cd test + pip install --upgrade pip + pip install -r requirements.txt + echo "Running functional tests....." + python -m pytest \ + --splunkd-url https://$CI_SPLUNK_HOST:8089 \ + --splunk-user admin \ + --splunk-password $CI_SPLUNK_PASSWORD \ + -p no:warnings -s diff --git a/README.md b/README.md index b87869c..3891de1 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,3 @@ -[![CircleCI](https://circleci.com/gh/git-lfs/git-lfs.svg?style=shield&circle-token=856152c2b02bfd236f54d21e1f581f3e4ebf47ad)](https://circleci.com/gh/splunk/fluent-plugin-kubernetes-metrics) # Fluentd Plugin for Kubernetes Metrics The [Fluentd](https://fluentd.org/) input plugin collects Kubernetes cluster metrics which are exposed by the [Kubelet API](https://kubernetes.io/docs/admin/kubelet/) and forwards them to fluentd. diff --git a/ci_scripts/deploy_connector.sh b/ci_scripts/deploy_connector.sh new file mode 100755 index 0000000..2af97c1 --- /dev/null +++ b/ci_scripts/deploy_connector.sh @@ -0,0 +1,27 @@ +#!/usr/bin/env bash +set -e + +#Make sure to check and clean previously failed deployment +echo "Checking if previous deployment exist..." +if [ "`helm ls --short`" == "" ]; then + echo "Nothing to clean, ready for deployment" +else + helm delete $(helm ls --short) +fi + +# Clone splunk-connect-for-kubernetes repo +cd /opt +git clone https://github.com/splunk/splunk-connect-for-kubernetes.git +cd splunk-connect-for-kubernetes + +echo "Deploying k8s-connect with latest changes" +helm install ci-sck --set global.splunk.hec.token=$CI_SPLUNK_HEC_TOKEN \ +--set global.splunk.hec.host=$CI_SPLUNK_HOST \ +--set kubelet.serviceMonitor.https=true \ +--set splunk-kubernetes-metrics.image.repository=k8s-metrics \ +--set splunk-kubernetes-metrics.image.pullPolicy=IfNotPresent \ +-f ci_scripts/sck_values.yml helm-chart/splunk-connect-for-kubernetes +#wait for deployment to finish +until kubectl get pod | grep Running | [[ $(wc -l) == 4 ]]; do + sleep 1; +done \ No newline at end of file diff --git a/ci_scripts/install_dep.sh b/ci_scripts/install_dep.sh new file mode 100755 index 0000000..4fb02aa --- /dev/null +++ b/ci_scripts/install_dep.sh @@ -0,0 +1,5 @@ +#!/usr/bin/env bash +sudo gem update --system +gem install bundler +bundle update --bundler +bundle install \ No newline at end of file diff --git a/ci_scripts/k8s-splunk.yml b/ci_scripts/k8s-splunk.yml new file mode 100644 index 0000000..543c6ca --- /dev/null +++ b/ci_scripts/k8s-splunk.yml @@ -0,0 +1,31 @@ +apiVersion: v1 +kind: Pod +metadata: + name: splunk +spec: + hostNetwork: true + securityContext: + runAsUser: 0 + runAsGroup: 0 + containers: + - name: splunk + image: splunk/splunk:latest + ports: + - containerPort: 8000 + hostPort: 8000 + protocol: TCP + - containerPort: 8088 + hostPort: 8088 + protocol: TCP + - containerPort: 8089 + hostPort: 8089 + protocol: TCP + env: + - name: SPLUNK_START_ARGS + value: --accept-license + - name: SPLUNK_USER + value: root + - name: SPLUNK_PASSWORD + value: helloworld + - name: SPLUNK_LAUNCH_CONF + value: OPTIMISTIC_ABOUT_FILE_LOCKING=1 From 29cb9f77733348eae6c16209ddec8882c4f14f2d Mon Sep 17 00:00:00 2001 From: Mei Date: Thu, 9 Sep 2021 10:32:20 -0700 Subject: [PATCH 2/2] removed CircleCi pipeline --- .circleci/config.yml | 88 ---------------------------- .circleci/install_dep.sh | 5 -- .circleci/trigger_func_test.sh | 42 ------------- .github/workflows/ci_build_test.yaml | 2 +- 4 files changed, 1 insertion(+), 136 deletions(-) delete mode 100644 .circleci/config.yml delete mode 100755 .circleci/install_dep.sh delete mode 100755 .circleci/trigger_func_test.sh diff --git a/.circleci/config.yml b/.circleci/config.yml deleted file mode 100644 index 5c0b0c3..0000000 --- a/.circleci/config.yml +++ /dev/null @@ -1,88 +0,0 @@ -version: 2 -jobs: - build: - docker: - - image: circleci/ruby:2.6.1-node-browsers - working_directory: ~/repo - steps: - - checkout - - setup_remote_docker: - reusable: true - - run: - name: Install dependencies - command: | - .circleci/install_dep.sh - - run: - name: Builder - command: | - rake build -t -v - cp -R pkg /tmp - - persist_to_workspace: - root: /tmp - paths: - - pkg - - unit_test: - docker: - - image: circleci/ruby:2.6.1-node-browsers - working_directory: ~/repo - steps: - - attach_workspace: - at: /tmp - - checkout - - setup_remote_docker: - reusable: true - - run: - name: Install dependencies - command: | - .circleci/install_dep.sh - - run: - name: Run unit tests - command: | - bundle exec rake test -t -v - - func_test_main: - docker: - - image: circleci/ruby:2.6.1-node-browsers - working_directory: ~/repo - steps: - - checkout - - setup_remote_docker: - reusable: true - - run: - name: trigger - command: | - .circleci/trigger_func_test.sh main - - func_test_develop: - docker: - - image: circleci/ruby:2.6.1-node-browsers - working_directory: ~/repo - steps: - - checkout - - setup_remote_docker: - reusable: true - - run: - name: trigger - command: | - .circleci/trigger_func_test.sh develop - -workflows: - version: 2 - build_test_push: - jobs: - - build: - filters: - branches: - ignore: - - /^release\/.*/ - - main - - unit_test: - requires: - - build - - func_test_main: - requires: - - unit_test - - func_test_develop: - requires: - - unit_test \ No newline at end of file diff --git a/.circleci/install_dep.sh b/.circleci/install_dep.sh deleted file mode 100755 index 7c4d131..0000000 --- a/.circleci/install_dep.sh +++ /dev/null @@ -1,5 +0,0 @@ -#!/usr/bin/env bash -set -e -gem install bundler -bundle update --bundler -bundle install \ No newline at end of file diff --git a/.circleci/trigger_func_test.sh b/.circleci/trigger_func_test.sh deleted file mode 100755 index a08745a..0000000 --- a/.circleci/trigger_func_test.sh +++ /dev/null @@ -1,42 +0,0 @@ -#!/usr/bin/env bash - -# trigger SCK 'main' branch to introduce this new image from this commit -# to working version of every other component. -ORGANIZATION=splunk -PROJECT=splunk-connect-for-kubernetes -BRANCH=$1 - -# Trigger functional test -curl -X POST --header "Content-Type: application/json" \ - -d '{"build_parameters": {"CIRCLE_JOB":"build_test", "TRIG_BRANCH":"'"$CIRCLE_BRANCH"'", "TRIG_PROJECT":"'"$CIRCLE_PROJECT_REPONAME"'", "TRIG_REPO":"'"$CIRCLE_REPOSITORY_URL"'"}}' "https://circleci.com/api/v1/project/$ORGANIZATION/$PROJECT/tree/$BRANCH?circle-token=$CIRCLE_TOKEN" > build.json -cat build.json -BUILD_NUM=$(jq -r .build_num build.json) -sleep 10 - -# Wait until finish or maximum 20 minutes -TIMEOUT=20 -DONE="FALSE" -until [ "$TIMEOUT" -lt 0 ] || [ "$DONE" == "TRUE" ]; do - curl https://circleci.com/api/v1/project/$ORGANIZATION/$PROJECT/$BUILD_NUM?circle-token=$CIRCLE_TOKEN > build_progress.json - STATUS=$(jq -r .status build_progress.json) - echo "STATUS = $STATUS" - if [ "$STATUS" != "running" ] && [ "$STATUS" != "queued" ]; then - DONE="TRUE" - else - let TIMEOUT-- - sleep 60 - fi -done - -BUILD_URL=$(jq -r .build_url build_progress.json) -if [ "$DONE" == "FALSE" ]; then - # Cancel hanging job and fail - curl -X POST https://circleci.com/api/v1/project/$ORGANIZATION/$PROJECT/$BUILD_NUM/cancel?circle-token=$CIRCLE_TOKEN -else - if [ "$STATUS" != "success" ] && [ "$STATUS" != "fixed" ]; then - echo "Functional test have failed please see:" - echo $BUILD_URL - exit 1 - fi - exit 0 -fi diff --git a/.github/workflows/ci_build_test.yaml b/.github/workflows/ci_build_test.yaml index e273ff4..6b65488 100644 --- a/.github/workflows/ci_build_test.yaml +++ b/.github/workflows/ci_build_test.yaml @@ -8,7 +8,7 @@ on: jobs: build: - runs-on: ubuntu-latest + runs-on: ubuntu-20.04 steps: - name: Checkout code uses: actions/checkout@v2