diff --git a/circle_ci/2-audit.md b/circle_ci/2-audit.md
index 9fb1ee7..a102e6c 100644
--- a/circle_ci/2-audit.md
+++ b/circle_ci/2-audit.md
@@ -190,4 +190,4 @@ Each pipeline will have a variety of files written that include:
### Next lab
-[Perform a dry-run of a GitLab pipeline](3-dry-run.md)
+[Perform a dry-run of a CircleCI pipeline](3-dry-run.md)
diff --git a/circle_ci/3-dry-run.md b/circle_ci/3-dry-run.md
new file mode 100644
index 0000000..4aa0dc3
--- /dev/null
+++ b/circle_ci/3-dry-run.md
@@ -0,0 +1,193 @@
+# Perform a dry-run of a CircleCI pipeline
+
+In this lab you will use the `dry-run` command to convert a CircleCI pipeline to its equivalent GitHub Actions workflow.
+
+## Prerequisites
+
+1. Followed the steps [here](./readme.md#configure-your-codespace) to set up your Codespace environment.
+2. Completed the [configure lab](./1-configure.md#configuring-credentials).
+3. Completed the [audit lab](./2-audit.md).
+
+## Perform a dry run
+
+You will be performing a dry-run against a CircleCI project. Answer the following questions before running this command:
+
+1. What project do you want to convert?
+ - __circleci-demo-ruby-rails__. This is one of the sample projects avaiable in the CircleCI labs-data organization.
+
+2. Where do you want to store the result?
+ - __./tmp/dry-run-lab__. This can be any path within the working directory that Valet commands are executed from.
+
+### Steps
+
+1. Navigate to your codespace terminal
+2. Run the following command from the root directory:
+
+ ```bash
+ gh valet dry-run circle-ci --output-dir ./tmp/dry-run-lab --circle-ci-project circleci-demo-ruby-rails
+ ```
+
+3. The command will list all the files written to disk when the command succeeds.
+
+ 
+
+
+
+4. View the converted workflow:
+ - Find `./tmp/dry-run-lab/labs-data/circleci-demo-ruby-rails` in the file explorer pane in your codespace.
+ - Click `build_and_test.yml` to open.
+
+## Inspect the output files
+
+The files generated from the `dry-run` command represent the equivalent Actions workflow for the CircleCI project. The CircleCI configuration and converted workflow can be seen below:
+
+
+ CircleCI configuration 👇
+
+```yaml
+version: 2.1
+
+orbs:
+ ruby: circleci/ruby@1.1.0
+ node: circleci/node@2
+
+jobs:
+ build:
+ docker:
+ - image: cimg/ruby:2.7.5-node
+ steps:
+ - checkout
+ - ruby/install-deps
+ # Store bundle cache
+ - node/install-packages:
+ pkg-manager: yarn
+ cache-key: "yarn.lock"
+ test:
+ parallelism: 3
+ docker:
+ - image: cimg/ruby:2.7.5-node
+ - image: circleci/postgres:9.5-alpine
+ environment:
+ POSTGRES_USER: circleci-demo-ruby
+ POSTGRES_DB: rails_blog_test
+ POSTGRES_PASSWORD: ""
+ environment:
+ BUNDLE_JOBS: "3"
+ BUNDLE_RETRY: "3"
+ PGHOST: 127.0.0.1
+ PGUSER: circleci-demo-ruby
+ PGPASSWORD: ""
+ RAILS_ENV: test
+ steps:
+ - checkout
+ - ruby/install-deps
+ - node/install-packages:
+ pkg-manager: yarn
+ cache-key: "yarn.lock"
+ - run:
+ name: Wait for DB
+ command: dockerize -wait tcp://localhost:5432 -timeout 1m
+ - run:
+ name: Database setup
+ command: bundle exec rails db:schema:load --trace
+ # Run rspec in parallel
+ - ruby/rspec-test
+ - ruby/rubocop-check
+
+workflows:
+ version: 2
+ build_and_test:
+ jobs:
+ - build
+ - test:
+ requires:
+ - build
+
+```
+
+
+
+
+ Converted workflow 👇
+
+```yaml
+name: labs-data/circleci-demo-ruby-rails/build_and_test
+on:
+ push:
+ branches:
+ - master
+jobs:
+ build:
+ runs-on: ubuntu-latest
+ container:
+ image: cimg/ruby:2.7.5-node
+ steps:
+ - name: Set up bundler cache
+ uses: ruby/setup-ruby@v1
+ with:
+ ruby-version: 3.0.2
+ bundler-cache: true
+ - uses: actions/checkout@v2
+ - run: bundle check || bundle install
+ env:
+ BUNDLE_DEPLOYMENT: true
+ - id: yarn-cache-dir-path
+ run: echo "::set-output name=dir::$(yarn config get cacheFolder)"
+ - uses: actions/cache@v2
+ with:
+ path: "${{ steps.yarn-cache-dir-path.outputs.dir }}"
+ key: "${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }}"
+ restore-keys: "${{ runner.os }}-yarn-"
+ - run: yarn install --frozen-lockfile
+ test:
+ runs-on: ubuntu-latest
+ container:
+ image: cimg/ruby:2.7.5-node
+ services:
+ postgres:
+ image: postgres:9.5-alpine
+ env:
+ POSTGRES_USER: circleci-demo-ruby
+ POSTGRES_DB: rails_blog_test
+ POSTGRES_PASSWORD: ''
+ needs:
+ - build
+ env:
+ BUNDLE_JOBS: '3'
+ BUNDLE_RETRY: '3'
+ PGHOST: 127.0.0.1
+ PGUSER: circleci-demo-ruby
+ PGPASSWORD: ''
+ RAILS_ENV: test
+ steps:
+ - name: Set up bundler cache
+ uses: ruby/setup-ruby@v1
+ with:
+ ruby-version: 3.0.2
+ bundler-cache: true
+ - uses: actions/checkout@v2
+ - run: bundle check || bundle install
+ env:
+ BUNDLE_DEPLOYMENT: true
+ - id: yarn-cache-dir-path
+ run: echo "::set-output name=dir::$(yarn config get cacheFolder)"
+ - uses: actions/cache@v2
+ with:
+ path: "${{ steps.yarn-cache-dir-path.outputs.dir }}"
+ key: "${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }}"
+ restore-keys: "${{ runner.os }}-yarn-"
+ - run: yarn install --frozen-lockfile
+ - name: Wait for DB
+ run: dockerize -wait tcp://localhost:5432 -timeout 1m
+ - name: Database setup
+ run: bundle exec rails db:schema:load --trace
+ - run: bundle exec rspec spec --profile 10 --format RspecJunitFormatter --out /tmp/test-results/rspec/results.xml --format progress
+ - run: bundle exec rubocop --format progress
+```
+
+
+Despite these two pipelines using different syntax they will function equivalently.
+
+## Next lab
+
+[Use custom transformers to customize Valet's behavior](./4-custom-transformers.md)