diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml
index 4c84c36e32ed50baaf4a80b822438360929c3f55..2a1c81d9992c432fc5d30c2499c4ff0eb8eb10e3 100644
--- a/.github/workflows/main.yml
+++ b/.github/workflows/main.yml
@@ -12,7 +12,6 @@ on:
 
 # A workflow run is made up of one or more jobs that can run sequentially or in parallel
 jobs:
-  # This workflow contains a single job called "build"
   build:
     # The type of runner that the job will run on
     runs-on: ubuntu-latest
@@ -53,3 +52,20 @@ jobs:
         run: git update-index --refresh && git diff-index --quiet HEAD --
         # ignore errors here while we are using 'go get' above
         continue-on-error: true
+  e2e:
+    # The type of runner that the job will run on
+    runs-on: ubuntu-latest
+
+    # Steps represent a sequence of tasks that will be executed as part of the job
+    steps:
+      # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it
+      - uses: actions/checkout@v2
+      - name: Docker Build
+        run: docker-compose build
+      - name: Docker Compose Start
+        run: docker-compose up -d
+      - uses: actions/setup-go@v2
+        with:
+          go-version: '1.15.6'
+      - name: CLI
+        run: .tests/e2e-test.sh
diff --git a/tests/e2e-test.sh b/tests/e2e-test.sh
new file mode 100755
index 0000000000000000000000000000000000000000..443b63af27268b2eacaf0eadede8a6a8a4ef5418
--- /dev/null
+++ b/tests/e2e-test.sh
@@ -0,0 +1,9 @@
+#!/bin/bash
+set -ex
+testdir=$(dirname "$0")
+
+# Node
+nodedir=${testdir}/node
+go run ./cmd/cli/ upload \
+    --artifact $(< ${nodedir}/url) --sha $(< ${nodedir}/sha) \
+    --signature=${nodedir}/sig  --public-key=${nodedir}/key
diff --git a/tests/node/SHASUMS256.txt b/tests/node/SHASUMS256.txt
new file mode 100644
index 0000000000000000000000000000000000000000..2f9e03b75ab589ea7ea9ab21ae18f9a2e0003c74
--- /dev/null
+++ b/tests/node/SHASUMS256.txt
@@ -0,0 +1,32 @@
+e9630d01ee1ff74445e12ab2f14581b2aea9201eca05b39f8174697afdba74b2  node-v15.4.0-aix-ppc64.tar.gz
+503d160016f6a61ec25a9462499721ef96b9ed08e232a420d17541774e079dda  node-v15.4.0-darwin-x64.tar.gz
+db5bfc430f865061bde1f6afe6d75fae98fc04b647050e9e7ad7444a44d790e0  node-v15.4.0-darwin-x64.tar.xz
+2e0efc6931f30e6d8ba1cdde018ae234bd6186b3f38ce8a94a8304f4340fbd2f  node-v15.4.0-headers.tar.gz
+cf1f16dbda084ac8102b2faeb2608bd3d3541311281ba8869da06649f8099dba  node-v15.4.0-headers.tar.xz
+0dad2932f7f7e0fc21bca0690d31f065080dbbf448527e982447355ff4bb91bd  node-v15.4.0-linux-arm64.tar.gz
+1b2b601167f6e07bb9b2bb86774bc386c5c60fac6ab28e49ad6d62f491be2b7f  node-v15.4.0-linux-arm64.tar.xz
+a36ecfa85ca2b6cfbb864190147a26c1fd2e04e15ab4b31b3a398663dc91223a  node-v15.4.0-linux-armv7l.tar.gz
+8912e375b96ef964db5c1ba100e3afedc13730d53570cbe7c0dd71e055afb1b4  node-v15.4.0-linux-armv7l.tar.xz
+ebcc8c6819032fc02dee3214d61032c11cd9ecfc764613e8f7ed2cbe5afaabff  node-v15.4.0-linux-ppc64le.tar.gz
+6948bad4bcdac9b8f4f8b0a29b8eb89c0b09c39ded0bdd67e4a55a4c89c0af80  node-v15.4.0-linux-ppc64le.tar.xz
+93ca0bf22bd0ee7a5f261a8235b0e8305873228e63c174bd15a77ce2d222c69f  node-v15.4.0-linux-s390x.tar.gz
+417ade49c5d9b15391fb47e5d95bc91b0da90977472f062905b22f1a4a027f4c  node-v15.4.0-linux-s390x.tar.xz
+96b801f51bf73330c65e6ee4d17c5b223fded16d8020af3b3550a548d271b1e2  node-v15.4.0-linux-x64.tar.gz
+a1fc57a8aeeb2a175ca62718fdc0f896efc0f78695a7d4f56d5e8653a24b1a11  node-v15.4.0-linux-x64.tar.xz
+4ee293f815395b1774895da79f02ae6bc5c158b93985a315db36b54f25f62c8c  node-v15.4.0.pkg
+b199796544d988b4bb61e38584cd097744e073fa0559cbec772858d91ce4649f  node-v15.4.0.tar.gz
+ba726955316c8190adc8e8c892d8782e7167643e41b22bb7c7aa4e092783e04e  node-v15.4.0.tar.xz
+343f603329de39f4019df9ef8ff7610d3e079bc397afd15560abf7bd9f60fafe  node-v15.4.0-win-x64.7z
+9bfd174d15cf38885740e3b2308e701f33d064bb1100afd59f8114298a89e4a7  node-v15.4.0-win-x64.zip
+ac97daba712c7e5ae58d8cdd9e7e7a3103092efdaef0328b14e80bc046b21d86  node-v15.4.0-win-x86.7z
+37d852eade26bfd262f62190f848265409e0de5d510753c158c619ed4897dd63  node-v15.4.0-win-x86.zip
+0be3e8050feecc0546d81fc5884626e7ea1ed99a2c1fdcc96e246e59774d4809  node-v15.4.0-x64.msi
+cee5d80302f0a4d29816cae05f80058e578c72d08caa36e19bd766a8bcd4a9cb  node-v15.4.0-x86.msi
+1a76edb3b10a006ea6108f318c9fa959fe1e692586bad90b3edfda4918f5fb69  win-x64/node.exe
+8730c9880ba0237ec978c6bfb224e84390112980dc39daabb89f1148e9f9f81d  win-x64/node.lib
+b7e88f414378a776282586a0de4a6aa61869c647426e57466ee6fac3059cc760  win-x64/node_pdb.7z
+c2618d56cd3a1cbf6b267c44b42f260082b3eb33b83944084a8e50425ba02fb2  win-x64/node_pdb.zip
+f170feef25cf2f77be3f9c67c123f03999f913cfb6a04267df827ed0320fa1d1  win-x86/node.exe
+5d6b151f6deaa4ca42b52e5333f467f2ae8f12dfa52715bf9f16562723fc996e  win-x86/node.lib
+60de0dc131697829439de285beef8dd31ad366cf6b183e5aac7467b098c38c21  win-x86/node_pdb.7z
+fc102b969efdd8a335d039d13d39c4a174947395fa0a89569e7b7381b278238f  win-x86/node_pdb.zip
diff --git a/tests/node/key b/tests/node/key
new file mode 100644
index 0000000000000000000000000000000000000000..7dedf2e7c569bcf39a441c290f4ac86f7c3ff98d
Binary files /dev/null and b/tests/node/key differ
diff --git a/tests/node/sha b/tests/node/sha
new file mode 100644
index 0000000000000000000000000000000000000000..c545c94edae77b362036910d52e0967b79188c0b
--- /dev/null
+++ b/tests/node/sha
@@ -0,0 +1 @@
+bc51ec78f8f290860c35cdd93ef3886b464ba5a535b2e6f2a80623439026bcd5
diff --git a/tests/node/sig b/tests/node/sig
new file mode 100644
index 0000000000000000000000000000000000000000..e5c05c33f678dd8246b112bfc150b2d02d9dd02f
Binary files /dev/null and b/tests/node/sig differ
diff --git a/tests/node/sig.asc b/tests/node/sig.asc
new file mode 100644
index 0000000000000000000000000000000000000000..6f059a82603fb6dc2cf43b893e6c9dd279c04ac3
--- /dev/null
+++ b/tests/node/sig.asc
@@ -0,0 +1,46 @@
+-----BEGIN PGP SIGNED MESSAGE-----
+Hash: SHA256
+
+e9630d01ee1ff74445e12ab2f14581b2aea9201eca05b39f8174697afdba74b2  node-v15.4.0-aix-ppc64.tar.gz
+503d160016f6a61ec25a9462499721ef96b9ed08e232a420d17541774e079dda  node-v15.4.0-darwin-x64.tar.gz
+db5bfc430f865061bde1f6afe6d75fae98fc04b647050e9e7ad7444a44d790e0  node-v15.4.0-darwin-x64.tar.xz
+2e0efc6931f30e6d8ba1cdde018ae234bd6186b3f38ce8a94a8304f4340fbd2f  node-v15.4.0-headers.tar.gz
+cf1f16dbda084ac8102b2faeb2608bd3d3541311281ba8869da06649f8099dba  node-v15.4.0-headers.tar.xz
+0dad2932f7f7e0fc21bca0690d31f065080dbbf448527e982447355ff4bb91bd  node-v15.4.0-linux-arm64.tar.gz
+1b2b601167f6e07bb9b2bb86774bc386c5c60fac6ab28e49ad6d62f491be2b7f  node-v15.4.0-linux-arm64.tar.xz
+a36ecfa85ca2b6cfbb864190147a26c1fd2e04e15ab4b31b3a398663dc91223a  node-v15.4.0-linux-armv7l.tar.gz
+8912e375b96ef964db5c1ba100e3afedc13730d53570cbe7c0dd71e055afb1b4  node-v15.4.0-linux-armv7l.tar.xz
+ebcc8c6819032fc02dee3214d61032c11cd9ecfc764613e8f7ed2cbe5afaabff  node-v15.4.0-linux-ppc64le.tar.gz
+6948bad4bcdac9b8f4f8b0a29b8eb89c0b09c39ded0bdd67e4a55a4c89c0af80  node-v15.4.0-linux-ppc64le.tar.xz
+93ca0bf22bd0ee7a5f261a8235b0e8305873228e63c174bd15a77ce2d222c69f  node-v15.4.0-linux-s390x.tar.gz
+417ade49c5d9b15391fb47e5d95bc91b0da90977472f062905b22f1a4a027f4c  node-v15.4.0-linux-s390x.tar.xz
+96b801f51bf73330c65e6ee4d17c5b223fded16d8020af3b3550a548d271b1e2  node-v15.4.0-linux-x64.tar.gz
+a1fc57a8aeeb2a175ca62718fdc0f896efc0f78695a7d4f56d5e8653a24b1a11  node-v15.4.0-linux-x64.tar.xz
+4ee293f815395b1774895da79f02ae6bc5c158b93985a315db36b54f25f62c8c  node-v15.4.0.pkg
+b199796544d988b4bb61e38584cd097744e073fa0559cbec772858d91ce4649f  node-v15.4.0.tar.gz
+ba726955316c8190adc8e8c892d8782e7167643e41b22bb7c7aa4e092783e04e  node-v15.4.0.tar.xz
+343f603329de39f4019df9ef8ff7610d3e079bc397afd15560abf7bd9f60fafe  node-v15.4.0-win-x64.7z
+9bfd174d15cf38885740e3b2308e701f33d064bb1100afd59f8114298a89e4a7  node-v15.4.0-win-x64.zip
+ac97daba712c7e5ae58d8cdd9e7e7a3103092efdaef0328b14e80bc046b21d86  node-v15.4.0-win-x86.7z
+37d852eade26bfd262f62190f848265409e0de5d510753c158c619ed4897dd63  node-v15.4.0-win-x86.zip
+0be3e8050feecc0546d81fc5884626e7ea1ed99a2c1fdcc96e246e59774d4809  node-v15.4.0-x64.msi
+cee5d80302f0a4d29816cae05f80058e578c72d08caa36e19bd766a8bcd4a9cb  node-v15.4.0-x86.msi
+1a76edb3b10a006ea6108f318c9fa959fe1e692586bad90b3edfda4918f5fb69  win-x64/node.exe
+8730c9880ba0237ec978c6bfb224e84390112980dc39daabb89f1148e9f9f81d  win-x64/node.lib
+b7e88f414378a776282586a0de4a6aa61869c647426e57466ee6fac3059cc760  win-x64/node_pdb.7z
+c2618d56cd3a1cbf6b267c44b42f260082b3eb33b83944084a8e50425ba02fb2  win-x64/node_pdb.zip
+f170feef25cf2f77be3f9c67c123f03999f913cfb6a04267df827ed0320fa1d1  win-x86/node.exe
+5d6b151f6deaa4ca42b52e5333f467f2ae8f12dfa52715bf9f16562723fc996e  win-x86/node.lib
+60de0dc131697829439de285beef8dd31ad366cf6b183e5aac7467b098c38c21  win-x86/node_pdb.7z
+fc102b969efdd8a335d039d13d39c4a174947395fa0a89569e7b7381b278238f  win-x86/node_pdb.zip
+-----BEGIN PGP SIGNATURE-----
+
+iQEzBAEBCAAdFiEEHAUImTNCRKivdeU3ku9mHYZ7nfoFAl/Q2/IACgkQku9mHYZ7
+nfpQ8wgAig10JH3M183WHbDQU1b+snCg+q1yoUUVHF8qIfxG+fbsvz4/zTFIWe3J
+cYlVoD4enJ5JE5/xOSJ1qeQnXTVD6CulGlzVFRCvs8909X6drLfx2NSAdKLZaoyw
+n4hjYu6/71e/fBkJJU0bPXRD1INqPfofhVJ8G+E9ubIYPv1/E8Wn9VJK+3DOdRTN
+W+VfBgTU6qDRVTsTDJTiQE6Rf5lIABKlgwBNuUF22GJm9Khcb0a/ewb8XZZo/Apf
+RWv0+f/CecGJs8wU0E9TYqS0ne+CkBSsvzxbWY0KeKBTIcM/AQf+wPn3Ad5Fu6O1
+R7Up/RjbCQifD7LpLZJGO1VTYqciag==
+=axYa
+-----END PGP SIGNATURE-----
diff --git a/tests/node/url b/tests/node/url
new file mode 100644
index 0000000000000000000000000000000000000000..a3f3c2891af29a23a45b8b9bea83503bae628e9e
--- /dev/null
+++ b/tests/node/url
@@ -0,0 +1 @@
+https://nodejs.org/dist/v15.4.0/SHASUMS256.txt