• Stars
    star
    1,406
  • Rank 33,453 (Top 0.7 %)
  • Language
    Ruby
  • License
    MIT License
  • Created almost 11 years ago
  • Updated 5 months ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

Deployment coordination

Shipit - Documentation

Build Status Gem Version

Shipit is a deployment tool that makes shipping code better for everyone. It's especially great for large teams of developers and designers who work together to build and deploy GitHub repos. You can use it to:

  • add new applications to your deployment environment without having to change core configuration files repeatedly — shipit.yml is basically plug and play
  • control the pace of development by pushing, locking, and rolling back deploys from within Shipit
  • enforce checklists and provide monitoring right at the point of deployment.

Shipit is compatible with just about anything that you can deploy using a script. It natively detects stacks using bundler and Capistrano, and it has tools that make it easy to deploy to Heroku or RubyGems. At Shopify, we've used Shipit to synchronize and deploy hundreds of projects across dozens of teams, using Python, Rails, RubyGems, Java, and Go.

This guide aims to help you set up, use, and understand Shipit.

Shipit requires a database (MySQL, PostgreSQL or SQLite3), redis, and Ruby 2.6 or superior.


Table of contents

I. INSTALLATION & SETUP

II. USING SHIPIT

III. REFERENCE

IV. INTEGRATING

V. CONTRIBUTING


I. INSTALLATION & SETUP

Installation

To create a new Shipit installation you can follow the setup guide.

Updating an existing installation

  1. If you locked the gem to a specific version in your Gemfile, update it there.
  2. Update the shipit-engine gem with bundle update shipit-engine.
  3. Install new migrations with rake shipit:install:migrations db:migrate.

Specific updates requiring more steps

If you are upgrading from 0.21 or older, you will have to update the configuration. Please follow the dedicated upgrade guide


II. USING SHIPIT

The main workflows in Shipit are adding stacks, working on stacks, and configuring stacks.

A stack is composed of a GitHub repository, a branch, and a deployment environment. Shipit tracks the commits made to the branch, and then displays them in the stack overview. From there, you can deploy the branch to whatever environment you've chosen (some typical environments include production, staging, performance, etc.).

Add a new stack

  1. From the main page in Shipit, click Add a stack.
  2. On the Create a stack page, enter the required information:
    • Repo
    • Branch
    • Environment
    • Deploy URL
  3. When you're finished, click Create stack.

Work on an existing stack

  1. If you want to browse the list of available stacks, click Show all stacks on the main page in Shipit. If you know the name of the stack you're looking for, enter it in the search field.
  2. Click the name of the stack you want to open.
  3. From a stack's overview page, you can:
    • review previous deploys
    • deploy any undeployed commits by clicking Deploy
    • rollback to an earlier build by clicking Rollback to this deploy
    • adjust the stack's settings by clicking the gear icon in the page header
    • perform any custom tasks that are defined in the shipit.yml file
  4. When you're ready to deploy an undeployed commit, click the relevant Deploy button on the stack's overview page.
  5. From the Deploy page, complete the checklist, then click Create deploy.

Edit stack settings

To edit a stack's settings, open the stack in Shipit, then click the gear icon in the page header.

From a stack's Settings page, you can:

  • change the deploy URL
  • enable and disable continuous deployment
  • lock and unlock deploys through Shipit
  • resynchronize the stack with GitHub
  • delete the stack from Shipit

III. REFERENCE

Configuring shipit.yml

The settings in the shipit.yml file relate to the different things you can do with Shipit:

All the settings in shipit.yml are optional. Most applications can be deployed from Shipit without any configuration.

Also, if your repository is deployed different ways depending on the environment, you can have an alternative shipit.yml by including the environment name.

For example for a stack like: my-org/my-repo/staging, shipit.staging.yml will have priority over shipit.yml.

Lastly, if you override the app_name configuration in your Shipit deployment, yourapp.yml and yourapp.staging.yml will work.


Respecting bare shipit.yml files

