diff --git a/.github/workflows/gateway-conformance.yml b/.github/workflows/gateway-conformance.yml new file mode 100644 index 00000000..7c729e87 --- /dev/null +++ b/.github/workflows/gateway-conformance.yml @@ -0,0 +1,103 @@ +name: Gateway Conformance + +on: + push: + branches: + - main + pull_request: + +env: + LASSIE_ADDRESS: 127.0.0.1 + LASSIE_PORT: 8888 + +jobs: + gateway-conformance: + runs-on: ubuntu-latest + steps: + # 1. Start the Kubo gateway + - name: Download Kubo gateway + uses: ipfs/download-ipfs-distribution-action@v1 + - name: Start Kubo gateway + uses: ipfs/start-ipfs-daemon-action@v1 + + # 2. Download the gateway-conformance fixtures + - name: Download gateway-conformance fixtures + uses: ipfs/gateway-conformance/.github/actions/extract-fixtures@v0.2.0 + with: + output: fixtures + + # 3. Populate the Kubo gateway with the gateway-conformance fixtures + - name: Import fixtures + run: | + find fixtures -name '*.car' -exec ipfs dag import --pin-roots=false {} \; + sudo rm -rf fixtures + + # 4. Build the L1 + - name: Checkout repository + uses: actions/checkout@v3 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v2 + + - name: Build local Docker image + uses: docker/build-push-action@v3 + with: + context: . + tags: lassie + cache-from: type=gha + cache-to: type=gha,mode=max + load: true + + # 5. Start the L1 + - name: Start L1 + run: | + + # Configure lassie to fetch only from the localhost kubo + export LASSIE_ALLOW_PROVIDERS=$(ipfs id | jq --raw-output '.Addresses | @csv | sub("\"";"";"g") ') + export DOCKER_NETWORK=host + export LASSIE_PORT=${{ env.LASSIE_PORT }} + export LASSIE_ADDRESS=${{ env.LASSIE_ADDRESS}} + docker run --name lassie --rm \ + --network=$DOCKER_NETWORK \ + -e "LASSIE_ALLOW_PPROVIDERS=$LASSIE_ALLOW_PROVIDERS" \ + -e "LASSIE_PORT=$LASSIE_PORT" \ + -e "LASSIE_ADDRESS=$LASSIE_ADDRESS" lassie daemon & + + num_attempts=0 + max_attempts=5 + url=http://${{ env.LASSIE_ADDRESS }}:${{ env.LASSIE_PORT }} + + # wait for the container to be up + until curl -s "$url" -o /dev/null; do + if [ ${num_attempts} -eq ${max_attempts} ];then + echo "Max attempts reached" + exit 1 + fi + + num_attempts=$(($num_attempts+1)) + sleep 5; + done + + # 6. Run the gateway-conformance tests + - name: Run gateway-conformance tests + # Wait for release that contains "trustless-block-gateway,trustless-car-gateway" specs + uses: ipfs/gateway-conformance/.github/actions/test@v0.2.0 + with: + gateway-url: http://${{ env.LASSIE_ADDRESS }}:${{ env.LASSIE_PORT }} + specs: trustless-block-gateway,trustless-car-gateway + json: output.json + xml: output.xml + html: output.html + markdown: output.md + args: -skip 'TestGatewayCar/GET_response_for_application/vnd.ipld.car/Header_Content-Length' + + # 7. Upload the results + - name: Upload Markdown summary + if: "!cancelled()" + run: cat output.md >> $GITHUB_STEP_SUMMARY + - name: Upload HTML report + if: "!cancelled()" + uses: actions/upload-artifact@v3 + with: + name: gateway-conformance.html + path: output.html