add GHA workflow as CI
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
new file mode 100644
index 0000000..4faa9fe
--- /dev/null
+++ b/.github/workflows/ci.yml
@@ -0,0 +1,32 @@
+name: CI
+
+on: [push, pull_request]
+
+jobs:
+  build:
+    name: "${{ matrix.name }}"
+    runs-on: [ubuntu-20.04]
+
+    # We want to run on external PRs, but not on our own internal PRs as they'll be run
+    # by the push to the branch.
+    if: github.event_name == 'push' || github.event.pull_request.head.repo.full_name != github.repository
+
+    strategy:
+      fail-fast: false
+      matrix:
+        include:
+          - name: default
+            command: make -f misc/docker-ci.mk
+          - name: asan
+            command: make -f misc/docker-ci.mk CMAKE_ENVS='CC=clang CXX=clang++ CFLAGS="-fsanitize=address,undefined" CXXFLAGS="-fsanitize=address,undefined" LDFLAGS="-fsanitize=address,undefined"' CHECK_ENVS="ASAN_OPTIONS=detect_leaks=0 UBSAN_OPTIONS=print_stacktrace=1:halt_on_error=1"
+
+    timeout-minutes: 10
+    steps:
+    - uses: actions/checkout@v2
+      with:
+        submodules: recursive
+    - name: Run with Docker
+      shell: 'script -q -e -c "bash -xe {0}"'
+      run: |
+        chmod -R ugo+w .
+        ${{ matrix.command }}
diff --git a/misc/docker-ci.mk b/misc/docker-ci.mk
new file mode 100644
index 0000000..cadb1ee
--- /dev/null
+++ b/misc/docker-ci.mk
@@ -0,0 +1,24 @@
+CONTAINER_NAME=h2oserver/h2o-ci:ubuntu2004
+SRC_DIR=/quicly
+CI_MK=$(SRC_DIR)/misc/docker-ci.mk
+CMAKE_ARGS=
+CMAKE_ENVS=
+DOCKER_RUN_OPTS=--privileged \
+	-v `pwd`:$(SRC_DIR) \
+	-it
+
+ALL:
+	docker run $(DOCKER_RUN_OPTS) $(CONTAINER_NAME) make -f $(CI_MK) _check CMAKE_ARGS='$(CMAKE_ARGS)' CMAKE_ENVS='$(CMAKE_ENVS)' CHECK_ENVS='$(CHECK_ENVS)'
+
+_check:
+	uname -a
+	mkdir -p build
+	sudo mount -t tmpfs tmpfs build -o size=3G
+	sudo chown -R ci:ci build
+	sudo chmod 0755 build
+	$(MAKE) -f $(CI_MK) -C build _do-check CMAKE_ARGS='$(CMAKE_ARGS)' CMAKE_ENVS='$(CMAKE_ENVS)' CHECK_ENVS='$(CHECK_ENVS)'
+
+_do-check:
+	env $(CMAKE_ENVS) cmake $(CMAKE_ARGS) -H$(SRC_DIR) -B.
+	make all VERBOSE=1
+	$(CHECK_ENVS) make check