GitHub Actions Certification
Continuous Deployment with GitHub Actions
Setting Output for Integration testing
This guide shows you how to dynamically fetch your Kubernetes Ingress host, expose it as a job output in a dev-deploy
job, and consume that output in an integration-testing
job to verify your /live
endpoint. By the end, you’ll have a seamless flow where the Ingress URL travels between jobs in the same workflow.
Overview
- Capture the Ingress host URL after deployment
- Export it as a job output
- Use the output in a downstream integration test
1. Deploying to Dev and Capturing the Ingress URL
In the dev-deploy
job, we apply Kubernetes manifests and query the Ingress host name. We then write it to $GITHUB_OUTPUT
so it becomes available to other jobs.
jobs:
dev-deploy:
needs: docker
runs-on: ubuntu-latest
steps:
- name: Checkout Repository
uses: actions/checkout@v4
- name: Install kubectl CLI
uses: azure/setup-kubectl@v3
with:
version: 'v1.26.0'
- name: Configure kubeconfig
uses: azure/k8s-set-context@v3
with:
method: kubeconfig
kubeconfig: ${{ secrets.KUBECONFIG }}
- name: Deploy to Dev Environment
run: kubectl apply -f kubernetes/development
- name: Set App Ingress Host URL
id: set-ingress-host-address
run: |
HOST=$(kubectl -n ${{ vars.NAMESPACE }} \
get ingress -o jsonpath='{.items[0].spec.tls[0].hosts[0]}')
echo "APP_INGRESS_URL=$HOST" >> "$GITHUB_OUTPUT"
outputs:
APP_INGRESS_URL: ${{ steps.set-ingress-host-address.outputs.APP_INGRESS_URL }}
Note
Ensure your Kubernetes context and namespace (${{ vars.NAMESPACE }}
) are correctly configured before running kubectl
.
2. Defining the Integration Testing Job
After dev-deploy
completes, integration-testing
retrieves the APP_INGRESS_URL
output and calls the /live
endpoint using curl
and jq
.
integration-testing:
name: Dev Integration Testing
needs: dev-deploy
runs-on: ubuntu-latest
steps:
- name: Test `/live` Endpoint
env:
URL: ${{ needs.dev-deploy.outputs.APP_INGRESS_URL }}
run: |
echo "Testing endpoint: https://$URL/live"
curl https://$URL/live -s -k | jq -r .status | grep -iq live
Note
The Ubuntu runner includes both curl
and jq
by default. If you use a custom runner, install these tools before running the test.
3. Passing Values Between Jobs
GitHub Actions lets you map step outputs to job outputs and then reference them in downstream jobs via the needs
context.
Level | Syntax | Example |
---|---|---|
Step output | steps.<step_id>.outputs.<output_name> | steps.set-ingress-host-address.outputs.APP_INGRESS_URL |
Job output | needs.<job_id>.outputs.<output_name> | needs.dev-deploy.outputs.APP_INGRESS_URL |
For more details, see the GitHub Actions contexts documentation.
4. Complete Workflow Example
Here’s how the full .github/workflows/solar-system.yml
might look with both jobs defined:
name: Deploy and Test
on:
push:
branches: [ main ]
jobs:
dev-deploy:
needs: docker
runs-on: ubuntu-latest
steps:
- name: Checkout Repository
uses: actions/checkout@v4
- name: Install kubectl CLI
uses: azure/setup-kubectl@v3
with:
version: 'v1.26.0'
- name: Configure kubeconfig
uses: azure/k8s-set-context@v3
with:
method: kubeconfig
kubeconfig: ${{ secrets.KUBECONFIG }}
- name: Deploy to Dev Environment
run: kubectl apply -f kubernetes/development
- name: Set App Ingress Host URL
id: set-ingress-host-address
run: |
HOST=$(kubectl -n ${{ vars.NAMESPACE }} \
get ingress -o jsonpath='{.items[0].spec.tls[0].hosts[0]}')
echo "APP_INGRESS_URL=$HOST" >> "$GITHUB_OUTPUT"
outputs:
APP_INGRESS_URL: ${{ steps.set-ingress-host-address.outputs.APP_INGRESS_URL }}
integration-testing:
name: Dev Integration Testing
needs: dev-deploy
runs-on: ubuntu-latest
steps:
- name: Test `/live` Endpoint
env:
URL: ${{ needs.dev-deploy.outputs.APP_INGRESS_URL }}
run: |
echo "Testing endpoint: https://$URL/live"
curl https://$URL/live -s -k | jq -r .status | grep -iq live
References
Watch Video
Watch video content