Skip to content

ok-to-test-command #886

ok-to-test-command

ok-to-test-command #886

# This was adapted from https://github.com/imjohnbo/ok-to-test/blob/master/.github/workflows/integration.yml
name: Validate Pull Request (fork)
on:
repository_dispatch:
types: [ok-to-test-command]
jobs:
integration-tests-fork:
runs-on: [self-hosted, 1ES.Pool=aso-1es-pool]
if:
github.event_name == 'repository_dispatch' &&
github.event.client_payload.slash_command.args.named.sha != '' &&
contains(github.event.client_payload.pull_request.head.sha, github.event.client_payload.slash_command.args.named.sha)
permissions:
checks: write
packages: read
steps:
# Update check run called "integration-tests" setting status to in_progress
# Note: There is no way to specify which suite the check we create goes into apparently, see:
# https://github.community/t/specify-check-suite-when-creating-a-checkrun/118380
# Also, details_url doesn't currently work when set via a GITHUB_TOKEN which is what we're using, see:
# https://github.community/t/create-a-check-run-details-url-is-not-being-set/166002
# Given the above limitations, we create a new check for the fork integration tests, and then at the end
# of this job we update the "integration-tests" check to be passing as well (so this single job really
# ends up writing the status 2 checks, 1 is "integration-tests" and one is "integration-tests-fork").
- name: set-check-run-in-progress
uses: actions/github-script@v6
id: set-check-run-in-progress
env:
number: ${{ github.event.client_payload.pull_request.number }}
job: ${{ github.job }}
server_url: ${{ github.server_url }}
repo: ${{ github.repository }}
run_id: ${{ github.run_id }}
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
script: |
const url = `${process.env.server_url}/${process.env.repo}/actions/runs/${process.env.run_id}`
const { data: pull } = await github.rest.pulls.get({
...context.repo,
pull_number: process.env.number
});
const ref = pull.head.sha;
const { data: result } = await github.rest.checks.create({
...context.repo,
name: process.env.job,
head_sha: ref,
status: 'in_progress',
details_url: url,
});
return result;
- name: Fork based /ok-to-test checkout
uses: actions/checkout@v3
with:
fetch-depth: 0 # required to access tags
submodules: 'true'
ref: 'refs/pull/${{ github.event.client_payload.pull_request.number }}/merge'
- name: Force docker to SSD
run: sudo scripts/v2/linux-docker-use-ssd.sh --containerd true
- name: check-changes
id: check-changes
run: scripts/v2/check-changes.sh
- name: Log in to GitHub Docker Registry
uses: docker/login-action@v2
with:
registry: docker.pkg.github.com # ghcr.io not yet enabled for Azure org
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
if: steps.check-changes.outputs.code-changed == 'true'
# Note: Changes to this step must also be mirrored into pr-validation.yaml
- name: Build devcontainer image
# We must issue a manual pull before the build so the image gets copied locally, because
# docker.pkg.github.com is not a valid Docker registry and doesn't work with --cache-from,
# however, `docker pull` will fall back to other methods that do work and get the image loaded.
#
# This message comes from "docker pull":
#
# Run docker pull docker.pkg.github.com/azure/azure-service-operator/aso-devcontainer:latest
# WARNING: ⚠️ Failed to pull manifest by the resolved digest. This registry does not
# appear to conform to the distribution registry specification; falling back to
# pull by tag. This fallback is DEPRECATED, and will be removed in a future
# release. Please contact admins of https://docker.pkg.github.com. ⚠️
#
# See: https://github.com/moby/moby/issues/41687#issuecomment-733826074 and related issues
run: |
docker pull docker.pkg.github.com/azure/azure-service-operator/aso-devcontainer:latest
docker build --cache-from docker.pkg.github.com/azure/azure-service-operator/aso-devcontainer:latest --tag devcontainer:latest .devcontainer
env:
DOCKER_BUILDKIT: 1
if: steps.check-changes.outputs.code-changed == 'true'
- name: Run devcontainer image
id: devcontainer
run: |
container_id=$(docker create -w /workspace -v $GITHUB_WORKSPACE:/workspace -v /var/run/docker.sock:/var/run/docker.sock --network=host devcontainer:latest)
docker start "$container_id"
echo "container_id=$container_id" >> $GITHUB_ENV
if: steps.check-changes.outputs.code-changed == 'true'
- name: Run integration tests
run: |
container_id=${{ env.container_id }}
docker exec --env HOSTROOT=$GITHUB_WORKSPACE -e GITHUB_ACTIONS -e AZURE_TENANT_ID -e AZURE_SUBSCRIPTION_ID "$container_id" task controller:ci-integration-tests
env:
AZURE_TENANT_ID: ${{ secrets.AZURE_TENANT_ID }}
AZURE_SUBSCRIPTION_ID: ${{ secrets.AZURE_SUBSCRIPTION_ID }}
if: steps.check-changes.outputs.code-changed == 'true'
# Update check run called "integration-fork"
- name: update-integration-tests-result
uses: actions/github-script@v6
id: update-check-run
if: ${{ always() }}
env:
number: ${{ github.event.client_payload.pull_request.number }}
job: ${{ github.job }}
integration_test_job: 'integration-tests' # This is the name of the job defined in pr-validation.yml
# Conveniently, job.status maps to https://developer.github.com/v3/checks/runs/#update-a-check-run
conclusion: ${{ job.status }}
server_url: ${{ github.server_url }}
repo: ${{ github.repository }}
run_id: ${{ github.run_id }}
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
script: |
const url = `${process.env.server_url}/${process.env.repo}/actions/runs/${process.env.run_id}`
const { data: pull } = await github.rest.pulls.get({
...context.repo,
pull_number: process.env.number
});
const ref = pull.head.sha;
const { data: checks } = await github.rest.checks.listForRef({
...context.repo,
ref
});
const forkCheck = checks.check_runs.filter(c => c.name === process.env.job);
await github.rest.checks.update({
...context.repo,
check_run_id: forkCheck[0].id,
status: 'completed',
conclusion: process.env.conclusion,
details_url: url,
});
const mainCheck = checks.check_runs.filter(c => c.name === process.env.integration_test_job);
const { data: result } = await github.rest.checks.update({
...context.repo,
check_run_id: mainCheck[0].id,
status: 'completed',
conclusion: process.env.conclusion,
details_url: url,
});
return result;