name: Validate publishing functionality on: push: branches: - main - releases/* paths-ignore: - '**.md' pull_request: paths-ignore: - '**.md' permissions: contents: read defaults: run: shell: pwsh jobs: setup-java-publishing: name: Validate settings.xml runs-on: ${{ matrix.os }} strategy: fail-fast: false matrix: os: [macos-latest, windows-latest, ubuntu-latest] steps: - name: Checkout uses: actions/checkout@v7 with: persist-credentials: false - name: setup-java uses: ./ id: setup-java with: distribution: 'temurin' java-version: '11' server-id: maven server-username-env-var: MAVEN_USERNAME server-password-env-var: MAVEN_CENTRAL_TOKEN gpg-passphrase-env-var: MAVEN_GPG_PASSPHRASE - name: Validate settings.xml run: | $xmlPath = Join-Path $HOME ".m2" "settings.xml" Get-Content $xmlPath | ForEach-Object { Write-Host $_ } $content = [System.IO.File]::ReadAllText($xmlPath) $expected = @( '' ' false' ' ' ' ' ' maven' ' ${env.MAVEN_USERNAME}' ' ${env.MAVEN_CENTRAL_TOKEN}' ' ' ' ' '' ) -join "`n" if ($content -ne $expected) { Write-Host "Expected settings.xml:" $expected -split "`n" | ForEach-Object { Write-Host $_ } throw "Generated XML file is incorrect" } test-publishing-overwrite: name: settings.xml is overwritten if flag is true runs-on: ${{ matrix.os }} strategy: fail-fast: false matrix: os: [macos-latest, windows-latest, ubuntu-latest] steps: - name: Checkout uses: actions/checkout@v7 with: persist-credentials: false - name: Create fake settings.xml run: | $xmlDirectory = Join-Path $HOME ".m2" $xmlPath = Join-Path $xmlDirectory "settings.xml" New-Item -Path $xmlDirectory -ItemType Directory Set-Content -Path $xmlPath -Value "Fake_XML" - name: setup-java uses: ./ id: setup-java with: distribution: 'temurin' java-version: '11' server-id: maven server-username-env-var: MAVEN_USERNAME server-password-env-var: MAVEN_CENTRAL_TOKEN gpg-passphrase-env-var: MAVEN_GPG_PASSPHRASE - name: Validate settings.xml is overwritten run: | $xmlPath = Join-Path $HOME ".m2" "settings.xml" Get-Content $xmlPath | ForEach-Object { Write-Host $_ } $content = Get-Content $xmlPath -Raw if ($content -notlike '*maven*') { throw "settings.xml file is not overwritten" } test-publishing-skip-overwrite: name: settings.xml is not overwritten if flag is false runs-on: ${{ matrix.os }} strategy: fail-fast: false matrix: os: [macos-latest, windows-latest, ubuntu-latest] steps: - name: Checkout uses: actions/checkout@v7 with: persist-credentials: false - name: Create fake settings.xml run: | $xmlDirectory = Join-Path $HOME ".m2" $xmlPath = Join-Path $xmlDirectory "settings.xml" New-Item -Path $xmlDirectory -ItemType Directory Set-Content -Path $xmlPath -Value "Fake_XML" - name: setup-java uses: ./ id: setup-java with: distribution: 'temurin' java-version: '11' server-id: maven server-username-env-var: MAVEN_USERNAME server-password-env-var: MAVEN_CENTRAL_TOKEN overwrite-settings: false gpg-passphrase-env-var: MAVEN_GPG_PASSPHRASE - name: Validate that settings.xml is not overwritten run: | $xmlPath = Join-Path $HOME ".m2" "settings.xml" $content = Get-Content -Path $xmlPath -Raw Write-Host $content if ($content -notlike "*Fake_XML*") { throw "settings.xml file was overwritten but it should not be" } test-publishing-custom-location: name: settings.xml in custom location runs-on: ${{ matrix.os }} strategy: fail-fast: false matrix: os: [macos-latest, windows-latest, ubuntu-latest] steps: - name: Checkout uses: actions/checkout@v7 with: persist-credentials: false - name: setup-java uses: ./ id: setup-java with: distribution: 'temurin' java-version: '11' server-id: maven server-username-env-var: MAVEN_USERNAME server-password-env-var: MAVEN_CENTRAL_TOKEN gpg-passphrase-env-var: MAVEN_GPG_PASSPHRASE settings-path: ${{ runner.temp }} - name: Validate settings.xml location run: | $path = Join-Path $env:RUNNER_TEMP "settings.xml" if (-not (Test-Path $path)) { throw "settings.xml file is not found in expected location" } test-maven-repositories: name: Maven ${{ matrix.repositories }} repositories runs-on: ${{ matrix.os }} strategy: fail-fast: false matrix: os: [macos-latest, windows-latest, ubuntu-latest] repositories: [dependencies, plugins, both] steps: - name: Checkout uses: actions/checkout@v7 with: persist-credentials: false - name: Prepare Maven model inspection run: | $directory = Join-Path $env:RUNNER_TEMP "maven-repository-test" New-Item -Path $directory -ItemType Directory -Force | Out-Null $pomPath = Join-Path $directory "pom.xml" $warmSettingsPath = Join-Path $directory "warm-settings.xml" $cachePath = Join-Path $directory "repository" $outputPath = Join-Path $directory "warm-effective-pom.xml" # This project repository keeps the inspection plugin available offline # after the generated settings disable inherited plugin Central. @' 4.0.0 setup-java.test repository-settings 1.0 inspection https://repo.maven.apache.org/maven2 '@ | Set-Content -Path $pomPath '' | Set-Content -Path $warmSettingsPath mvn --batch-mode --no-transfer-progress --settings $warmSettingsPath ` "-Dmaven.repo.local=$cachePath" --file $pomPath ` org.apache.maven.plugins:maven-help-plugin:3.5.1:effective-pom ` "-Doutput=$outputPath" if ($LASTEXITCODE -ne 0) { throw "Could not prepare the Maven Help Plugin" } - name: Configure dependency and plugin repositories uses: ./ with: distribution: 'temurin' java-version: '21' settings-path: ${{ runner.temp }}/maven-repository-test/settings mvn-server-credentials: | private:PRIVATE_USERNAME:PRIVATE_TOKEN mvn-repositories: ${{ matrix.repositories != 'plugins' && 'private:https://repo.example.invalid/maven:false' || '' }} mvn-plugin-repositories: ${{ matrix.repositories != 'dependencies' && 'private:https://repo.example.invalid/maven:false' || '' }} mvn-repositories-include-central: false - name: Validate generated settings and effective Maven repositories env: REPOSITORY_CONFIGURATION: ${{ matrix.repositories }} run: | $directory = Join-Path $env:RUNNER_TEMP "maven-repository-test" $settingsPath = Join-Path $directory "settings/settings.xml" [xml]$settings = Get-Content -Path $settingsPath -Raw $profiles = @($settings.settings.profiles.profile) if ($profiles.Count -ne 1 -or $profiles[0].id -ne "setup-java-repositories") { throw "Expected one repository profile" } $activeProfiles = @($settings.settings.activeProfiles.activeProfile) if ($activeProfiles.Count -ne 1 -or $activeProfiles[0] -ne "setup-java-repositories") { throw "Expected one active repository profile" } $server = $settings.settings.servers.server if ($server.id -ne "private" -or $server.username -ne '${env.PRIVATE_USERNAME}' -or $server.password -ne '${env.PRIVATE_TOKEN}') { throw "Repository credentials were not preserved" } function Assert-Repositories($repositories, $expectPrivate, $context) { $central = @($repositories | Where-Object { $_.id -eq "central" }) if ($central.Count -ne 1 -or $central[0].releases.enabled -ne "false" -or $central[0].snapshots.enabled -ne "false") { throw "$context did not disable inherited Maven Central" } $private = @($repositories | Where-Object { $_.id -eq "private" }) $expectedCount = if ($expectPrivate) { 1 } else { 0 } if ($private.Count -ne $expectedCount) { throw "$context has incorrect private repositories" } if ($expectPrivate -and ($private[0].url -ne "https://repo.example.invalid/maven" -or $private[0].snapshots.enabled -ne "false")) { throw "$context has incorrect private repository settings" } } $expectDependencies = $env:REPOSITORY_CONFIGURATION -ne "plugins" $expectPlugins = $env:REPOSITORY_CONFIGURATION -ne "dependencies" Assert-Repositories @($profiles[0].repositories.repository) $expectDependencies "Settings dependency repositories" Assert-Repositories @($profiles[0].pluginRepositories.pluginRepository) $expectPlugins "Settings plugin repositories" $pomPath = Join-Path $directory "pom.xml" $cachePath = Join-Path $directory "repository" $outputPath = Join-Path $directory "effective-pom.xml" mvn --batch-mode --no-transfer-progress --offline --settings $settingsPath ` "-Dmaven.repo.local=$cachePath" --file $pomPath ` org.apache.maven.plugins:maven-help-plugin:3.5.1:effective-pom ` "-Doutput=$outputPath" if ($LASTEXITCODE -ne 0) { throw "Could not inspect the effective Maven model" } [xml]$effectivePom = Get-Content -Path $outputPath -Raw Assert-Repositories @($effectivePom.project.repositories.repository) $expectDependencies "Effective dependency repositories" Assert-Repositories @($effectivePom.project.pluginRepositories.pluginRepository) $expectPlugins "Effective plugin repositories"