Shipit will, by default, respect the "bare" shipit.yml file as a fallback option if no more specifically-named file exists (such as shipit.staging.yml).

You can configure this behavior via the attribute Shipit.respect_bare_shipit_file.

  • The value false will disable this behavior and instead cause Shipit to emit an error upon deploy if Shipit cannot find a more specifically-named file.
  • Setting this attribute to any other value (including nil), or not setting this attribute, will cause Shipit to use the default behavior of respecting bare shipit.yml files.

You can determine if Shipit is configured to respect bare files using Shipit.respect_bare_shipit_file?.


Installing dependencies

The dependencies step allows you to install all the packages your deploy script needs.

Bundler

If your application uses Bundler, Shipit will detect it automatically and take care of the bundle install and prefix your commands with bundle exec.

By default, the following gem groups will be ignored:

  • default
  • production
  • development
  • test
  • staging
  • benchmark
  • debug

The gems you need in order to deploy should be in a different group, such as deploy.

For example:

dependencies:
  bundler:
    without:
      - development
      - test
      - debug

Other dependencies

If your deploy script uses another tool to install dependencies, you can install them manually via dependencies.override:

dependencies:
  override:
    - npm install

dependencies.pre If you wish to execute commands before Shipit installs the dependencies, you can specify them here.

For example:

dependencies:
  pre:
    - mkdir tmp/
    - cp -R /var/cache/ tmp/cache

dependencies.post If you wish to execute commands after Shipit installed the dependencies, you can specify them here:

For example:

dependencies:
  post:
    - cp -R tmp/cache /var/cache/

Deployment

The deploy and rollback sections are the core of Shipit:

deploy.override contains an array of the shell commands required to deploy the application. Shipit will try to infer it from the repository structure, but you can change the default inference.

For example:

deploy:
  override:
    - ./script/deploy

deploy.pre If you wish to execute commands before Shipit executes your deploy script, you can specify them here.

For example:

deploy:
  pre:
    - ./script/notify_deploy_start

deploy.post If you wish to execute commands after Shipit executed your deploy script, you can specify them here.

For example:

deploy:
  post:
    - ./script/notify_deploy_end

You can also accept custom environment variables defined by the user that triggers the deploy:

deploy.variables contains an array of variable definitions.

For example:

deploy:
  variables:
    -
      name: RUN_MIGRATIONS
      title: Run database migrations on deploy
      default: 1

deploy.variables.select will turn the input into a <select> of values.

For example:

deploy:
  variables:
    -
      name: REGION
      title: Run a deploy in a given region
      select:
        - east
        - west
        - north

deploy.max_commits defines the maximum number of commits that should be shipped per deploy. Defaults to 8 if no value is provided.

To disable this limit, you can use use an explicit null value: max_commits: null. Continuous Delivery will then deploy any number of commits.

Human users will be warned that they are not respecting the recommendation, but allowed to continue. However continuous delivery will respect this limit. If there is no deployable commits in this range, a human intervention will be required.

For example:

deploy:
  max_commits: 5

deploy.interval defines the interval between the end of a deploy and the next deploy, when continuous delivery is enabled. You can use s, m, h, d as units for seconds, minutes, hours, and days. Defaults to 0, which means a new deploy will start as soon as the current one finishes.

For example, this will wait 5 minutes after the end of a deploy before starting a new one:

deploy:
  interval: 5m

deploy.retries enables retries for a stack, and defines the maximum amount of times that Shipit will retry a deploy that finished with a failed, error or timedout status.

For example, this will retry a deploy twice if it fails.

deploy:
  retries: 2

rollback.override contains an array of the shell commands required to rollback the application to a previous state. Shipit will try to infer it from the repository structure, but you can change the default inference. This key defaults to disabled unless Capistrano is detected.

For example:

rollback:
  override:
    - ./script/rollback

rollback.pre If you wish to execute commands before Shipit executes your rollback script, you can specify them here:

For example:

rollback:
  pre:
    - ./script/notify_rollback_start

