Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Patience and the right tools II – ways to handle 
content model changes

Patience and the right tools II – ways to handle 
content model changes

stefan judis

June 28, 2018
Tweet

More Decks by stefan judis

Other Decks in Technology

Transcript

  1. Patience and the right tools
    @stefanjudis
    Ways to handle

    content model changes

    View Slide

  2. Stefan Judis
    Frontend Developer, Occasional Teacher, Meetup Organizer
    ❤ Open Source, Performance and Accessibility ❤
    @stefanjudis

    View Slide

  3. NOBODY(!)
    GETS IT RIGHT
    THE FIRST
    TIME...

    View Slide

  4. 4
    WAYS TO SURVIVE
    SHARE
    &
    REUSE
    ANALYSE EVOLVE

    View Slide

  5. 5
    WAYS TO SURVIVE
    SHARE
    &
    REUSE
    ANALYSE EVOLVE

    View Slide

  6. github.com/contentful/contentful-migration

    View Slide

  7. github.com/contentful/contentful-migration
    PROGRAMMATIC
    CONTENT MODEL
    CHANGES

    View Slide

  8. MIGRATION CLI
    CONTENT TYPE OPERATIONS
    Create a content type
    01
    02
    03
    04
    05
    Delete a content type
    Edit a content type
    Create/edit/delete fields
    Change a field ID

    View Slide

  9. Transform an entry in place
    01
    02 Derive an entry from another
    MIGRATION CLI
    CONTENT TRANSFORMATIONS

    View Slide

  10. MIGRATION CLI
    ADVANTAGES
    Repeatable
    01
    02
    03
    04
    Can be kept in VC
    Includes sanity checks
    Perfect for CI

    View Slide

  11. View Slide

  12. speakerdeck.com/stefanjudis/patience-and-the-right-tools-ways-to-approach-content-modelling
    youtu.be/eX2FzlA-QnQ

    View Slide

  13. 13
    How to
    DISCARD TEST PREVIEW
    a migration?

    View Slide

  14. Sandbox Environments

    View Slide

  15. View Slide

  16. CREATE MULTIPLE
    VERSIONS OF A SPACE
    CHANGE/TEST THEM IN
    ISOLATION

    View Slide

  17. cdn.contentful.com/spaces/{space_id}/entries
    const contentful = require('contentful');
    const client = contentful.createClient({
    space: '',
    accessToken: ''
    });
    client.getEntries();

    View Slide

  18. cdn.contentful.com/spaces/{space_id}/environments/{environment_id}/entries
    const contentful = require('contentful');
    const client = contentful.createClient({
    space: '',
    environment: '',
    accessToken: ''
    });
    client.getEntries();

    View Slide

  19. COPIED
    Content types Entries Assets
    Locales UI-extensions Saved views
    SHARED
    Users & space memberships
    Roles & permissions
    API keys Web hooks

    View Slide

  20. youtu.be/7DE6PQ3tPyI

    View Slide

  21. 21
    Common use cases
    LOCAL
    DEVELOPMENT
    STAGING/QA
    CONTINUOUS
    INTEGRATION

    View Slide

  22. 22
    Common use cases
    LOCAL
    DEVELOPMENT
    STAGING/QA
    CONTINUOUS
    INTEGRATION

    View Slide

  23. View Slide

  24. 24
    Common use cases
    LOCAL
    DEVELOPMENT
    STAGING/QA
    CONTINUOUS
    INTEGRATION

    View Slide

  25. FEATURE SANDBOXES

    View Slide

  26. FEATURE SANDBOXES
    ENVIRONMENT SANDBOXES

    View Slide

  27. ENVIRONMENT SANDBOXES
    FEATURE SANDBOXES
    CI SANDBOXES

    View Slide

  28. www.contentful.com/r/knowledgebase/cms-as-code/
    www.contentful.com/developers/docs/concepts/multiple-environments/

    View Slide

  29. www.contentful.com/r/knowledgebase/cms-as-code/
    www.contentful.com/developers/docs/concepts/multiple-environments/
    BUT HOW
    TO DO THIS?

    View Slide

  30. View Slide

  31. migrations
    0_0_4.js
    0_0_5.js
    0_0_6.js
    0_0_7.js
    0_0_8.js

    View Slide

  32. 0_0_8.js
    module.exports = function runMigration(migration) {
    const post = migration.editContentType("post");
    post
    .createField("rating")
    .name("Rating")
    .type("Number")
    .required(false);
    return;
    };

    View Slide

  33. - run:
    name: Preparing environment for testing
    command: |
    . venv/bin/activate
    python scripts/migration_prep.py "CI_$CIRCLE_BRANCH"
    scripts/migrate.js $SPACE_ID "CI_$CIRCLE_BRANCH" $MANAGEMENT_API_KEY

    View Slide

  34. - run:
    name: Preparing environment for testing
    command: |
    . venv/bin/activate
    python scripts/migration_prep.py "CI_$CIRCLE_BRANCH"
    scripts/migrate.js $SPACE_ID "CI_$CIRCLE_BRANCH" $MANAGEMENT_API_KEY
    client = contentful_management.Client(MANGEMENT_API_KEY)
    environment = client.environments(SPACE_ID).create(TESTING_ENV, {"name": TESTING_ENV})

    View Slide

  35. - run:
    name: Preparing environment for testing
    command: |
    . venv/bin/activate
    python scripts/migration_prep.py "CI_$CIRCLE_BRANCH"
    scripts/migrate.js $SPACE_ID "CI_$CIRCLE_BRANCH" $MANAGEMENT_API_KEY
    const {default: runMigration} = require('contentful-migration/built/bin/cli');
    await runMigration({ /* ... */ });
    client = contentful_management.Client(MANGEMENT_API_KEY)
    environment = client.environments(SPACE_ID).create(TESTING_ENV, {"name": TESTING_ENV})

    View Slide

  36. Keep code and
    content model in sync

    View Slide

  37. Demo

    View Slide

  38. Feedback?
    Ideas?

    View Slide

  39. Integrate your content model
    into your delivery pipeline

    View Slide

  40. Thanks.
    @stefanjudis
    Slides
    ctfl.io/ci-environments
    Example
    ctfl.io/ci-environments-example

    View Slide