diff --git a/.github/workflows/README.md b/.github/workflows/README.md new file mode 100644 index 0000000..43af343 --- /dev/null +++ b/.github/workflows/README.md @@ -0,0 +1,62 @@ +# GitHub Actions Workflows + +## Setup +- workloads run using [GitHub self-hosted runners](https://help.github.com/en/actions/automating-your-workflow-with-github-actions/about-self-hosted-runners) +- project admins maintain a private Google Compute Engine VM for running tests + - VM should be at least n1-standard-4 with 50GB persistent disk + - instructions for setting up the VM can be found in repo settings under "Actions" + - ⚠️ WARNING: VM should be set up with no GCP service account + - external contributors could contribute malicious PRs to run code on our test VM. Ensure no service accounts or other secrets exist on the VM + - An empty GCP project should be used for extra security + - to set up dependencies, run the following commands: + ``` + # install kubectl + sudo apt-get install kubectl + + # install kind + curl -Lo ./kind "https://github.com/kubernetes-sigs/kind/releases/download/v0.7.0/kind-$(uname)-amd64" && \ + chmod +x ./kind && \ + sudo mv ./kind /usr/local/bin + + # install skaffold + curl -Lo skaffold https://storage.googleapis.com/skaffold/releases/latest/skaffold-linux-amd64 && \ + chmod +x skaffold && \ + sudo mv skaffold /usr/local/bin + + # install docker + sudo apt install apt-transport-https ca-certificates curl gnupg2 software-properties-common && \ + curl -fsSL https://download.docker.com/linux/debian/gpg | sudo apt-key add - && \ + sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/debian $(lsb_release -cs) stable" && \ + sudo apt update && \ + sudo apt install docker-ce && \ + sudo usermod -aG docker ${USER} + + # logout and back on + exit + ``` + - ensure GitHub Actions runs as background service: + ``` + sudo ∼/actions-runner/svc.sh install + sudo ∼/actions-runner/svc.sh start + ``` + + +--- +## Workflows + +### ci.yaml + +#### Triggers +- commits pushed to master +- PRs to master +- PRs to release/ branches + +#### Actions +- ensures kind cluster is running +- builds all containers in src/ +- deploys local containers to kind + - ensures all pods reach ready state + - ensures HTTP request to frontend returns HTTP status 200 +- deploys manifests from /releases + - ensures all pods reach ready state + - ensures HTTP request to frontend returns HTTP status 200 diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..2661a8f --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,53 @@ +name: "Continuous Integration" +on: + push: + # run on pushes to master or release/* + branches: + - master + - release/* + pull_request: + # run on pull requests targeting master + branches: + - master +jobs: + run-tests: + runs-on: self-hosted + steps: + - uses: actions/checkout@v2 + - name: Setup Cluster + run: | + set -x + kind delete cluster || true + kind create cluster + kubectl get nodes + - name: Deploy From Source + run: | + skaffold run + - name: Wait For Pods + timeout-minutes: 20 + run: | + set -x + kubectl wait --for=condition=available --timeout=500s deployment/adservice + kubectl wait --for=condition=available --timeout=500s deployment/cartservice + kubectl wait --for=condition=available --timeout=500s deployment/checkoutservice + kubectl wait --for=condition=available --timeout=500s deployment/currencyservice + kubectl wait --for=condition=available --timeout=500s deployment/emailservice + kubectl wait --for=condition=available --timeout=500s deployment/frontend + kubectl wait --for=condition=available --timeout=500s deployment/loadgenerator + kubectl wait --for=condition=available --timeout=500s deployment/paymentservice + kubectl wait --for=condition=available --timeout=500s deployment/productcatalogservice + kubectl wait --for=condition=available --timeout=500s deployment/recommendationservice + kubectl wait --for=condition=available --timeout=500s deployment/shippingservice + - name: Smoke Test + timeout-minutes: 5 + run: | + set -x + RESULT=" " + while [[ "$RESULT" != " HTTP/1.1 200 OK" ]]; do + sleep 1 + RESULT=$(kubectl exec deployments/frontend -- sh -c "wget --spider -S "http://frontend" 2>&1 | grep 'HTTP/'") + echo "front end response: $RESULT" + done + if [[ "$RESULT" != " HTTP/1.1 200 OK" ]]; then + exit 1 + fi diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 124f5dd..0000000 --- a/.travis.yml +++ /dev/null @@ -1,12 +0,0 @@ -sudo: required - -services: -- docker - -install: -- curl -Lo skaffold https://storage.googleapis.com/skaffold/releases/v0.20.0/skaffold-linux-amd64 -- chmod +x skaffold -- sudo mv skaffold /usr/local/bin - -script: -- skaffold build --profile travis-ci diff --git a/skaffold.yaml b/skaffold.yaml index 665f80a..dfd6aeb 100644 --- a/skaffold.yaml +++ b/skaffold.yaml @@ -49,12 +49,6 @@ deploy: manifests: - ./kubernetes-manifests/**.yaml profiles: -# "travis-ci" profile is used to build the images without -# pushing them. -- name: travis-ci - build: - local: - push: false # "gcb" profile allows building and pushing the images # on Google Container Builder without requiring docker # installed on the developer machine. However, note that