rollback.post If you wish to execute commands after Shipit executed your rollback script, you can specify them here:

For example:

rollback:
  post:
    - ./script/notify_rollback_end

fetch contains an array of the shell commands that Shipit executes to check the revision of the currently-deployed version. This key defaults to disabled.

For example:

fetch:
  curl --silent https://app.example.com/services/ping/version

Kubernetes

kubernetes allows to specify a Kubernetes namespace and context to deploy to.

For example:

kubernetes:
  namespace: my-app-production
  context: tier4

kubernetes.template_dir allows to specify a Kubernetes template directory. It defaults to ./config/deploy/$ENVIRONMENT

Environment

machine.environment contains the extra environment variables that you want to provide during task execution.

For example:

machine:
  environment:
    key: val # things added as environment variables

Directory

machine.directory specifies a subfolder in which to execute all tasks. Useful for repositories containing multiple applications or if you don't want your deploy scripts to be located at the root.

For example:

machine:
  directory: scripts/deploy/

Cleanup

machine.cleanup specifies whether or not the deploy working directory should be cleaned up once the deploy completed. Defaults to true, but can be useful to disable temporarily to investigate bugs.

For example:

machine:
  cleanup: false

CI

ci.require contains an array of the statuses context you want Shipit to disallow deploys if any of them is missing on the commit being deployed.

For example:

ci:
  require:
    - ci/circleci

ci.hide contains an array of the statuses context you want Shipit to ignore.

For example:

ci:
  hide:
    - ci/circleci

ci.allow_failures contains an array of the statuses context you want to be visible but not to required for deploy.

For example:

ci:
  allow_failures:
    - ci/circleci

ci.blocking contains an array of the statuses context you want to disallow deploys if any of them is missing or failing on any of the commits being deployed.

For example:

ci:
  blocking:
    - soc/compliance

Merge Queue

The merge queue allows developers to register pull requests which will be merged by Shipit once the stack is clear (no lock, no failing CI, no backlog). It can be enabled on a per stack basis via the settings page.

It can be customized via several shipit.yml properties:

merge.revalidate_after a duration after which pull requests that couldn't be merged are rejected from the queue. Defaults to unlimited.

For example:

merge:
  revalidate_after: 12m30s

merge.require contains an array of the statuses context that you want Shipit to consider as failing if they aren't present on the pull request. Defaults to ci.require if present, or empty otherwise.

For example:

merge:
  require:
    - continuous-integration/travis-ci/push

merge.ignore contains an array of the statuses context that you want Shipit not to consider when merging pull requests. Defaults to the union of ci.allow_failures and ci.hide if any is present or empty otherwise.

For example:

merge:
  ignore:
    - codeclimate

merge.method the merge method to use for this stack. If it's not set the default merge method will be used. Can be either merge, squash or rebase.

For example:

merge:
  method: squash

merge.max_divergence.commits the maximum number of commits a pull request can be behind its merge base, after which pull requests are rejected from the merge queue.

For example:

merge:
  max_divergence:
    commits: 50

merge.max_divergence.age a duration after the commit date of the merge base, after which pull requests will be rejected from the merge queue.

For example:

merge:
  max_divergence:
    age: 72h

Custom tasks

You can create custom tasks that users execute directly from a stack's overview page in Shipit. To create a new custom task, specify its parameters in the tasks section of the shipit.yml file. For example:

tasks.restart restarts the application.

tasks:
  restart:
    action: "Restart Application"
    description: "Sometimes needed if you want the application to restart but don't want to ship any new code."
    steps:
      - ssh [email protected] 'touch myapp/restart.txt'

By default, custom tasks are not allowed to be triggered while a deploy is running. But if it's safe for that specific task, you can change that behavior with the allow_concurrency attribute:

tasks:
  flush_cache:
    action: "Flush Cache"
    steps:
      - ssh [email protected] 'myapp/flush_cache.sh'
    allow_concurrency: true

