mirror of
https://github.com/juanfont/headscale.git
synced 2025-07-18 21:18:56 -04:00
.github/workflow: only run a few selected postgres tests
We are already being punished by github actions, there seem to be little value in running all the tests for both databases, so only run a few key tests to check postgres isnt broken. Signed-off-by: Kristoffer Dalby <kristoffer@tailscale.com>
This commit is contained in:
parent
4668e5dd96
commit
05996a5048
@ -38,11 +38,12 @@ func findTests() []string {
|
|||||||
return tests
|
return tests
|
||||||
}
|
}
|
||||||
|
|
||||||
func updateYAML(tests []string, testPath string) {
|
func updateYAML(tests []string, jobName string, testPath string) {
|
||||||
testsForYq := fmt.Sprintf("[%s]", strings.Join(tests, ", "))
|
testsForYq := fmt.Sprintf("[%s]", strings.Join(tests, ", "))
|
||||||
|
|
||||||
yqCommand := fmt.Sprintf(
|
yqCommand := fmt.Sprintf(
|
||||||
"yq eval '.jobs.integration-test.strategy.matrix.test = %s' %s -i",
|
"yq eval '.jobs.%s.strategy.matrix.test = %s' %s -i",
|
||||||
|
jobName,
|
||||||
testsForYq,
|
testsForYq,
|
||||||
testPath,
|
testPath,
|
||||||
)
|
)
|
||||||
@ -59,7 +60,7 @@ func updateYAML(tests []string, testPath string) {
|
|||||||
log.Fatalf("failed to run yq command: %s", err)
|
log.Fatalf("failed to run yq command: %s", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
fmt.Printf("YAML file (%s) updated successfully\n", testPath)
|
fmt.Printf("YAML file (%s) job %s updated successfully\n", testPath, jobName)
|
||||||
}
|
}
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
@ -70,5 +71,21 @@ func main() {
|
|||||||
quotedTests[i] = fmt.Sprintf("\"%s\"", test)
|
quotedTests[i] = fmt.Sprintf("\"%s\"", test)
|
||||||
}
|
}
|
||||||
|
|
||||||
updateYAML(quotedTests, "./test-integration.yaml")
|
// Define selected tests for PostgreSQL
|
||||||
|
postgresTestNames := []string{
|
||||||
|
"TestACLAllowUserDst",
|
||||||
|
"TestPingAllByIP",
|
||||||
|
"TestEphemeral2006DeletedTooQuickly",
|
||||||
|
"TestPingAllByIPManyUpDown",
|
||||||
|
"TestSubnetRouterMultiNetwork",
|
||||||
|
}
|
||||||
|
|
||||||
|
quotedPostgresTests := make([]string, len(postgresTestNames))
|
||||||
|
for i, test := range postgresTestNames {
|
||||||
|
quotedPostgresTests[i] = fmt.Sprintf("\"%s\"", test)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Update both SQLite and PostgreSQL job matrices
|
||||||
|
updateYAML(quotedTests, "sqlite", "./test-integration.yaml")
|
||||||
|
updateYAML(quotedPostgresTests, "postgres", "./test-integration.yaml")
|
||||||
}
|
}
|
||||||
|
93
.github/workflows/integration-test-template.yml
vendored
Normal file
93
.github/workflows/integration-test-template.yml
vendored
Normal file
@ -0,0 +1,93 @@
|
|||||||
|
name: Integration Test Template
|
||||||
|
|
||||||
|
on:
|
||||||
|
workflow_call:
|
||||||
|
inputs:
|
||||||
|
test:
|
||||||
|
required: true
|
||||||
|
type: string
|
||||||
|
postgres_flag:
|
||||||
|
required: false
|
||||||
|
type: string
|
||||||
|
default: ""
|
||||||
|
database_name:
|
||||||
|
required: true
|
||||||
|
type: string
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
integration-test:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
env:
|
||||||
|
# Github does not allow us to access secrets in pull requests,
|
||||||
|
# so this env var is used to check if we have the secret or not.
|
||||||
|
# If we have the secrets, meaning we are running on push in a fork,
|
||||||
|
# there might be secrets available for more debugging.
|
||||||
|
# If TS_OAUTH_CLIENT_ID and TS_OAUTH_SECRET is set, then the job
|
||||||
|
# will join a debug tailscale network, set up SSH and a tmux session.
|
||||||
|
# The SSH will be configured to use the SSH key of the Github user
|
||||||
|
# that triggered the build.
|
||||||
|
HAS_TAILSCALE_SECRET: ${{ secrets.TS_OAUTH_CLIENT_ID }}
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
||||||
|
with:
|
||||||
|
fetch-depth: 2
|
||||||
|
- name: Get changed files
|
||||||
|
id: changed-files
|
||||||
|
uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3.0.2
|
||||||
|
with:
|
||||||
|
filters: |
|
||||||
|
files:
|
||||||
|
- '*.nix'
|
||||||
|
- 'go.*'
|
||||||
|
- '**/*.go'
|
||||||
|
- 'integration_test/'
|
||||||
|
- 'config-example.yaml'
|
||||||
|
- name: Tailscale
|
||||||
|
if: ${{ env.HAS_TAILSCALE_SECRET }}
|
||||||
|
uses: tailscale/github-action@6986d2c82a91fbac2949fe01f5bab95cf21b5102 # v3.2.2
|
||||||
|
with:
|
||||||
|
oauth-client-id: ${{ secrets.TS_OAUTH_CLIENT_ID }}
|
||||||
|
oauth-secret: ${{ secrets.TS_OAUTH_SECRET }}
|
||||||
|
tags: tag:gh
|
||||||
|
- name: Setup SSH server for Actor
|
||||||
|
if: ${{ env.HAS_TAILSCALE_SECRET }}
|
||||||
|
uses: alexellis/setup-sshd-actor@master
|
||||||
|
- uses: nixbuild/nix-quick-install-action@889f3180bb5f064ee9e3201428d04ae9e41d54ad # v31
|
||||||
|
if: steps.changed-files.outputs.files == 'true'
|
||||||
|
- uses: nix-community/cache-nix-action@135667ec418502fa5a3598af6fb9eb733888ce6a # v6.1.3
|
||||||
|
if: steps.changed-files.outputs.files == 'true'
|
||||||
|
with:
|
||||||
|
primary-key: nix-${{ runner.os }}-${{ runner.arch }}-${{ hashFiles('**/*.nix', '**/flake.lock') }}
|
||||||
|
restore-prefixes-first-match: nix-${{ runner.os }}-${{ runner.arch }}
|
||||||
|
- name: Run Integration Test
|
||||||
|
uses: Wandalen/wretry.action@e68c23e6309f2871ca8ae4763e7629b9c258e1ea # v3.8.0
|
||||||
|
if: steps.changed-files.outputs.files == 'true'
|
||||||
|
with:
|
||||||
|
# Our integration tests are started like a thundering herd, often
|
||||||
|
# hitting limits of the various external repositories we depend on
|
||||||
|
# like docker hub. This will retry jobs every 5 min, 10 times,
|
||||||
|
# hopefully letting us avoid manual intervention and restarting jobs.
|
||||||
|
# One could of course argue that we should invest in trying to avoid
|
||||||
|
# this, but currently it seems like a larger investment to be cleverer
|
||||||
|
# about this.
|
||||||
|
# Some of the jobs might still require manual restart as they are really
|
||||||
|
# slow and this will cause them to eventually be killed by Github actions.
|
||||||
|
attempt_delay: 300000 # 5 min
|
||||||
|
attempt_limit: 10
|
||||||
|
command: |
|
||||||
|
nix develop --command -- hi run "^${{ inputs.test }}$" \
|
||||||
|
--timeout=120m \
|
||||||
|
${{ inputs.postgres_flag }}
|
||||||
|
- uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
|
||||||
|
if: always() && steps.changed-files.outputs.files == 'true'
|
||||||
|
with:
|
||||||
|
name: ${{ inputs.database_name }}-${{ inputs.test }}-logs
|
||||||
|
path: "control_logs/*/*.log"
|
||||||
|
- uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
|
||||||
|
if: always() && steps.changed-files.outputs.files == 'true'
|
||||||
|
with:
|
||||||
|
name: ${{ inputs.database_name }}-${{ inputs.test }}-archives
|
||||||
|
path: "control_logs/*/*.tar"
|
||||||
|
- name: Setup a blocking tmux session
|
||||||
|
if: ${{ env.HAS_TAILSCALE_SECRET }}
|
||||||
|
uses: alexellis/block-with-tmux-action@master
|
100
.github/workflows/test-integration.yaml
vendored
100
.github/workflows/test-integration.yaml
vendored
@ -1,4 +1,4 @@
|
|||||||
name: Integration Tests
|
name: integration
|
||||||
# To debug locally on a branch, and when needing secrets
|
# To debug locally on a branch, and when needing secrets
|
||||||
# change this to include `push` so the build is ran on
|
# change this to include `push` so the build is ran on
|
||||||
# the main repository.
|
# the main repository.
|
||||||
@ -7,8 +7,7 @@ concurrency:
|
|||||||
group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }}
|
group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }}
|
||||||
cancel-in-progress: true
|
cancel-in-progress: true
|
||||||
jobs:
|
jobs:
|
||||||
integration-test:
|
sqlite:
|
||||||
runs-on: ubuntu-latest
|
|
||||||
strategy:
|
strategy:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
@ -80,78 +79,23 @@ jobs:
|
|||||||
- TestSSHNoSSHConfigured
|
- TestSSHNoSSHConfigured
|
||||||
- TestSSHIsBlockedInACL
|
- TestSSHIsBlockedInACL
|
||||||
- TestSSHUserOnlyIsolation
|
- TestSSHUserOnlyIsolation
|
||||||
database: [postgres, sqlite]
|
uses: ./.github/workflows/integration-test-template.yml
|
||||||
env:
|
with:
|
||||||
# Github does not allow us to access secrets in pull requests,
|
test: ${{ matrix.test }}
|
||||||
# so this env var is used to check if we have the secret or not.
|
postgres_flag: "--postgres=0"
|
||||||
# If we have the secrets, meaning we are running on push in a fork,
|
database_name: "sqlite"
|
||||||
# there might be secrets available for more debugging.
|
postgres:
|
||||||
# If TS_OAUTH_CLIENT_ID and TS_OAUTH_SECRET is set, then the job
|
strategy:
|
||||||
# will join a debug tailscale network, set up SSH and a tmux session.
|
fail-fast: false
|
||||||
# The SSH will be configured to use the SSH key of the Github user
|
matrix:
|
||||||
# that triggered the build.
|
test:
|
||||||
HAS_TAILSCALE_SECRET: ${{ secrets.TS_OAUTH_CLIENT_ID }}
|
- TestACLAllowUserDst
|
||||||
steps:
|
- TestPingAllByIP
|
||||||
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
- TestEphemeral2006DeletedTooQuickly
|
||||||
with:
|
- TestPingAllByIPManyUpDown
|
||||||
fetch-depth: 2
|
- TestSubnetRouterMultiNetwork
|
||||||
- name: Get changed files
|
uses: ./.github/workflows/integration-test-template.yml
|
||||||
id: changed-files
|
with:
|
||||||
uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3.0.2
|
test: ${{ matrix.test }}
|
||||||
with:
|
postgres_flag: "--postgres=1"
|
||||||
filters: |
|
database_name: "postgres"
|
||||||
files:
|
|
||||||
- '*.nix'
|
|
||||||
- 'go.*'
|
|
||||||
- '**/*.go'
|
|
||||||
- 'integration_test/'
|
|
||||||
- 'config-example.yaml'
|
|
||||||
- name: Tailscale
|
|
||||||
if: ${{ env.HAS_TAILSCALE_SECRET }}
|
|
||||||
uses: tailscale/github-action@6986d2c82a91fbac2949fe01f5bab95cf21b5102 # v3.2.2
|
|
||||||
with:
|
|
||||||
oauth-client-id: ${{ secrets.TS_OAUTH_CLIENT_ID }}
|
|
||||||
oauth-secret: ${{ secrets.TS_OAUTH_SECRET }}
|
|
||||||
tags: tag:gh
|
|
||||||
- name: Setup SSH server for Actor
|
|
||||||
if: ${{ env.HAS_TAILSCALE_SECRET }}
|
|
||||||
uses: alexellis/setup-sshd-actor@master
|
|
||||||
- uses: nixbuild/nix-quick-install-action@889f3180bb5f064ee9e3201428d04ae9e41d54ad # v31
|
|
||||||
if: steps.changed-files.outputs.files == 'true'
|
|
||||||
- uses: nix-community/cache-nix-action@135667ec418502fa5a3598af6fb9eb733888ce6a # v6.1.3
|
|
||||||
if: steps.changed-files.outputs.files == 'true'
|
|
||||||
with:
|
|
||||||
primary-key: nix-${{ runner.os }}-${{ runner.arch }}-${{ hashFiles('**/*.nix', '**/flake.lock') }}
|
|
||||||
restore-prefixes-first-match: nix-${{ runner.os }}-${{ runner.arch }}
|
|
||||||
- name: Run Integration Test
|
|
||||||
uses: Wandalen/wretry.action@e68c23e6309f2871ca8ae4763e7629b9c258e1ea # v3.8.0
|
|
||||||
if: steps.changed-files.outputs.files == 'true'
|
|
||||||
with:
|
|
||||||
# Our integration tests are started like a thundering herd, often
|
|
||||||
# hitting limits of the various external repositories we depend on
|
|
||||||
# like docker hub. This will retry jobs every 5 min, 10 times,
|
|
||||||
# hopefully letting us avoid manual intervention and restarting jobs.
|
|
||||||
# One could of course argue that we should invest in trying to avoid
|
|
||||||
# this, but currently it seems like a larger investment to be cleverer
|
|
||||||
# about this.
|
|
||||||
# Some of the jobs might still require manual restart as they are really
|
|
||||||
# slow and this will cause them to eventually be killed by Github actions.
|
|
||||||
attempt_delay: 300000 # 5 min
|
|
||||||
attempt_limit: 10
|
|
||||||
command: |
|
|
||||||
nix develop --command -- hi run "^${{ matrix.test }}$" \
|
|
||||||
--timeout=120m \
|
|
||||||
--postgres=${{ matrix.database == 'postgres' && 'true' || 'false' }}
|
|
||||||
- uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
|
|
||||||
if: always() && steps.changed-files.outputs.files == 'true'
|
|
||||||
with:
|
|
||||||
name: ${{ matrix.test }}-${{matrix.database}}-logs
|
|
||||||
path: "control_logs/*/*.log"
|
|
||||||
- uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
|
|
||||||
if: always() && steps.changed-files.outputs.files == 'true'
|
|
||||||
with:
|
|
||||||
name: ${{ matrix.test }}-${{matrix.database}}-archives
|
|
||||||
path: "control_logs/*/*.tar"
|
|
||||||
- name: Setup a blocking tmux session
|
|
||||||
if: ${{ env.HAS_TAILSCALE_SECRET }}
|
|
||||||
uses: alexellis/block-with-tmux-action@master
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user