-
Notifications
You must be signed in to change notification settings - Fork 542
12367 GitHub actions workflow for jenkins redundancy #12368
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: develop
Are you sure you want to change the base?
Changes from all commits
741a78c
a80c6a4
22183e9
09ed1d1
45dfd49
b89507a
14dcdbd
130702e
fba6ec5
2c9ab4a
b96bdf6
b7ab2c4
afa78e1
279911e
68ec7d5
8190f6d
9dc575b
91ecc55
2d62696
9f91441
a45ce24
985e032
e9e11e7
2cfaeca
ef0245b
33cfb1f
61413ac
b890fde
d7b33e8
d3ec604
7b400e4
ee83f24
1b195de
54b11ac
4414e88
9acb44f
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,285 @@ | ||
| name: Container Integration Tests Workflow | ||
|
|
||
| on: | ||
| workflow_dispatch: | ||
| push: | ||
| branches: | ||
| - develop | ||
| - master | ||
| paths-ignore: | ||
| - "doc/**" | ||
| - "**/*.md" | ||
| - ".github/ISSUE_TEMPLATE/**" | ||
| - ".github/*.md" | ||
| pull_request: | ||
| branches: | ||
| - develop | ||
|
Member
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Should we add "master" here? That way the tests will run when we release, I would think, after this step: https://guides.dataverse.org/en/6.10.1/developers/making-releases.html#merge-develop-into-master-non-hotfix-only Here's an example of where we merged develop into master:
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Absolutely, I'll add master in there. (I actually didn't know y'all used master)
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Done |
||
| - master | ||
| paths-ignore: | ||
| - "doc/**" | ||
| - "**/*.md" | ||
| - ".github/ISSUE_TEMPLATE/**" | ||
| - ".github/*.md" | ||
|
srmanda-cs marked this conversation as resolved.
|
||
|
|
||
| concurrency: | ||
| group: "container-integration-tests-${{ github.ref }}" | ||
| cancel-in-progress: true | ||
|
|
||
| jobs: | ||
| main-integration-tests-workflow: | ||
| runs-on: ubuntu-latest | ||
| timeout-minutes: 60 | ||
|
|
||
| defaults: | ||
| run: | ||
| shell: bash | ||
|
|
||
| permissions: | ||
|
srmanda-cs marked this conversation as resolved.
|
||
| contents: read | ||
| checks: write | ||
| pull-requests: write | ||
|
|
||
| steps: | ||
|
|
||
| # --------------------------- | ||
| # CHECKOUT | ||
| # --------------------------- | ||
| - name: Checkout repository | ||
| uses: actions/checkout@v6 | ||
|
|
||
| # --------------------------- | ||
| # VERIFY DOCKER | ||
| # --------------------------- | ||
| - name: Verify Docker | ||
| run: | | ||
| set -euo pipefail | ||
| docker version | ||
|
|
||
| # --------------------------- | ||
| # SETUP JAVA + MAVEN | ||
| # --------------------------- | ||
| - name: Setup Java | ||
| uses: actions/setup-java@v5 | ||
| with: | ||
| distribution: "temurin" | ||
| java-version: "21" | ||
| cache: "maven" | ||
|
|
||
| - name: Verify Maven | ||
| run: | | ||
| set -euo pipefail | ||
| mvn -version | ||
|
|
||
| # --------------------------- | ||
| # BUILD IMAGES (Dataverse-native) | ||
| # --------------------------- | ||
| - name: Build Dataverse containers via Maven | ||
| run: | | ||
| set -euo pipefail | ||
| mvn -Pct -T 1C package | ||
|
|
||
| # --------------------------- | ||
| # START CONTAINERS (BACKGROUND) | ||
| # --------------------------- | ||
| - name: Start Dataverse stack | ||
| run: | | ||
| set -euo pipefail | ||
| mvn -Pct docker:start \ | ||
| -Ddataverse.feature.index-harvested-metadata-source=true \ | ||
| -Ddataverse.oai.server.maxidentifiers=2 \ | ||
| -Ddataverse.oai.server.maxrecords=2 | ||
|
|
||
| # --------------------------- | ||
| # WAIT FOR API READINESS | ||
| # --------------------------- | ||
| - name: Wait for Dataverse API readiness | ||
| run: | | ||
| set -euo pipefail | ||
| URL="http://localhost:8080/api/info/version" | ||
| MAX_ATTEMPTS=10 | ||
| SLEEP_TIME=15 | ||
| echo "Waiting for Dataverse readiness..." | ||
| for attempt in $(seq 1 $MAX_ATTEMPTS); do | ||
| echo "Attempt $attempt..." | ||
| RESPONSE=$(curl -s --max-time 15 "$URL" || true) | ||
| STATUS=$(echo "$RESPONSE" | jq -r '.status' 2>/dev/null || echo "NOT_READY") | ||
| if [ "$STATUS" = "OK" ]; then | ||
| echo "Dataverse endpoint is READY." | ||
| echo "Dataverse waiting for full readiness. Waiting 30 more seconds." | ||
| sleep 30 | ||
| echo "Response: $RESPONSE" | ||
| exit 0 | ||
| fi | ||
| echo "Not ready. Sleeping ${SLEEP_TIME}s..." | ||
| sleep $SLEEP_TIME | ||
| if [ $SLEEP_TIME -lt 60 ]; then | ||
| SLEEP_TIME=$((SLEEP_TIME * 2)) | ||
| if [ $SLEEP_TIME -gt 60 ]; then | ||
| SLEEP_TIME=60 | ||
| fi | ||
| fi | ||
| done | ||
| echo "Dataverse failed to become ready." | ||
| docker ps | ||
| CONTAINERS="$(docker ps -aq)" | ||
| if [ -n "$CONTAINERS" ]; then | ||
| for cid in $CONTAINERS; do | ||
| echo "===== Logs for container $cid =====" | ||
| docker logs "$cid" || true | ||
| done | ||
| else | ||
| echo "No running containers to show logs for." | ||
| fi | ||
| exit 1 | ||
|
|
||
| # --------------------------- | ||
| # MAP LOCALSTACK TO LOCALHOST | ||
| # --------------------------- | ||
| - name: Map localstack to localhost for Maven tests | ||
| run: echo "127.0.0.1 localstack" | sudo tee -a /etc/hosts | ||
|
|
||
| # --------------------------- | ||
| # CONFIGURE DATAVERSE FOR TESTS | ||
| # --------------------------- | ||
| - name: Configure Dataverse API Settings | ||
| run: | | ||
| set -euo pipefail | ||
|
|
||
| echo "Setting API Database Settings via internal container curl..." | ||
|
|
||
| # We define the settings in an array | ||
| declare -A settings=( | ||
| [":BuiltinUsersKey"]="burrito" | ||
| [":ProvCollectionEnabled"]="true" | ||
| [":AllowApiTokenLookupViaApi"]="true" | ||
| [":AllowSignUp"]="true" | ||
| ) | ||
| # We run curl INSIDE the container so the source IP is 127.0.0.1 | ||
| for key in "${!settings[@]}"; do | ||
| echo "Setting $key..." | ||
| docker exec dev_dataverse curl --fail-with-body -sS -X PUT -d "${settings[$key]}" "http://localhost:8080/api/admin/settings/$key" | ||
| echo "" | ||
| done | ||
|
|
||
| # --------------------------- | ||
| # PRE-TEST INJECTIONS | ||
| # --------------------------- | ||
| - name: Put SUSHI config file in place | ||
| run: | | ||
| set -euo pipefail | ||
|
|
||
| SOURCE_FILE="${{ github.workspace }}/src/test/java/edu/harvard/iq/dataverse/makedatacount/sushi_sample_logs.json" | ||
|
|
||
| echo "Injecting local file into container..." | ||
| # This reads the local file and writes it inside the container using standard input | ||
| docker exec -i dev_dataverse sh -c "cat > /tmp/sushi_sample_logs.json" < "$SOURCE_FILE" | ||
|
|
||
| # Verify the content is actually there and has size | ||
| docker exec dev_dataverse ls -l /tmp/sushi_sample_logs.json | ||
| docker exec dev_dataverse head -n 5 /tmp/sushi_sample_logs.json | ||
|
|
||
| # --------------------------- | ||
| # RUN MAVEN INTEGRATION TESTS | ||
| # --------------------------- | ||
| - name: Run Maven Integration Tests | ||
| env: | ||
| DVAPIKEY: "burrito" | ||
| DV_APIKEY: "burrito" | ||
| DV_API_KEY: "burrito" | ||
| run: | | ||
| set -euo pipefail | ||
| TEST_SUITE=$(cat tests/integration-tests.txt) | ||
|
|
||
| echo "Running suite: $TEST_SUITE" | ||
|
|
||
| mvn test \ | ||
| -Dtest="$TEST_SUITE" \ | ||
| -Dmaven.test.failure.ignore=true \ | ||
| -Ddataverse.test.baseurl=http://localhost:8080 \ | ||
| -DcompilerArgument=-Xlint:unchecked | ||
|
|
||
| # --------------------------- | ||
| # UPLOAD SUREFIRE/FAILSAFE REPORTS | ||
| # --------------------------- | ||
| - name: Upload Test Failure Reports | ||
| if: always() | ||
| uses: actions/upload-artifact@v7 | ||
| with: | ||
| name: maven-test-reports | ||
| path: | | ||
| target/surefire-reports/ | ||
| target/failsafe-reports/ | ||
| retention-days: 14 | ||
|
|
||
| # --------------------------- | ||
| # PUBLISH TEST DASHBOARD IN GITHUB PR | ||
| # --------------------------- | ||
| - name: Publish Test Results Dashboard | ||
| uses: EnricoMi/publish-unit-test-result-action@v2 | ||
| if: always() | ||
| with: | ||
| files: | | ||
| target/failsafe-reports/TEST-*.xml | ||
| target/surefire-reports/TEST-*.xml | ||
|
|
||
| # --------------------------- | ||
| # FAIL WORKFLOW IF TESTS FAILED | ||
| # --------------------------- | ||
| - name: Check for Test Failures | ||
| if: always() | ||
| run: | | ||
| echo "Checking Surefire/Failsafe reports for failures..." | ||
| if grep -q "<failure" target/surefire-reports/*.xml target/failsafe-reports/*.xml 2>/dev/null; then | ||
| echo "Tests failed! Failing the workflow." | ||
| exit 1 | ||
| fi | ||
| echo "All tests passed." | ||
|
|
||
| # --------------------------- | ||
| # COLLECT DOCKER LOGS (ALWAYS, WITH MAPPING) | ||
| # --------------------------- | ||
| - name: Collect Docker logs (mapped) | ||
| if: always() | ||
| run: | | ||
| mkdir -p docker-logs | ||
| echo "Gathering container metadata..." | ||
| docker ps -a --format '{{.Names}}|{{.Image}}|{{.Status}}' > docker-logs/container-summary.txt | ||
| while IFS='|' read -r name image status; do | ||
| # Create a readable label | ||
| label="$name" | ||
| case "$name" in | ||
| *dataverse*) | ||
| label="dataverse-app" | ||
| ;; | ||
| *postgres*) | ||
| label="postgres-db" | ||
| ;; | ||
| *solr*) | ||
| label="solr-index" | ||
| ;; | ||
| *localstack*) | ||
| label="localstack-s3" | ||
| ;; | ||
| esac | ||
| echo "Collecting logs for $name ($label)" | ||
| { | ||
| echo "===== CONTAINER: $name =====" | ||
| echo "Label: $label" | ||
| echo "Image: $image" | ||
| echo "Status: $status" | ||
| echo "" | ||
| echo "===== LOGS =====" | ||
| docker logs --timestamps "$name" 2>&1 || true | ||
| } > "docker-logs/${label}__${name}.log" | ||
| done < docker-logs/container-summary.txt | ||
|
|
||
| # --------------------------- | ||
| # UPLOAD DOCKER LOGS (ALWAYS) | ||
| # --------------------------- | ||
| - name: Upload Docker logs | ||
| if: always() | ||
| uses: actions/upload-artifact@v7 | ||
| with: | ||
| name: docker-logs | ||
| path: docker-logs/ | ||
| retention-days: 14 | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -21,6 +21,7 @@ | |
| import static org.hamcrest.CoreMatchers.equalTo; | ||
| import static org.hamcrest.CoreMatchers.startsWith; | ||
| import static org.junit.jupiter.api.Assertions.*; | ||
| import org.junit.jupiter.api.Disabled; | ||
|
|
||
| public class DataRetrieverApiIT { | ||
|
|
||
|
|
@@ -111,6 +112,7 @@ public void testRetrieveMyDataAsJsonString() throws InterruptedException { | |
| } | ||
|
|
||
| // Test getting a list of collections that the user can add datasets to | ||
| @Disabled("Temporarily disabled because this integration test is not reliable in CI; re-enable once stabilized. All assertions return one extra dataset than expected.") | ||
|
Member
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Once we merge this PR, we plan to re-enable this test. See the following:
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Noted. Thank you! |
||
| @Test | ||
| public void testRetrieveMyDataCollections() throws InterruptedException { | ||
| int rootCount = 1; // everyone has access to this dataverse | ||
|
|
||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Do we need "push" at all? We have branch protection turned on for both "develop" and "master".
Uh oh!
There was an error while loading. Please reload this page.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
We don't "need" push strictly speaking, but its a bit of defensive programming. Just in case. It doesn't hurt to be there, and lets the team know if something is broken in case of emergencies if anyone decides to disable branch protection for a "quick fix".