Tasks like deploys can prompt for user defined environment variables:

tasks:
  restart:
    action: "Restart Application"
    description: "Sometimes needed if you want the application to restart but don't want to ship any new code."
    steps:
      - ssh [email protected] 'touch myapp/restart.txt'
    variables:
      -
        name: FORCE
        title: Restart server without waiting for in-flight requests to complete (Dangerous).
        default: 0

You can also make these variables appear in the task title:

tasks:
  failover:
    action: "Failover a pod"
    title: "Failover Pod %{POD_ID}"
    steps:
      - script/failover $POD_ID
    variables:
      - name: POD_ID

You can add custom links to the header of a stacks overview page in Shipit. To create a new custom link, specify its parameters in the links section of the shipit.yml file. The link title is a humanized version of the key. For example:

links.monitoring_dashboard creates a link in the header of of the page titled "Monitoring dashboard"

You can specify multiple custom links:

links:
  monitoring_dashboard: https://example.com/monitoring.html
  other_link: https://example.com/something_else.html

Review process

You can display review elements, such as monitoring data or a pre-deployment checklist, on the deployment page in Shipit:

review.checklist contains a pre-deploy checklist that appears on the deployment page in Shipit, with each item in the checklist as a separate string in the array. It can contain strong and a HTML tags. Users cannot deploy from Shipit until they have checked each item in the checklist.

For example:

review:
  checklist:
    - >
      Do you know if it is safe to revert the code being shipped? What happens if we need to undo this deploy?
    - Has the Docs team been notified of any major changes to the app?
    - Is the app stable right now?

review.monitoring contains a list of inclusions that appear on the deployment page in Shipit. Inclusions can either be images or iframes.

For example:

review:
  monitoring:
    - image: https://example.com/monitoring.png
    - iframe: https://example.com/monitoring.html

review.checks contains a list of commands that will be executed during the pre-deploy review step. Their output appears on the deployment page in Shipit, and if continuous delivery is enabled, deploys will only be triggered if those commands are successful.

For example:

review:
  checks:
    - bundle exec rake db:migrate:status

Shell commands timeout

All the shell commands can take an optional timeout parameter to limit their duration:

deploy:
  override:
    - ./script/deploy:
        timeout: 30
  post:
    - ./script/notify_deploy_end: { timeout: 15 }
review:
  checks:
    - bundle exec rake db:migrate:status:
        timeout: 60

See also commands_inactivity_timeout in secrets.yml for a global timeout setting.


Script parameters

Your deploy scripts have access to the following environment variables:

  • SHIPIT: Set to 1 to allow your script to know it's executed by Shipit
  • SHIPIT_LINK: URL to the task output, useful to broadcast it in an IRC channel
  • SHIPIT_USER: Full name of the user that triggered the deploy/task
  • GITHUB_REPO_NAME: Name of the GitHub repository being used for the current deploy/task.
  • GITHUB_REPO_OWNER: The GitHub username of the repository owner for the current deploy/task.
  • EMAIL: Email of the user that triggered the deploy/task (if available)
  • ENVIRONMENT: The stack environment (e.g production / staging)
  • BRANCH: The stack branch (e.g master)
  • LAST_DEPLOYED_SHA: The git SHA of the last deployed commit
  • DIFF_LINK: URL to the diff on GitHub.
  • TASK_ID: ID of the task that is running
  • All the content of the secrets.yml env key
  • All the content of the shipit.yml machine.environment key

These variables are accessible only during deploys and rollback:

  • REVISION: the git SHA of the revision that must be deployed in production
  • SHA: alias for REVISION

Configuring providers

Heroku

To use Heroku integration (lib/snippets/push-to-heroku), make sure that the environment has Heroku CLI available.

Kubernetes

For Kubernetes, you have to provision Shipit environment with the following tools:

  • kubectl
  • kubernetes-deploy gem

IV. INTEGRATING

Registering webhooks

