diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml
new file mode 100644
index 0000000..80ce4eb
--- /dev/null
+++ b/.github/workflows/main.yml
@@ -0,0 +1,67 @@
+name: CI
+on: [push, pull_request]
+
+jobs:
+  docker:
+    name: Docker
+    runs-on: ubuntu-latest
+    strategy:
+      matrix:
+        target:
+        - aarch64-unknown-linux-gnu
+        - arm-unknown-linux-gnueabi
+        - arm-unknown-linux-gnueabihf
+        - armv7-unknown-linux-gnueabihf
+        - i686-unknown-linux-gnu
+        - mips-unknown-linux-gnu
+        - mips64-unknown-linux-gnuabi64
+        - mips64el-unknown-linux-gnuabi64
+        - powerpc-unknown-linux-gnu
+        - powerpc64-unknown-linux-gnu
+        - powerpc64le-unknown-linux-gnu
+        - x86_64-unknown-linux-gnu
+    steps:
+    - uses: actions/checkout@master
+    - name: Install Rust
+      run: rustup update nightly && rustup default nightly
+    - run: rustup target add ${{ matrix.target }}
+    - run: rustup target add x86_64-unknown-linux-musl
+    - run: cargo generate-lockfile
+    - run: ./ci/run-docker.sh ${{ matrix.target }}
+
+  rustfmt:
+    name: Rustfmt
+    runs-on: ubuntu-latest
+    steps:
+    - uses: actions/checkout@master
+    - name: Install Rust
+      run: rustup update stable && rustup default stable && rustup component add rustfmt
+    - run: cargo fmt -- --check
+
+  wasm:
+    name: WebAssembly
+    runs-on: ubuntu-latest
+    steps:
+    - uses: actions/checkout@master
+    - name: Install Rust
+      run: rustup update nightly && rustup default nightly
+    - run: rustup target add wasm32-unknown-unknown
+    - run: cargo build --target wasm32-unknown-unknown
+
+  cb:
+    name: "The compiler-builtins crate works"
+    runs-on: ubuntu-latest
+    steps:
+    - uses: actions/checkout@master
+    - name: Install Rust
+      run: rustup update nightly && rustup default nightly
+    - run: cargo build -p cb
+
+  benchmarks:
+    name: Benchmarks
+    runs-on: ubuntu-latest
+    steps:
+    - uses: actions/checkout@master
+    - name: Install Rust
+      run: rustup update nightly && rustup default nightly
+    - run: cargo bench --all
diff --git a/README.md b/README.md
index e90b42d..61a6ebf 100644
--- a/README.md
+++ b/README.md
@@ -1,7 +1,5 @@
 # `libm`
 
-[![Build Status](https://dev.azure.com/rust-lang/libm/_apis/build/status/rust-lang-nursery.libm?branchName=master)](https://dev.azure.com/rust-lang/libm/_build/latest?definitionId=7&branchName=master)
-
 A port of [MUSL]'s libm to Rust.
 
 [MUSL]: https://www.musl-libc.org/
@@ -27,7 +25,7 @@ The API documentation can be found [here](https://docs.rs/libm).
 ## Benchmark
 [benchmark]: #benchmark
 
-The benchmarks are located in `crates/libm-bench` and require a nightly Rust toolchain. 
+The benchmarks are located in `crates/libm-bench` and require a nightly Rust toolchain.
 To run all benchmarks:
 
 > cargo +nightly bench --all
diff --git a/azure-pipelines.yml b/azure-pipelines.yml
deleted file mode 100644
index 0d723c5..0000000
--- a/azure-pipelines.yml
+++ /dev/null
@@ -1,82 +0,0 @@
-trigger:
-  - master
-
-jobs:
-  - job: Docker
-    pool:
-      vmImage: ubuntu-16.04
-    steps:
-      - template: ci/azure-install-rust.yml
-      - bash: rustup target add $TARGET
-        displayName: "add cross target"
-      - bash: rustup target add x86_64-unknown-linux-musl
-        displayName: "add musl target"
-      - bash: cargo generate-lockfile && ./ci/run-docker.sh $TARGET
-        displayName: "run tests"
-    strategy:
-      matrix:
-        aarch64:
-          TARGET: aarch64-unknown-linux-gnu
-        arm:
-          TARGET: arm-unknown-linux-gnueabi
-        armhf:
-          TARGET: arm-unknown-linux-gnueabihf
-        armv7:
-          TARGET: armv7-unknown-linux-gnueabihf
-        i686:
-          TARGET: i686-unknown-linux-gnu
-        mips:
-          TARGET: mips-unknown-linux-gnu
-        mips64:
-          TARGET: mips64-unknown-linux-gnuabi64
-        mips64el:
-          TARGET: mips64el-unknown-linux-gnuabi64
-        powerpc:
-          TARGET: powerpc-unknown-linux-gnu
-        powerpc64:
-          TARGET: powerpc64-unknown-linux-gnu
-        powerpc64le:
-          TARGET: powerpc64le-unknown-linux-gnu
-        x86_64:
-          TARGET: x86_64-unknown-linux-gnu
-
-  - job: wasm
-    pool:
-      vmImage: ubuntu-16.04
-    steps:
-      - template: ci/azure-install-rust.yml
-      - script: rustup target add wasm32-unknown-unknown
-        displayName: "Install rust wasm target"
-      - script: cargo build --target wasm32-unknown-unknown
-        displayName: "Build for wasm"
-    variables:
-      TOOLCHAIN: nightly
-
-  - job: rustfmt
-    pool:
-      vmImage: ubuntu-16.04
-    steps:
-      - template: ci/azure-install-rust.yml
-      - bash: rustup component add rustfmt
-        displayName: "install rustfmt"
-      - bash: cargo fmt --all -- --check
-        displayName: "check formatting"
-
-  - job: compiler_builtins_works
-    pool:
-      vmImage: ubuntu-16.04
-    steps:
-      - template: ci/azure-install-rust.yml
-      - bash: cargo build -p cb
-        displayName: "Check compiler-builtins still probably builds"
-
-  - job: benchmarks
-    pool:
-      vmImage: ubuntu-16.04
-    steps:
-      - template: ci/azure-install-rust.yml
-      - bash: cargo bench --all
-        displayName: "Benchmarks"
-    variables:
-      TOOLCHAIN: nightly
-
diff --git a/ci/azure-install-rust.yml b/ci/azure-install-rust.yml
deleted file mode 100644
index f1cd87b..0000000
--- a/ci/azure-install-rust.yml
+++ /dev/null
@@ -1,25 +0,0 @@
-steps:
-  - bash: |
-      set -e
-      toolchain=$TOOLCHAIN
-      if [ "$toolchain" = "" ]; then
-        toolchain=stable
-      fi
-      if command -v rustup; then
-        rustup update $toolchain
-        rustup default $toolchain
-      else
-        curl https://sh.rustup.rs -sSf | sh -s -- -y --default-toolchain $toolchain
-        echo "##vso[task.prependpath]$HOME/.cargo/bin"
-      fi
-    displayName: Install rust (unix)
-    condition: ne( variables['Agent.OS'], 'Windows_NT' )
-
-  - bash: rustup update stable-$TOOLCHAIN && rustup default stable-$TOOLCHAIN
-    displayName: Install rust (windows)
-    condition: eq( variables['Agent.OS'], 'Windows_NT' )
-
-  - script: |
-        rustc -Vv
-        cargo -V
-    displayName: Query rust and cargo versions