Shipit handles several webhook types by default, listed in Shipit::Wehbooks::DEFAULT_HANDLERS, in order to implement default behaviours. Extra handler blocks can be registered via Shipit::Webhooks.register_handler. Valid handlers need only implement the call method - meaning any object which implements call - blocks, procs, or lambdas are valid. The webhooks controller will pass a params argument to the handler. Some examples:

Registering a Plain old Ruby Object as a handler

class PullRequestHandler
  def call(params)
    # do something with pull request webhook events
  end
end

Shipit::Webhooks.register_handler('pull_request', PullRequestHandler)

Registering a Block as a handler

Shipit::Webhooks.register_handler('pull_request') do |params|
  # do something with pull request webhook events
end

Multiple handler blocks can be registered. If any raise errors, execution will be halted and the request will be reported failed to github.

V. CONTRIBUTING

Instructions

  1. Fork it ( https://github.com/shopify/shipit-engine/fork )
  2. Create your feature branch (git checkout -b my-new-feature)
  3. Commit your changes (git commit -am 'Add some feature')
  4. Push to the branch (git push origin my-new-feature)
  5. Create a new Pull Request

Local development

This repository has a test/dummy app in it which can be used for local development without having to setup a new rails application.

Run ./bin/bootstrap in order to bootstrap the dummy application. The bootstrap script is going to:

  • Copy config/secrets.development.example.yml to config/secrets.development.yml;
  • Make sure all dependencies are installed;
  • Create and seed database (recreate database if already available);

Run ./test/dummy/bin/rails server to run the rails dummy application.

Set the environment variable SHIPIT_DISABLE_AUTH=1 in order to disable authentication.

If you need to test caching behaviour in the dummy application, use bin/rails dev:cache.

More Repositories

1

draggable

The JavaScript Drag & Drop library your grandparents warned you about.
JavaScript
17,927
star
2

dashing

The exceptionally handsome dashboard framework in Ruby and Coffeescript.
JavaScript
11,025
star
3

liquid

Liquid markup language. Safe, customer facing template language for flexible web apps.
Ruby
10,419
star
4

toxiproxy

⏰ 🔥 A TCP proxy to simulate network and system conditions for chaos and resiliency testing
Go
9,412
star
5

react-native-skia

High-performance React Native Graphics using Skia
TypeScript
6,746
star
6

flash-list

A better list for React Native
TypeScript
5,489
star
7

polaris

Shopify’s design system to help us work together to build a great experience for all of our merchants.
TypeScript
5,352
star
8

hydrogen-v1

React-based framework for building dynamic, Shopify-powered custom storefronts.
TypeScript
3,747
star
9

go-lua

A Lua VM in Go
Go
2,773
star
10

bootsnap

Boot large Ruby/Rails apps faster
Ruby
2,614
star
11

graphql-design-tutorial

2,335
star
12

restyle

A type-enforced system for building UI components in React Native with TypeScript.
TypeScript
2,331
star
13

dawn

Shopify's first source available reference theme, with Online Store 2.0 features and performance built-in.
Liquid
2,279
star
14

identity_cache

IdentityCache is a blob level caching solution to plug into Active Record. Don't #find, #fetch!
Ruby
1,874
star
15

quilt

A loosely related set of packages for JavaScript/TypeScript projects at Shopify
TypeScript
1,703
star
16

shopify_app

A Rails Engine for building Shopify Apps
Ruby
1,649
star
17

kubeaudit

kubeaudit helps you audit your Kubernetes clusters against common security controls
Go
1,624
star
18

graphql-batch

A query batching executor for the graphql gem
Ruby
1,388
star
19

packwerk

Good things come in small packages.
Ruby
1,346
star
20

krane

A command-line tool that helps you ship changes to a Kubernetes namespace and understand the result
Ruby
1,309
star
21

semian

🐒 Resiliency toolkit for Ruby for failing fast
Ruby
1,286
star
22

slate

Slate is a toolkit for developing Shopify themes. It's designed to assist your workflow and speed up the process of developing, testing, and deploying themes.
JavaScript
1,283
star
23

ejson

EJSON is a small library to manage encrypted secrets using asymmetric encryption.
Go
1,246
star
24

superdb

The Super Debugger, a realtime wireless debugger for iOS
Objective-C
1,158
star
25

shopify_python_api

ShopifyAPI library allows Python developers to programmatically access the admin section of stores
Python
1,072
star
26

storefront-api-examples

Example custom storefront applications built on Shopify's Storefront API
JavaScript
1,069
star
27

themekit

Shopify theme development command line tool.
Go
1,068
star
28

Timber

The ultimate Shopify theme framework, built by Shopify.
Liquid
992
star
29

shopify-cli

Shopify CLI helps you build against the Shopify platform faster.
Ruby
987
star
30

shopify-api-ruby

ShopifyAPI is a lightweight gem for accessing the Shopify admin REST and GraphQL web services.
Ruby
982
star
31

hydrogen

Hydrogen is Shopify’s stack for headless commerce. It provides a set of tools, utilities, and best-in-class examples for building dynamic and performant commerce applications. Hydrogen is designed to dovetail with Remix, Shopify’s full stack web framework, but it also provides a React library portable to other supporting frameworks. Demo store 👇🏼
TypeScript
966
star
32

js-buy-sdk

The JS Buy SDK is a lightweight library that allows you to build ecommerce into any website. It is based on Shopify's API and provides the ability to retrieve products and collections from your shop, add products to a cart, and checkout.
JavaScript
932
star
33

job-iteration

Makes your background jobs interruptible and resumable by design.
Ruby
907
star
34

cli-ui

Terminal user interface library
Ruby
869
star
35

react-native-performance

Performance monitoring for React Native apps
TypeScript
860
star
36

ruby-lsp

An opinionated language server for Ruby
Ruby
851
star
37

active_shipping

ActiveShipping is a simple shipping abstraction library extracted from Shopify
Ruby
809
star
38

shopify-api-js

Shopify Admin API Library for Node. Accelerate development with support for authentication, graphql proxy, webhooks
TypeScript
765
star
39

tapioca

The swiss army knife of RBI generation
Ruby
733
star
40

maintenance_tasks

A Rails engine for queueing and managing data migrations.
Ruby
705
star
41

shopify-app-template-node

JavaScript
701
star
42

remote-ui

TypeScript
701
star
43

erb_lint

Lint your ERB or HTML files
Ruby
651
star
44

shopify_theme

A console tool for interacting with Shopify Theme Assets.
Ruby
640
star
45

pitchfork

Ruby
630
star
46

ghostferry

The swiss army knife of live data migrations
Go
596
star
47

yjit

Optimizing JIT compiler built inside CRuby
593
star
48

statsd-instrument

A StatsD client for Ruby apps. Provides metaprogramming methods to inject StatsD instrumentation into your code.
Ruby
546
star
49

autotuner

Get suggestions to tune Ruby's garbage collector
Ruby
511
star
50

shopify.github.com

A collection of the open source projects by Shopify
CSS
505
star
51

ruby-style-guide

Shopify’s Ruby Style Guide
Ruby
475
star
52

theme-scripts

Theme Scripts is a collection of utility libraries which help theme developers with problems unique to Shopify Themes.
JavaScript
470
star
53

livedata-ktx

Kotlin extension for LiveData, chaining like RxJava
Kotlin
468
star
54

starter-theme

The Shopify Themes Team opinionated starting point for new a Slate project
Liquid
459
star
55

shopify-demo-app-node-react

JavaScript
444
star
56

web-configs

Common configurations for building web apps at Shopify
JavaScript
433
star
57

mobile-buy-sdk-ios

Shopify’s Mobile Buy SDK makes it simple to sell physical products inside your mobile app. With a few lines of code, you can connect your app with the Shopify platform and let your users buy your products using Apple Pay or their credit card.
Swift
433
star
58

shopify_django_app

Get a Shopify app up and running with Django and Python Shopify API
Python
425
star
59

deprecation_toolkit

⚒Eliminate deprecations from your codebase ⚒
Ruby
390
star
60

ruby-lsp-rails

A Ruby LSP extension for Rails
Ruby
388
star
61

bootboot

Dualboot your Ruby app made easy
Ruby
374
star
62

FunctionalTableData

Declarative UITableViewDataSource implementation
Swift
365
star
63

shadowenv

reversible directory-local environment variable manipulations
Rust
349
star
64

shopify-node-app

An example app that uses Polaris components and shopify-express
JavaScript
327
star
65

polaris-viz

A collection of React and React native components that compose Shopify's data visualization system
TypeScript
317
star
66

better-html

Better HTML for Rails
Ruby
311
star
67

theme-check

The Ultimate Shopify Theme Linter
Ruby
306
star
68

product-reviews-sample-app

A sample Shopify application that creates and stores product reviews for a store, written in Node.js
JavaScript
300
star
69

tracky

The easiest way to do motion tracking!
Swift
295
star
70

shopify-api-php

PHP
279
star
71

measured

Encapsulate measurements and their units in Ruby.
Ruby
275
star
72

cli

Build apps, themes, and hydrogen storefronts for Shopify
TypeScript
273
star
73

money

Manage money in Shopify with a class that won't lose pennies during division
Ruby
265
star
74

javascript

The home for all things JavaScript at Shopify.
253
star
75

ruvy

Rust
252
star
76

limiter

Simple Ruby rate limiting mechanism.
Ruby
244
star
77

vscode-ruby-lsp

VS Code plugin for connecting with the Ruby LSP
TypeScript
232
star
78

ruby_memcheck

Use Valgrind memcheck on your native gem without going crazy
Ruby
230
star
79

polaris-tokens

Design tokens for Polaris, Shopify’s design system
TypeScript
230
star
80

buy-button-js

BuyButton.js is a highly customizable UI library for adding ecommerce functionality to any website.
JavaScript
230
star
81

android-testify

Add screenshots to your Android tests
Kotlin
225
star
82

spoom

Useful tools for Sorbet enthusiasts
Ruby
220
star
83

turbograft

Hard fork of turbolinks, adding partial page replacement strategies, and utilities.
JavaScript
213
star
84

mobile-buy-sdk-android

Shopify’s Mobile Buy SDK makes it simple to sell physical products inside your mobile app. With a few lines of code, you can connect your app with the Shopify platform and let your users buy your products using their credit card.
Java
202
star
85

graphql-js-client

A Relay compliant GraphQL client.
JavaScript
187
star
86

shopify-app-template-php

PHP
186
star
87

skeleton-theme

A barebones ☠️starter theme with the required files needed to compile with Slate and upload to Shopify.
Liquid
185
star
88

sprockets-commoner

Use Babel in Sprockets to compile JavaScript modules for the browser
Ruby
182
star
89

rotoscope

High-performance logger of Ruby method invocations
Ruby
180
star
90

shopify-app-template-remix

TypeScript
178
star
91

git-chain

Tool to rebase multiple Git branches based on the previous one.
Ruby
176
star
92

verdict

Framework to define and implement A/B tests in your application, and collect data for analysis purposes.
Ruby
176
star
93

hydrogen-react

Reusable components and utilities for building Shopify-powered custom storefronts.
TypeScript
174
star
94

ui-extensions

TypeScript
173
star
95

storefront-api-learning-kit

JavaScript
171
star
96

heap-profiler

Ruby heap profiler
C++
159
star
97

autoload_reloader

Experimental implementation of code reloading using Ruby's autoload
Ruby
158
star
98

app_profiler

Collect performance profiles for your Rails application.
Ruby
157
star
99

graphql-metrics

Extract as much much detail as you want from GraphQL queries, served up from your Ruby app and the graphql gem.
Ruby
157
star
100

active_fulfillment

Active Merchant library for integration with order fulfillment services
Ruby
155
star