diff --git a/.github/workflows/hugo.yaml b/.github/workflows/hugo.yaml
new file mode 100644
index 0000000..11a088f
--- /dev/null
+++ b/.github/workflows/hugo.yaml
@@ -0,0 +1,75 @@
+name: Deploy Site
+
+on:
+ push:
+ branches:
+ - main
+
+ # Allows you to run this workflow manually from the Actions tab
+ workflow_dispatch:
+
+# Sets permissions of the GITHUB_TOKEN to allow deployment to GitHub Pages
+permissions:
+ contents: read
+ pages: write
+ id-token: write
+
+# Allow only one concurrent deployment, skipping runs queued between the run in-progress and latest queued.
+# However, do NOT cancel in-progress runs as we want to allow these production deployments to complete.
+concurrency:
+ group: "pages"
+ cancel-in-progress: false
+
+# Default to bash
+defaults:
+ run:
+ shell: bash
+
+jobs:
+ # Build job
+ build:
+ runs-on: ubuntu-latest
+ env:
+ HUGO_VERSION: 0.133.0
+ steps:
+ - name: Install Hugo CLI
+ run: |
+ wget -O ${{ runner.temp }}/hugo.deb https://github.com/gohugoio/hugo/releases/download/v${HUGO_VERSION}/hugo_extended_${HUGO_VERSION}_linux-amd64.deb \
+ && sudo dpkg -i ${{ runner.temp }}/hugo.deb
+ - name: Checkout
+ uses: actions/checkout@v4
+ with:
+ submodules: recursive
+ fetch-depth: 0
+ - name: Setup Pages
+ id: pages
+ uses: actions/configure-pages@v5
+ - name: Install Node.js dependencies
+ run: "[[ -f package-lock.json || -f npm-shrinkwrap.json ]] && npm ci || true"
+ - name: Build with Hugo
+ env:
+ HUGO_CACHEDIR: ${{ runner.temp }}/hugo_cache
+ HUGO_ENVIRONMENT: production
+ TZ: America/Toronto
+ run: |
+ hugo \
+ --gc \
+ --minify
+ - name: Upload artifact
+ uses: actions/upload-pages-artifact@v3
+ with:
+ path: ./public
+
+ # Deployment job
+ deploy:
+ environment:
+ name: github-pages
+ url: ${{ steps.deployment.outputs.page_url }}
+ runs-on: ubuntu-latest
+ needs: build
+ steps:
+ - name: Deploy to GitHub Pages
+ id: deployment
+ uses: actions/deploy-pages@v4
+
+
diff --git a/.gitignore b/.gitignore
index 57510a2..d1ba582 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1 +1,4 @@
_site/
+public/
+
+.DS_Store
diff --git a/.hugo_build.lock b/.hugo_build.lock
new file mode 100644
index 0000000..e69de29
diff --git a/404.html b/404.html
deleted file mode 100644
index 086a5c9..0000000
--- a/404.html
+++ /dev/null
@@ -1,25 +0,0 @@
----
-permalink: /404.html
-layout: default
----
-
-
-
-
-
404
-
-
Page not found :(
-
The requested page could not be found.
-
diff --git a/Gemfile b/Gemfile
deleted file mode 100644
index ff2c342..0000000
--- a/Gemfile
+++ /dev/null
@@ -1,33 +0,0 @@
-source "https://rubygems.org"
-# Hello! This is where you manage which Jekyll version is used to run.
-# When you want to use a different version, change it below, save the
-# file and run `bundle install`. Run Jekyll with `bundle exec`, like so:
-#
-# bundle exec jekyll serve
-#
-# This will help ensure the proper Jekyll version is running.
-# Happy Jekylling!
-gem "jekyll", "~> 4.3.2"
-# This is the default theme for new Jekyll sites. You may change this to anything you like.
-gem "minima", "~> 2.5"
-# If you want to use GitHub Pages, remove the "gem "jekyll"" above and
-# uncomment the line below. To upgrade, run `bundle update github-pages`.
-# gem "github-pages", group: :jekyll_plugins
-# If you have any plugins, put them here!
-group :jekyll_plugins do
- gem "jekyll-feed", "~> 0.12"
-end
-
-# Windows and JRuby does not include zoneinfo files, so bundle the tzinfo-data gem
-# and associated library.
-platforms :mingw, :x64_mingw, :mswin, :jruby do
- gem "tzinfo", ">= 1", "< 3"
- gem "tzinfo-data"
-end
-
-# Performance-booster for watching directories on Windows
-gem "wdm", "~> 0.1.1", :platforms => [:mingw, :x64_mingw, :mswin]
-
-# Lock `http_parser.rb` gem to `v0.6.x` on JRuby builds since newer versions of the gem
-# do not have a Java counterpart.
-gem "http_parser.rb", "~> 0.6.0", :platforms => [:jruby]
diff --git a/Gemfile.lock b/Gemfile.lock
deleted file mode 100644
index 3f50a5f..0000000
--- a/Gemfile.lock
+++ /dev/null
@@ -1,84 +0,0 @@
-GEM
- remote: https://rubygems.org/
- specs:
- addressable (2.8.1)
- public_suffix (>= 2.0.2, < 6.0)
- colorator (1.1.0)
- concurrent-ruby (1.2.0)
- em-websocket (0.5.3)
- eventmachine (>= 0.12.9)
- http_parser.rb (~> 0)
- eventmachine (1.2.7)
- ffi (1.15.5)
- forwardable-extended (2.6.0)
- google-protobuf (3.22.0-arm64-darwin)
- http_parser.rb (0.8.0)
- i18n (1.12.0)
- concurrent-ruby (~> 1.0)
- jekyll (4.3.2)
- addressable (~> 2.4)
- colorator (~> 1.0)
- em-websocket (~> 0.5)
- i18n (~> 1.0)
- jekyll-sass-converter (>= 2.0, < 4.0)
- jekyll-watch (~> 2.0)
- kramdown (~> 2.3, >= 2.3.1)
- kramdown-parser-gfm (~> 1.0)
- liquid (~> 4.0)
- mercenary (>= 0.3.6, < 0.5)
- pathutil (~> 0.9)
- rouge (>= 3.0, < 5.0)
- safe_yaml (~> 1.0)
- terminal-table (>= 1.8, < 4.0)
- webrick (~> 1.7)
- jekyll-feed (0.17.0)
- jekyll (>= 3.7, < 5.0)
- jekyll-sass-converter (3.0.0)
- sass-embedded (~> 1.54)
- jekyll-seo-tag (2.8.0)
- jekyll (>= 3.8, < 5.0)
- jekyll-watch (2.2.1)
- listen (~> 3.0)
- kramdown (2.4.0)
- rexml
- kramdown-parser-gfm (1.1.0)
- kramdown (~> 2.0)
- liquid (4.0.4)
- listen (3.8.0)
- rb-fsevent (~> 0.10, >= 0.10.3)
- rb-inotify (~> 0.9, >= 0.9.10)
- mercenary (0.4.0)
- minima (2.5.1)
- jekyll (>= 3.5, < 5.0)
- jekyll-feed (~> 0.9)
- jekyll-seo-tag (~> 2.1)
- pathutil (0.16.2)
- forwardable-extended (~> 2.6)
- public_suffix (5.0.1)
- rb-fsevent (0.11.2)
- rb-inotify (0.10.1)
- ffi (~> 1.0)
- rexml (3.2.5)
- rouge (4.1.0)
- safe_yaml (1.0.5)
- sass-embedded (1.58.3-arm64-darwin)
- google-protobuf (~> 3.21)
- terminal-table (3.0.2)
- unicode-display_width (>= 1.1.1, < 3)
- unicode-display_width (2.4.2)
- webrick (1.8.1)
-
-PLATFORMS
- arm64-darwin-22
-
-DEPENDENCIES
- http_parser.rb (~> 0.6.0)
- jekyll (~> 4.3.2)
- jekyll-feed (~> 0.12)
- minima (~> 2.5)
- tzinfo (>= 1, < 3)
- tzinfo-data
- wdm (~> 0.1.1)
-
-BUNDLED WITH
- 2.4.7
diff --git a/README.md b/README.md
index 5511c00..06d5b61 100644
--- a/README.md
+++ b/README.md
@@ -1 +1,26 @@
-# blog
\ No newline at end of file
+# Concourse Blog
+
+This repo contains the blog posts for blog.concourse-ci.org
+
+## Running the blog locally
+
+```
+hug server
+```
+
+## Adding a New Blog Post
+
+```
+touch content/posts/YYYY-MM-DD-my-post.md
+```
+With the following content
+```
++++
+title = "{{ replace .TranslationBaseName "-" " " | title }}"
+date = "{{ .Date }}"
+author = ""
+tags = ["", ""]
+keywords = ["", ""]
+description = ""
++++
+```
\ No newline at end of file
diff --git a/_config.yml b/_config.yml
deleted file mode 100644
index 7b683c1..0000000
--- a/_config.yml
+++ /dev/null
@@ -1,53 +0,0 @@
-# Welcome to Jekyll!
-#
-# This config file is meant for settings that affect your whole blog, values
-# which you are expected to set up once and rarely edit after that. If you find
-# yourself editing this file very often, consider using Jekyll's data files
-# feature for the data you need to update frequently.
-#
-# For technical reasons, this file is *NOT* reloaded automatically when you use
-# 'bundle exec jekyll serve'. If you change this file, please restart the server process.
-#
-# If you need help with YAML syntax, here are some quick references for you:
-# https://learn-the-web.algonquindesign.ca/topics/markdown-yaml-cheat-sheet/#yaml
-# https://learnxinyminutes.com/docs/yaml/
-#
-# Site settings
-# These are used to personalize your new site. If you look in the HTML files,
-# you will see them accessed via {{ site.title }}, {{ site.email }}, and so on.
-# You can create any custom variable you would like, and they will be accessible
-# in the templates via {{ site.myvariable }}.
-
-title: Concourse Blog
-email: noreply@blog.concourse-ci.org
-description: >- # this means to ignore newlines until "baseurl:"
- Come Fly The Friendly CI
-baseurl: "" # the subpath of your site, e.g. /blog
-url: "http://blog.concourse-ci.org" # the base hostname & protocol for your site, e.g. http://example.com
-twitter_username:
-github_username: concourse
-
-# Build settings
-theme: minima
-plugins:
- - jekyll-feed
-
-# Exclude from processing.
-# The following items will not be processed, by default.
-# Any item listed under the `exclude:` key here will be automatically added to
-# the internal "default list".
-#
-# Excluded items can be processed by explicitly listing the directories or
-# their entries' file path in the `include:` list.
-#
-# exclude:
-# - .sass-cache/
-# - .jekyll-cache/
-# - gemfiles/
-# - Gemfile
-# - Gemfile.lock
-# - node_modules/
-# - vendor/bundle/
-# - vendor/cache/
-# - vendor/gems/
-# - vendor/ruby/
diff --git a/_posts/2020-05-25-introduction-to-task-inputs-and-outputs.markdown b/_posts/2020-05-25-introduction-to-task-inputs-and-outputs.markdown
deleted file mode 100644
index e91fae9..0000000
--- a/_posts/2020-05-25-introduction-to-task-inputs-and-outputs.markdown
+++ /dev/null
@@ -1,467 +0,0 @@
----
-layout: post
-title: Introduction to Task Inputs and Outputs
-date: '2020-05-25 13:14:40'
-tags:
-- tutorials
----
-
-Understanding how task inputs and outputs work in Concourse can be a little confusing initially. This post will walk you through a few example pipelines to show you how inputs and outputs work within a single Concourse job. By the end you should understand how inputs and outputs work within the context of a single job.
-
-Let's define some jargon first.
-
-- **step** : A [step](https://concourse-ci.org/jobs.html#steps) is a container running code within the context of a Concourse job. A [step](https://concourse-ci.org/jobs.html#steps) may have inputs and/or outputs, or neither.
-- **Job plan** : A list of [step](https://concourse-ci.org/jobs.html#steps)s that a job will execute when triggered.
-- **Inputs and Outputs** : These are directories. Within Concourse they're generically referred to as **artifacts**. These artifacts are mounted in a **step**'s container under a directory with _some-name_. You, as a writer of Concourse pipelines, have control over what the name of your artifacts will be. If you're coming from the Docker world, artifact is synonymous with [volumes](https://docs.docker.com/storage/volumes/).
-
-To run the pipelines in the following examples yourself you can get your own Concourse running locally by following the [Quick Start guide](https://concourse-ci.org/quick-start.html). Then use [`fly set-pipeline`](https://concourse-ci.org/setting-pipelines.html) to see the pipelines in action.
-
-Concourse pipelines contain a lot of information. Within each pipeline YAML there are comments to help bring specific lines to your attention.
-
-## Example One - Two Tasks
-
-This pipeline will show us how to create outputs and pass outputs as inputs to the next [step](https://concourse-ci.org/jobs.html#steps)(s) in a [job plan](https://concourse-ci.org/jobs.html#schema.job.plan).
-
-This pipeline has two tasks. The first task outputs a file with the date. The second task reads and prints the contents of the file from the first task.
-
- ---
- jobs:
- - name: a-job
- plan:
- - task: create-one-output
- config:
- platform: linux
- image_resource:
- type: registry-image
- source: {repository: alpine}
- outputs:
- # Concourse will make an empty dir with this name
- # and save the contents for later steps
- - name: the-output
- run:
- path: /bin/sh
- args:
- - -cx
- - |
- ls -lah
- date > ./the-output/file
- - task: read-ouput-from-previous-step
- config:
- platform: linux
- image_resource:
- type: registry-image
- source: {repository: alpine}
- # You must explicitly name the inputs you expect
- # this task to have.
- # If you don't then outputs from previous steps
- # will not appear in the step's container.
- # The name must match the output from the previous step.
- # Try removing or renaming the input to see what happens!
- inputs:
- - name: the-output
- run:
- path: /bin/sh
- args:
- - -cx
- - |
- ls -lah
- cat ./the-output/file
-
-Here's a visual graphic of what happens when the above job is executed.
-
-
-## Example Two - Two tasks with the same output, who wins?
-
-This example is to satisfy the curiosity cat inside all of us! Never do this in real life because you're definitely going to hurt yourself!
-
-There are two jobs in this pipeline. The first job has two [step](https://concourse-ci.org/jobs.html#steps)s; both steps will produce an artifact named `the-output` in parallel. If you run the `writing-to-the-same-output-in-parallel` job multiple times you'll see the file in `the-output` folder changes depending on which of the parallel tasks finished last. Here's a visualization of the first job.
-
-
-
-The second job is a serial version of the first job. In this job the second task always wins because it's the last task that outputs `the-output`, so only `file2` will be in `the-output` directory in the last [step](https://concourse-ci.org/jobs.html#steps) in the [job plan](https://concourse-ci.org/jobs.html#schema.job.plan).
-
-
-
-This pipeline illustrates that you could accidentally overwrite the output from a previous [step](https://concourse-ci.org/jobs.html#steps) if you're not careful with the names of your outputs.
-
- ---
- jobs:
- - name: writing-to-the-same-output-in-parallel
- plan:
- # running two tasks that output in parallel?!?
- # who will win??
- - in_parallel:
- - task: create-the-output
- config:
- platform: linux
- image_resource:
- type: registry-image
- source: {repository: busybox}
- outputs:
- - name: the-output
- run:
- path: /bin/sh
- args:
- - -cx
- - |
- ls -lah
- date > ./the-output/file1
- - task: also-create-the-output
- config:
- platform: linux
- image_resource:
- type: registry-image
- source: {repository: busybox}
- outputs:
- - name: the-output
- run:
- path: /bin/sh
- args:
- - -cx
- - |
- ls -lah
- date > ./the-output/file2
- # run this job multiple times to see which
- # previous task wins each time
- - task: read-ouput-from-previous-step
- config:
- platform: linux
- image_resource:
- type: registry-image
- source: {repository: busybox}
- inputs:
- - name: the-output
- run:
- path: /bin/sh
- args:
- - -cx
- - |
- ls -lah ./the-output
- echo "Get ready to error!"
- cat ./the-output/file1 ./the-output/file2
-
- - name: writing-to-the-same-output-serially
- plan:
- - task: create-one-output
- config:
- platform: linux
- image_resource:
- type: registry-image
- source: {repository: busybox}
- outputs:
- - name: the-output
- run:
- path: /bin/sh
- args:
- - -cx
- - |
- ls -lah
- date > ./the-output/file1
- - task: create-another-output
- config:
- platform: linux
- image_resource:
- type: registry-image
- source: {repository: busybox}
- outputs:
- - name: the-output
- run:
- path: /bin/sh
- args:
- - -cx
- - |
- ls -lah
- date > ./the-output/file2
- - task: read-ouput-from-previous-step
- config:
- platform: linux
- image_resource:
- type: registry-image
- source: {repository: busybox}
- inputs:
- - name: the-output
- run:
- path: /bin/sh
- args:
- - -cx
- - |
- ls -lah ./the-output
- echo "Get ready to error!"
- cat ./the-output/file1 ./the-output/file2
-
-## Example Three - Input/Output Name Mapping
-
-Sometimes the names of inputs and outputs don't match, or they do match and you don't want them overwriting each other, like in the previous example. That's when [`input_mapping`](https://concourse-ci.org/jobs.html#schema.step.task-step.input_mapping) and [`output_mapping`](https://concourse-ci.org/jobs.html#schema.step.task-step.output_mapping) become helpful. Both of these features map the inputs/outputs in the task's config to some artifact name in the [job plan](https://concourse-ci.org/jobs.html#schema.job.plan).
-
-This pipeline has one job with four tasks.
-
-The first task outputs a file with the date to the `the-output` directory. `the-output` is mapped to the new name `demo-disk`. The artifact `demo-disk` is now available in the rest of the [job plan](https://concourse-ci.org/jobs.html#schema.job.plan) for future [step](https://concourse-ci.org/jobs.html#steps)s to take as inputs. The remaining steps do this in various ways.
-
-The second task reads and prints the contents of the file under the new name `demo-disk`.
-
-The third task reads and prints the contents of the file under another name, `generic-input`. The `demo-disk` artifact in the [job plan](https://concourse-ci.org/jobs.html#schema.job.plan) is mapped to `generic-input`.
-
-The fourth task tries to use the artifact named `the-output` as its input. This task fails to even start because there was no artifact with the name `the-output` available in the [job plan](https://concourse-ci.org/jobs.html#schema.job.plan); it was remapped to `demo-disk`.
-
-Here's a visualization of the job.
-
-
-
-Here's the pipeline YAML for you to run on your local Concourse.
-
- ---
- jobs:
- - name: a-job
- plan:
- - task: create-one-output
- # The task config has the artifact `the-output`
- # output_mapping will rename `the-output` to `demo-disk`
- # in the rest of the job's plan
- output_mapping:
- the-output: demo-disk
- config:
- platform: linux
- image_resource:
- type: registry-image
- source: {repository: busybox}
- outputs:
- - name: the-output
- run:
- path: /bin/sh
- args:
- - -cx
- - |
- ls -lah
- date > ./the-output/file
- # this task expects the artifact `demo-disk` so no mapping is needed
- - task: read-ouput-from-previous-step
- config:
- platform: linux
- image_resource:
- type: registry-image
- source: {repository: busybox}
- inputs:
- - name: demo-disk
- run:
- path: /bin/sh
- args:
- - -cx
- - |
- ls -lah
- cat ./demo-disk/file
- - task: rename-and-read-output
- # This task expects the artifact `generic-input`.
- # input_mapping will map the tasks `generic-input` to
- # the job plans `demo-disk` artifact
- input_mapping:
- generic-input: demo-disk
- config:
- platform: linux
- image_resource:
- type: registry-image
- source: {repository: busybox}
- inputs:
- - name: generic-input
- run:
- path: /bin/sh
- args:
- - -cx
- - |
- ls -lah
- cat ./generic-input/file
- - task: try-and-read-the-output
- input_mapping:
- generic-input: demo-disk
- config:
- platform: linux
- image_resource:
- type: registry-image
- source: {repository: busybox}
- # `the-output` is not available in the job plan
- # so this task will error while initializing
- # since there's no artiact named `the-output` in
- # the job's plan
- inputs:
- - name: the-output
- run:
- path: /bin/sh
- args:
- - -cx
- - |
- ls -lah
- cat ./generic-input/file
-
-## Example Four - Can you add files to an existing output artifact?
-
-This pipeline will also have two jobs in order to illustrate this point. What happens if we add a file to an output? If you think back to example two you may already know the answer.
-
-The first task will create `the-output` with `file1`. The second task will add `file2` to the `the-output`. The last task will read the contents of `file1` and `file2`.
-
-As long as you re-declare the input as an output in the second task you can modify any of your outputs.
-
-This means you can pass something between a bunch of tasks and have each task add or modify something in the artifact.
-
- ---
- jobs:
- - name: add-file-to-output
- plan:
- - task: create-one-output
- config:
- platform: linux
- image_resource:
- type: registry-image
- source: {repository: busybox}
- outputs:
- - name: the-output
- run:
- path: /bin/sh
- args:
- - -cx
- - |
- ls -lah
- date > ./the-output/file1
- - task: add-file-to-previous-output
- config:
- platform: linux
- image_resource:
- type: registry-image
- source: {repository: busybox}
- # this task lists the same artifact as
- # its input and output
- inputs:
- - name: the-output
- outputs:
- - name: the-output
- run:
- path: /bin/sh
- args:
- - -cx
- - |
- ls -lah
- date > ./the-output/file2
- - task: read-ouput-from-previous-step
- config:
- platform: linux
- image_resource:
- type: registry-image
- source: {repository: busybox}
- inputs:
- - name: the-output
- run:
- path: /bin/sh
- args:
- - -cx
- - |
- ls -lah ./the-output
- cat ./the-output/file1 ./the-output/file2
-
-Here's a visualization of the job.
-
-
-## Example Five - Multiple Outputs
-
-What happens if you have a task that has multiple outputs and a second task that only lists one of the outputs? Does the second task get the extra outputs from the first task?
-
-The answer is no. A task will only get the artifacts that match the name of the inputs listed in the task's config.
-
- ---
- jobs:
- - name: multiple-outputs
- plan:
- - task: create-three-outputs
- config:
- platform: linux
- image_resource:
- type: registry-image
- source: {repository: busybox}
- outputs:
- - name: the-output-1
- - name: the-output-2
- - name: the-output-3
- run:
- path: /bin/sh
- args:
- - -cx
- - |
- ls -lah
- date > ./the-output-1/file
- date > ./the-output-2/file
- date > ./the-output-3/file
- - task: take-one-output
- config:
- platform: linux
- image_resource:
- type: registry-image
- source: {repository: busybox}
- # only one of the three outputs are
- # listed as inputs
- inputs:
- - name: the-output-1
- run:
- path: /bin/sh
- args:
- - -cx
- - |
- ls -lah ./
- cat ./the-output-1/file
- - task: take-two-outputs
- config:
- platform: linux
- image_resource:
- type: registry-image
- source: {repository: busybox}
- # this task pulls in the other
- # two outputs, just for fun!
- inputs:
- - name: the-output-2
- - name: the-output-3
- run:
- path: /bin/sh
- args:
- - -cx
- - |
- ls -lah ./
- cat ./the-output-2/file
- cat ./the-output-3/file
-
-Here's a visualization of the above job.
-
-
-## Example Six - Get Steps
-
-The majority of Concourse pipelines have at least one resource, which means they have at least one [get step](https://concourse-ci.org/jobs.html#get-step). Using a get step in a job makes an artifact with the name of the get step available for later steps in the [job plan](https://concourse-ci.org/jobs.html#schema.job.plan) to consume as inputs.
-
- ---
- resources:
- - name: concourse-examples
- type: git
- source: {uri: "https://github.com/concourse/examples"}
-
- jobs:
- - name: get-step
- plan:
- # there will be an artifact named
- # "concourse-examples" available in the job plan
- - get: concourse-examples
- - task: take-one-output
- config:
- platform: linux
- image_resource:
- type: registry-image
- source: {repository: busybox}
- inputs:
- - name: concourse-examples
- run:
- path: /bin/sh
- args:
- - -cx
- - |
- ls -lah ./
- cat ./concourse-examples/README.md
-
-Here's a visualization for the above job.
-
-
-
-I hope you found these example helpful with figuring out how inputs and outputs work within a single Concourse job.
-
diff --git a/about.markdown b/about.markdown
deleted file mode 100644
index 8b4e0b2..0000000
--- a/about.markdown
+++ /dev/null
@@ -1,18 +0,0 @@
----
-layout: page
-title: About
-permalink: /about/
----
-
-This is the base Jekyll theme. You can find out more info about customizing your Jekyll theme, as well as basic Jekyll usage documentation at [jekyllrb.com](https://jekyllrb.com/)
-
-You can find the source code for Minima at GitHub:
-[jekyll][jekyll-organization] /
-[minima](https://github.com/jekyll/minima)
-
-You can find the source code for Jekyll at GitHub:
-[jekyll][jekyll-organization] /
-[jekyll](https://github.com/jekyll/jekyll)
-
-
-[jekyll-organization]: https://github.com/jekyll
diff --git a/_posts/2017-09-29-the-concourse-crew--2017-.markdown b/content/posts/2017-09-29-the-concourse-crew--2017.md
similarity index 90%
rename from _posts/2017-09-29-the-concourse-crew--2017-.markdown
rename to content/posts/2017-09-29-the-concourse-crew--2017.md
index 3c35279..ec633ed 100644
--- a/_posts/2017-09-29-the-concourse-crew--2017-.markdown
+++ b/content/posts/2017-09-29-the-concourse-crew--2017.md
@@ -6,7 +6,7 @@ tags:
- product-update
---
-
+{{< image src="/images/downloaded_images/The-Concourse-Crew--2017-/1-Q5Wx-Lltp5MDzh1rE2Yw0g.png" alt="Concourse logo" position="center" >}}
In 2014 the Concourse CI project started with just two engineers; Alex Suraci and Chris Brown. At the time, both Alex and Chris were working on the [Pivotal](https://medium.com/u/44756b810893) Cloud Foundry team. Over time, they became increasingly frustrated by existing CI/CD solutions. In response, Alex and Chris worked on designing a new CI/CD system in their spare time; imagining a new type of CI/CD system that would treat pipelines as first class citizens. After building some early prototypes and seeing early success internally within Pivotal, Concourse as released as an open source project with sponsorship from Pivotal.
diff --git a/_posts/2017-10-03-how-the-concourse-team-organize-issues.markdown b/content/posts/2017-10-03-how-the-concourse-team-organize-issues.md
similarity index 92%
rename from _posts/2017-10-03-how-the-concourse-team-organize-issues.markdown
rename to content/posts/2017-10-03-how-the-concourse-team-organize-issues.md
index ffcceaa..0b20a74 100644
--- a/_posts/2017-10-03-how-the-concourse-team-organize-issues.markdown
+++ b/content/posts/2017-10-03-how-the-concourse-team-organize-issues.md
@@ -1,12 +1,11 @@
---
-layout: post
title: How the Concourse Team Organize Issues
date: '2017-10-03 00:00:00'
tags:
- product-update
---
-
+{{< image src="/images/downloaded_images/How-the-Concourse-Team-Organize-Issues/1--19t4s8wuBf9tUCiluO_mQ.png" alt="" width="20%" >}}
As the Concourse team continues to grow in size and in the # of incoming issues, the team has been experimenting with new ways of managing our backlog. So far we have tried three different setups:
@@ -35,7 +34,7 @@ To address this, [Alex Suraci](https://medium.com/u/263a63b2f209) bucketed our i
By bucketing our issues into projects, engineers can now spend more time in thematically similar problem spaces in the Concourse codebase.
### GitHub Projects
-
+{{< image src="/images/downloaded_images/How-the-Concourse-Team-Organize-Issues/1-5wA-RflsG_zFAyYMw0O95w.png" alt="A snapshot of the Concourse UX project" width="100%">}}
Our Concourse Projects manifest themselves as GitHub Projects in the Concourse GitHub organization. Annoyingly, GitHub doesn’t (yet?) allow us to share these projects publicly.
diff --git a/_posts/2017-10-26-build-page-improvements.markdown b/content/posts/2017-10-26-build-page-improvements.md
similarity index 60%
rename from _posts/2017-10-26-build-page-improvements.markdown
rename to content/posts/2017-10-26-build-page-improvements.md
index 1f5de95..dc6e178 100644
--- a/_posts/2017-10-26-build-page-improvements.markdown
+++ b/content/posts/2017-10-26-build-page-improvements.md
@@ -1,10 +1,9 @@
---
-layout: post
title: Build Page Improvements
date: '2017-10-26 00:00:00'
---
-
+{{< image src="/images/downloaded_images/Build-Page-Improvements/1-vjvvVZAw9nO4yRrveU0Ojg.gif" alt="GIF demoing build page changes" width="50%" >}}
[Concourse v3.6.0](https://concourse-ci.org/downloads.html#v360) comes with two new features on the build output page: timestamps and keyboard shortcuts.
@@ -15,19 +14,19 @@ When looking at the build page, you will now see timestamps reported against eac
This feature addresses issue [#361](https://github.com/concourse/concourse/issues/361), [#838](https://github.com/concourse/concourse/issues/838) and [#1423](https://github.com/concourse/concourse/issues/1423). Thank you for your patience!
## Keyboard Shortcuts
-
+{{< image src="/images/downloaded_images/Build-Page-Improvements/1-8-_eZ3qsDLB8Sqq5I-9vTw.png" alt="" width="50%" >}}
-The build page also supports basic vim-style keyboard shortcuts as well. You can bring up a handy reference menu using ? or SHIFT + / if you’re really having trouble finding it.
+The build page also supports basic vim-style keyboard shortcuts as well. You can bring up a handy reference menu using `?` or `SHIFT + /` if you’re really having trouble finding it.
The supported keyboard shortcuts are:
-- h and l for previous / next build
-- j and k for scrolling up and down
-- T to trigger a new build
-- A to abort the build
-- gg to scroll back to the top of the page
-- G to scroll to the bottom of the page
-- ? to toggle the keyboard hint on and off
+- `h` and `l` for previous / next build
+- `j` and `k` for scrolling up and down
+- `T` to trigger a new build
+- `A` to abort the build
+- `gg` to scroll back to the top of the page
+- `G` to scroll to the bottom of the page
+- `?` to toggle the keyboard hint on and off
This feature closes out issue [#439](https://github.com/concourse/concourse/issues/439)
diff --git a/_posts/2017-11-01-sneak-peek--spatial-resources.markdown b/content/posts/2017-11-01-sneak-peek--spatial-resources.md
similarity index 82%
rename from _posts/2017-11-01-sneak-peek--spatial-resources.markdown
rename to content/posts/2017-11-01-sneak-peek--spatial-resources.md
index 2e6dfed..95c4a42 100644
--- a/_posts/2017-11-01-sneak-peek--spatial-resources.markdown
+++ b/content/posts/2017-11-01-sneak-peek--spatial-resources.md
@@ -1,25 +1,24 @@
---
-layout: post
title: 'Sneak Peek: Spatial Resources'
date: '2017-11-01 00:00:00'
---
-
+{{< image src="/images/downloaded_images/Sneak-Peek--Spatial-Resources/1-agN3JPhVv4Fyfvp-2VQsRQ.png" alt="An early visualization of Spatial Resources" width="100%" >}}
If you’ve been paying close attention to our [issues on GitHub](https://github.com/concourse/concourse/issues/) you may have noticed a small flurry of activity around one specific issue: [#1707 Spike: spatial resource flows](https://github.com/concourse/concourse/issues/1707).
-### What are Spatial Resources Flows (aka Space)?
+### What are Spatial Resources Flows (aka Space)?
The first reference to “spatial” resources came up in a proposal between [Alex Suraci](https://medium.com/u/263a63b2f209) and [Christopher Hendrix](https://medium.com/u/9c1e9edb1d5e) for Multi-branch workflows ( [#1172](https://github.com/concourse/concourse/issues/1172)). In that issue we focused specifically on one recurring problem: it’s a real pain to deal with the Git resource when you have multiple branches representing different streams of work.
Over time we researched similar build paradigms and thought deeply about generalized solutions that would fit nicely with the Concourse philosophy™:
-> Concourse makes it very easy to model changes over time. Resources do this for you; you point them at a given source of truth, and it’ll let you know everything that happened.Some workflows, however, can’t just be modeled as change over time. Multiple branches of a repo, or pull requests to a repository, are over _space_, not _time_. They are parallel pipelines, which today are hard to manage, and impossible to correlate (you cannot fan-in).
-> Build matrixes are another example of wanting to run over many spaces (i.e. versions of a product). This can be done today, within a pipeline, but results in a massive pipeline with every combination explicitly configured…
+> Concourse makes it very easy to model changes over time. Resources do this for you; you point them at a given source of truth, and it’ll let you know everything that happened.Some workflows, however, can’t just be modeled as change over time. Multiple branches of a repo, or pull requests to a repository, are over _space_, not _time_. They are parallel pipelines, which today are hard to manage, and impossible to correlate (you cannot fan-in).
+> Build matrixes are another example of wanting to run over many spaces (i.e. versions of a product). This can be done today, within a pipeline, but results in a massive pipeline with every combination explicitly configured...
> …(a spatial resource) introduces the ability to have arbitrary build matrixes within one pipeline, which should dramatically improve the experience for people testing many variations/combinations.
-### Would you like to know more?
-
+### Would you like to know more?
+{{< image src="/images/downloaded_images/Sneak-Peek--Spatial-Resources/1-9vFBBZBYtFvCxsDnoMZszw.jpeg" alt="" width="100%" >}}
There’s a few ways you can get involved as the Concourse team continues to build out spaces:
diff --git a/_posts/2017-12-01-concourse-at-springone-2017.markdown b/content/posts/2017-12-01-concourse-at-springone-2017.md
similarity index 90%
rename from _posts/2017-12-01-concourse-at-springone-2017.markdown
rename to content/posts/2017-12-01-concourse-at-springone-2017.md
index 0ce7d64..0c60e59 100644
--- a/_posts/2017-12-01-concourse-at-springone-2017.markdown
+++ b/content/posts/2017-12-01-concourse-at-springone-2017.md
@@ -1,12 +1,11 @@
---
-layout: post
title: Concourse at SpringOne 2017
date: '2017-12-01 00:00:00'
tags:
- product-update
---
-
+{{< image src="/images/downloaded_images/Concourse-at-SpringOne-2017/1-JzJoM_Man8MYThde2qy7Zg.png" alt="" width="100%" >}}
[Topher Bullock](https://medium.com/u/58876cdc2180), [Lindsay Auchinachie](https://medium.com/u/84b937bda3b6), [Alex Suraci](https://medium.com/u/263a63b2f209) and I will be travelling to San Francisco next week to attend the [SpringOne Platform 2017](https://springoneplatform.io/) Conference. Not only are there a lot of exciting Spring talks this year, but there will be a lot of CI/CD talks from some amazing speakers.
diff --git a/_posts/2018-02-02-concourse-updates--jan-29---feb-2--2018-.markdown b/content/posts/2018-02-02-concourse-updates--jan-29---feb-2--2018-.md
similarity index 99%
rename from _posts/2018-02-02-concourse-updates--jan-29---feb-2--2018-.markdown
rename to content/posts/2018-02-02-concourse-updates--jan-29---feb-2--2018-.md
index 3859938..366066a 100644
--- a/_posts/2018-02-02-concourse-updates--jan-29---feb-2--2018-.markdown
+++ b/content/posts/2018-02-02-concourse-updates--jan-29---feb-2--2018-.md
@@ -1,5 +1,4 @@
---
-layout: post
title: Concourse Updates (Jan 29 — Feb 2, 2018)
date: '2018-02-02 00:00:00'
tags:
diff --git a/_posts/2018-02-09-concourse-updates--feb-5---feb9-.markdown b/content/posts/2018-02-09-concourse-updates--feb-5---feb9-.md
similarity index 100%
rename from _posts/2018-02-09-concourse-updates--feb-5---feb9-.markdown
rename to content/posts/2018-02-09-concourse-updates--feb-5---feb9-.md
diff --git a/_posts/2018-02-16-concourse-update--feb-12-16-.markdown b/content/posts/2018-02-16-concourse-update--feb-12-16-.md
similarity index 92%
rename from _posts/2018-02-16-concourse-update--feb-12-16-.markdown
rename to content/posts/2018-02-16-concourse-update--feb-12-16-.md
index bd3f917..1287363 100644
--- a/_posts/2018-02-16-concourse-update--feb-12-16-.markdown
+++ b/content/posts/2018-02-16-concourse-update--feb-12-16-.md
@@ -13,7 +13,7 @@ If you haven’t heard the news by now, we released Concourse v3.9.0 this week
To find out what else we’ve packed into this release, I’d encourage you to read the full release notes on the [concourse.ci/downloads](https://concourse-ci.org/downloads.html#v390) page!
-On to the update…
+On to the update...
## **Features**
@@ -23,12 +23,12 @@ On to the update…
**Runtime**
-- As I mentioned last week, the Concourse team runs a relatively large installation of Concourse that is used by Pivotal employees for internal projects. As a result of running this giant Concourse, we’ve discovered that our Garbage Collector needs significant improvement in order to keep up with the workloads that we’ve been observing. GH issue [#2016](https://github.com/concourse/concourse/issues/2016)has been consuming a lot of our thoughts and feelings this week.
+- As I mentioned last week, the Concourse team runs a relatively large installation of Concourse that is used by Pivotal employees for internal projects. As a result of running this giant Concourse, we’ve discovered that our Garbage Collector needs significant improvement in order to keep up with the workloads that we’ve been observing. GH issue [#2016](https://github.com/concourse/concourse/issues/2016) has been consuming a lot of our thoughts and feelings this week.
**Core**
- Same as last week: continued breaking out our backend auth systems to use Dex [#1888](https://github.com/concourse/concourse/issues/1888), (see [#1886](https://github.com/concourse/concourse/issues/1886)for additional background)
-- ^^ Refactoring our complex backend to support individual auth is going to take some time, and we recognize that :)
+- ^^ Refactoring our complex backend to support individual auth is going to take some time, and we recognize that :)
## Design Research
diff --git a/_posts/2018-02-23-concourse-update--feb-20-23-.markdown b/content/posts/2018-02-23-concourse-update--feb-20-23-.md
similarity index 100%
rename from _posts/2018-02-23-concourse-update--feb-20-23-.markdown
rename to content/posts/2018-02-23-concourse-update--feb-20-23-.md
diff --git a/_posts/2018-03-02-concourse-update--feb-26---mar2-.markdown b/content/posts/2018-03-02-concourse-update--feb-26---mar2-.md
similarity index 100%
rename from _posts/2018-03-02-concourse-update--feb-26---mar2-.markdown
rename to content/posts/2018-03-02-concourse-update--feb-26---mar2-.md
diff --git a/_posts/2018-03-08-we-re-switchin--domains-.markdown b/content/posts/2018-03-08-we-re-switchin--domains-.md
similarity index 75%
rename from _posts/2018-03-08-we-re-switchin--domains-.markdown
rename to content/posts/2018-03-08-we-re-switchin--domains-.md
index 8b08283..92acac8 100644
--- a/_posts/2018-03-08-we-re-switchin--domains-.markdown
+++ b/content/posts/2018-03-08-we-re-switchin--domains-.md
@@ -1,5 +1,4 @@
---
-layout: post
title: We’re switchin’ domains.
date: '2018-03-08 00:00:00'
---
@@ -14,7 +13,7 @@ Before you say anything, I totally remembered to renew the domain. It was due to
As far as I can tell, our registrar just didn’t do the one thing it’s supposed to do: renew the damned domain. They took the money, bumped the expiry date on the website, and…apparently stopped there. They had literally one job and they didn’t do it.
-
+{{< youtube src="https://www.youtube.com/embed/4T2GmGSNvaM?start=39" >}}
So some Joe Schmoe out of Macedonia went ahead and registered it somewhere else, presumeably to act as part of some spam network (the only thing set up were MX records). We contacted the new registrar’s abuse email and they basically told us that the domain was registered normally, not transferred, and must have been available. And that there is nothing they can do.
@@ -22,13 +21,13 @@ I contacted our registrar, and the latest word is this:
> We are contacting Domain Authorities in Ivory Coast to know more about this. I will contact you back as soon as possible.
-Soooo at this point I’m calling the domain a loss. I’m giving up pretty easily here for a reason: the .ci TLD is under the authority of the Ivory Coast and has next to zero legitimate registrars willing to reserve domains for it. I could tell from day one that my registrar was hot garbage, but didn’t find any other choices.
+Soooo at this point I’m calling the domain a loss. I’m giving up pretty easily here for a reason: the .ci TLD is under the authority of the Ivory Coast and has next to zero legitimate registrars willing to reserve domains for it. I could tell from day one that my registrar was hot garbage, but didn’t find any other choices.
-It seems like the registrar messed up so badly that there’s not much leverage for getting it back. Even if I could get it back, I don’t really want to deal with something like this again in the future. Luckily, before we got too big I went ahead and registered concourse-ci.org, .net, and .com in case something like this happened.
+It seems like the registrar messed up so badly that there’s not much leverage for getting it back. Even if I could get it back, I don’t really want to deal with something like this again in the future. Luckily, before we got too big I went ahead and registered concourse-ci.org, .net, and .com in case something like this happened.
So here‘s our new home: [https://concourse-ci.org](https://concourse-ci.org)
-I’d already been considering this switch for a while (anticipating trouble with .ci), but a more graceful transition would have been nice. Unfortunately there is a ton of material pointing to the old website, and it’ll probably take time for the new location to bubble up in Google search results.
+I’d already been considering this switch for a while (anticipating trouble with .ci), but a more graceful transition would have been nice. Unfortunately there is a ton of material pointing to the old website, and it’ll probably take time for the new location to bubble up in Google search results.
I want to highlight that this doesn’t seem to have been a targeted attack, but that you should be careful to not accidentally go to the old domain or send any traffic or emails there. It may not be a targeted attack, but the new owner still has full control over it, and they’re receiving a bunch of free traffic. I wouldn’t be surprised if they wisened up and pulled something nefarious.
diff --git a/_posts/2018-03-09-concourse-update--mar-5-9-.markdown b/content/posts/2018-03-09-concourse-update--mar-5-9-.md
similarity index 90%
rename from _posts/2018-03-09-concourse-update--mar-5-9-.markdown
rename to content/posts/2018-03-09-concourse-update--mar-5-9-.md
index 578abe8..db22da3 100644
--- a/_posts/2018-03-09-concourse-update--mar-5-9-.markdown
+++ b/content/posts/2018-03-09-concourse-update--mar-5-9-.md
@@ -1,5 +1,4 @@
---
-layout: post
title: Concourse Update (Mar 5–9)
date: '2018-03-09 00:00:00'
tags:
@@ -23,7 +22,7 @@ On to the update:
**Docker Image Resource**
-- Fixed [#170](https://github.com/concourse/docker-image-resource/issues/170) . According to GitHub, I’m the original author of that, but I honestly can’t remember writing it. I _do_ remember that it was supposed to help a Concourse user, so hurrah!
+- Fixed [#170](https://github.com/concourse/docker-image-resource/issues/170). According to GitHub, I’m the original author of that, but I honestly can’t remember writing it. I _do_ remember that it was supposed to help a Concourse user, so hurrah!
**Runtime**
diff --git a/_posts/2018-03-16-concourse-update--mar-12-16-.markdown b/content/posts/2018-03-16-concourse-update--mar-12-16-.md
similarity index 99%
rename from _posts/2018-03-16-concourse-update--mar-12-16-.markdown
rename to content/posts/2018-03-16-concourse-update--mar-12-16-.md
index 9ff5e68..5b3fcb4 100644
--- a/_posts/2018-03-16-concourse-update--mar-12-16-.markdown
+++ b/content/posts/2018-03-16-concourse-update--mar-12-16-.md
@@ -1,5 +1,4 @@
---
-layout: post
title: Concourse Update (Mar 12–16)
date: '2018-03-16 00:00:00'
tags:
diff --git a/_posts/2018-03-23-concourse-update--april-19-23-.markdown b/content/posts/2018-03-23-concourse-update--april-19-23-.md
similarity index 99%
rename from _posts/2018-03-23-concourse-update--april-19-23-.markdown
rename to content/posts/2018-03-23-concourse-update--april-19-23-.md
index b8cbc5e..d398c60 100644
--- a/_posts/2018-03-23-concourse-update--april-19-23-.markdown
+++ b/content/posts/2018-03-23-concourse-update--april-19-23-.md
@@ -1,5 +1,4 @@
---
-layout: post
title: Concourse Update (April 19–23)
date: '2018-03-23 00:00:00'
tags:
diff --git a/_posts/2018-03-29-a-renewed-focus---community-changes.markdown b/content/posts/2018-03-29-a-renewed-focus---community-changes.md
similarity index 95%
rename from _posts/2018-03-29-a-renewed-focus---community-changes.markdown
rename to content/posts/2018-03-29-a-renewed-focus---community-changes.md
index 125292e..8b19cc8 100644
--- a/_posts/2018-03-29-a-renewed-focus---community-changes.markdown
+++ b/content/posts/2018-03-29-a-renewed-focus---community-changes.md
@@ -16,9 +16,9 @@ We’ve added an [“About” page](https://concourse-ci.org/about.html) which p
In addition to these new sections, we’ve also consolidated many pages and simplified the organization. There are now top-level sections for all the “things” you’ll be working with (Pipelines, Tasks, etc.), and each section contains the schema right up-front with examples to the side. This should make the docs much more effective when used as a reference.
-Search is back, and we’ve made a lot better than it was before its unceremonious removal. Try searching “imgrespar” and you’ll find image\_resource.params. It’s not full-text, but there’s always Google for that. I tried but it’s pretty slow and janky
+Search is back, and we’ve made a lot better than it was before its unceremonious removal. Try searching “imgrespar” and you’ll find image\_resource.params. It’s not full-text, but there’s always Google for that. I tried but it’s pretty slow and janky.
-## Community platform changes
+## Community platform changes
Along with the new site, we’re changing a few things in an effort to foster a healthier, more collaborative community:
@@ -28,7 +28,7 @@ Along with the new site, we’re changing a few things in an effort to foster a
## Simpler deployment
-We’ve coordinated all this with the launch of 3.10.0, which simplifies how Concourse is deployed. We’ve made it easier to spin up a single-instance Concourse via the quickstart command, which we’re in turn using for a the quick intro on the front page, via Docker Compose. We also no longer require you to configure an external URL (which was the main obstacle in the way of a single-command intro).
+We’ve coordinated all this with the launch of 3.10.0, which simplifies how Concourse is deployed. We’ve made it easier to spin up a single-instance Concourse via the quickstart command, which we’re in turn using for the quick intro on the front page, via Docker Compose. We also no longer require you to configure an external URL (which was the main obstacle in the way of a single-command intro).
Instead of documenting four different deployment methods (and scaring away people in the process), we’re focusing on the concourse binary distribution as the _lingua franca_ on the main site. It’s the most general and assumes the least about how you want to deploy it. For platform-specific documentation, each GitHub repo will be the source of truth:
@@ -49,4 +49,3 @@ We’re still figuring things out, and hope to provide more structure to the con
As always, thanks everyone for your patience and support.
Alex
-
diff --git a/_posts/2018-04-06-concourse-updates--april-2-6-.markdown b/content/posts/2018-04-06-concourse-updates--april-2-6-.md
similarity index 99%
rename from _posts/2018-04-06-concourse-updates--april-2-6-.markdown
rename to content/posts/2018-04-06-concourse-updates--april-2-6-.md
index 66d8b4c..a60efb6 100644
--- a/_posts/2018-04-06-concourse-updates--april-2-6-.markdown
+++ b/content/posts/2018-04-06-concourse-updates--april-2-6-.md
@@ -1,5 +1,4 @@
---
-layout: post
title: Concourse Updates (April 2–6)
date: '2018-04-06 00:00:00'
tags:
diff --git a/_posts/2018-04-13-concourse-update--april-9-13-.markdown b/content/posts/2018-04-13-concourse-update--april-9-13-.md
similarity index 83%
rename from _posts/2018-04-13-concourse-update--april-9-13-.markdown
rename to content/posts/2018-04-13-concourse-update--april-9-13-.md
index e2cce22..f92accb 100644
--- a/_posts/2018-04-13-concourse-update--april-9-13-.markdown
+++ b/content/posts/2018-04-13-concourse-update--april-9-13-.md
@@ -17,4 +17,6 @@ On another note: I’ve noticed some interesting articles and guides come out on
Fun fact: we got some new stickers printed up and we’ll be handing some out at Summit:
-
\ No newline at end of file
+{{< image src="/images/downloaded_images/Concourse-Update--April-9-13-/1-cS-JeBD00f0h7vhlpYTE7w.png" alt="" width="20%" >}}
+
+{{< image src="/images/downloaded_images/Concourse-Update--April-9-13-/1-thrSlXnAzYewzqirHjukWA.png" alt="Whee!" width="20%" >}}
\ No newline at end of file
diff --git a/_posts/2018-04-27-concourse-update--april-23-27-.markdown b/content/posts/2018-04-27-concourse-update--april-23-27-.md
similarity index 93%
rename from _posts/2018-04-27-concourse-update--april-23-27-.markdown
rename to content/posts/2018-04-27-concourse-update--april-23-27-.md
index 733af77..1232400 100644
--- a/_posts/2018-04-27-concourse-update--april-23-27-.markdown
+++ b/content/posts/2018-04-27-concourse-update--april-23-27-.md
@@ -1,12 +1,11 @@
---
-layout: post
title: Concourse Update (April 23–27)
date: '2018-04-27 00:00:00'
tags:
- product-update
---
-
+{{< image src="/images/downloaded_images/Concourse-Update--April-23-27-/1-1T4dM1zWpCx5NvHFnhK2Lw.jpeg" alt="" width="100%" >}}
Well, that was fun! [Topher Bullock](https://medium.com/u/58876cdc2180) absolutely _killed it_ last week on the CF Summit 2018 main stage with his demo of the experimental Concourse ❤ ️K8s runtime project. We also had a great time talking to companies who were using Concourse to continuously do things in the cloud. One of my favorite talks was from Jason Immerman and Derek Van Assche from Zipcar ([Concourse All the Things, All the Time](https://cfna18.sched.com/event/DdZz/concourse-all-of-the-things-at-all-times-jason-immerman-zipcar-derek-van-assche-hs2-solutions?iframe=no&w=&sidebar=yes&bg=no)); really inspirational stuff!
@@ -24,7 +23,7 @@ This week we’ve been cranking away at three key areas:
- Building out Users in Concourse with dex [https://github.com/concourse/concourse/issues/1888](https://github.com/concourse/concourse/issues/1888)
- Distributing GC across workers: [https://github.com/concourse/concourse/issues/1959](https://github.com/concourse/concourse/issues/1959)
-On the design front, our team has been working on something that we call “design snacks”; minor changes to the UI that could make big improvements to the overall experience with the app. Given our current tracks of work, we may not be able to pick them up right away, but at least the designs are attached to issues for contributors to pick up; if they felt so inclined :D
+On the design front, our team has been working on something that we call “design snacks”; minor changes to the UI that could make big improvements to the overall experience with the app. Given our current tracks of work, we may not be able to pick them up right away, but at least the designs are attached to issues for contributors to pick up; if they felt so inclined :D
A few examples:
diff --git a/_posts/2018-05-04-concourse-update--april-30---may-4-.markdown b/content/posts/2018-05-04-concourse-update--april-30---may-4-.md
similarity index 74%
rename from _posts/2018-05-04-concourse-update--april-30---may-4-.markdown
rename to content/posts/2018-05-04-concourse-update--april-30---may-4-.md
index 9e55f50..89ddf54 100644
--- a/_posts/2018-05-04-concourse-update--april-30---may-4-.markdown
+++ b/content/posts/2018-05-04-concourse-update--april-30---may-4-.md
@@ -1,5 +1,4 @@
---
-layout: post
title: Concourse Update (April 30 — May 4)
date: '2018-05-04 00:00:00'
tags:
@@ -16,17 +15,18 @@ On to the update:
We’ve been building out some of the frontend code for representing Spaces as part of [#2131](https://github.com/concourse/concourse/issues/2131). You can see some of the early visualizations below:
-
+{{< image src="/images/downloaded_images/Concourse-Update--April-30---May-4-/1-K13pFduQtcsPeX3VH6crQQ.png" alt="" width="100%" >}}
+{{< image src="/images/downloaded_images/Concourse-Update--April-30---May-4-/1-_ndF5rSNwVlKJWTj2_vxUQ.png" alt="" width="100%" >}}
+{{< image src="/images/downloaded_images/Concourse-Update--April-30---May-4-/1-kBELwDyhYQwPchw7J-O0eQ.png" alt="" width="100%" >}}
We now have the capability of testing Space end-to-end i.e. write the yml -\> fly sp -\> check out the web visualization.
EXCITING
-## Distributed GC on Workers
+## Distributed GC on Workers
We’ve been hacking away on master issue [#1959](https://github.com/concourse/concourse/issues/1959) for distributed GC. If you’ve been following along closely you’ll notice that the number of boxes that we’ve checked has increased…and that’s a good thing! We’re in the final stretches of this work and will be prepping to test them in our internal Concourse “Wings” very soon
## User Auth
As always, we continue to work on our User Auth master issue [#1888](https://github.com/concourse/concourse/issues/1888). We’ve now transitioned into building out specific auth connectors using the [dex](https://github.com/coreos/dex) library. We’ve completed the GitHub and CF connectors, and are currently working on the generic OAuth provider
-
diff --git a/_posts/2018-05-11-concourse-update--may-7-11-.markdown b/content/posts/2018-05-11-concourse-update--may-7-11-.md
similarity index 98%
rename from _posts/2018-05-11-concourse-update--may-7-11-.markdown
rename to content/posts/2018-05-11-concourse-update--may-7-11-.md
index f2b1645..8a8aa64 100644
--- a/_posts/2018-05-11-concourse-update--may-7-11-.markdown
+++ b/content/posts/2018-05-11-concourse-update--may-7-11-.md
@@ -1,5 +1,4 @@
---
-layout: post
title: Concourse Update (May 7–11)
date: '2018-05-11 00:00:00'
tags:
diff --git a/_posts/2018-05-18-concourse-update--may-14-18-.markdown b/content/posts/2018-05-18-concourse-update--may-14-18-.md
similarity index 97%
rename from _posts/2018-05-18-concourse-update--may-14-18-.markdown
rename to content/posts/2018-05-18-concourse-update--may-14-18-.md
index 7c6abef..7ce5c16 100644
--- a/_posts/2018-05-18-concourse-update--may-14-18-.markdown
+++ b/content/posts/2018-05-18-concourse-update--may-14-18-.md
@@ -1,5 +1,4 @@
---
-layout: post
title: Concourse Update (May 14–18)
date: '2018-05-18 00:00:00'
tags:
@@ -15,7 +14,7 @@ And now, on to the update:
**Core**
- Continued banging our heads against new auth connectors with Dex. **Note:** We’ve started to centralize backwards-(in)compatibilities with user auth in issue [#2218](https://github.com/concourse/concourse/issues/2218)
-- We’ve stood up a new Concourse with our experimental Spaces work. We’re looking for volunteers who are interested in trying out their pipelines before and after “space”. Tweet at me if you’re interested [https://twitter.com/pioverpi](https://twitter.com/pioverpi) !
+- We’ve stood up a new Concourse with our experimental Spaces work. We’re looking for volunteers who are interested in trying out their pipelines before and after “space”. Tweet at me if you’re interested [https://twitter.com/pioverpi](https://twitter.com/pioverpi)!
**Runtime**
diff --git a/_posts/2018-05-25-concourse-update--may-22-25-.markdown b/content/posts/2018-05-25-concourse-update--may-22-25-.md
similarity index 99%
rename from _posts/2018-05-25-concourse-update--may-22-25-.markdown
rename to content/posts/2018-05-25-concourse-update--may-22-25-.md
index c306fc0..933ff19 100644
--- a/_posts/2018-05-25-concourse-update--may-22-25-.markdown
+++ b/content/posts/2018-05-25-concourse-update--may-22-25-.md
@@ -1,5 +1,4 @@
---
-layout: post
title: Concourse Update (May 22–25)
date: '2018-05-25 00:00:00'
tags:
diff --git a/_posts/2018-06-01-concourse-update--may-28---june-1-.markdown b/content/posts/2018-06-01-concourse-update--may-28---june-1-.md
similarity index 66%
rename from _posts/2018-06-01-concourse-update--may-28---june-1-.markdown
rename to content/posts/2018-06-01-concourse-update--may-28---june-1-.md
index e1434d5..b725fbc 100644
--- a/_posts/2018-06-01-concourse-update--may-28---june-1-.markdown
+++ b/content/posts/2018-06-01-concourse-update--may-28---june-1-.md
@@ -1,12 +1,11 @@
---
-layout: post
title: Concourse Update (May 28 — June 1)
date: '2018-06-01 00:00:00'
tags:
- product-update
---
-
+{{< image src="/images/downloaded_images/Concourse-Update--May-28---June-1-/1-kJxF-3MOSqElyItFT2ec-A.png" alt="" width="100%" >}}
If you’ve been experiencing “Aw Snap” errors on Chrome with Concourse 3.13.0 or 3.12.0 we traced the root case to two lines of CSS. This seems to happen only on Chrome 67; so a temporary workaround is to switch over to Chrome [canary](https://www.google.com/chrome/browser/canary.html) or use Firefox/Safari/Edge. You can follow along in our discussion at GitHub issue [#2236](https://github.com/concourse/concourse/issues/2236)
@@ -16,7 +15,8 @@ Now, on to the update
We were able to successfully test our distributed volume GC collection code on our Wings environment this week. Overall we’ve seen a significant drop in Database Queries and a ~10% decrease in Web CPU usage.
-
+{{< image src="/images/downloaded_images/Concourse-Update--May-28---June-1-/1-GfBC0PNc6p2DOiGAbcxKnA.png" alt="" width="100%" >}}
+{{< image src="/images/downloaded_images/Concourse-Update--May-28---June-1-/1-n8Ea93MfUmDIGaPLtdU37Q.png" alt="" width="100%" >}}
Notice how the Database Queries now look like a sawtooth; this is a result of our new “mark and sweep” GC strategy on workers.
@@ -26,7 +26,7 @@ In an effort to make our new Users work backwards compatible and downgrade-able,
**UX**
-
+{{< image src="/images/downloaded_images/Concourse-Update--May-28---June-1-/1-VzHW0teV3e1DfrqcYWc_-w.png" alt="" width="100%" >}}
Check out the new breadcrumbs and responsive groups on our [prod environment](https://ci.concourse-ci.org/)!
diff --git a/_posts/2018-06-06-how-we-build-concourse.markdown b/content/posts/2018-06-06-how-we-build-concourse.md
similarity index 91%
rename from _posts/2018-06-06-how-we-build-concourse.markdown
rename to content/posts/2018-06-06-how-we-build-concourse.md
index 429707d..cac620b 100644
--- a/_posts/2018-06-06-how-we-build-concourse.markdown
+++ b/content/posts/2018-06-06-how-we-build-concourse.md
@@ -1,12 +1,11 @@
---
-layout: post
title: How We Build Concourse
date: '2018-06-06 00:00:00'
---
Building on some of our previous posts on the Concourse team mechanics¹, I wanted to spend some time going over how we actually _build_ Concourse.
-### **Tracking Features and Bugs**
+### Tracking Features and Bugs
Concourse tracks all of its bugs, features and epics through GitHub Issues.
@@ -16,8 +15,7 @@ For issues regarding the Concourse website and documentation, you can find the b
Concourse resources, both the ones [included with Concourse](https://concourse-ci.org/included-resources.html) and the ones that are[community made](https://concourse-ci.org/community-resources.html), live in their own repositories. Issues, bugs and features should be reported against the resource’s GitHub issues repo.
-### **Triage, Review and Prioritization**
-
+### Triage, Review and Prioritization
We do our best to review and triage new issues that come into the Concourse repository on a daily basis. Triaging an issue requires us to:
@@ -30,7 +28,7 @@ We do our best to review and triage new issues that come into the Concourse repo
Issues assigned to a GitHub Project are automatically assigned into the project’s Icebox. The Concourse team follows a very similar development approach to [XP and Pivotal workflow](https://www.pivotaltracker.com/help/articles/workflow_overview/) where only active and prioritized items are assigned to the Backlog, and all finished stories are required to be “Accepted” or “Rejected” by a Product Manager or some other knowledgeable subject matter expert.
-### **Design & Research**
+### Design & Research
Issues that require design and UX feedback are labeled with needs-design. These are usually picked up by our product design team.
@@ -38,21 +36,21 @@ We also use the label design-snack on bite-sized UX/UI issues that are ready to
Sometimes we work on big issues that require more research and testing before we can actually write issues. This work is often tracked separately through various tools (both online and offline). We do our best to post updates in blog posts and GitHub issues along the way.
-### **Iteration Planning Meeting (IPM)**
+### Iteration Planning Meeting (IPM)
The Concourse team conducts IPM every week on Monday afternoon. During this time we review each GitHub Project’s backlog. This includes discussions on stories that were recently complete, are currently in flight, new stories added to the backlog and any change in Backlog priorities. The Concourse team uses this custom-build project view ([https://project.concourse-ci.org/](https://project.concourse-ci.org/)) as a way to quickly access the backlogs of all our projects.
-### **Acceptance**
+### Acceptance
Issues that are resolved are moved into the “Done” column of each project. This means that the issue is ready to be reviewed for Acceptance. Typically, work that is ready for acceptance is reviewed on our “prod” instance, that is, [https://ci.concourse-ci.org/](https://ci.concourse-ci.org/) The issue is typically reviewed by a product manager or a subject matter expert who can determine whether the completed issue is acceptable for general distribution. Some changes require additional load and/or “real-world” testing; in that case we deploy to Pivotal’s internal large-scale Concourse “Wings”; which currently runs 3 ATCs, 38 workers and has \> 70 teams.
Rejected issues are returned to the top of the GitHub Project Backlog and commented on for revision.
-### **PR/Community**
+### PR/Community
PRs and “Community” work (e.g. answering questions on Discord, our Forum, in GitHub issues) is usually handled by a dedicated person. Currently this person is Alex Suraci (Product Manager). In addition to helping the community, he is building out new proposals for long-term changes to Concourse in the [RFCs repo](https://github.com/concourse/rfcs/pulls).
-### What do we build?
+### What do we build?
In my next blog post, I plan on covering _what_ the core team is working on, how we make those decisions, and how we are working to make those plans more obvious
diff --git a/_posts/2018-06-08-concourse-update--june-4-8-.markdown b/content/posts/2018-06-08-concourse-update--june-4-8-.md
similarity index 68%
rename from _posts/2018-06-08-concourse-update--june-4-8-.markdown
rename to content/posts/2018-06-08-concourse-update--june-4-8-.md
index b82947a..262dc72 100644
--- a/_posts/2018-06-08-concourse-update--june-4-8-.markdown
+++ b/content/posts/2018-06-08-concourse-update--june-4-8-.md
@@ -1,14 +1,13 @@
---
-layout: post
title: Concourse Update (June 4–8)
date: '2018-06-08 00:00:00'
tags:
- product-update
---
-
+{{< image src="/images/downloaded_images/Concourse-Update--June-4-8-/1-XZfbfSSmYOJi2Ujc1uDP7Q.png" alt="" width="100%" >}}
-Big release this week! After lots internal load testing on Wings we finally felt comfortable releasing Concourse 3.14.0. In addition to the new [Distributed Garbage Collection ](https://medium.com/concourse-ci/distributed-garbage-collection-ae3867ab5438), breadcrumbs, responsive groups, and [Windows worker](https://github.com/concourse/concourse-bosh-deployment/blob/master/cluster/operations/windows-worker.yml), we have 14 new features a whole bunch of bug fixes. But wait! Don’t download that one; get [Concourse v3.14.1 i](https://concourse-ci.org/download.html#v3141)nstead.
+Big release this week! After lots internal load testing on Wings we finally felt comfortable releasing Concourse 3.14.0. In addition to the new [Distributed Garbage Collection](https://medium.com/concourse-ci/distributed-garbage-collection-ae3867ab5438), breadcrumbs, responsive groups, and [Windows worker](https://github.com/concourse/concourse-bosh-deployment/blob/master/cluster/operations/windows-worker.yml), we have 14 new features a whole bunch of bug fixes. But wait! Don’t download that one; get [Concourse v3.14.1 i](https://concourse-ci.org/download.html#v3141)nstead.
A few other updates. First, be sure to check out my write up on [How We Build Concourse](https://medium.com/concourse-ci/how-we-build-concourse-dd15939d92f2). I plan on writing more posts like this in hopes of giving you more insight into the internals of the Concourse team. Hope you like it!
@@ -23,7 +22,7 @@ And now, on to the update; starting with a note on [RFCs](https://github.com/con
- We’re seriously, absolutely, most definitely tacking the slow performance on the build page [#1543](https://github.com/concourse/concourse/issues/1543#issuecomment-394449918)
- Spatial Resource testing continues! Here’s a peek at our most recent iteration:
-
+ {{< image src="/images/downloaded_images/Concourse-Update--June-4-8-/1-C8RdmEmjBxrG5pzamGDMSg.png" alt="" width="100%" >}}
**Core**
diff --git a/_posts/2018-06-15-concourse-update--jun-11-15-.markdown b/content/posts/2018-06-15-concourse-update--jun-11-15-.md
similarity index 99%
rename from _posts/2018-06-15-concourse-update--jun-11-15-.markdown
rename to content/posts/2018-06-15-concourse-update--jun-11-15-.md
index 7671b83..7447421 100644
--- a/_posts/2018-06-15-concourse-update--jun-11-15-.markdown
+++ b/content/posts/2018-06-15-concourse-update--jun-11-15-.md
@@ -1,5 +1,4 @@
---
-layout: post
title: Concourse Update (Jun 11–15)
date: '2018-06-15 00:00:00'
tags:
diff --git a/_posts/2018-06-22-concourse-update--jun-18-22-.markdown b/content/posts/2018-06-22-concourse-update--jun-18-22-.md
similarity index 89%
rename from _posts/2018-06-22-concourse-update--jun-18-22-.markdown
rename to content/posts/2018-06-22-concourse-update--jun-18-22-.md
index 1c24e22..8cafb18 100644
--- a/_posts/2018-06-22-concourse-update--jun-18-22-.markdown
+++ b/content/posts/2018-06-22-concourse-update--jun-18-22-.md
@@ -1,12 +1,11 @@
---
-layout: post
title: Concourse Update (Jun 18–22)
date: '2018-06-22 00:00:00'
tags:
- product-update
---
-
+{{< image src="/images/downloaded_images/Concourse-Update--Jun-18-22-/0-iPsCYY5ob7h-bSKD.jpg" alt="" width="100%" >}}
It’s been a busy week for myself and [Topher Bullock](https://medium.com/u/58876cdc2180). We spent some time in Boston meeting with some users operating large-scale Concourses. We learned a lot about the issues they were running into operating Concourse a scale…and we ate a lot of Lobster!
diff --git a/_posts/2018-06-29-concourse-update--jun-25-29-.markdown b/content/posts/2018-06-29-concourse-update--jun-25-29-.md
similarity index 75%
rename from _posts/2018-06-29-concourse-update--jun-25-29-.markdown
rename to content/posts/2018-06-29-concourse-update--jun-25-29-.md
index 84ba9ad..77d744d 100644
--- a/_posts/2018-06-29-concourse-update--jun-25-29-.markdown
+++ b/content/posts/2018-06-29-concourse-update--jun-25-29-.md
@@ -6,13 +6,13 @@ tags:
- product-update
---
-
+{{< image src="/images/downloaded_images/Concourse-Update--Jun-25-29-/1-eGvw-f2AjgJvsWN9pdikBg.gif" alt="" width="25%" >}}
If you’ve been following along with our [Auth changes](https://medium.com/concourse-ci/oh-auth-f4fe68438171), you’ll know that we’ve been doing a lot of work behind the scenes to make the upgrade into this new world as seamless as possible. This week, we were able to do our first large-scale upgrade test against our Wings instance. The upgrade went well and we were able to find a few more areas of polish before we push this feature. You can find our updated list of future incompatibilities in GitHub issue [#2218](https://github.com/concourse/concourse/issues/2218). Having considered the nature of the breaking changes, the next update of Concourse with Users will push us into[4.0.0](https://github.com/concourse/concourse/issues/2218#issuecomment-401078612)!!!
I also wanted to take this time to give a big **thank you** to all of the participants in our spatial resource interview. If you’re curious to see the results of our research please read up on [Lindsay Auchinachie](https://medium.com/u/84b937bda3b6)’s post here:[Designing for Space in Concourse](https://medium.com/concourse-ci/designing-for-space-in-concourse-3037344644c6)
-If you’d like to get your hands on Space as soon as possible, then I’d encourage you to also read and comment on our Resources v2 [RFC ](https://github.com/concourse/rfcs/pull/1). [Alex Suraci](https://medium.com/u/263a63b2f209) made some recent updates to the proposal so definitely [check it out](https://github.com/concourse/rfcs/pull/1/files/3bc00098143d7f1d59c7c25b8614ddc545a05d81), or read the [fully rendered proposal](https://github.com/vito/rfcs/blob/resources-v2/01-resources-v2/proposal.md).
+If you’d like to get your hands on Space as soon as possible, then I’d encourage you to also read and comment on our Resources v2 [RFC](https://github.com/concourse/rfcs/pull/1). [Alex Suraci](https://medium.com/u/263a63b2f209) made some recent updates to the proposal so definitely [check it out](https://github.com/concourse/rfcs/pull/1/files/3bc00098143d7f1d59c7c25b8614ddc545a05d81), or read the [fully rendered proposal](https://github.com/vito/rfcs/blob/resources-v2/01-resources-v2/proposal.md).
We’d like to get the Resources v2 RFC closed out soon so we can implement the resource changes necessary to tap into the full potential of spatial resources!
@@ -27,4 +27,4 @@ _Edit_
I ALMOST FORGOT! We also improved build page performance [#1543](https://github.com/concourse/concourse/issues/1543)! In some instances we reduced the page load time from 25s to only 5s:
-
\ No newline at end of file
+{{< image src="/images/downloaded_images/Concourse-Update--Jun-25-29-/1-KEWandpQWRWRFcBvLRwbog.jpeg" alt="" width="100%" >}}
\ No newline at end of file
diff --git a/_posts/2018-07-06-concourse-updates--july-3-6-.markdown b/content/posts/2018-07-06-concourse-updates--july-3-6-.md
similarity index 85%
rename from _posts/2018-07-06-concourse-updates--july-3-6-.markdown
rename to content/posts/2018-07-06-concourse-updates--july-3-6-.md
index 09210fa..8e3bd7b 100644
--- a/_posts/2018-07-06-concourse-updates--july-3-6-.markdown
+++ b/content/posts/2018-07-06-concourse-updates--july-3-6-.md
@@ -1,12 +1,11 @@
---
-layout: post
title: Concourse Updates (July 3–6)
date: '2018-07-06 00:00:00'
tags:
- product-update
---
-
+{{< image src="/images/downloaded_images/Concourse-Updates--July-3-6-/0-BrjbFvtgpagi0Ag3.png" alt="Concourse, beavers, poutine and maple syrup" width="100%" >}}
Since July 1st was the official day of [Canada’s birth](https://en.wikipedia.org/wiki/Canada_Day), the Concourse team enjoyed a long weekend with no work on Monday. We were, however, able to get quite a bit done during this short week.
@@ -17,7 +16,7 @@ Here’s also a few interesting reminders:
- For Pivotal-supported releases of Concourse (aka Concourse for PCF) you can find a compatibility matrix of common dependencies here: [http://docs.pivotal.io/p-concourse/#Compatibility](http://docs.pivotal.io/p-concourse/#Compatibility)
- I realized this week that not a lot of people know about this; but [Alex Suraci](https://medium.com/u/263a63b2f209) wrote up a series of [Concourse Anti-Patterns](https://github.com/concourse/concourse/wiki/Anti-Patterns) a while back. Its definitely worth the read
- PLEASE take a second to review the upcoming Resource v2 [RFC](https://github.com/concourse/rfcs/pull/1) or its rendered version [here](https://github.com/vito/rfcs/blob/resources-v2/01-resources-v2/proposal.md)
-- **Concourse team is going to OSCON!** Come by the Pivotal booth 406 and say “hi” !
+- **Concourse team is going to OSCON!** Come by the Pivotal booth 406 and say “hi”!
Anyways, on to the update:
@@ -25,7 +24,7 @@ Anyways, on to the update:
- Fixed some minor UI issues across the board: [#2333](https://github.com/concourse/concourse/issues/2333), [#2313](https://github.com/concourse/concourse/issues/2313), [#2291](https://github.com/concourse/concourse/issues/2291), and [#2310](https://github.com/concourse/concourse/issues/2310)
- Continued our work in routing Dashboard page to the Home page in [#2282](https://github.com/concourse/concourse/issues/2282). This, however, has turned into a bit of a scope creep and we are now upgrading the entire UI to use the new dark theme:
-
+ {{< image src="/images/downloaded_images/Concourse-Updates--July-3-6-/1-Xp51wHexBz5wx1GcqaCvwA.png" alt="" width="50%" >}}
**Core**
diff --git a/_posts/2018-07-13-concourse-update--jul-9-13-.markdown b/content/posts/2018-07-13-concourse-update--jul-9-13-.md
similarity index 85%
rename from _posts/2018-07-13-concourse-update--jul-9-13-.markdown
rename to content/posts/2018-07-13-concourse-update--jul-9-13-.md
index 293a0e0..d3f1a7a 100644
--- a/_posts/2018-07-13-concourse-update--jul-9-13-.markdown
+++ b/content/posts/2018-07-13-concourse-update--jul-9-13-.md
@@ -6,13 +6,13 @@ tags:
- product-update
---
-
+{{< image src="/images/downloaded_images/Concourse-Update--Jul-9-13-/1-AuH8VYkniNetbpZtRBjTuA.png" alt="DARK" width="100%" >}}
We’re going dark themed for Concourse 4.0.0! In addition to the users work, we’re promoting the Dashboard to the / level to take over the home page. You’ll also notice that we added pipeline play/pause capabilities to the dashboard, NEAT!
To keep things consistent, we’re also propagating our new design to the existing pipeline views. You can play around with this new nav structure on our own CI: [https://ci.concourse-ci.org/](https://ci.concourse-ci.org/)
-The team here is also planning to attend OSCON in Portland next week (July 18 &19). Drop by the Pivotal booth to say hi and grab a Concourse sticker!
+The team here is also planning to attend OSCON in Portland next week (July 18 & 19). Drop by the Pivotal booth to say hi and grab a Concourse sticker!
On to the update:
diff --git a/_posts/2018-07-20-concourse-update--jul-16-20-.markdown b/content/posts/2018-07-20-concourse-update--jul-16-20-.md
similarity index 93%
rename from _posts/2018-07-20-concourse-update--jul-16-20-.markdown
rename to content/posts/2018-07-20-concourse-update--jul-16-20-.md
index e612be9..6b32f26 100644
--- a/_posts/2018-07-20-concourse-update--jul-16-20-.markdown
+++ b/content/posts/2018-07-20-concourse-update--jul-16-20-.md
@@ -6,7 +6,7 @@ tags:
- product-update
---
-
+{{< image src="/images/downloaded_images/Concourse-Update--Jul-16-20-/1-CIxNgJ_FKbnacEpUI588nw.jpeg" alt="" width="100%" >}}
This week, the Concourse team went out to Portland to attend OSCON 2018. [Topher Bullock](https://medium.com/u/58876cdc2180) gave a great intro to Concourse in the Open Source track. We even met some of the Concourse fans in person!
@@ -35,4 +35,4 @@ On to the update:
- Addressed [#1516](https://github.com/concourse/concourse/issues/1516), wherein Concourse doesn’t run any jobs if Vault misconfigured
- Did some work to begin imposing limits on containers in [#787](https://github.com/concourse/concourse/issues/787). Please review this issue carefully if this affects you; since our initial resolution is very specific and requires you to understand the nature of your worker vms
-- Worked on [#2375](https://github.com/concourse/concourse/issues/2375) “Listing destroying volumes should not perform any database write operations” :D
+- Worked on [#2375](https://github.com/concourse/concourse/issues/2375) “Listing destroying volumes should not perform any database write operations” :D
diff --git a/_posts/2018-07-27-concourse-update--jul-23-27-.markdown b/content/posts/2018-07-27-concourse-update--jul-23-27-.md
similarity index 71%
rename from _posts/2018-07-27-concourse-update--jul-23-27-.markdown
rename to content/posts/2018-07-27-concourse-update--jul-23-27-.md
index a444490..f70738a 100644
--- a/_posts/2018-07-27-concourse-update--jul-23-27-.markdown
+++ b/content/posts/2018-07-27-concourse-update--jul-23-27-.md
@@ -1,18 +1,19 @@
---
-layout: post
title: Concourse Update (Jul 23–27)
date: '2018-07-27 00:00:00'
tags:
- product-update
---
-
+{{< image src="/images/downloaded_images/Concourse-Update--Jul-23-27-/1-tfhJwBRSLe9wrc2-a7MwpQ.png" alt="Concourse v4 Dashboard" width="100%" >}}
I’m happy to announce that we released Concourse 4.0.0 this week! This was a HUGE release with over 28 new features and fixes. I’d encourage you to read through the full list of changes on our [Downloads page.](https://concourse-ci.org/download.html#v400)
-Why did this release warrant a bump in the major version? Well, if you’ve been following along [closely](https://medium.com/concourse-ci/oh-auth-f4fe68438171) you’ll know that we had just finished our new auth work in 4.0.0. Users are now central to the authentication flows, **not** teams. Practically speaking, the user-centric auth flow means that you won’t need to re-login to see pipelines in other teams that you already have access to! Underneath the hood though, _“We’re leveraging CoreOS’s Dex project for all the moving parts, which already supports a ton of providers (Dex calls them “connectors”). The only delta required for Concourse to support a Dex connector is a tiny bit of glue code in our new_ [_Skymarshal_](https://github.com/concourse/skymarshal) _component to provide higher-level flags for our CLI.”_ We spent a lot of time near the end of this cycle trying to make these changes [backwards compatible](https://github.com/concourse/concourse/issues/2218), but ultimately decided that the changes were significant enough to warrant a bump in the major version. PLEASE _PLEASE_ _ **PLEASE** _ refer to our release notes for all the breaking changes before executing your upgrade!
+Why did this release warrant a bump in the major version? Well, if you’ve been following along [closely](https://medium.com/concourse-ci/oh-auth-f4fe68438171) you’ll know that we had just finished our new auth work in 4.0.0. Users are now central to the authentication flows, **not** teams. Practically speaking, the user-centric auth flow means that you won’t need to re-login to see pipelines in other teams that you already have access to! Underneath the hood though, _“We’re leveraging CoreOS’s Dex project for all the moving parts, which already supports a ton of providers (Dex calls them “connectors”). The only delta required for Concourse to support a Dex connector is a tiny bit of glue code in our new_ [_Skymarshal_](https://github.com/concourse/skymarshal) _component to provide higher-level flags for our CLI.”_
-
+We spent a lot of time near the end of this cycle trying to make these changes [backwards compatible](https://github.com/concourse/concourse/issues/2218), but ultimately decided that the changes were significant enough to warrant a bump in the major version. PLEASE _PLEASE **PLEASE**_ refer to our release notes for all the breaking changes before executing your upgrade!
+
+{{< image src="/images/downloaded_images/Concourse-Update--Jul-23-27-/1-A7zDAYYisJzHjZldrxqneg.gif" alt="" width="50%" >}}
The second big change you’ll notice in 4.0.0 is that the home (/) route now takes you to the dashboard. We’ve also propagated the new colour scheme to the rest of the app and tightened up the fonts throughout the app.
diff --git a/_posts/2018-08-03-concourse-update--july-30---aug-3-.markdown b/content/posts/2018-08-03-concourse-update--july-30---aug-3-.md
similarity index 91%
rename from _posts/2018-08-03-concourse-update--july-30---aug-3-.markdown
rename to content/posts/2018-08-03-concourse-update--july-30---aug-3-.md
index c663d52..9cc3543 100644
--- a/_posts/2018-08-03-concourse-update--july-30---aug-3-.markdown
+++ b/content/posts/2018-08-03-concourse-update--july-30---aug-3-.md
@@ -1,12 +1,11 @@
---
-layout: post
title: Concourse Update (July 30 — Aug 3)
date: '2018-08-03 00:00:00'
tags:
- product-update
---
-
+{{< image src="/images/downloaded_images/Concourse-Update--July-30---Aug-3-/1--syJtPB3nj0x2z8AVEh7zA.png" alt="" width="45%" >}}
With the launch of Concourse 4.0.0, we’ve been monitoring our [typical communication channels](https://concourse-ci.org/community.html)carefully to watch out for any glaring new bugs. So far we seem to be safe from any crazy issues, but we have noticed that there has been some confusion in how to set the basic auth users in the new deployment method (see [#2421](https://github.com/concourse/concourse/issues/2421) for details). Thanks everyone for your patience and working through these issues with us!
diff --git a/_posts/2018-08-10-concourse-update--aug-7-10-.markdown b/content/posts/2018-08-10-concourse-update--aug-7-10-.md
similarity index 87%
rename from _posts/2018-08-10-concourse-update--aug-7-10-.markdown
rename to content/posts/2018-08-10-concourse-update--aug-7-10-.md
index 43991ee..e0b4be2 100644
--- a/_posts/2018-08-10-concourse-update--aug-7-10-.markdown
+++ b/content/posts/2018-08-10-concourse-update--aug-7-10-.md
@@ -1,12 +1,11 @@
---
-layout: post
title: Concourse Update (Aug 7–10)
date: '2018-08-10 00:00:00'
tags:
- roadmap
---
-
+{{< image src="/images/downloaded_images/Concourse-Update--Aug-7-10-/1-QBeLayNVacbJGgBW-BhGSw.jpeg" alt="" width="35%" >}}
As I mentioned last week, this was a short week for us in Canada due to the [Civic Holiday](https://en.wikipedia.org/wiki/Civic_Holiday#Ontario). We did, however, manage to work on some pretty cool stuff!
diff --git a/_posts/2018-08-10-suspicious-volume-usage-on-workers.markdown b/content/posts/2018-08-10-suspicious-volume-usage-on-workers.md
similarity index 79%
rename from _posts/2018-08-10-suspicious-volume-usage-on-workers.markdown
rename to content/posts/2018-08-10-suspicious-volume-usage-on-workers.md
index 0a8d282..915ec86 100644
--- a/_posts/2018-08-10-suspicious-volume-usage-on-workers.markdown
+++ b/content/posts/2018-08-10-suspicious-volume-usage-on-workers.md
@@ -1,5 +1,4 @@
---
-layout: post
title: Suspicious Volume Usage on Workers
date: '2018-08-10 00:00:00'
---
@@ -10,11 +9,11 @@ As a Product Manger at Pivotal I’m often called on to help with our customer
One of the primary use case for Concourse within the Pivotal Cloud Foundry ([PCF](https://www.google.com/search?q=pivotal+cloud+foundry&oq=pivotal+cloud+fou&aqs=chrome.0.0j69i60l2j69i65l2j69i60.3685j0j7&sourceid=chrome&ie=UTF-8)) ecosystem is to automate the toil of manual maintenance against the platform; specifically [PAS](https://pivotal.io/platform/pivotal-application-service) and [PKS](https://pivotal.io/platform/pivotal-container-service). For the purposes of this issue, the specific details of the pipeline doesn’t matter but an understanding the general flow of the pipeline will help frame problem:
-
+{{< image src="/images/downloaded_images/Suspicious-Volume-Usage-on-Workers/1-afxjY-fNHqW6BPik1xdGVQ.png" alt="A simplified version of a pipeline used to pull updates from the Pivotal Network and apply the changes onto Ops Manager" width="100%" >}}
In these pipelines the pivnet-resource is responsible for monitoring new product versions on [network.pivotal.io](https://network.pivotal.io/) (aka PivNet). When a new product version is released on PivNet, the pivnet-resource picks it up and initiates a download. These files are relatively large, from 500mb to over 1 GB
-**Recreate** _ **all** _ **the workers?**
+**Recreate _all_ the workers?**
Over the course of the past year or so we would get sporadic reports of customers who used Concourse for PCF management running out of space on their workers. The typical manifestation of it comes from a failed to stream in volume error. It would appear that workers were running out of space; but it wasn’t clear why. To mitigate the issue Concourse operators would be forced to periodically re-create their workers to get a “clean slate”.
@@ -24,13 +23,13 @@ Having to periodically recreate workers is a _huge_ pain and it doesn’t give o
After some poking and prodding, I think we figured out what was happening in this specific scenario. Using the same simplified pipeline above, consider the following scenario:
-
+{{< image src="/images/downloaded_images/Suspicious-Volume-Usage-on-Workers/1-m-1ouUbMQEVv9gPJ3wggug.png" alt="" width="100%" >}}
- At t=0 the pipeline is configured and idling; monitoring the external system for a new version.
- At t=1 a new version of the “Metrics” product is released on PivNet, picked up by Concourse, downloaded and begins to flow through your pipeline
- At t=2 the Upload to OM (OM == Ops Manager) job kicks off and does its thing
- At t=3 the artifact is used for some long running process like Apply Changes on OM. Concourse will hold on to that downloaded data since its still running
-But wait, what’s that new Metrics1.0 box in deep blue at t=3? Well, its not uncommon for the metadata of a release to be modified just-after release. This could be a tweak to metadata (e.g. support dates, dependencies, supported stemcells, etc.), which causes PivNet to report a new version. Semantically, its still reported as Metrics v1.0 but Concourse will pick it up nonetheless. Because of this change we have effectively doubled the amount of storage used!
+But wait, what’s that new Metrics 1.0 box in deep blue at t=3? Well, its not uncommon for the metadata of a release to be modified just-after release. This could be a tweak to metadata (e.g. support dates, dependencies, supported stemcells, etc.), which causes PivNet to report a new version. Semantically, its still reported as Metrics v1.0 but Concourse will pick it up nonetheless. Because of this change we have effectively doubled the amount of storage used!
**I think we learned a valuable lesson today…**
diff --git a/_posts/2018-08-17-concourse-update--august-13-17-.markdown b/content/posts/2018-08-17-concourse-update--august-13-17-.md
similarity index 84%
rename from _posts/2018-08-17-concourse-update--august-13-17-.markdown
rename to content/posts/2018-08-17-concourse-update--august-13-17-.md
index 98beb1f..5a80a72 100644
--- a/_posts/2018-08-17-concourse-update--august-13-17-.markdown
+++ b/content/posts/2018-08-17-concourse-update--august-13-17-.md
@@ -1,12 +1,11 @@
---
-layout: post
title: Concourse Update (August 13–17)
date: '2018-08-17 00:00:00'
tags:
- product-update
---
-
+{{< image src="/images/downloaded_images/Concourse-Update--August-13-17-/1-tElpiP87T2Ee3rXKJP88QQ.gif" alt="Combining repos for great justice" width="45%" >}}
Going to switch things up this week and start with some interesting community news:
@@ -14,7 +13,7 @@ Going to switch things up this week and start with some interesting community ne
- [Lindsay Auchinachie](https://medium.com/u/84b937bda3b6) wrote up a blog post describing some of the visual elements of the Concourse pipeline view in a blog post titled [Concourse Pipeline UI Explained](https://medium.com/concourse-ci/concourse-pipeline-ui-explained-87dfeea83553)
- marco-m has been updating a “concourse-in-a-box” formula that comes with a s3-compatible-store and a Vault. Check it out here: [https://github.com/marco-m/concourse-ci-formula](https://github.com/marco-m/concourse-ci-formula)
- [concourse-up](https://github.com/EngineerBetter/concourse-up) is a Concourse quick-start tool created created by our friends at EngineerBetter. The team there is looking for feedback on how to support the 4.0.0 authentication scheme moving forwards. If you use their tool, please take some time to give them some love on their GitHub issue [https://github.com/EngineerBetter/concourse-up/issues/62](https://github.com/EngineerBetter/concourse-up/issues/62)
-- Is our efforts to have Concourse un-flaky a myth? Find out on this forum post by [**eedwards-sk**](https://discuss.concourse-ci.org/u/eedwards-sk) **,** you won’t believe post [#4](https://discuss.concourse-ci.org/t/is-concourses-aim-to-eliminate-snowflaking-just-a-myth/444/4?u=jama) !!
+- Is our efforts to have Concourse un-flaky a myth? Find out on this forum post by [eedwards-sk](https://discuss.concourse-ci.org/u/eedwards-sk), you won’t believe post [#4](https://discuss.concourse-ci.org/t/is-concourses-aim-to-eliminate-snowflaking-just-a-myth/444/4?u=jama)!!
On to some development news:
diff --git a/_posts/2018-08-24-concourse-update--august-20-24-.markdown b/content/posts/2018-08-24-concourse-update--august-20-24-.md
similarity index 92%
rename from _posts/2018-08-24-concourse-update--august-20-24-.markdown
rename to content/posts/2018-08-24-concourse-update--august-20-24-.md
index 26acb1d..4b86c8e 100644
--- a/_posts/2018-08-24-concourse-update--august-20-24-.markdown
+++ b/content/posts/2018-08-24-concourse-update--august-20-24-.md
@@ -1,17 +1,17 @@
---
-layout: post
title: Concourse Update (August 20–24)
date: '2018-08-24 00:00:00'
tags:
- product-update
---
-
+{{< image src="/images/downloaded_images/Concourse-Update--August-20-24-/0-9tKyl-ikt-ttbS_z.jpg" alt="Logs and resources" width="25%" >}}
+
### Kubernetes
As we continue our sporadic work on Kubernetes and its Helm chart, we’re also starting to expand our thinking to cover the runtime aspects of Concourse + Kubernetes. We’ve already prioritized the need to have Kubernetes as a supporting backend in addition to Garden, but what about the spiffy new developments in the Kubernetes world? We’re hearing a lot about [knative](https://github.com/knative/) and knative services like [build](https://github.com/knative/build) and [eventing](https://github.com/knative/eventing). Are there any kubernetes users who’d like to weigh in on the topic? Let us know on our[forums!](https://discuss.concourse-ci.org/t/kubernetes-knative/573)
-### **Request for Comment**
+### Request for Comment
We’ve written a new RFC titled: [Merge](https://github.com/clarafu/rfcs/blob/master/05-recursive-resources/proposal.md)[resource](https://github.com/clarafu/rfcs/blob/master/05-recursive-resources/proposal.md)[and](https://github.com/clarafu/rfcs/blob/master/05-recursive-resources/proposal.md)[resource\_type](https://github.com/clarafu/rfcs/blob/master/05-recursive-resources/proposal.md)s. This RFC came about as a result of the work in pinning resources and [#2386](https://github.com/concourse/concourse/issues/2386). You can comment on the RFC PR [here](https://github.com/concourse/rfcs/pull/8)
diff --git a/_posts/2018-08-30-concourse-update--aug-27-31-.markdown b/content/posts/2018-08-30-concourse-update--aug-27-31-.md
similarity index 87%
rename from _posts/2018-08-30-concourse-update--aug-27-31-.markdown
rename to content/posts/2018-08-30-concourse-update--aug-27-31-.md
index e0db59c..5e5bfe7 100644
--- a/_posts/2018-08-30-concourse-update--aug-27-31-.markdown
+++ b/content/posts/2018-08-30-concourse-update--aug-27-31-.md
@@ -1,18 +1,17 @@
---
-layout: post
title: Concourse Update (Aug 27–31)
date: '2018-08-30 00:00:00'
tags:
- product-update
---
-
+{{< image src="/images/downloaded_images/Concourse-Update--Aug-27-31-/0-39sBwa4rlBwJYlH4.jpg" alt="Photo courtesy of the CNE" width="100%" >}}
Apologies for the break from the usual update schedule; I wanted to get one last update out before I take some personal time, starting Fri. Aug 31 and coming back Sept 10. In my absence [Scott Foerster](https://medium.com/u/86d0fa097bb9) and [Alex Suraci](https://medium.com/u/263a63b2f209) will be writing the product update next week. The Concourse team will also be taking Monday, Sept 3rd off in observance of Labour day as well.
On to the updates:
-- Concourse 4.1.0 will be out…soon! We’ve begun the process of accepting all stories and deploying our pre-release version onto the internal test environments. If you’re curious as to what new features/bug fixes are coming out in this release, you can get an at-a-glace view in our [Milestones page](https://project.concourse-ci.org/milestones).You can expect the official release to come out very soon :D
+- Concourse 4.1.0 will be out…soon! We’ve begun the process of accepting all stories and deploying our pre-release version onto the internal test environments. If you’re curious as to what new features/bug fixes are coming out in this release, you can get an at-a-glace view in our [Milestones page](https://project.concourse-ci.org/milestones).You can expect the official release to come out very soon :D
- [Lindsay Auchinachie](https://medium.com/u/84b937bda3b6) wrote another entry in her Concourse UI Explained series; this time covering the [Concourse Build page](https://medium.com/@lauchinachie_78613/4f92824c98f1).
- The Concourse mono-repo is coming! You can read more about the change in issue [#2534](https://github.com/concourse/concourse/issues/2534). Work on this will continue the moment we release 4.1.0
diff --git a/_posts/2018-09-14-concourse-update--sept-10---sept-14-.markdown b/content/posts/2018-09-14-concourse-update--sept-10---sept-14-.md
similarity index 77%
rename from _posts/2018-09-14-concourse-update--sept-10---sept-14-.markdown
rename to content/posts/2018-09-14-concourse-update--sept-10---sept-14-.md
index e662683..0c5a328 100644
--- a/_posts/2018-09-14-concourse-update--sept-10---sept-14-.markdown
+++ b/content/posts/2018-09-14-concourse-update--sept-10---sept-14-.md
@@ -1,16 +1,15 @@
---
-layout: post
title: Concourse Update (Sept 10 — Sept 14)
date: '2018-09-14 00:00:00'
tags:
- product-update
---
-
+{{< image src="/images/downloaded_images/Concourse-Update--Sept-10---Sept-14-/1-oJ9JKLsPYwX6YtLNEibR0w.png" alt="Let us know if you’d be interested in Concourse swag" width="100%" >}}
Following up from a discussion on our forums [Scott Foerster](https://medium.com/u/86d0fa097bb9) has been looking at different options for selling Concourse swag online. Do you want Concourse leggings? or maybe a limited edition @vito pls pillow! Let us know in the thread [Concourse merchandising](https://discuss.concourse-ci.org/t/concourse-merchandising-t-shirts-and-similar/599/4).
-**Please also take some time to fill out our** [**2018 Concourse Community survey**](https://docs.google.com/forms/u/1/d/e/1FAIpQLScWHuP130rJAcqBJhQtyIUCqbMcY4Qj0beHtfOnWEQugWSuUw/viewform) **.** Your feedback is really valuable to us and the information you provide will help us plan the future of Concourse. We only have a handful of responses so far and we’d like to get more before we publish the results!
+**Please also take some time to fill out our** [**2018 Concourse Community survey**](https://docs.google.com/forms/u/1/d/e/1FAIpQLScWHuP130rJAcqBJhQtyIUCqbMcY4Qj0beHtfOnWEQugWSuUw/viewform). Your feedback is really valuable to us and the information you provide will help us plan the future of Concourse. We only have a handful of responses so far and we’d like to get more before we publish the results!
On to the update:
diff --git a/_posts/2018-09-21-concourse-update--sept-17-21-.markdown b/content/posts/2018-09-21-concourse-update--sept-17-21-.md
similarity index 84%
rename from _posts/2018-09-21-concourse-update--sept-17-21-.markdown
rename to content/posts/2018-09-21-concourse-update--sept-17-21-.md
index 7bf3c89..ead1967 100644
--- a/_posts/2018-09-21-concourse-update--sept-17-21-.markdown
+++ b/content/posts/2018-09-21-concourse-update--sept-17-21-.md
@@ -1,12 +1,11 @@
---
-layout: post
title: Concourse Update (Sept 17–21)
date: '2018-09-21 00:00:00'
tags:
- product-update
---
-
+{{< image src="/images/downloaded_images/Concourse-Update--Sept-17-21-/1-7EmboSXNrRcSwtYmV9WSLQ.jpeg" alt="wiltshirespotter" width="50%" >}}
[Concourse 4.2.0](https://concourse-ci.org/download.html#v420) and [Concourse 4.2.1](https://concourse-ci.org/download.html#v421) were released earlier this week. There’s a lot of great fixes and features in this new release, so please upgrade now!
@@ -16,7 +15,7 @@ You’ll also notice that the BOSH spec has moved from its usual place. We’ve
_Edit:_ I forgot to mention that Concourse user [danhigham](https://github.com/danhigham) wrote an awesome Atom plugin for Concourse. Give the [concourse-vis](https://github.com/danhigham) plugin a spin and show him some love!
-Finally, please take some time to fill out the [2018 Concourse community survey ](https://docs.google.com/forms/d/e/1FAIpQLScWHuP130rJAcqBJhQtyIUCqbMcY4Qj0beHtfOnWEQugWSuUw/viewform). We’re at 80 responses right now and hoping to hit 100 before we publish the results!
+Finally, please take some time to fill out the [2018 Concourse community survey](https://docs.google.com/forms/d/e/1FAIpQLScWHuP130rJAcqBJhQtyIUCqbMcY4Qj0beHtfOnWEQugWSuUw/viewform). We’re at 80 responses right now and hoping to hit 100 before we publish the results!
On to the update:
diff --git a/_posts/2018-09-28-concourse-update--sept-24-28-.markdown b/content/posts/2018-09-28-concourse-update--sept-24-28-.md
similarity index 72%
rename from _posts/2018-09-28-concourse-update--sept-24-28-.markdown
rename to content/posts/2018-09-28-concourse-update--sept-24-28-.md
index cfb50c9..15ce2dc 100644
--- a/_posts/2018-09-28-concourse-update--sept-24-28-.markdown
+++ b/content/posts/2018-09-28-concourse-update--sept-24-28-.md
@@ -1,29 +1,28 @@
---
-layout: post
title: Concourse Update (Sept 24–28)
date: '2018-09-28 00:00:00'
tags:
- product-update
---
-
+{{< image src="/images/downloaded_images/Concourse-Update--Sept-24-28-/1-hrYofU4YBkZ9SWkt4fUPZA.jpeg" alt="Reppin’ Concourse at Spring One Platform" width="60%" >}}
The Concourse team went out to Washington D.C. this week to attend Spring One Platform 2018. Thanks to all the Concourse fans who stopped by to say hi, we really enjoyed meeting ya’ll. All of the talks were recorded and should be uploaded to the [SpringDeveloper](https://www.youtube.com/user/SpringSourceDev/videos) YouTube channel in the coming weeks. Some of the interesting talks to check out are:
- [Extreme Pipelines](https://springoneplatform.io/2018/sessions/extreme-pipelines)
- [Zero to Multicloud](https://springoneplatform.io/2018/sessions/zero-to-multi-cloud) and [Spinnaker and the Distributed Monorepo](https://springoneplatform.io/2018/sessions/spinnaker-and-the-distributed-monorepo)
-- …and of course [Draupnir: A story about Managing Concourse in the Enterprise](https://springoneplatform.io/2018/sessions/draupnir-a-story-about-managing-concourse-in-the-enterprise)
-
+- ...and of course [Draupnir: A story about Managing Concourse in the Enterprise](https://springoneplatform.io/2018/sessions/draupnir-a-story-about-managing-concourse-in-the-enterprise)
+ {{< image src="/images/downloaded_images/Concourse-Update--Sept-24-28-/1-syqGOwSEdWFE5CvrkZT-Kg.jpeg" alt="Concourse ❤ Spring & PCF" width="60%" >}}
And now, on to the update:
-
+{{< image src="/images/downloaded_images/Concourse-Update--Sept-24-28-/1-kTNsddsROpolUBj1oiJ6Mg.png" alt="" width="50%" >}}
You’ll notice that our main pipelines are paused. This is because [Alex Suraci](https://medium.com/u/263a63b2f209) is working away on [#2534](https://github.com/concourse/concourse/issues/2534), refactoring our main pipeline to support our new mono-repo structure. This new pipeline is simply called the [concourse](https://ci.concourse-ci.org/teams/main/pipelines/concourse)[pipeline](https://ci.concourse-ci.org/teams/main/pipelines/concourse).
In addition to refactoring the pipeline, [Alex Suraci](https://medium.com/u/263a63b2f209) has been fleshing out the new developer/contributor workflows under our new mono-repo. You can find the new updated information in [CONTRIBUTING.md](https://github.com/concourse/concourse/blob/master/.github/CONTRIBUTING.md).
-
+{{< image src="/images/downloaded_images/Concourse-Update--Sept-24-28-/1-f2DIMOJRMC4Cm8YG-iWGXw.png" alt="Bugs…or features?!" width="100%" >}}
You’ll also notice that we ask whether you are reporting a bug or a new feature when creating issues. This will (hopefully) help get our backlog more organized and reduce the up-front triaging!
diff --git a/_posts/2018-10-05-concourse-update--oct-1-5-.markdown b/content/posts/2018-10-05-concourse-update--oct-1-5-.md
similarity index 91%
rename from _posts/2018-10-05-concourse-update--oct-1-5-.markdown
rename to content/posts/2018-10-05-concourse-update--oct-1-5-.md
index c06f5cd..f1b3836 100644
--- a/_posts/2018-10-05-concourse-update--oct-1-5-.markdown
+++ b/content/posts/2018-10-05-concourse-update--oct-1-5-.md
@@ -1,5 +1,4 @@
---
-layout: post
title: Concourse Update (Oct 1–5)
date: '2018-10-05 00:00:00'
tags:
@@ -16,11 +15,13 @@ On to the update:
**RBAC**
-We continue to work on the proposal for [Role Based Access Control (RBAC)](https://github.com/concourse/rfcs/pull/6). In the past few weeks we’ve been focusing more on the _experience_ of assigning roles to new users. Our early attempts at this was to require operators to supply those changes through the fly CLI :
+We continue to work on the proposal for [Role Based Access Control (RBAC)](https://github.com/concourse/rfcs/pull/6). In the past few weeks we’ve been focusing more on the _experience_ of assigning roles to new users. Our early attempts at this was to require operators to supply those changes through the fly CLI:
- fly -t mytarget set-team -n myteam --role viewer --allow-all-users
-
- fly -t mytarget set-team -n myteam --role member --github-user pivotal-jwinters --github-team myorg:myteam
+```shell-session
+fly -t mytarget set-team -n myteam --role viewer --allow-all-users
+
+fly -t mytarget set-team -n myteam --role member --github-user pivotal-jwinters --github-team myorg:myteam
+```
This raises some questions though: how do you go about removing a role from a user on a team? should the role parameters be additive, or overriding like the other flags? Also, that’s a lot of flags to supply through the set-team command, maybe this belongs in a configuration file.
diff --git a/_posts/2018-10-12-concourse-update--oct-9-12-.markdown b/content/posts/2018-10-12-concourse-update--oct-9-12-.md
similarity index 85%
rename from _posts/2018-10-12-concourse-update--oct-9-12-.markdown
rename to content/posts/2018-10-12-concourse-update--oct-9-12-.md
index 04961a3..5099baf 100644
--- a/_posts/2018-10-12-concourse-update--oct-9-12-.markdown
+++ b/content/posts/2018-10-12-concourse-update--oct-9-12-.md
@@ -1,12 +1,11 @@
---
-layout: post
title: Concourse Update (Oct 9–12)
date: '2018-10-12 00:00:00'
tags:
- product-update
---
-
+{{< image src="/images/downloaded_images/Concourse-Update--Oct-9-12-/1-beC36nbzVbF57aHcM2jEyQ.jpeg" alt="From the Smithsonian National Air and Space Museum in Washington D.C." width="100%" >}}
The results of the [Concourse 2018 Community survey](https://medium.com/concourse-ci/2018-community-survey-ddff90bdc35b) is out! Thanks to everyone who took the time to fill it out; and to [Scott Foerster](https://medium.com/u/86d0fa097bb9) and [Lindsay Auchinachie](https://medium.com/u/84b937bda3b6) for sifting through the data.
diff --git a/_posts/2018-10-19-concourse-update--oct-15-19-.markdown b/content/posts/2018-10-19-concourse-update--oct-15-19-.md
similarity index 75%
rename from _posts/2018-10-19-concourse-update--oct-15-19-.markdown
rename to content/posts/2018-10-19-concourse-update--oct-15-19-.md
index bf80b70..742258b 100644
--- a/_posts/2018-10-19-concourse-update--oct-15-19-.markdown
+++ b/content/posts/2018-10-19-concourse-update--oct-15-19-.md
@@ -1,16 +1,15 @@
---
-layout: post
title: Concourse Update (Oct 15–19)
date: '2018-10-19 00:00:00'
tags:
- product-update
---
-
+{{< image src="/images/downloaded_images/Concourse-Update--Oct-15-19-/1-Y05yilBhjLQKwCftw39ZVw.jpeg" alt="Torontonians typically overreact when they get their first snowfall of the year. Its just a bit of frost ya’ll" width="50%" >}}
We finished our first implementation of Role Based Access Control (RBAC) this week! You can look forward to this change in our next release of Concourse.
-Speaking of which, the next release of Concourse is currently blocked while we try to re-build our new [release pipelines](https://ci.concourse-ci.org/teams/main/pipelines/concourse). Along with our move to the mono-repo, we’re focusing even more on making the binary distribution of Concourse the first-class distribution of Concourse. This means that you’ll get everything you need for Concourse packaged into one nifty tgz ! We’re still working on finalizing the pipelines, so look forward to hearing more details about these changes in the coming weeks.
+Speaking of which, the next release of Concourse is currently blocked while we try to re-build our new [release pipelines](https://ci.concourse-ci.org/teams/main/pipelines/concourse). Along with our move to the mono-repo, we’re focusing even more on making the binary distribution of Concourse the first-class distribution of Concourse. This means that you’ll get everything you need for Concourse packaged into one nifty tgz! We’re still working on finalizing the pipelines, so look forward to hearing more details about these changes in the coming weeks.
This week, I’ve also been doing some analysis on our internal Concourse instance Wings. Wings currently runs on GCP and has
@@ -27,7 +26,7 @@ On to the update:
**API**
-
+{{< image src="/images/downloaded_images/Concourse-Update--Oct-15-19-/1-I0qcGZPL9DOugmQ6eC_xVQ.png" alt="" width="40%" >}}
- We finished RBAC!
- Fixed an issue where Users who are not assigned to teams aren’t able to login [#2670](https://github.com/concourse/concourse/issues/2670)
diff --git a/_posts/2018-10-26-concourse-update--oct-22-26-.markdown b/content/posts/2018-10-26-concourse-update--oct-22-26-.md
similarity index 79%
rename from _posts/2018-10-26-concourse-update--oct-22-26-.markdown
rename to content/posts/2018-10-26-concourse-update--oct-22-26-.md
index d5168ec..2e831ea 100644
--- a/_posts/2018-10-26-concourse-update--oct-22-26-.markdown
+++ b/content/posts/2018-10-26-concourse-update--oct-22-26-.md
@@ -1,12 +1,11 @@
---
-layout: post
title: Concourse Update (Oct 22–26)
date: '2018-10-26 00:00:00'
tags:
- product-update
---
-
+{{< image src="/images/downloaded_images/Concourse-Update--Oct-22-26-/1-MnGUtwM_fDCZBeKhYrlwqA.jpeg" alt="MGI Construction Corp" width="50%" >}}
This week the team got together to discuss the initial groundwork and investigations required to publish and maintain a supported API. If you’ve built any tools against our API and have feedback for us, please let us know by commenting on the original [issue #1122](https://github.com/concourse/concourse/issues/1122).
@@ -29,9 +28,8 @@ On to the update:
**Operations**
-
+{{< image src="/images/downloaded_images/Concourse-Update--Oct-22-26-/1-yxHddOEl3sz5TqCy7M0q_A.png" width="50%" >}}
We’ve added descriptions to our metrics graphs! You can check out the descriptions on our prod metrics here: [https://metrics.concourse-ci.org/dashboard/db/concourse?refresh=1m&orgId=1](https://metrics.concourse-ci.org/dashboard/db/concourse?refresh=1m&orgId=1)
In other news we’re also working on [#2674](https://github.com/concourse/concourse/issues/2674), emit metrics for locks held in the database
-
diff --git a/_posts/2018-11-02-concourse-update--oct-29--nov-2-.markdown b/content/posts/2018-11-02-concourse-update--oct-29--nov-2-.md
similarity index 80%
rename from _posts/2018-11-02-concourse-update--oct-29--nov-2-.markdown
rename to content/posts/2018-11-02-concourse-update--oct-29--nov-2-.md
index ca8ec13..297fde5 100644
--- a/_posts/2018-11-02-concourse-update--oct-29--nov-2-.markdown
+++ b/content/posts/2018-11-02-concourse-update--oct-29--nov-2-.md
@@ -1,18 +1,17 @@
---
-layout: post
title: Concourse Update (Oct 29— Nov 2)
date: '2018-11-02 00:00:00'
tags:
- product-update
---
-
+{{< image src="/images/downloaded_images/Concourse-Update--Oct-29--Nov-2-/1-7C_nS91OafAnN5DWBtN4SA.jpeg" alt="The Concourse team’s big yoga ball has returned to its rightful home" width="50%" >}}
As a part of our refactor of the prod pipeline, [Alex Suraci](https://medium.com/u/263a63b2f209) cleaned up and refactored parts of the TSA to better support draining and rebalancing [#2748](https://github.com/concourse/concourse/pull/2748). The numbers are looking really good!
On to the update:
-### **API**
+### API
- We’re deep into investigations around our API documentation and management strategy. Our current investigation work is captured in [#2739](https://github.com/concourse/concourse/issues/2739) but the original request comes from [#1122](https://github.com/concourse/concourse/issues/1122)
diff --git a/_posts/2018-11-09-concourse-update--nov-5-9-.markdown b/content/posts/2018-11-09-concourse-update--nov-5-9-.md
similarity index 90%
rename from _posts/2018-11-09-concourse-update--nov-5-9-.markdown
rename to content/posts/2018-11-09-concourse-update--nov-5-9-.md
index 3b1e7bc..4bbde7e 100644
--- a/_posts/2018-11-09-concourse-update--nov-5-9-.markdown
+++ b/content/posts/2018-11-09-concourse-update--nov-5-9-.md
@@ -1,12 +1,11 @@
---
-layout: post
title: Concourse Update (Nov 5–9)
date: '2018-11-09 00:00:00'
tags:
- product-update
---
-
+{{< image src="/images/downloaded_images/Concourse-Update--Nov-5-9-/1-JcXgBDqfq8Lwc4WNwyJgQg.jpeg" alt="" width="50%" >}}
Right off the bat I’d like to give a shoutout to [Jamie Klassen](https://medium.com/u/f0f4a8a2fbb8) and his new post about the upcoming feature for pinning resources. You can check it out the new post here:[https://medium.com/concourse-ci/resource-page-explained-eb99cf256fb5](https://medium.com/concourse-ci/resource-page-explained-eb99cf256fb5)
diff --git a/_posts/2018-11-23-concourse-rbac-preview.markdown b/content/posts/2018-11-23-concourse-rbac-preview.md
similarity index 69%
rename from _posts/2018-11-23-concourse-rbac-preview.markdown
rename to content/posts/2018-11-23-concourse-rbac-preview.md
index 319d0e6..a2cca1a 100644
--- a/_posts/2018-11-23-concourse-rbac-preview.markdown
+++ b/content/posts/2018-11-23-concourse-rbac-preview.md
@@ -1,22 +1,21 @@
---
-layout: post
title: Concourse RBAC Preview
date: '2018-11-23 00:00:00'
---
-
+{{< image src="/images/downloaded_images/Concourse-RBAC-Preview/0-oy1M_w9ksoAje2LR.jpg" width="50%" >}}
One of the big themes for Concourse in 2018 has been [Users](https://concourse-ci.org/download.html#v400), [multiple auth connectors](https://concourse-ci.org/install.html#auth-config), and role-based access control (aka [RBAC](https://github.com/pivotal-jwinters/rfcs/blob/proposal/rbac/03-rbac/proposal.md)). With RBAC in the final phases of development, I wanted to give you a preview of some of the functionality that you can expect in our upcoming release; Concourse 5.0
-## Admins, Owners, Members and Viewers
+## Admins, Owners, Members and Viewers
Concourse 5.0 will come with 4 roles: Concourse Admin, Team Owner, Team Member, and Team Viewer.
### Concourse Admin
-A Concourse Admin is the same as today’s [admin user](https://concourse-ci.org/main-team.html). Members of main team will automatically be Concourse Admins\* and have the ability to administrate teams with fly : set-team, destroy-team, rename-team, and teams. Given that all Concourse Admins must be a member of the main team, all Concourse Admins must have at least one other role; and that should typically be the Team Owner role.
+A Concourse Admin is the same as today’s [admin user](https://concourse-ci.org/main-team.html). Members of main team will automatically be Concourse Admins* and have the ability to administrate teams with fly: set-team, destroy-team, rename-team, and teams. Given that all Concourse Admins must be a member of the main team, all Concourse Admins must have at least one other role; and that should typically be the Team Owner role.
-\*there’s an open issue to restrict this grant to Team Owners on main in [#2846](https://github.com/concourse/concourse/issues/2846)
+_* There’s an open issue to restrict this grant to Team Owners on main in [#2846](https://github.com/concourse/concourse/issues/2846)_
### Team Owner
@@ -38,7 +37,7 @@ We considered other role types while developing this feature; including roles th
For a full list of each role’s allowed actions you can reference our handy permission matrix on Google Sheets [here](https://docs.google.com/spreadsheets/d/1np3hyJy3mVRfB2gcgKykz3QTQg5qEj28QgK523SEmao/edit#gid=1437859537).
-## Configuring Roles with fly
+## Configuring Roles with fly
Now that we’ve gone over the new roles, we can do a quick overview of how we can go about setting users & roles on teams.
@@ -46,44 +45,53 @@ Now that we’ve gone over the new roles, we can do a quick overview of how we c
By default, if no configuration is provided the user is given theTeam Owner role:
- fly -t dev set-team -n PowerRangers --local-user=Zordon
+```shell-session
+fly -t dev set-team -n PowerRangers --local-user=Zordon
+```
This behaviour also applies to groups as well, so be careful!
- fly -t dev set-team -n A-Team
- --github-team=MightyMorphin:PowerRangers
+```shell-session
+fly -t dev set-team -n A-Team \
+ --github-team=MightyMorphin:PowerRangers
+```
-### Specifying Roles with -c
+### Specifying Roles with `-c`
Roles must be specified in a separate configuration file using the -c
+```shell-session
fly -t dev set-team -n PowerTeam -c ./team.yml
-
- team.yml
-
- roles:
- - name: owner
- local:
- users: ["Zordon"]
- - name: member
- local:
- users: ["RedRanger", "BlueRanger", "GreenRanger"]
- - name: viewer
- local:
- users: ["Alpha"]
+```
+
+`team.yml`:
+```yaml
+roles:
+- name: owner
+ local:
+ users: ["Zordon"]
+- name: member
+ local:
+ users: ["RedRanger", "BlueRanger", "GreenRanger"]
+- name: viewer
+ local:
+ users: ["Alpha"]
+```
### Inspecting Roles Configuration
Once you’ve set the team configuration you can verify it using the details flag on fly teams:
- fly -t dev teams -d
-
- name users groups
- A-Team/member local:RedRanger, BlueRanger, GreenRanger none
- A-Team/owner local:Zordon none
- A-Team/viewer local:Alpha none
+```shell-session
+fly -t dev teams -d
-..where you’ll find the output is now updated to list each team/role combination and its associated users/groups.
+name users groups
+A-Team/member local:RedRanger, BlueRanger, GreenRanger none
+A-Team/owner local:Zordon none
+A-Team/viewer local:Alpha none
+```
+
+...where you’ll find the output is now updated to list each team/role combination and its associated users/groups.
## What’s left?
diff --git a/_posts/2018-11-23-concourse-update--nov-19-23-.markdown b/content/posts/2018-11-23-concourse-update--nov-19-23-.md
similarity index 85%
rename from _posts/2018-11-23-concourse-update--nov-19-23-.markdown
rename to content/posts/2018-11-23-concourse-update--nov-19-23-.md
index 7964971..271a67a 100644
--- a/_posts/2018-11-23-concourse-update--nov-19-23-.markdown
+++ b/content/posts/2018-11-23-concourse-update--nov-19-23-.md
@@ -1,12 +1,11 @@
---
-layout: post
title: Concourse Update (Nov 19–23)
date: '2018-11-23 00:00:00'
tags:
- product-update
---
-
+{{< image src="/images/downloaded_images/Concourse-Update--Nov-19-23-/1-fBOnArsQyRfYMLYGB4Uk_w.jpeg" width="50%" >}}
It was a relatively light week this week due to some vacations. I did, however, get a chance to do some acceptance work on our upcoming feature for role-based access control in Concourse. You can read more about how that’ll work in our [feature preview post](https://medium.com/concourse-ci/concourse-rbac-preview-8e07616ddc47).
diff --git a/_posts/2018-11-30-concourse-updates--nov-26-30-.markdown b/content/posts/2018-11-30-concourse-updates--nov-26-30-.md
similarity index 74%
rename from _posts/2018-11-30-concourse-updates--nov-26-30-.markdown
rename to content/posts/2018-11-30-concourse-updates--nov-26-30-.md
index 294d7de..6dfe4cf 100644
--- a/_posts/2018-11-30-concourse-updates--nov-26-30-.markdown
+++ b/content/posts/2018-11-30-concourse-updates--nov-26-30-.md
@@ -1,16 +1,15 @@
---
-layout: post
title: Concourse Updates (Nov 26–30)
date: '2018-11-30 00:00:00'
tags:
- product-update
---
-
+{{< image src="/images/downloaded_images/Concourse-Updates--Nov-26-30-/1-BFgbR-J5U389pc0g9nDi_Q.jpeg" width="100%" >}}
As I mentioned last week I’ve been doing story acceptance in our dev environments for the upcoming [RBAC](https://medium.com/concourse-ci/concourse-rbac-preview-8e07616ddc47) feature. The team’s been working through some of the new issues that come out of that to give some final polish on to the release.
-Something that I haven’t talked too much about in the past weeks is our work on the [Concourse k8s Helm chart](https://github.com/helm/charts/tree/master/stable/concourse). If you pull up some of the PRs under[[stable/concourse]](https://github.com/helm/charts/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+%5Bstable%2Fconcourse%5D+), you’ll see that we’ve been proposing some changes to the chart. This all falls under our goals for helping the community stabilize the Concourse Helm Chart and to increase the scope of automated tests using the Helm chart. You can follow along some of our work in GH issues [#2753](https://github.com/concourse/concourse/issues/2753) and [#2876](https://github.com/concourse/concourse/issues/2876).
+Something that I haven’t talked too much about in the past weeks is our work on the [Concourse k8s Helm chart](https://github.com/helm/charts/tree/master/stable/concourse). If you pull up some of the PRs under [stable/concourse](https://github.com/helm/charts/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+%5Bstable%2Fconcourse%5D+), you’ll see that we’ve been proposing some changes to the chart. This all falls under our goals for helping the community stabilize the Concourse Helm Chart and to increase the scope of automated tests using the Helm chart. You can follow along some of our work in GH issues [#2753](https://github.com/concourse/concourse/issues/2753) and [#2876](https://github.com/concourse/concourse/issues/2876).
On to the update
@@ -42,4 +41,3 @@ On to the update
Continued with [#2577](https://github.com/concourse/concourse/issues/2577):
> “..as a first effort solution, we have decided to go with using the existing number of active containers on the workers to determine container placement. This means that we are adding a placement strategy that adds the new task on to a worker with the least existing active containers.”
-
diff --git a/_posts/2018-12-07-concourse-update--dec-3-7-.markdown b/content/posts/2018-12-07-concourse-update--dec-3-7-.md
similarity index 90%
rename from _posts/2018-12-07-concourse-update--dec-3-7-.markdown
rename to content/posts/2018-12-07-concourse-update--dec-3-7-.md
index f2ac335..0fe89ef 100644
--- a/_posts/2018-12-07-concourse-update--dec-3-7-.markdown
+++ b/content/posts/2018-12-07-concourse-update--dec-3-7-.md
@@ -1,12 +1,11 @@
---
-layout: post
title: Concourse Update (Dec 3–7)
date: '2018-12-07 00:00:00'
tags:
- product-update
---
-
+{{< image src="/images/downloaded_images/Concourse-Update--Dec-3-7-/1-9QGCZafW4o8rGIVxN4QvYA.jpeg" alt="Stephen A. Wolfe" width="75%" >}}
We’re nearing the end on some UX refactoring work and finished off the issue regarding container scheduling. Between those improvements and the global resource caching, we’re hoping to see a lot of efficiency improvements in 5.0
diff --git a/_posts/2018-12-12-concourse-2018-year-in-review.markdown b/content/posts/2018-12-12-concourse-2018-year-in-review.md
similarity index 95%
rename from _posts/2018-12-12-concourse-2018-year-in-review.markdown
rename to content/posts/2018-12-12-concourse-2018-year-in-review.md
index 1829d31..3375bf5 100644
--- a/_posts/2018-12-12-concourse-2018-year-in-review.markdown
+++ b/content/posts/2018-12-12-concourse-2018-year-in-review.md
@@ -1,16 +1,15 @@
---
-layout: post
title: Concourse 2018 Year in Review
date: '2018-12-12 00:00:00'
tags:
- product-update
---
-
+{{< image src="/images/downloaded_images/Concourse-2018-Year-in-Review/1-pzx9yhOYi-XyEFUgqnxBfw.jpeg" alt="Bernal Saborio" width="100%" >}}
2018 has been an action-packed year for us. We saw a major release ([Concourse 4.0.0](https://concourse-ci.org/download.html#v400)) with a lot of new features: [new auth connectors and users](https://medium.com/concourse-ci/oh-auth-f4fe68438171), [dashboard](https://medium.com/concourse-ci/designing-a-dashboard-for-concourse-fe2e03248751), [distributed GC](https://medium.com/concourse-ci/distributed-garbage-collection-ae3867ab5438) and other runtime improvements. At the same time our team grew from 3 engineering pairs at the start of 2018 to 8 engineering pairs and an additional PM (👋 [Scott Foerster](https://medium.com/u/86d0fa097bb9)) working on Concourse OSS and supporting Concourse for PCF.
-## By the Numbers
+## By the Numbers
- 13 releases of Concourse
- 1 TLD snafu leading to[our domain change](https://medium.com/concourse-ci/were-switchin-domains-5597dcd0b48b)
@@ -21,7 +20,7 @@ tags:
- 417 PRs, up by 15% from last year
- 3,300 stars, up by 38% from last year
-## Most Popular Posts
+## Most Popular Posts
We started this blog in Sept of last year. Since then we’ve had thousands of readers over 70 posts. The top 5 most popular posts are:
@@ -51,7 +50,7 @@ Finally, Thanks to all our contributors across all our repos:
…and many more. Special thanks to all the contributors who’ve built new resources for Concourse in 2018, contributed to the health of resources and also took over old resources.
-## See you in 2019!
+## See you in 2019!
I hope y’all get to enjoy some time off this holiday season. We’ve got a lot of updates planned for 2019, like our new contributor workflow, Concourse 5.0 and spatial resources! Look forward to an in-depth post from [Alex Suraci](https://medium.com/u/263a63b2f209) in the next few days.
diff --git a/_posts/2018-12-20-the-great-process-update-of-2018.markdown b/content/posts/2018-12-20-the-great-process-update-of-2018.md
similarity index 90%
rename from _posts/2018-12-20-the-great-process-update-of-2018.markdown
rename to content/posts/2018-12-20-the-great-process-update-of-2018.md
index 7c11119..e23bc79 100644
--- a/_posts/2018-12-20-the-great-process-update-of-2018.markdown
+++ b/content/posts/2018-12-20-the-great-process-update-of-2018.md
@@ -1,17 +1,16 @@
---
-layout: post
title: The Great Process Update of 2018
date: '2018-12-20 00:00:00'
---
### Or, “why we haven’t shipped any new features since September.”
-
+{{< image src="/images/downloaded_images/The-Great-Process-Update-of-2018/1-Fdk1aihMwmllUR7HOBp2kg.jpeg" width="80%" >}}
You may have noticed that our release cadence has slowed down significantly in the past few months. The _bad news_ is we probably won’t get a release out this year (mainly due to end-of-year vacations and slowing down in general), but the _good news_ is the next release is huge — big enough to bump us to v5.0 — and it’s just about ready. I’ll have more information on the next release in an upcoming post.
This post will go over all the changes we’ve made to our project structure and processes surrounding contribution. These changes aren’t very visible to end-users, but they set the stage for the community growth and collaboration that will make our future releases even better and bring more depth to our culture and ecosystem.
-## A newly minted process for RFCs
+## A newly minted process for RFCs
We’ve finally established a process for submitting and accepting RFCs! Head over to the [concourse/rfcs](https://github.com/concourse/rfcs)[repo](https://github.com/concourse/rfcs) if you want to check it out.
@@ -21,7 +20,7 @@ We've already started submitting RFCs for substantial features like [Resources V
Credit where it’s due: this process based pretty heavily on [Rust’s](https://github.com/rust-lang/rfcs). Just about every detail seemed to apply just as appropriately to Concourse, and we’re just as cautious about far-reaching changes, so it was a great match.
-## Switching from CLA to DCO
+## Switching from CLA to DCO
Up until now, all pull request authors have had to sign off on the Pivotal CLA in order for their pull request to be accepted (unless it was an “obvious fix”).
@@ -29,7 +28,7 @@ On occasion contributors would get caught in a corporate quagmire when trying to
So, we’re abandoning the CLA process and instead adopting the [Developer Certificate of Origin (“DCO”)](https://developercertificate.org) process. This process is much more lightweight, only requiring pull request authors to include a “Signed-off-by:” line in each commit, which can be done via git commit -s. More information on this is available in [CONTRIBUTING.md](https://github.com/concourse/concourse/blob/master/CONTRIBUTING.md#signing-your-work).
-## Completing the Great Project Restructuring of 2018
+## Completing the Great Project Restructuring of 2018
The single biggest cause of the release slowdown has been [The Great Project Restructuring of 2018](https://github.com/concourse/concourse/issues/2534), which was a massive revamp of how we develop, build, test, and ship Concourse. We knew this would be a “stop-the-world” transition that would prevent us from shipping for a while, but we really had to bite the bullet at some point.
@@ -42,9 +41,9 @@ This change kicked off a ripple effect that improved a ton of things about the d
- Now that all the code is together in one repo, cross-cutting changes can now be submitted as a single pull request! 🎊 Pull requests now trigger acceptance tests too, which is something we couldn’t really do easily before.
- Resources are now versioned and shipped independently from Concourse versions. Each resource is published as concourse/\-resource with appropriate tags (e.g. 1.2.3, 1.2, 1, latest, dev). This means you can refer to specific versions when necessary by using resource\_types: in your pipeline. A core set of resource types will still be shipped with Concourse, at whichever version they were when the release was frozen.
- The concourse repo is no longer a BOSH release; we’ve split it out into [its own repository](https://github.com/concourse/concourse-bosh-release) instead. The new BOSH release simply wraps the binary distribution, rather than building from source. This reduces the surface area for support and removes any discrepancies between the platforms — everything just uses the binary now! This also makes deploying the BOSH release faster because there’s not much to compile.
-- We’ve changed how the concourse executable is packaged. We’re switching to a .tgz format containing the binary and its dependencies, rather than a self-extracting “all-in-one” binary. This results in way fewer moving parts and dramatically reduces concourse worker start-up time.
+- We’ve changed how the concourse executable is packaged. We’re switching to a .tgz format containing the binary and its dependencies, rather than a self-extracting “all-in-one” binary. This results in way fewer moving parts and dramatically reduces concourse worker start-up time.
-## Where are we now?
+## Where are we now?
Overall, I think these recent changes may be the most important thing we’ve done for the project since its inception, even if it meant not shipping for a while.
diff --git a/_posts/2019-01-11-concourse-update--jan-7-11-.markdown b/content/posts/2019-01-11-concourse-update--jan-7-11-.md
similarity index 67%
rename from _posts/2019-01-11-concourse-update--jan-7-11-.markdown
rename to content/posts/2019-01-11-concourse-update--jan-7-11-.md
index b1973c5..8726c8d 100644
--- a/_posts/2019-01-11-concourse-update--jan-7-11-.markdown
+++ b/content/posts/2019-01-11-concourse-update--jan-7-11-.md
@@ -1,20 +1,19 @@
---
-layout: post
title: Concourse Update (Jan 7–11)
date: '2019-01-11 00:00:00'
tags:
- product-update
---
-
+{{< image src="/images/downloaded_images/Concourse-Update--Jan-7-11-/1-xc1d4AtxzZanyNVDiEPrvg.jpeg" width="50%" >}}
…and we’re back! The team’s been pretty quiet over the past few weeks due to vacations and holidays. This was our first week back at full strength so we’ve got some interesting updates for ya’ll
-## How are issues managed?
+## How are issues managed?
This is an issue that comes up a lot in our open source community, and [Alex Suraci](https://medium.com/u/8a9db60441c) has taken some time to clean up our issues backlog and add in some bots. You can read the full details here: [How Issues are Managed](https://github.com/concourse/concourse/wiki/How-Issues-are-Managed)
-In addition to the changes to how issues are labeled, we’ve also changed how we used projects and milestones under concourse/concourse. Epics are now organized under [projects in](https://github.com/concourse/concourse/projects)[concourse/concourse](https://github.com/concourse/concourse/projects)[ ](https://github.com/concourse/concourse/projects), and release markers are managed under [milestones in](https://github.com/concourse/concourse/milestones)[concourse/concourse](https://github.com/concourse/concourse/milestones)[.](https://github.com/concourse/concourse/milestones) And as always, our “tracks of work” can be found at the [org-level project page ](https://github.com/orgs/concourse/projects).
+In addition to the changes to how issues are labeled, we’ve also changed how we used projects and milestones under concourse/concourse. Epics are now organized under [projects in concourse/concourse](https://github.com/concourse/concourse/projects), and release markers are managed under [milestones in concourse/concourse](https://github.com/concourse/concourse/milestones). And as always, our “tracks of work” can be found at the [org-level project page](https://github.com/orgs/concourse/projects).
## Updates
diff --git a/_posts/2019-01-18-concourse-update--jan-14-18-.markdown b/content/posts/2019-01-18-concourse-update--jan-14-18-.md
similarity index 90%
rename from _posts/2019-01-18-concourse-update--jan-14-18-.markdown
rename to content/posts/2019-01-18-concourse-update--jan-14-18-.md
index 396643b..2e694dd 100644
--- a/_posts/2019-01-18-concourse-update--jan-14-18-.markdown
+++ b/content/posts/2019-01-18-concourse-update--jan-14-18-.md
@@ -1,12 +1,11 @@
---
-layout: post
title: Concourse Update (Jan 14–18)
date: '2019-01-18 00:00:00'
tags:
- product-update
---
-
+{{< image src="/images/downloaded_images/Concourse-Update--Jan-14-18-/1-6MKC6FrHvi5u_9yZCklyeA.png" alt="for context... or don’t 🤷" width="100%" >}}
Some updates worth bringing up this week. As I had mentioned last week we began to do a re-organization of projects and issues in our concourse/concourse repo; you can read more about it on our [wiki page here](https://github.com/concourse/concourse/wiki/How-Issues-are-Managed). With that said, you can find the issues and PRs that are slated for Concourse 5.0.0’s release in our [5.0.0 Milestones](https://github.com/concourse/concourse/milestone/33). If you’d like to help us with documentation, we’ve started a new branch in the docs repo under [v5.0](https://github.com/concourse/docs/tree/v5.0).
diff --git a/_posts/2019-01-25-concourse-update--jan-21-25-.markdown b/content/posts/2019-01-25-concourse-update--jan-21-25-.md
similarity index 85%
rename from _posts/2019-01-25-concourse-update--jan-21-25-.markdown
rename to content/posts/2019-01-25-concourse-update--jan-21-25-.md
index adaf3cf..821f3b9 100644
--- a/_posts/2019-01-25-concourse-update--jan-21-25-.markdown
+++ b/content/posts/2019-01-25-concourse-update--jan-21-25-.md
@@ -6,7 +6,7 @@ tags:
- product-update
---
-
+{{< image src="/images/downloaded_images/Concourse-Update--Jan-21-25-/1-t_CkNyt-IVxZrxMiARCJLQ.jpeg" alt="Dennis Jarvis" width="50%" >}}
Its been a week since we switched over to the PR workflow and so far its been great! We’re still working through some of the kinks with this process so please bear with us while we continue to burn down through the list of open PRs!
diff --git a/_posts/2019-03-08-an-overview-of-authorization-in-concourse-3--4-and-5.markdown b/content/posts/2019-03-08-an-overview-of-authorization-in-concourse-3--4-and-5.md
similarity index 84%
rename from _posts/2019-03-08-an-overview-of-authorization-in-concourse-3--4-and-5.markdown
rename to content/posts/2019-03-08-an-overview-of-authorization-in-concourse-3--4-and-5.md
index 4b9a969..3e486d6 100644
--- a/_posts/2019-03-08-an-overview-of-authorization-in-concourse-3--4-and-5.markdown
+++ b/content/posts/2019-03-08-an-overview-of-authorization-in-concourse-3--4-and-5.md
@@ -1,24 +1,23 @@
---
-layout: post
title: An Overview of Authorization in Concourse 3, 4 and 5
date: '2019-03-08 00:00:00'
tags:
- product-update
---
-
+{{< image src="/images/downloaded_images/An-Overview-of-Authorization-in-Concourse-3--4-and-5/1-sh1rcJO5eSRDQrmxIF8qTA.jpeg" alt="NASA HQ Photo" width="60%" >}}
With the release of [Concourse 5.0.0](https://concourse-ci.org/download.html#v500) this week I thought it would be a good time to review the evolving implementation of authorization in Concourse. I’ll also be covering some helpful debugging information for you to consider when configuring authorization in your own Concourse instance.
-## Read the Docs
+## Read the Docs
The revised [Concourse Auth & Teams docs](https://concourse-ci.org/auth.html)is a great place to start when diving into Concourse 5.0.0. The docs will cover important steps around provider configuration and team configuration for your cluster. If you’re more interested in how things used to work compared to how they now work; then read on!
-## How Authorization Works in 3.x
+## How Authorization Works in 3.x
_This section will only be useful to operators who are migrating into 4.x and beyond. Feel free to skip ahead if this does not apply to you._
-
+{{< image src="/images/downloaded_images/An-Overview-of-Authorization-in-Concourse-3--4-and-5/1-cNIh0ygLLcNnPbGEDOhcig.png" alt="" width="100%" >}}
Every Concourse instance starts with a main team that must be configured against an Authentication Provider on start-up. The main team is an admin team, meaning it can create teams, update other teams and view system-scoped details on workers, containers, etc.
@@ -42,7 +41,7 @@ Concourse 4 introduced Users and totally revamped the authorization flow:
- Identity providers must be specified when Concourse first starts up (this includes local users as well!)
- Identity providers are shared across teams and can no longer be customized per-team
- Adding/removing Identity Providers require a restart to the web node
-- When specifying groups in provider configuration, administrators must use : as the separator instead of /
+- When specifying groups in provider configuration, administrators must use : as the separator instead of /
- Users logging into Concourse are whitelisted into all teams that match thier provider membership. More on this later
### Overview of Authorization Flow
@@ -76,7 +75,7 @@ Once you have configured the providers you can freely add users/teams/orgs/group
As with most fly commands, you can actually attach multiple users/teams across providers to a team. For example: if you have GitHub and OAuth providers set up, a team owner could attach two teams (one from GitHub, one from OAuth) to the team.
### Examples
-
+{{< image src="/images/downloaded_images/An-Overview-of-Authorization-in-Concourse-3--4-and-5/1-c4yd3A2DIIrRYF8uqh9_fw.png" width="100%" >}}
In this example we have a simple Concourse installation with two identity providers: GitHub and a single Local User.
@@ -102,24 +101,24 @@ The Operator logs in using GitHub auth and…can see everything! Because the Ope
Jama finds out about this cool Concourse thing and logs into Concourse using the GitHub auth provider. Since he has a GitHub account he is able to login successfully. However, once the login flow is completed he is returned to Concourse and a blank screen…nothing is available to him! Jama is not a member of a GitHub team/organization that was specified in the Concourse team configurations.
-## Debugging Login Problems
+## Debugging Login Problems
-### What are the auth settings for [insert team name]?
+### What are the auth settings for [insert team name]?
If you are an operator and you need to figure out what the exact auth settings are, you can use the new fly teams -dcommand. This will list the teams with details, including the users and groups whitelisted into that team
-### Help, I logged in but I can’t see my team
+### Help, I logged in but I can’t see my team
1. Try using the search function on the dashboard. This is silly but for large Concourse clusters there are a LOT of teams with exposed pipelines and it can be hard to find the team you need
2. Logout and Log back in. Due to the implementation of the auth scheme, Users who are already logged into Concourse and are added into a new team must refresh their token by logging out and logging in. Yes, [we know it sucks](https://github.com/concourse/concourse/issues/2441).
3. Is the user a member of the org that was specified in set-team? For example, if GitHub team pivotal:foo was used, make sure to ask if the user is a member of that team on GitHub!
4. Was there a typo? Use fly set-team -d to look for the team in question and triple-check the spelling of usernames and teams
-5. Did you use the correct separator? Concourse requires all group separators to use : and not /:
+5. Did you use the correct separator? Concourse requires all group separators to use : and not /:
- pivotal:foo is OK
- pivotal/foo will fail silently on set-team
-### I have two Identity servers, how do I add them both?
+### I have two Identity servers, how do I add them both?
Unfortunately, that is not possible in Concourse 4. You’ll notice that you can only supply one set of credentials when providing auth providers. The side-effect limitation is that a single Concourse installation can’t be connected to more than one of the same provider. The operator will have to set up another Concourse if they absolutely must be able to connect to two differet identity providers of the same type.
@@ -129,7 +128,7 @@ Concourse 5.0 comes with 4 roles: Concourse Admin, Team Owner, Team Member, and
**Concourse Admin**
-A Concourse Admin is the same as today’s [admin user](https://concourse-ci.org/main-team.html). Members of main team will automatically be Concourse Admins\* and have the ability to administrate teams with fly : set-team, destroy-team, rename-team, and teams. Given that all Concourse Admins must be a member of the main team, all Concourse Admins must have at least one other role; and that should typically be the Team Owner role.
+A Concourse Admin is the same as today’s [admin user](https://concourse-ci.org/main-team.html). Members of main team will automatically be Concourse Admins\* and have the ability to administrate teams with fly: set-team, destroy-team, rename-team, and teams. Given that all Concourse Admins must be a member of the main team, all Concourse Admins must have at least one other role; and that should typically be the Team Owner role.
**Team Owner**
@@ -147,7 +146,7 @@ Team Viewer is also a new role that gives users “read-only” access to a team
For a full list of each role’s allowed actions you can reference our handy permission matrix on Google Sheets [here](https://docs.google.com/spreadsheets/d/1np3hyJy3mVRfB2gcgKykz3QTQg5qEj28QgK523SEmao/edit#gid=1437859537).
-### Configuring Roles with fly
+### Configuring Roles with fly
Now that we’ve gone over the new roles, we can do a quick overview of how we can go about setting users & roles on teams.
@@ -155,37 +154,46 @@ Now that we’ve gone over the new roles, we can do a quick overview of how we c
By default, if no configuration is provided the user is given the Team Owner role:
-fly -t dev set-team -n PowerRangers --local-user=Zordon This behaviour also applies to groups as well, so be careful!
+```bash
+fly -t dev set-team -n PowerRangers --local-user=Zordon
- fly -t dev set-team -n A-Team
- --github-team=MightyMorphin:PowerRangers
+#This behaviour also applies to groups as well, so be careful!
+fly -t dev set-team -n A-Team \
+ --github-team=MightyMorphin:PowerRangers
+```
-### Specifying Roles with -c
+### Specifying Roles with `-c`
Roles must be specified in a separate configuration file using the -c
- fly -t dev set-team -n A-Team -c ./team.yml
- team.yml
- roles:
- - name: owner
- local:
- users: ["Zordon"]
- - name: member
- local:
- users: ["RedRanger", "BlueRanger", "GreenRanger"]
- - name: viewer
- local:
- users: ["Alpha"]
+```bash
+fly -t dev set-team -n A-Team -c ./team.yml
+```
+`team.yml`
+```yaml
+roles:
+- name: owner
+ local:
+ users: ["Zordon"]
+- name: member
+ local:
+ users: ["RedRanger", "BlueRanger", "GreenRanger"]
+- name: viewer
+ local:
+ users: ["Alpha"]
+```
## Inspecting Roles Configuration
Once you’ve set the team configuration you can verify it using the details flag on fly teams:
- fly -t dev teams -d
- name users groups
- A-Team/member local:RedRanger, BlueRanger, GreenRanger none
- A-Team/owner local:Zordon none
- A-Team/viewer local:Alpha none
+```shell-session
+fly -t dev teams -d
+name users groups
+A-Team/member local:RedRanger, BlueRanger, GreenRanger none
+A-Team/owner local:Zordon none
+A-Team/viewer local:Alpha none
+```
..where you’ll find the output is now updated to list each team/role combination and its associated users/groups.
diff --git a/_posts/2019-04-01-concourse-update-----april-1--2019-.markdown b/content/posts/2019-04-01-concourse-update-----april-1--2019-.md
similarity index 95%
rename from _posts/2019-04-01-concourse-update-----april-1--2019-.markdown
rename to content/posts/2019-04-01-concourse-update-----april-1--2019-.md
index f59806a..8dd6645 100644
--- a/_posts/2019-04-01-concourse-update-----april-1--2019-.markdown
+++ b/content/posts/2019-04-01-concourse-update-----april-1--2019-.md
@@ -1,12 +1,11 @@
---
-layout: post
title: "Concourse Update (\U0001F937-April 1, 2019)"
date: '2019-04-01 00:00:00'
tags:
- product-update
---
-
+{{< image src="/images/downloaded_images/Concourse-Update-----April-1--2019-/1-Z49uzJr_wqYlpCGLBpnoXQ.jpeg" alt="Some airport somewhere... waiting" width="50%" >}}
Phew, it’s been a while since I last wrote an update. For some background behind why I slowed down, hop on over to this thread on our forms: [“What would you like to see on our blog”](https://discuss.concourse-ci.org/t/what-kind-of-topics-would-you-like-to-see-on-our-blog/1222/8).
@@ -33,7 +32,7 @@ You’ll also notice that we recently gave the [Concourse homepage](https://conc
- A primer on the new [Global Resources](https://concourse-ci.org/global-resources.html) feature
- Our spiffy new [Examples](https://concourse-ci.org/learning.html#examples) section, which gives you a side-by-side comparison of a pipeline and the yml that made it
-## **Interesting Blog Posts**
+## Interesting Blog Posts
There’s also been some interesting blog posts about Concourse from around the interwebs…and not all of them were written by me!
@@ -43,7 +42,7 @@ There’s also been some interesting blog posts about Concourse from around the
- Aptomi described how to do [CI/CD for Knative serverless apps on Kubernetes with Concourse](https://medium.com/aptomi/ci-cd-for-knative-serverless-apps-on-kubernetes-with-concourse-54bafef51767)
- Concourse-Up is now renamed to [“Control Tower”](http://www.engineerbetter.com/blog/concourse-up-renamed-to-control-tower/)
- Someone compared us to Drone.io in [CI/CD tool showdown pits adoptability vs. adaptability](https://searchsoftwarequality.techtarget.com/tip/CI-CD-tool-showdown-pits-adoptability-vs-adaptability)
-- We got a mention on [PorscheDev’s Technology Radar vol 2](https://medium.com/porschedev/technology-radar-vol-2-4833fb31e2fd) (I think they like us :D)
+- We got a mention on [PorscheDev’s Technology Radar vol 2](https://medium.com/porschedev/technology-radar-vol-2-4833fb31e2fd) (I think they like us :D)
## Concourse Swag
@@ -90,7 +89,7 @@ In 2018, we saw 263 PRs opened against concourse/concourse and its core resource
- [#3475 web: add pause button to top bar of pipeline view](https://github.com/concourse/concourse/pull/3475)
- [#3248 Add option to prune all stalled workers instead of just one at a time](https://github.com/concourse/concourse/pull/3248)
-## The Future of Weekly Updates
+## The Future of Weekly Updates
I’ll do my best to resume the weekly cadence of the project updates. In the meantime, if you have any specific opinions on what kind of blog posts we should right, I’d suggest you check out this thread on our forums: [“What would you like to see on our blog”](https://discuss.concourse-ci.org/t/what-kind-of-topics-would-you-like-to-see-on-our-blog/1222/8)
diff --git a/_posts/2019-04-05-concourse-update--april-1-5-.markdown b/content/posts/2019-04-05-concourse-update--april-1-5-.md
similarity index 79%
rename from _posts/2019-04-05-concourse-update--april-1-5-.markdown
rename to content/posts/2019-04-05-concourse-update--april-1-5-.md
index 54beb66..fad6dd1 100644
--- a/_posts/2019-04-05-concourse-update--april-1-5-.markdown
+++ b/content/posts/2019-04-05-concourse-update--april-1-5-.md
@@ -1,12 +1,11 @@
---
-layout: post
title: Concourse Update (April 1–5)
date: '2019-04-05 00:00:00'
tags:
- product-update
---
-
+{{< image src="/images/downloaded_images/Concourse-Update--April-1-5-/1-nZQ4xbWXguDpNQzLEkcJcA.jpeg" alt="Concourse in action at the CF Summit 2019 Grape Up booth" width="50%" >}}
Greetings from sunny Philadelphia! The team was there for the [Cloud Foundry 2019 NA Summit](https://www.cloudfoundry.org/event/nasummit2019/) for a few days; talking to Concourse users and attending talks. Recorded videos of the talks should be uploaded soon; so I’ll point you to the interesting Concourse-related ones next week.
@@ -18,7 +17,7 @@ On to the update.
- Regarding the runtime, there’s been an active conversation around better build scheduling and load distribution. You can catch up on the thread [here](https://github.com/concourse/concourse/issues/2928). We’d love for you to tell us about your own experience in our meta-issue [#3695](https://github.com/concourse/concourse/issues/3695)
## Coming Soon: Concourse 5.1.0
-
+{{< image src="/images/downloaded_images/Concourse-Update--April-1-5-/1-dEssJTEo9_VnNszNDUj6gQ.png" alt="Icons on resources" width="100%" >}}
We’re in the process of polishing up some items that we weren’t quite able to zfit into the 5.0.0 release. There’s been also some interesting new features and new PRs that you can look forward to in 5.1.0 as well:
diff --git a/_posts/2019-04-18-concourse-update--april-8-18-.markdown b/content/posts/2019-04-18-concourse-update--april-8-18-.md
similarity index 67%
rename from _posts/2019-04-18-concourse-update--april-8-18-.markdown
rename to content/posts/2019-04-18-concourse-update--april-8-18-.md
index 17450dd..4a246bb 100644
--- a/_posts/2019-04-18-concourse-update--april-8-18-.markdown
+++ b/content/posts/2019-04-18-concourse-update--april-8-18-.md
@@ -1,18 +1,17 @@
---
-layout: post
title: Concourse Update (April 8–18)
date: '2019-04-18 00:00:00'
tags:
- product-update
---
-
+{{< image src="/images/downloaded_images/Concourse-Update--April-8-18-/1-gTTAFBV8KHzEL0CV-I-_kA.jpeg" alt="Roman Alekseenkov from Aptomi giving a talk on Concourse at the Bay Area User Group" width="50%" >}}
Sorry for missing the update last week. I was travelling out to the Bay area to attend the ConcourseCI Bay Area User Group. For those who missed it, you can find a recording of the event [here](https://www.youtube.com/watch?v=1RRZHPlTkXs). On to the update.
-
+{{< image src="/images/downloaded_images/Concourse-Update--April-8-18-/1-QqwW-_RArz5a_sprZC7PZw.png" width="100%" >}}
-In case you missed it, Concourse 5.1.0 is out! It’s got icons on resources, better garbage collection, on\_error on pipelines, and much more! As usual, you can read the full list of new features [here](https://concourse-ci.org/download.html#v510).
+In case you missed it, Concourse 5.1.0 is out! It’s got icons on resources, better garbage collection, `on_error` on pipelines, and much more! As usual, you can read the full list of new features [here](https://concourse-ci.org/download.html#v510).
Other interesting developments:
diff --git a/_posts/2019-05-03-concourse-update-april-29-3.markdown b/content/posts/2019-05-03-concourse-update-april-29-3.md
similarity index 74%
rename from _posts/2019-05-03-concourse-update-april-29-3.markdown
rename to content/posts/2019-05-03-concourse-update-april-29-3.md
index b4aeda8..5c24b00 100644
--- a/_posts/2019-05-03-concourse-update-april-29-3.markdown
+++ b/content/posts/2019-05-03-concourse-update-april-29-3.md
@@ -1,5 +1,4 @@
---
-layout: post
title: Concourse Update April 29–3
date: '2019-05-03 00:00:00'
tags:
@@ -10,13 +9,13 @@ In case you missed it, we’ve made some tweaks to the structure of the website.
Second, you’ll notice that a lot of the community related comment that was on our homepage has now been moved to our [Concourse GitHub Wiki](https://github.com/concourse/concourse/wiki). We hope this change will make contributor and community specific content more discoverable and more maintainable over time.
-
+{{< image src="/images/downloaded_images/Concourse-Update-April-29-3/1-08IsVksi-Nc9O0BnmW5MiA.png" alt="Concourse Wiki with more Contributor things!" width="100%" >}}
-Notably, the [Resource Types](https://github.com/concourse/concourse/wiki/Resource-Types), [Tutorials ](https://github.com/concourse/concourse/wiki/Tutorials), and [Tools](https://github.com/concourse/concourse/wiki/Tools) page has moved over to the wiki. Content that may be new to some of you include the Project Management section: [How Issues are Managed](https://github.com/concourse/concourse/wiki/How-Issues-are-Managed), [How to Process PRs](https://github.com/concourse/concourse/wiki/How-to-Process-PRs), and [Release Process](https://github.com/concourse/concourse/wiki/Release-Process).
+Notably, the [Resource Types](https://github.com/concourse/concourse/wiki/Resource-Types), [Tutorials](https://github.com/concourse/concourse/wiki/Tutorials), and [Tools](https://github.com/concourse/concourse/wiki/Tools) page has moved over to the wiki. Content that may be new to some of you include the Project Management section: [How Issues are Managed](https://github.com/concourse/concourse/wiki/How-Issues-are-Managed), [How to Process PRs](https://github.com/concourse/concourse/wiki/How-to-Process-PRs), and [Release Process](https://github.com/concourse/concourse/wiki/Release-Process).
On to the update.
-### **K8s Runtime**
+### K8s Runtime
Bohen and Sameer have been doing some great write-ups on their research. You can get caught up with their latest research in two GitHub issues: [What does k8s offer as a runtime](https://github.com/concourse/concourse/issues/3798) and [What does Tekton offer as a runtime](https://github.com/concourse/concourse/issues/3797). If you’d like to track along with this project’s movements you can bookmark the K8s Runtime project board here: [https://github.com/concourse/concourse/projects/14](https://github.com/concourse/concourse/projects/14)
diff --git a/_posts/2019-06-07-concourse-update-june-7.markdown b/content/posts/2019-06-07-concourse-update-june-7.md
similarity index 97%
rename from _posts/2019-06-07-concourse-update-june-7.markdown
rename to content/posts/2019-06-07-concourse-update-june-7.md
index ff5459c..fa8d626 100644
--- a/_posts/2019-06-07-concourse-update-june-7.markdown
+++ b/content/posts/2019-06-07-concourse-update-june-7.md
@@ -1,12 +1,11 @@
---
-layout: post
title: Concourse Update June 7
date: '2019-06-07 00:00:00'
tags:
- product-update
---
-…and we’re back! Apologies for the lack of updates lately. I’ve just come back from some time off and work travel has taken up a lot of my time. I’m back in Toronto now so let’s get back into it.
+...and we’re back! Apologies for the lack of updates lately. I’ve just come back from some time off and work travel has taken up a lot of my time. I’m back in Toronto now so let’s get back into it.
## Release Engineering & Concourse 5.3.0
@@ -14,7 +13,7 @@ In the past, we relied _a lot_ on [Alex Suraci](https://medium.com/u/263a63b2f20
On that note, you can now follow along with our release plans for Concourse 5.3.0 by tracking our [project note](https://github.com/orgs/concourse/projects/36#card-22467664). Unfortunately, we were mostly blocked on some metrics instabilities in our [production instance](https://ci.concourse-ci.org/) this week. Those issues have been mostly cleared up and we hope to be able to continue with our production and wings tests next
-## Core / API
+## Core/API
The team’s been making a lot of progress on two key issues:
@@ -43,4 +42,3 @@ You’ll also note that we’ve created a architecture-rfcs repo. This repositor
The proposal for a Concourse “Duty Free” was first reported in [issue #191](https://github.com/concourse/concourse/issues/191); its the idea of creating a separate site to highlight community resources and other re-usable Concourse artifacts for our community. Today, advertise Concourse resources through the [Resources page in our wiki](https://github.com/concourse/concourse/wiki/Resource-Types), but a dedicated Concourse Duty Free site would have a lot more pizzaz.
We’ve always wanted to build Duty Free but we were never been able to figure out how to slot it into our work schedule. Thankfully, the Pivotal team out in Dublin had some time and offered to help kick-start the project for us. We’re still in the very early stages of development and design, but you can follow along the project on their GitHub repo here: [concourse/dutyfree](https://github.com/concourse/dutyfree)
-
diff --git a/_posts/2019-06-21-concourse-update--july-21-2019-.markdown b/content/posts/2019-06-21-concourse-update--july-21-2019-.md
similarity index 73%
rename from _posts/2019-06-21-concourse-update--july-21-2019-.markdown
rename to content/posts/2019-06-21-concourse-update--july-21-2019-.md
index 39b3cac..45b8181 100644
--- a/_posts/2019-06-21-concourse-update--july-21-2019-.markdown
+++ b/content/posts/2019-06-21-concourse-update--july-21-2019-.md
@@ -11,13 +11,13 @@ The Concourse team had the opportunity to visit some Concourse users out in Mont
I’ll also be in Kansas City for two days next week to meet some other Concourse users as well, so give me a tap on[Twitter](http://twitter.com/pioverpi) or Discord (username jama) if you wanna meet up.
## Parallel Input Streaming
-
+{{< image src="/images/downloaded_images/Concourse-Update--July-21-2019-/0-ywZaAHKMEtZGTx5c.png" alt="initialization dropped from 1 hour 22 min to just over 4 min" width="60%" >}}
In addition to the work on [Algorithm](https://github.com/concourse/concourse/issues/3602) improvements from the Core track, the Runtime track tested out their new work on [Parallel Input Streaming](https://github.com/concourse/concourse/issues/3992). By parallelizing the input streams we saw a _massive_ improvement on the initialization of tasks in our test pipelines. In our test we saw [Dwayne Forde](https://medium.com/u/225055297bdc)’s Strabo pipeline (which has over 100 input resources on a job) go from a 1 hour, 22 min initialization to just over 4 min. We were able to observe these results on both the BOSH and k8s deployment of Concourse. Exciting work!
## Runtime Interface Track
-For those who are interested, you can follow along our swappable runtimes (including k8s) work in the [Runtime Interface track ](https://github.com/concourse/concourse/projects/16). We’ve been doing a lot of planning and research, but its all come down to “lets just give it a shot”. We’ll probably have more to say on this next update.
+For those who are interested, you can follow along our swappable runtimes (including k8s) work in the [Runtime Interface track](https://github.com/concourse/concourse/projects/16). We’ve been doing a lot of planning and research, but its all come down to “lets just give it a shot”. We’ll probably have more to say on this next update.
## Release Engineering
diff --git a/_posts/2019-07-02-designing-a-dashboard-for-concourse.markdown b/content/posts/2019-07-02-designing-a-dashboard-for-concourse.md
similarity index 67%
rename from _posts/2019-07-02-designing-a-dashboard-for-concourse.markdown
rename to content/posts/2019-07-02-designing-a-dashboard-for-concourse.md
index 8dbdd96..1c721a1 100644
--- a/_posts/2019-07-02-designing-a-dashboard-for-concourse.markdown
+++ b/content/posts/2019-07-02-designing-a-dashboard-for-concourse.md
@@ -1,5 +1,4 @@
---
-layout: post
title: Designing a Dashboard for Concourse
date: '2019-07-02 15:28:15'
---
@@ -8,7 +7,8 @@ date: '2019-07-02 15:28:15'
With the growing popularity of Concourse, we noticed that our development teams wanted to observe and monitor multiple pipelines simultaneously. This behaviour wasn’t limited to just Pivotal engineering teams; in fact, it was even more prevalent amongst our Open Source Community. Our users currently solve this by cramming multiple browser windows into TV their monitor view or they use the [Concourse Summary](https://github.com/dgodd/concourse-summary) (aka Crystal) by David Goddard of the Pivotal Buildpacks team.
-
+{{< image src="/images/downloaded_images/1_nU107xCbOq-21YkWl2OBXQ.png" alt="Concourse pipelines (left) Datadog and Concourse Summary (right)" width="100%" >}}
+[https://github.com/dgodd/concourse-summary](https://github.com/dgodd/concourse-summary)
So, we embarked on a deeper Discovery effort with the goal of understanding and evaluating our assumptions around how Concourse users were solving this problem today.
@@ -27,7 +27,8 @@ We began this process by thinking about the assumptions that were made about thi
- Only seeing red or green pipeline status is all that is important for pipeline summary
- Users want to understand the state of all their teams
- Users recognize their pipelines by their shape in the UI
-
+
+{{< image src="/images/downloaded_images/1_fnSsJkhigoNgfuURiOPCpg.png" class="Miro board" width="100%" >}}
After we went out in the field to talk to users, we came back to synthesize our findings using this virtual whiteboard tool called [Realtimeboard](https://realtimeboard.com/app/board/o9J_k0EAilo=/). One of our team members was remote, so this tool allowed us to easily collaborate on our research.
@@ -37,7 +38,7 @@ From our research, we found that users only care about failed jobs and the amoun
Based on the feedback we collected we began to prioritize our insights and frame our solution. We proceeded to brainstorm and sketch ideas for a prototype experiment.
-
+{{< image src="/images/downloaded_images/0_Iz72Bh80-LNbQc-I.png" alt="Early Dashboard prototype" width="50%" >}}
Our first InVision prototype represented each team’s pipeline as a series of thumbnails. We believed this approach would help users identify their pipelines, and at the same time have an at-a-glance view of the pipeline status. Our first round of feedback from users revealed that the thumbnail was not as useful as we had thought, and our approach made it more difficult to understand what the pipeline status was.
@@ -45,11 +46,12 @@ So, we pivoted and started to explore the idea of a pipeline thumbnail that abst
Alex Suraci, co-creator of Concourse, had been working on a UI experiment, based on a treemap chart (below), that looked like something we could expand upon. I hypothesized that by removing the resources from this view and stripping down the thumbnail to just jobs we could provide the user with just enough information for ‘at a glance’ triaging.
-
+{{< image src="/images/downloaded_images/0_VKfa4IVa51zOWoiU.png" width="50%" >}}
+{{< image src="/images/downloaded_images/0_V2tAM1z62u0gd-Sx.png" alt="Alex’s pipeline treemap algorithm experiment (left). Thumbnail compression of the pipeline for the Concourse Dashboard (right)." width="25%" >}}
This was a radical idea with significant departures from the current visual style of Concourse. We didn’t want to just “do it” and release it to our community of users without some kind of feedback first. As a product designer, my first inclination was to start drawing up thumbnail variations that we could test with our users. However, there was no clear taxonomy of pipelines because every team within Pivotal has a drastically different pipeline configuration. We needed a quick way to test this design with “realistic” pipeline configurations at scale. Luckily for us, the Concourse team runs an internally managed multi-tenant instance of Concourse [called Wings](https://medium.com/concourse-ci/earning-our-wings-a0c307fa73e6). We use Wings as a sandbox for new features, so I paired with an engineer to do a lightweight implementation for Wings.
-
+{{< image src="/images/downloaded_images/0_bJ8wRINc9fo3aZ5L.png" width="100%" >}}
Since our initial rollout of the dashboard on Wings in September 2017, we have undergone at least 3 major revisions of the dashboard based on the feedback we had received from teams within Pivotal. Our next step was to incorporate this dashboard into the core product as a beta feature without disrupting users who are looking for a more stable Concourse experience.
diff --git a/_posts/2019-07-17-core-roadmap-towards-v10.markdown b/content/posts/2019-07-17-core-roadmap-towards-v10.md
similarity index 91%
rename from _posts/2019-07-17-core-roadmap-towards-v10.markdown
rename to content/posts/2019-07-17-core-roadmap-towards-v10.md
index 363eff7..afe3201 100644
--- a/_posts/2019-07-17-core-roadmap-towards-v10.markdown
+++ b/content/posts/2019-07-17-core-roadmap-towards-v10.md
@@ -1,5 +1,4 @@
---
-layout: post
title: 'Core roadmap: towards v10'
date: '2019-07-17 19:16:58'
tags:
@@ -20,7 +19,6 @@ There are a lot of words here - sorry! If you just want to skim, I've added a si
Each roadmap entry corresponds to an RFC or an issue, linked in their header. If you want to get involved in our design process or just provide feedback, please check them out and submit a PR review! (Thanks!)
-
## Table of contents
1. [Where is 'spaces'?](#where-is-spaces-)
@@ -39,7 +37,7 @@ Each roadmap entry corresponds to an RFC or an issue, linked in their header. If
- [RFC #28: notification resources](#rfc-28-notification-resources)
4. [What comes after all this?](#what-comes-after-all-this)
5. [Thanks!](#thanks-)
-
+
# Where is 'spaces'?
For those of you not familiar with [spaces](https://github.com/concourse/concourse/issues/1707), it was a big ol' feature that enabled the following workflows:
@@ -56,7 +54,8 @@ I had no reservations baking 'spaces' in to every layer of the stack - it would
But as time went on it became terrifying. It was a double-or-nothing bet. Either 'spaces' made sense everywhere, or 'spaces' didn't make sense at all. I tried to carve out work that could be done before fully committing to spaces, but it didn't make the monolithic feature any less monolithic.
-
+{{< image src="/images/2019/07/scaredy-cat-2.gif" alt="me vs the space dragon" width="25%" >}}
+
# Where are we now?
First off, I want to give a quick update on a couple of big things that you can expect in v6.0:
@@ -69,13 +68,15 @@ This new algorithm fixes long-standing architectural issues with the old one, wh
The key difference between the old and new algorithm is how `passed` constraints are implemented, specifically when multiple inputs depend on the same job:
- plan:
- - get: foo
- passed: [foo-unit, integration]
- - get: bar
- passed: [bar-unit, integration]
- - get: baz
- passed: [integration]
+```yaml
+plan:
+- get: foo
+ passed: [foo-unit, integration]
+- get: bar
+ passed: [bar-unit, integration]
+- get: baz
+ passed: [integration]
+```
In Concourse, this means "give me versions of `foo`, `bar`, and `baz` that have passed through `integration` _together in the same build_, with the same version of `foo` having passed `foo-unit` and the same version of `bar` having passed `bar-unit`."
@@ -121,7 +122,7 @@ Let's jump right in!
_Resources v2 is the first major revision of the resource interface since Concourse's inception. It's a step to take very carefully. I think we're finally ready to go._
-**UPDATE: Just kidding! This proposal has been superceded by something even more general: [Prototypes]( __GHOST_URL__ /reinventing-resource-types/)! ([RFC #37](https://github.com/concourse/rfcs/blob/master/037-prototypes/proposal.md))**
+**UPDATE: Just kidding! This proposal has been superceded by something even more general: [Prototypes](/posts/2019-10-15-reinventing-resource-types/)! ([RFC #37](https://github.com/concourse/rfcs/blob/master/037-prototypes/proposal.md))**
The v2 interface brings long-awaited polish to the interface: it renames `in` and `out` to `get` and `put` to match their step names, introduces a `delete` action, standardises TLS configuration, and revises terminology so as to not be coupled to the 'versioned artifacts' use case.
@@ -157,13 +158,15 @@ _The first step on our journey towards 'spaces' is to introduce a simple, but cr
The `set_pipeline` step is used like so:
- jobs:
- - name: bootstrap
- plan:
- - get: ci
- trigger: true
- - set_pipeline: concourse
- file: ci/pipelines/concourse.yml
+```yaml
+jobs:
+- name: bootstrap
+ plan:
+ - get: ci
+ trigger: true
+ - set_pipeline: concourse
+ file: ci/pipelines/concourse.yml
+```
This job will configure a `concourse` pipeline within the job's team. The pipeline will be automatically unpaused, and no authentication is required.
@@ -185,17 +188,21 @@ Ok, I promised to provide a tl;dr for each roadmap entry, but projects can't rea
A project's build plan can be used for anything you want. Small projects could use the build plan to run tests and/or perform various steps in a single build - a workflow more familiar to users of other CI systems:
- name: ci
- plan:
- - get: booklit
- trigger: true
- - task: unit
+```yaml
+name: ci
+plan:
+- get: booklit
+ trigger: true
+- task: unit
+```
Larger projects could use the build plan to execute `set_pipeline` steps. Concourse has long encouraged users to keep their pipelines under source control, but it never enforced it: `fly set-pipeline` was still a manual operation, and users would often forget to check in their changes. Projects will fix that:
- name: ci
- plan:
- - set_pipeline: booklit
+```yaml
+name: ci
+plan:
+- set_pipeline: booklit
+```
Small projects may start without pipelines and start using pipelines as they grow. Our original slogan, 'CI that scales with your project,' is now pretty literal! The hope is that by introducing build plans without requiring knowledge of pipelines and jobs, we'll have made Concourse's learning curve more gradual and made Concourse feel less overkill for side-projects.
@@ -207,7 +214,7 @@ _Archiving pipelines is a way to soft-delete a pipeline while still being able t
Well, after that bombshell this one's pretty easy to explain. Let's take a look at our own Concourse team's pipelines:
-
+{{< image src="/images/2019/07/Screenshot-from-2019-07-16-11-49-33.png" width="100%" >}}
Look at all that cruft! So many old, paused or bit-rotting pipelines which I really don't care about anymore but don't really have the heart to delete. That `old-concourse` pipeline served us well for years - it has sentimental value. In some cases you may also want to keep the history around for auditing purposes.
@@ -223,13 +230,15 @@ Instanced pipelines are an important piece of the 'spaces' puzzle: it's how user
Pipeline instances are created using the `set_pipeline` step like so:
- plan:
- - set_pipeline: branch
- instance_vars:
- branch: feature/projects
- - set_pipeline: branch
- instance_vars:
- branch: feature/new-algorithm
+```yaml
+plan:
+- set_pipeline: branch
+ instance_vars:
+ branch: feature/projects
+- set_pipeline: branch
+ instance_vars:
+ branch: feature/new-algorithm
+```
At the end of a build which uses `set_pipeline`, all instances of the named pipelines which were not configured by the build will be automatically archived.
@@ -247,36 +256,42 @@ The final piece of the puzzle for 'spaces' is the addition of an `across` step.
Let's first look at a simple use case, which is to execute a task across many variants:
- plan:
- # ...
- - across: supported-go-versions
- as: go
- do:
- - task: unit
- image: go
+```yaml
+plan:
+# ...
+- across: supported-go-versions
+ as: go
+ do:
+ - task: unit
+ image: go
+```
In this case, imagine we have a `supported-go-versions` resource whose `check` returns a config fragment for each tag and digest based on a pre-configured list of supported tags (e.g. `1.10`, `1.11`, `1.12`), and whose `in`/`get` fetches the image.
When nested, the `across` step enables dynamic build matrices:
- plan:
- # ...
- - across: supported-go-versions
- as: go
- do: # needed so we can define another 'across'
- - across: other-things
- as: some-input
- task: unit
- image: go
+```yaml
+plan:
+# ...
+- across: supported-go-versions
+ as: go
+ do: # needed so we can define another 'across'
+ - across: other-things
+ as: some-input
+ task: unit
+ image: go
+```
When used with `set_pipeline` and instanced pipelines, it enables dynamic _pipeline_ matrices:
- plan:
- - across: repo-branches
- as: repo-branch
- set_pipeline: branch
- instance_vars:
- branch_name: ((repo-branch.name))
+```yaml
+plan:
+- across: repo-branches
+ as: repo-branch
+ set_pipeline: branch
+ instance_vars:
+ branch_name: ((repo-branch.name))
+```
(Assuming we provide the ability to access fields of an artifact with `((vars))`.)
@@ -290,11 +305,13 @@ This is also a relatively simple feature, but it will improve today's usage of t
Rough sketch:
- jobs:
- - name: smoke-test
- plan:
- - param: 10m
- trigger: true
+```yaml
+jobs:
+- name: smoke-test
+ plan:
+ - param: 10m
+ trigger: true
+```
Semantically, `param` is similar to `get` but with one key difference: there is no central version history. Rather than being used as an _artifact_, the resource is used solely for its _config fragments._ Concourse will `check` against the job's last used config fragment for the trigger resource, `10m`, and if a different fragment is returned the job will trigger with the new one.
@@ -302,11 +319,13 @@ This skips the `get`, eliminates the thundering herd issue (because all jobs hav
Here's one idea of what that may look like, where the config fragments returned by param are somehow usable with `((vars))` syntax in subsequent steps:
- plan:
- - param: environment
- - task: smoke-test
- vars:
- environment: ((environment.name))
+```yaml
+plan:
+- param: environment
+- task: smoke-test
+ vars:
+ environment: ((environment.name))
+```
Another interesting use case would be to use it as a `instance_fragment` with the `set_pipeline` step.
@@ -322,7 +341,8 @@ If so, you're probably aware of how ugly it can make your pipelines, both in YAM
A simple pipeline quickly turns into a mess of boxes and lines:
-
+{{< image src="/images/2019/07/before-notifications-1.png" width="100%" >}}
+{{< image src="/images/2019/07/after-notifications.png" alt="a simple pipeline before and after notifications were added" width="100%" >}}
Not only is it a lot of manual work to copy-paste those `on_success` and `on_failure` hooks, when you finally configure it it really ruins the signal-to-noise ratio of the pipeline UI.
diff --git a/_posts/2019-08-30-concourse-mid-year-update.markdown b/content/posts/2019-08-30-concourse-mid-year-update.md
similarity index 83%
rename from _posts/2019-08-30-concourse-mid-year-update.markdown
rename to content/posts/2019-08-30-concourse-mid-year-update.md
index 12ee4b4..c08db34 100644
--- a/_posts/2019-08-30-concourse-mid-year-update.markdown
+++ b/content/posts/2019-08-30-concourse-mid-year-update.md
@@ -1,5 +1,4 @@
---
-layout: post
title: Concourse Mid-year Update
date: '2019-08-30 14:39:52'
---
@@ -10,20 +9,20 @@ Phew, it's been a while. I got lots of info to cover so let's just get right int
As some of you may know, the Concourse team switched over to a PR-based workflow at the beginning of the year. This change is in line with our objectives of being open and transparent with our community of contributors. Plus, its just good thing to do because that's what most OSS projects do. Since then we've noticed a noticeable uptick in PRs opened by non-Concourse core contributors across our repos:
-
+{{< image src="/images/2019/08/Screen-Shot-2019-08-30-at-10.12.17-AM-2.png" width="100%" >}}
And while our peak period seemed to be concentrated at the beginning of the year, we're still seeing steady contributions through the summer months
-
+{{< image src="/images/2019/08/Screen-Shot-2019-08-30-at-10.13.09-AM.png" width="100%" >}}
The Concourse project also hit another big milestone: we now have over **4000 Github stars**! As of today we're sitting at 4213 stars, a 52% increase in popularity from this time last year.
## Concourse v10
-In case you missed it, Alex wrote out a great blog post that outlines our long term vision for Concourse. It's got a breakdown of some exciting new features, from references to Spaces, the new Algorithm, Concourse Projects, etc. You can read more about it here [https://blog.concourse-ci.org/core-roadmap-towards-v10/]( __GHOST_URL__ /core-roadmap-towards-v10/)
+In case you missed it, Alex wrote out a great blog post that outlines our long term vision for Concourse. It's got a breakdown of some exciting new features, from references to Spaces, the new Algorithm, Concourse Projects, etc. You can read more about it here [/posts/2019-07-17-core-roadmap-towards-v10/](/posts/2019-07-17-core-roadmap-towards-v10/)
## Concourse Project Planning
-
+{{< image src="/images/2019/08/Screen-Shot-2019-08-30-at-10.27.27-AM.png" width="100%" >}}
There's been some big changes to how we organize and visualize each track of work now. If you take a peek in the project board [https://project.concourse-ci.org](https://project.concourse-ci.org/) you'll see now that each of our tracks are clearly labeled as swimlanes, with each prioritized Epic as cards under each swimlane. We hope you'll find this new format easier to consume
diff --git a/_posts/2019-10-15-reinventing-resource-types.markdown b/content/posts/2019-10-15-reinventing-resource-types.md
similarity index 81%
rename from _posts/2019-10-15-reinventing-resource-types.markdown
rename to content/posts/2019-10-15-reinventing-resource-types.md
index 9bc932e..c769f85 100644
--- a/_posts/2019-10-15-reinventing-resource-types.markdown
+++ b/content/posts/2019-10-15-reinventing-resource-types.md
@@ -1,12 +1,11 @@
---
-layout: post
title: Re-inventing resource types
date: '2019-10-15 15:24:13'
tags:
- roadmap
---
-Before the paint completely dries on the [v10 roadmap]( __GHOST_URL__ /core-roadmap-towards-v10/), there is one last big unknown I want to explore in case it brings more clarity to our direction: generic tasks.
+Before the paint completely dries on the [v10 roadmap](/posts/2019-07-17-core-roadmap-towards-v10/), there is one last big unknown I want to explore in case it brings more clarity to our direction: generic tasks.
Resource types are a great way to share tools and integrations for others to use in their pipelines. Unfortunately, they're basically the _only_ way, and because resources are a very opinionated concept, the resource type interface is not always a good fit.
@@ -35,12 +34,14 @@ Resources are **idempotent** ; outputs will always result in the same external e
A resource definition looks something like this:
- resources:
- - name: booklit
- type: git
- source:
- uri: https://github.com/vito/booklit
- branch: master
+```yaml
+resources:
+- name: booklit
+ type: git
+ source:
+ uri: https://github.com/vito/booklit
+ branch: master
+```
Every resource definition has a `type` and a `source`. The _type_ denotes the resource type - i.e. the implementation of the [Concourse resource interface](https://concourse-ci.org/implementing-resource-types.html) to use. The _source_ represents the location of the resource, i.e. the source of versions. This configuration is interpreted by the resource type, and is a black box to Concourse.
@@ -54,12 +55,14 @@ All other resource types must be configured in your pipeline under `resource_typ
Pipelines define their own resource types by configuring a resource for the type's container image:
- resource_types:
- - name: git
- type: registry-image
- source:
- repository: concourse/git-resource
- tag: 1
+```yaml
+resource_types:
+- name: git
+ type: registry-image
+ source:
+ repository: concourse/git-resource
+ tag: 1
+```
Technically, resource types work by using _another_ resource type to fetch their container image. It's turtles all the way down!
@@ -72,7 +75,7 @@ A resource type that fits the original design of resources implements the follow
The easiest example of a 'proper' resource type is `git`. The `check` action consults `git log --first-parent` to return ordered commits for a single branch. The `in` action does a `git clone` to fetch the repo and check out the given commit; this is easily cached. The `out` action does a `git push`, optionally rebasing and returning a new version in the event of a conflict.
## When is a resource type not a _resource_ type?
-
+{{< image src="/images/2019/10/image-3.png" alt="the treachery of container images" width="40%" >}}
Resource types should always implement `check` and `in`. Being able to find and fetch versions is what makes a resource a [resource](https://www.merriam-webster.com/dictionary/resource). Some resource types, however, only implement `out`. These resource types exist solely to be run as a `put` step - a form of "generic tasks" limited by the fact that it can't produce any outputs local to the build.
@@ -86,7 +89,7 @@ This is fraught with peril:
- Navigation is awkward. The pipeline UI is pretty meaningless since all the jobs just reflect the status of the most recent PR that ran, and going through the build history of a job is pretty confusing because each build may be a different pull request.
- Re-running builds for a pull request is annoying. You have to go to the PR resource, find the version for your PR, pin it, trigger all the builds, wait for them all to start, and _then_ you can unpin the resource, lest you forget and your pipeline never runs another PR again. This will get slightly better in v6.0 as we've finally implemented build re-triggering ([#413](http://github.com/concourse/concourse/issues/413)), but that won't help with triggering builds for an "older" PR that hasn't run yet.
-This pain is the main source of motivation for the [v10 roadmap]( __GHOST_URL__ /core-roadmap-towards-v10/), which introduces all the required components to dynamically set a pipeline for each pull request instead - each with a resource representing only one pull request, as Concourse intended.
+This pain is the main source of motivation for the [v10 roadmap](/posts/2019-07-17-core-roadmap-towards-v10/), which introduces all the required components to dynamically set a pipeline for each pull request instead - each with a resource representing only one pull request, as Concourse intended.
In short, we have an interface being used for things beyond its original design. This results in surprising and unwanted behavior because Concourse functionality that is sensible for _resources_ doesn't make sense for these other workflows. This hurts everyone: users have to deal with surprises and terrible UX, resource type authors have to deal with these limitations and workarounds, and the concept of 'resources' kind of erodes as these patterns spread.
@@ -102,67 +105,73 @@ Let's compare what it looks like to take a `git` repo, build an OCI image from i
We'll begin with two resources: one for my image source code, and one for the image repository on the registry:
- resources:
- - name: my-image-src
- type: git
- source:
- uri: # ...
-
- - name: my-image
- type: registry-image
- source:
- repository: # ...
- tag: latest
+```yaml
+resources:
+- name: my-image-src
+ type: git
+ source:
+ uri: # ...
+
+- name: my-image
+ type: registry-image
+ source:
+ repository: # ...
+ tag: latest
+```
Next we'll add a job that does the build-and-push.
Let's see how it looks to use a generic task:
- jobs:
- - name: build-and-push
- plan:
- # fetch repository source (containing Dockerfile)
- - get: my-image-src
-
- # build using `oci-build` task
- - task: build
- image: oci-build-task
- config:
- platform: linux
-
- image_resource:
- type: registry-image
- source:
- repository: vito/oci-build-task
-
- params:
- CONTEXT: my-image-src
+```yaml
+jobs:
+- name: build-and-push
+ plan:
+ # fetch repository source (containing Dockerfile)
+ - get: my-image-src
+
+ # build using `oci-build` task
+ - task: build
+ image: oci-build-task
+ config:
+ platform: linux
+
+ image_resource:
+ type: registry-image
+ source:
+ repository: vito/oci-build-task
+
+ params:
+ CONTEXT: my-image-src
+
+ inputs:
+ - name: my-image-src
+
+ outputs:
+ - name: image
- inputs:
- - name: my-image-src
-
- outputs:
- - name: image
-
- run:
- path: build
-
- # push using `registry-image` resource
- - put: my-image
- params: {image: image/image.tar}
+ run:
+ path: build
+
+ # push using `registry-image` resource
+ - put: my-image
+ params: {image: image/image.tar}
+```
Now let's see how it feels to use a resource type instead. If we switch the `my-repo` resource from `registry-image` to `docker-image`, we can leverage its ([quite contentious](https://github.com/concourse/docker-image-resource/issues/190)) build-and-push behavior:
- jobs:
- - name: build-and-push
- plan:
- # fetch repository source (containing Dockerfile)
- - get: my-image-src
-
- # build + push using `docker-image` resource
- - put: my-image
- params:
- build: my-image-src
+```yaml
+jobs:
+- name: build-and-push
+ plan:
+ # fetch repository source (containing Dockerfile)
+ - get: my-image-src
+
+ # build + push using `docker-image` resource
+ - put: my-image
+ params:
+ build: my-image-src
+```
Resources clearly take a _lot_ less effort to use in a pipeline. No wonder they're being used for everything!
@@ -173,11 +182,11 @@ Verbosity aside, tasks are also strictly worse at parameterization. Task `params
It seems like we need something in between tasks and resource types. We need something as versatile as tasks and as easy to use as resource types.
## Bridging the gap
-
+{{< image src="/images/2019/10/image-1.png" width="100%" >}}
Let's hone in on the reason why resource types don't work for every use case: they have a particular set of actions which have particular semantics because they're built for a particular Concourse use case: resources.
-The [v10 roadmap]( __GHOST_URL__ /core-roadmap-towards-v10/#rfc-24-resources-v2) introduced [RFC #24](https://github.com/concourse/rfcs/pull/24), a "generalized resource" interface which supports `check`, `get`, `put`, and `delete` actions while avoiding resource terminology like "version" and "source" so that it can be used for other workflows. It's kind of a strange middle ground: it's limited to resource-y actions while avoiding resource-y semantics.
+The [v10 roadmap](/posts/2019-07-17-core-roadmap-towards-v10/#rfc-24-resources-v2) introduced [RFC #24](https://github.com/concourse/rfcs/pull/24), a "generalized resource" interface which supports `check`, `get`, `put`, and `delete` actions while avoiding resource terminology like "version" and "source" so that it can be used for other workflows. It's kind of a strange middle ground: it's limited to resource-y actions while avoiding resource-y semantics.
Aside from the resource-y actions, RFC #24 was pretty darn close to what I wanted out of generic tasks, so I decided to just fork it as [RFC #37](https://github.com/concourse/rfcs/pull/37) and make one key change: instead of supporting `check`, `get`, `put`, and `delete`, support arbitrary actions instead.
@@ -185,7 +194,7 @@ With `check` and `get` removed, the interface was definitely not a _resource_ ty
After much deliberation, I decided to call these things **prototypes**. This name is inspired by prototype-based object-oriented languages like JavaScript, [Self](http://www.selflanguage.org/), and [Io](https://iolanguage.org/). Conveniently enough, it still has "type" in the name, so all those `type:` fields on resources still make sense!
-
+{{< image src="/images/2019/10/image-2.png" width="100%" >}}
The next change in my fork of RFC #24 was to adjust the terminology. Now that the interface was so open-ended, I wanted to build a solid mental model so that prototype authors would have an idea of how prototypes are meant to be designed. I did this by stealing more terminology from prototype-based OOP.
@@ -211,30 +220,32 @@ Whereas a task is built around a single action, a prototype is built around obje
Here's how it could look to use a prototype for building an OCI image (note the use of `prototypes:` instead of `resource_types:`):
- prototypes:
- - name: oci-image
- type: registry-image
- source:
- repository: vito/oci-image-prototype
-
- jobs:
- - name: build-and-push
- plan:
- # fetch repository source (containing Dockerfile)
- - get: my-image-src
-
- # build using `oci-image` prototype
- - run: build
- type: oci-image
- inputs: [my-image-src]
- params: {context: my-image-src}
- outputs: [image]
-
- # push using `registry-image` resource
- - put: my-image
- params: {image: image/image.tar}
-
-Here we use a new `run` step to run the `oci-image` prototype and send the `build` message to an object, given as `params`. With the `run` step, `inputs` and `outputs` must be explicitly provided, though `inputs` can be automated in the future with [#2692](https://github.com/concourse/concourse/issues/2692).
+```yaml
+prototypes:
+- name: oci-image
+ type: registry-image
+ source:
+ repository: vito/oci-image-prototype
+
+jobs:
+- name: build-and-push
+ plan:
+ # fetch repository source (containing Dockerfile)
+ - get: my-image-src
+
+ # build using `oci-image` prototype
+ - run: build
+ type: oci-image
+ inputs: [my-image-src]
+ params: {context: my-image-src}
+ outputs: [image]
+
+ # push using `registry-image` resource
+ - put: my-image
+ params: {image: image/image.tar}
+```
+
+Here we use a new `run` step to run the `oci-image` prototype and send the `build` message to an object, given as `params`. With the `run` step, `inputs` and `outputs` must be explicitly provided, though `inputs` can be automated in the future with [#2692](https://github.com/concourse/concourse/issues/2692).
All in all, this feels a whole lot better than the generic tasks of old. It's way less verbose, and feels a lot like using a `put` step, with no abstractions being abused and no surprising behavior. Mission accomplished?
@@ -254,4 +265,3 @@ I'm still getting a grip on this idea myself but I'm excited to see the places w
If everything goes well I plan to close RFC #24 and the other 'generalized resources' based RFCs in favor of these new prototype-based RFCs. (I still need to write up new prototype-based RFCs for the rest though: spatial resources, notification resources, trigger-only resources.)
Special thanks to everyone that has helped me talk through ideas in Discord, on GitHub, and in person!
-
diff --git a/_posts/2020-01-24-a-new-hangar-for-resource-types-2.markdown b/content/posts/2020-01-24-a-new-hangar-for-resource-types-2.md
similarity index 91%
rename from _posts/2020-01-24-a-new-hangar-for-resource-types-2.markdown
rename to content/posts/2020-01-24-a-new-hangar-for-resource-types-2.md
index 58635d9..5f1caa5 100644
--- a/_posts/2020-01-24-a-new-hangar-for-resource-types-2.markdown
+++ b/content/posts/2020-01-24-a-new-hangar-for-resource-types-2.md
@@ -4,7 +4,7 @@ title: A New Hangar For Resource Types
date: '2020-01-24 19:45:36'
---
-
+{{< image src="/images/downloaded_images/Strategic-Plan_Page_13_Image_0001-750.jpg" alt="The inside of an airplane hangar" width="100%" >}}
_Photo:_ [_National Parks Service_](https://www.nps.gov/subjects/aviation/images/Strategic-Plan_Page_13_Image_0001-750.jpg)
@@ -26,7 +26,6 @@ If you’ve gotten this far, have taken a quick look at the catalog, and are won
We’ve come a long way with Concourse resource types and are excited about the new catalog. We now have our sights set on adding more functionality on the page (check out the [backlog](https://github.com/concourse/resource-types-website/projects/1)). This includes displaying more information about each resource type on the cards (including GitHub stars and resource type actions), as well as improved search and sorting.
-We also have an eye on the V10 roadmap and can see [prototypes]( __GHOST_URL__ /reinventing-resource-types/) on the horizon.
+We also have an eye on the V10 roadmap and can see [prototypes](/posts/2019-10-15-reinventing-resource-types/) on the horizon.
In the spirit of the open-source project that it is, we’d also love feedback to inform our roadmap. So if you have feedback, we’d love to hear it. The best way to reach us is to either drop us a line in #resource-types on [Discord](https://discord.gg/cShhjvr) or submit an issue against the [GitHub repository](https://github.com/concourse/resource-types-website/issues/new).
-
diff --git a/_posts/2020-03-17-2020-survey.markdown b/content/posts/2020-03-17-2020-survey.md
similarity index 88%
rename from _posts/2020-03-17-2020-survey.markdown
rename to content/posts/2020-03-17-2020-survey.md
index 1201155..d58cccd 100644
--- a/_posts/2020-03-17-2020-survey.markdown
+++ b/content/posts/2020-03-17-2020-survey.md
@@ -1,5 +1,4 @@
---
-layout: post
title: Concourse 2020 Community Survey
date: '2020-03-17 17:41:39'
tags:
@@ -7,7 +6,8 @@ tags:
- roadmap
---
-
+{{< image src="/images/2020/03/whyconcourse2.png" width="100%" >}}
+
## Help shape the future of Concourse
Since Concourse CI was created, thousands of users worldwide have helped the project by opening issues, committing code, and providing feedback to the team that develops the product. This community involvement is priceless - thank you, Concourse community! 👏
@@ -22,11 +22,10 @@ Today we are launching the Concourse 2020 Community Survey. This survey is open
Please help us by participating in this 5-minute survey:
-**Edit: Survey closed! Thank you to everyone who participated. [Check out the results in the 2020 Community Report.]( __GHOST_URL__ /community-survey-2020-results/)**
+**Edit: Survey closed! Thank you to everyone who participated. [Check out the results in the 2020 Community Report.](/posts/2020-05-14-community-survey-2020-results/)**
#### **Spread the word!**
We need as many users as possible to participate in this survey to help us better understand our global user base. We'd be grateful if you would spread the word by sharing this post on your social network feeds, around the office, at meet-ups, and in other communities.
Thank you!
-
diff --git a/_posts/2020-03-25-concourse-wfh.markdown b/content/posts/2020-03-25-concourse-wfh.md
similarity index 80%
rename from _posts/2020-03-25-concourse-wfh.markdown
rename to content/posts/2020-03-25-concourse-wfh.md
index fbb6ae9..6d0bc6a 100644
--- a/_posts/2020-03-25-concourse-wfh.markdown
+++ b/content/posts/2020-03-25-concourse-wfh.md
@@ -1,5 +1,4 @@
---
-layout: post
title: "Developing Concourse (from home \U0001F3E1)"
date: '2020-03-25 14:03:51'
---
@@ -22,8 +21,6 @@ The majority of the Concourse team is located in the greater Toronto area, with
If you're a Pivotal/VMware customer, a Concourse contributor, or a user interview collaborator who's chatted with the team in the past, then you're probably familiar with a few of the meeting rooms from which we conduct Zoom meetings.
-
-
The Toronto office is a great work environment. We're lucky to have the opportunity to get up to play a game of ping pong between engineering stories or meetings, and it's great to be in the same room to collaborate around a whiteboard or break down a problem with post-it notes.
But what happens when your government enforces non-essential businesses to close their offices and asks employees to work from home instead?
@@ -40,11 +37,9 @@ With those goals in mind, our team has pulled from different experiences and tec
First and foremost, we have a perpetual group [Zoom](https://zoom.us/) meeting set up that everybody on the team hangs out in throughout the workday.
-
-
-Having one single room might be unconventional, but negates the need to constantly jump in and out of different Zoom meetings, and all of the confusion that can create. It's tied to a easy-to-remember URL that makes it painless to join each day - no more memorizing meeting IDs!
+{{< image src="/images/2020/03/Screen-Shot-2020-03-20-at-12.08.28-PM.png" alt="A typical workday in the Concourse hangar." width="100%" >}}
-
+Having one single room might be unconventional, but negates the need to constantly jump in and out of different Zoom meetings, and all of the confusion that can create. It's tied to a easy-to-remember URL that makes it painless to join each day - no more memorizing meeting IDs!
Additionally, having everyone in the same place makes it feel more like we're all in the office together. Seeing each other's faces throughout the day makes working at home feel a lot more friendly and less isolated.
@@ -54,7 +49,7 @@ The other major difference to Zoom meetings we held in the past is that now we r
We were already using Discord for our open source community's text-based chat, but it also excels at fast, simple, and effective voice communications. The Concourse team uses a series of private voice channels (named after famous aircraft, of course ✈️) that we can join and depart with a single click.
-
+{{< image src="/images/2020/03/Screen-Shot-2020-03-23-at-1.56.04-PM.png" alt="Pairs of engineers working in audio channels on Discord" width="20%" >}}
This makes it easy to navigate for pair programming, impromptu meetings, or general chat and attention-getting. There’s even a #water-cooler channel that acts as the defacto hangout spot! With this system you can see who is paired up in the respective rooms at a glance, adding a level of transparency and organization that isn't possible when everyone is pairing through separate Zoom meetings or other telecommunication products.
@@ -68,7 +63,6 @@ It still plays a large role in communicating with other product, engineering, an
Remote pairing is one area of our work process that is still up in the air. The Concourse team practices [pair programming](https://en.wikipedia.org/wiki/Pair_programming) everyday, and trying to do that remotely can be challenging at times. We’ve tried the following methods of pair programming, with each having different strengths and weaknesses for different situations.
-
### Toronto workstations
The pairing workstations in the Toronto office are set up so we can use OSX's screen sharing tool to securely connect to them over our company’s VPN. This allows us to share everything (browser, IDE, terminal, and more) as we normally would if we were sitting side by side in the office to pair program.
@@ -87,7 +81,7 @@ Sometimes you just need a command line. In these situations, the team can also s
This article has been heavy on technological solutions and workflow, but another thing worth mentioning is how positive and encouraging the team's attitude has been during the pandemic.
-
+{{< image src="/images/2020/03/Screen-Shot-2020-03-19-at-10.41.42-AM-1.png" alt="Concourse engineers, best engineers." width="100%" >}}
Even isolated to our respective homes, we've seen everyone step up to keep each other happy and healthy, and to keep work moving at a sustainable pace. I won't go into detail about all the memes, inside jokes, guitar solos, Zoom virtual backgrounds, and pet cameos that have been shared among the team in the past couple weeks - you can use your imagination. 😂
diff --git a/_posts/2020-04-16-nobody-wants-a-stale-bot.markdown b/content/posts/2020-04-16-nobody-wants-a-stale-bot.md
similarity index 89%
rename from _posts/2020-04-16-nobody-wants-a-stale-bot.markdown
rename to content/posts/2020-04-16-nobody-wants-a-stale-bot.md
index b33ca7f..7729963 100644
--- a/_posts/2020-04-16-nobody-wants-a-stale-bot.markdown
+++ b/content/posts/2020-04-16-nobody-wants-a-stale-bot.md
@@ -6,7 +6,8 @@ date: '2020-04-16 19:27:07'
Hasta la vista, stale bot.
-
+{{< youtube src="https://www.youtube.com/embed/0Kug8mJ8WiM?start=110&feature=oembed" >}}
+
## tl;dr:
- We've been granted access to GitHub's beta Discussions feature! 🎉
@@ -37,7 +38,7 @@ With these changes, we no longer have any need for the 'stale bot' as Discussion
Some of you have submitted RFCs and haven't received much feedback yet. I'm really sorry about that.
-With v6.0 out and with the dust settling on the ["v10" roadmap]( __GHOST_URL__ /core-roadmap-towards-v10/), I am going to shift my role towards shepherding RFCs and getting back to writing code rather than endlessly planning and prioritizing. It's been a long time! This will also eliminate the conflict-of-interest where I author RFCs and then prioritize them while neglecting others. Definitely not a trend that I want to continue.
+With v6.0 out and with the dust settling on the ["v10" roadmap](/posts/2019-07-17-core-roadmap-towards-v10/), I am going to shift my role towards shepherding RFCs and getting back to writing code rather than endlessly planning and prioritizing. It's been a long time! This will also eliminate the conflict-of-interest where I author RFCs and then prioritize them while neglecting others. Definitely not a trend that I want to continue.
Expect more RFC update blog posts soon!
@@ -58,4 +59,3 @@ Some of you may be wondering what the future holds for Concourse through VMware'
VMware is heavily invested in Concourse – in fact some of our recent significant contributions originated from VMware pre-acquisition. Concourse is already being used internally, and there is work underway planning Concourse's integration into VMware's product ecosystem. We ain't going anywhere!
Thanks and stay safe everyone!
-
diff --git a/_posts/2020-05-06-rfc-roundup-may-6th-2020.markdown b/content/posts/2020-05-06-rfc-roundup-may-6th-2020.md
similarity index 93%
rename from _posts/2020-05-06-rfc-roundup-may-6th-2020.markdown
rename to content/posts/2020-05-06-rfc-roundup-may-6th-2020.md
index c812018..0d9a855 100644
--- a/_posts/2020-05-06-rfc-roundup-may-6th-2020.markdown
+++ b/content/posts/2020-05-06-rfc-roundup-may-6th-2020.md
@@ -8,7 +8,7 @@ tags:
Howdy, and welcome to our first RFC round-up! 🤠
-
+{{< image src="/images/2020/05/image.png" width="40%" >}}
For those unaware, [Concourse RFCs](https://github.com/concourse/rfcs#concourse-rfcs) are a process for proposing and collaborating on improvements to core Concourse functionality, including pipeline behavior, new step types, new operator capabilities, etc.
@@ -23,7 +23,7 @@ The following RFCs have been given the `resolution/merge` label:
- [RFC #33: archiving pipelines](https://github.com/concourse/rfcs/pull/33) proposes that pipelines can be "archived" - effectively a soft-delete, or perhaps a long-pause. This RFC is ready to go, and in fact we've already started to implement it. It will be an experimental opt-in feature until this RFC is merged.
- [RFC #34: pipeline instances](https://github.com/concourse/rfcs/pull/34) proposes a mechanism for grouping related pipelines together under a single identifier, further breaking down each instance by a set of associated vars.
-Both of these RFCs are key components to our plan for Git branch/PR pipeline automation, as described in the [v10 blog post]( __GHOST_URL__ /core-roadmap-towards-v10/).
+Both of these RFCs are key components to our plan for Git branch/PR pipeline automation, as described in the [v10 blog post](/posts/2019-07-17-core-roadmap-towards-v10/).
Per the [resolution process](https://github.com/concourse/rfcs/blob/master/README.md#resolution), if there are no objections or significant changes in the 2 weeks after this post is published, they will be merged! 🚀
diff --git a/_posts/2020-05-14-community-survey-2020-results.markdown b/content/posts/2020-05-14-community-survey-2020-results.md
similarity index 83%
rename from _posts/2020-05-14-community-survey-2020-results.markdown
rename to content/posts/2020-05-14-community-survey-2020-results.md
index d9843f2..3fb75b9 100644
--- a/_posts/2020-05-14-community-survey-2020-results.markdown
+++ b/content/posts/2020-05-14-community-survey-2020-results.md
@@ -1,5 +1,4 @@
---
-layout: post
title: Concourse 2020 Community Report
date: '2020-05-14 18:41:54'
tags:
@@ -10,9 +9,9 @@ A little over a month ago, the Concourse team sent a survey out to the community
A huge thank you to everyone who responded. At the time of this writing, we’ve received over 100 responses and that number is still climbing. Your contributions are valuable, and learning about how different segments of our user base works with our product is going to help us make Concourse even better in 2020!
-## **Feature requests, areas to improve**
+## Feature requests, areas to improve
-### **Configuration ⚙️**
+### Configuration ⚙️
This is a big one. The community wants more control for administrators and operators, more options for integrations, and more power over resource types configuration. We also learned a lot about the specific ways Concourse is making life more difficult than it needs to be in terms of configuring tasks, pipelines, teams, and the product itself.
@@ -22,7 +21,7 @@ In addition, there's a lot of support for concepts covered by our [Instanced Pip
We're also paying particular attention to the number of responses that were focused on git integration and GitOps workflows. If you have a way of using Concourse that you feel isn’t well represented by the current featureset or CLI/UI, please [@mention us on Twitter](https://twitter.com/concourseci) or [drop by Discord](https://discord.gg/MeRxXKW) and tell us about it.
-### **Web UI 🖥**
+### Web UI 🖥
Concourse’s web UI is a hot topic! While most of the web UI feedback is positive, there are lots of suggestions on how to improve it or what to add next. Feedback from the survey about the web UI could make for its own blog post, so in the interest of being brief, I’m just going to touch lightly on the strongest signals/insights that were generated.
@@ -30,36 +29,36 @@ A number of respondents called to attention the ease of use and clarity of infor
Another area where we can clearly improve is by adding more detail to the dashboard. Users are requesting more options for adding notes, tracking an audit trail of actions in the UI, clearer and more detailed error messages, and more statistical information like build duration and lead times. We’ll be looking at the possibilities in this space over the coming months. If you have ideas, start a [Discussion on Github](https://github.com/concourse/concourse/discussions).
-### **Runtime Improvements 📈**
+### Runtime Improvements 📈
In addition to more stability and performance, the community puts a high level of importance and value on improving the efficient use of check containers, global locks on resource checking, and the ability to clear cached resource versions of a worker on demand with _fly_.
-### **Docker Enhancements and Performance 💨**
+### Docker Enhancements and Performance 💨
We hear you. 😀
-Comments from the community emphasized optimizing docker-image resources, facilitating docker in worker containers, and better reporting on docker image status. There are a number of different voices in this conversation all with very different strategies for how they use Concourse, and we're sorting through feedback to help us prioritize low hanging fruit and high value enhancements that the team can prioritize.
-
+Comments from the community emphasized optimizing docker-image resources, facilitating docker in worker containers, and better reporting on docker image status. There are a number of different voices in this conversation all with very different strategies for how they use Concourse, and we're sorting through feedback to help us prioritize low hanging fruit and high value enhancements that the team can prioritize.
+
Additionally, we're actively monitoring issues and continuously collecting data on Docker performance so that we can make more improvements - we understand that every last bit of performance we can squeeze out of Docker interactions results in a huge benefit to many of our users.
-### **Stability, Kubernetes, Documentation ⚖️ 🚢 📚**
+### Stability, Kubernetes, Documentation ⚖️ 🚢 📚
These issues have remained top of mind in the community for the past few years, and this year's survey is no exception. From a stability perspective, the team has made great strides with the release of the new algorithm in [version 6.0.0](https://github.com/concourse/concourse/releases/tag/v6.0.0). The team has also taken further steps into being more k8s native by beginning an ongoing track of work dedicated to running K8s workloads. And lastly, our documentation work is ongoing - we hope to prioritize more ‘getting started’ materials for beginners in order to enable new users to climb the learning curve faster than before. For more advanced users, we also plan more documentation around topics like autoscaling, tracing, and build statistics, among others.
-## **Demographic Data**
+## Demographic Data
-### **How long have you used Concourse?**
-
+### How long have you used Concourse?
+{{< image src="/images/2020/05/Screen-Shot-2020-05-14-at-11.24.35-AM-1.png" width="100%" >}}
Most of the people who responded indicated they had been using Concourse for one year or less. It's great to see that more people are picking up and experimenting with Concourse with each new release, and it's just as exciting to see that people stick around: more than 45% of respondents said they have been using Concourse for **2+ years**. Whenever we interpret feedback from the community, we want to make sure we're taking into account the experiences of both newcomers, established users, and very experienced power users. Each segment experiences different challenges, and prioritizes different parts of the product.
-### **Other CI CD tools used**
-
+### Other CI/CD tools used
+{{< image src="/images/2020/05/Screen-Shot-2020-05-14-at-11.24.03-AM-1.png" width="100%" >}}
Another dimension that's helpful to understand is the related experiences that each survey respondent is equipped with. When looking at other CI/CD tools that our community employs, **Jenkins** is still the top dog, accounting for nearly 30% of the tools mentioned. **Github Actions** has seen a rise in adoption since its initial release, and Travis, Gitlab, Bitbucket, and CircleCI are all fairly common options as well.
-### **How did you find out about Concourse?**
-
+### How did you find out about Concourse?
+{{< image src="/images/2020/05/Screen-Shot-2020-05-14-at-11.22.53-AM.png" width="100%" >}}
Pivotal Software (now VMware) has been Concourse's largest supporter since the project's inception. In previous years, it was common to see more than half of respondents say they were introduced to Concourse CI through a Pivotal Labs engagement, or through Concourse’s role in automation of the Pivotal Platform, Pivotal [Cloud Foundry](https://www.cloudfoundry.org/). Now the community has started to branch out, with only 22% of people reporting that they learned about the product through Pivotal.
@@ -67,52 +66,53 @@ The majority of users seem to have found Concourse organically, through search e
We'd love to grow that _Conference or Meetup_ section in 2020 - who's up for a remote meetup over Zoom? 🙌
-### **Why use Concourse?**
-
+### Why use Concourse?
+{{< image src="/images/2020/05/Screen-Shot-2020-05-14-at-11.24.16-AM.png" width="100%" >}}
When asked about the very important _ **why** _ behind their Concourse usage, concerns about **Open Source** tooling and **flexibility** were top of mind. The special emphasis that Concourse put on **reproducibility** and **user interface** also ranked highly, along with Concourse's **scalability** and overall feature set. Scalability is always a huge concern for the team, as we see enterprise customers frequently testing the limits of their tooling (sometimes with hundreds of Concourse clusters, many thousands of teams, and many _hundreds of thousands_ of pipelines). Likewise, reproducibility is a commitment we're not planning on straying from any time soon.
-### **Concourse Versions**
-
+### Concourse Versions
+{{< image src="/images/2020/05/Screen-Shot-2020-05-14-at-11.53.24-AM.png" width="100%" >}}
We released the survey _just_ as v6.0.0 of Concourse was being finalized, so it was only close to the end that we started to see people upgrading to v6. We're thrilled, nonetheless, to see so many people had already upgraded to v5.8.x. Together, versions v5.8.x and v5.7.x represented the majority of survey respondents, with a low (\>10) rate of responses for any other version.
To those 12 users who are still on v4.x.x and 7 users still on v3.x.x, feel free to[get in touch on the Concourse Discord](https://discord.gg/MeRxXKW) if you need any help upgrading! You can find all of the wonderful reasons to upgrade in the[release notes](https://github.com/concourse/concourse/releases), and we'll write blog articles in the coming months highlighting some of the latest and greatest new features and optimizations, as well as some upcoming enhancements on our roadmap.
-### **Scale**
-
+### Scale
+{{< image src="/images/2020/05/Screen-Shot-2020-05-14-at-11.23.29-AM.png" width="100%" >}}
The data gathered shows that the majority of respondents are working with Concourses organized with fewer teams. And when it comes to users...
-
+{{< image src="/images/2020/05/Screen-Shot-2020-05-14-at-11.23.48-AM.png" width="100%" >}}
... we see a lot of smaller Concourse instances of under 10 users. There are also a few examples of large, enterprise scale deployments of 100+ users over 50+ teams. On the Concourse team, we frequently reach out to enterprise customers for special feedback on more massive implementation concerns. We also survey and interview members of the open source community to make sure we're building solutions that scale _down_ to single users and small teams.
If you'd like to add your voice, feel free to join in on the[Concourse Discussions](https://github.com/concourse/concourse/discussions) board.
-### **Deployment Method**
-
+### Deployment Method
+{{< image src="/images/2020/05/Screen-Shot-2020-05-14-at-11.22.23-AM.png" width="100%" >}}
**Docker** remains the most frequently used deployment method, but the margins are slowly shrinking, and there's more even distribution across other popular options than we've seen in past years.
Nearly identical numbers of responses came in citing **Kubernetes** (via the Helm chart), **BOSH** , and **VM** deployment strategies, reinforcing both our interest in facilitating K8s workflows and supporting our substantial BOSH user base.
-### **Concourse Usage Style**
-
+### Concourse Usage Style
+{{< image src="/images/2020/05/Screen-Shot-2020-05-14-at-11.24.53-AM.png" width="100%" >}}
This year we asked about our users' usage style - specifically, what sort of development scenarios they were using Concourse to facilitate. Concourse remains an **Infrastructure Automation** powerhouse, and a similar number of users are using it to perform **CI for web development** and **deploying software** as part of their **path to production**.
-### **Workloads**
-
+### Workloads
+{{< image src="/images/2020/05/Screen-Shot-2020-05-14-at-11.57.17-AM.png" width="100%" >}}
**Linux workloads** represent the vast majority for the Concourse community. We're also paying attention to special concerns for those running **Windows** and **Darwin** workloads, however this knowledge will help us prioritize fixes to help the largest group of users possible.
-### **Preferred IAAS**
-
+### Preferred IAAS
+{{< image src="/images/2020/05/Screen-Shot-2020-05-14-at-1.10.07-PM.png" alt="" width="100%" >}}
+_Note: RMDH is remotely-managed dedicated hardware_
Finally, when asked about their preferred IAAS, **AWS** takes the top position again for the third year in a row. We consistently see a strong vSphere presence from enterprise customers, but it's really interesting to see the variety of setups that the open source community as a whole employs when deploying Concourse.
-## **Summary**
+## Summary
A recurring topic that comes up in conversations with customers and internal teams at VMware is the sheer variety of ways that Concourse can be set up and put to work. Running this survey further reinforces that idea, giving us insight into an even larger number of configurations and implementations than what we see during our day to day enterprise development and support.
diff --git a/content/posts/2020-05-25-introduction-to-task-inputs-and-outputs.md b/content/posts/2020-05-25-introduction-to-task-inputs-and-outputs.md
new file mode 100644
index 0000000..619587f
--- /dev/null
+++ b/content/posts/2020-05-25-introduction-to-task-inputs-and-outputs.md
@@ -0,0 +1,476 @@
+---
+layout: post
+title: Introduction to Task Inputs and Outputs
+date: '2020-05-25 13:14:40'
+tags:
+- tutorials
+---
+
+Understanding how task inputs and outputs work in Concourse can be a little confusing initially. This post will walk you through a few example pipelines to show you how inputs and outputs work within a single Concourse job. By the end you should understand how inputs and outputs work within the context of a single job.
+
+Let's define some jargon first.
+
+- **step** : A [step](https://concourse-ci.org/jobs.html#steps) is a container running code within the context of a Concourse job. A [step](https://concourse-ci.org/jobs.html#steps) may have inputs and/or outputs, or neither.
+- **Job plan** : A list of [step](https://concourse-ci.org/jobs.html#steps)s that a job will execute when triggered.
+- **Inputs and Outputs** : These are directories. Within Concourse they're generically referred to as **artifacts**. These artifacts are mounted in a **step**'s container under a directory with _some-name_. You, as a writer of Concourse pipelines, have control over what the name of your artifacts will be. If you're coming from the Docker world, artifact is synonymous with [volumes](https://docs.docker.com/storage/volumes/).
+
+To run the pipelines in the following examples yourself you can get your own Concourse running locally by following the [Quick Start guide](https://concourse-ci.org/quick-start.html). Then use [`fly set-pipeline`](https://concourse-ci.org/setting-pipelines.html) to see the pipelines in action.
+
+Concourse pipelines contain a lot of information. Within each pipeline YAML there are comments to help bring specific lines to your attention.
+
+## Example One - Two Tasks
+
+This pipeline will show us how to create outputs and pass outputs as inputs to the next [step](https://concourse-ci.org/jobs.html#steps)(s) in a [job plan](https://concourse-ci.org/jobs.html#schema.job.plan).
+
+This pipeline has two tasks. The first task outputs a file with the date. The second task reads and prints the contents of the file from the first task.
+
+```yaml
+jobs:
+- name: a-job
+ plan:
+ - task: create-one-output
+ config:
+ platform: linux
+ image_resource:
+ type: registry-image
+ source: {repository: alpine}
+ outputs:
+ # Concourse will make an empty dir with this name
+ # and save the contents for later steps
+ - name: the-output
+ run:
+ path: /bin/sh
+ args:
+ - -cx
+ - |
+ ls -lah
+ date > ./the-output/file
+ - task: read-ouput-from-previous-step
+ config:
+ platform: linux
+ image_resource:
+ type: registry-image
+ source: {repository: alpine}
+ # You must explicitly name the inputs you expect
+ # this task to have.
+ # If you don't then outputs from previous steps
+ # will not appear in the step's container.
+ # The name must match the output from the previous step.
+ # Try removing or renaming the input to see what happens!
+ inputs:
+ - name: the-output
+ run:
+ path: /bin/sh
+ args:
+ - -cx
+ - |
+ ls -lah
+ cat ./the-output/file
+```
+
+Here's a visual graphic of what happens when the above job is executed.
+
+{{< image src="/images/2020/05/example-one-10.gif" width="100%" >}}
+
+## Example Two - Two tasks with the same output, who wins?
+
+This example is to satisfy the curiosity cat inside all of us! Never do this in real life because you're definitely going to hurt yourself!
+
+There are two jobs in this pipeline. The first job has two [step](https://concourse-ci.org/jobs.html#steps)s; both steps will produce an artifact named `the-output` in parallel. If you run the `writing-to-the-same-output-in-parallel` job multiple times you'll see the file in `the-output` folder changes depending on which of the parallel tasks finished last. Here's a visualization of the first job.
+
+{{< image src="/images/2020/05/example-two-parallel.gif" width="100%" >}}
+
+The second job is a serial version of the first job. In this job the second task always wins because it's the last task that outputs `the-output`, so only `file2` will be in `the-output` directory in the last [step](https://concourse-ci.org/jobs.html#steps) in the [job plan](https://concourse-ci.org/jobs.html#schema.job.plan).
+
+{{< image src="/images/2020/05/example-two-serial.gif" width="100%" >}}
+
+This pipeline illustrates that you could accidentally overwrite the output from a previous [step](https://concourse-ci.org/jobs.html#steps) if you're not careful with the names of your outputs.
+
+```yaml
+jobs:
+- name: writing-to-the-same-output-in-parallel
+ plan:
+ # running two tasks that output in parallel?!?
+ # who will win??
+ - in_parallel:
+ - task: create-the-output
+ config:
+ platform: linux
+ image_resource:
+ type: registry-image
+ source: {repository: busybox}
+ outputs:
+ - name: the-output
+ run:
+ path: /bin/sh
+ args:
+ - -cx
+ - |
+ ls -lah
+ date > ./the-output/file1
+ - task: also-create-the-output
+ config:
+ platform: linux
+ image_resource:
+ type: registry-image
+ source: {repository: busybox}
+ outputs:
+ - name: the-output
+ run:
+ path: /bin/sh
+ args:
+ - -cx
+ - |
+ ls -lah
+ date > ./the-output/file2
+ # run this job multiple times to see which
+ # previous task wins each time
+ - task: read-ouput-from-previous-step
+ config:
+ platform: linux
+ image_resource:
+ type: registry-image
+ source: {repository: busybox}
+ inputs:
+ - name: the-output
+ run:
+ path: /bin/sh
+ args:
+ - -cx
+ - |
+ ls -lah ./the-output
+ echo "Get ready to error!"
+ cat ./the-output/file1 ./the-output/file2
+
+- name: writing-to-the-same-output-serially
+ plan:
+ - task: create-one-output
+ config:
+ platform: linux
+ image_resource:
+ type: registry-image
+ source: {repository: busybox}
+ outputs:
+ - name: the-output
+ run:
+ path: /bin/sh
+ args:
+ - -cx
+ - |
+ ls -lah
+ date > ./the-output/file1
+ - task: create-another-output
+ config:
+ platform: linux
+ image_resource:
+ type: registry-image
+ source: {repository: busybox}
+ outputs:
+ - name: the-output
+ run:
+ path: /bin/sh
+ args:
+ - -cx
+ - |
+ ls -lah
+ date > ./the-output/file2
+ - task: read-ouput-from-previous-step
+ config:
+ platform: linux
+ image_resource:
+ type: registry-image
+ source: {repository: busybox}
+ inputs:
+ - name: the-output
+ run:
+ path: /bin/sh
+ args:
+ - -cx
+ - |
+ ls -lah ./the-output
+ echo "Get ready to error!"
+ cat ./the-output/file1 ./the-output/file2
+```
+
+## Example Three - Input/Output Name Mapping
+
+Sometimes the names of inputs and outputs don't match, or they do match and you don't want them overwriting each other, like in the previous example. That's when [`input_mapping`](https://concourse-ci.org/jobs.html#schema.step.task-step.input_mapping) and [`output_mapping`](https://concourse-ci.org/jobs.html#schema.step.task-step.output_mapping) become helpful. Both of these features map the inputs/outputs in the task's config to some artifact name in the [job plan](https://concourse-ci.org/jobs.html#schema.job.plan).
+
+This pipeline has one job with four tasks.
+
+The first task outputs a file with the date to the `the-output` directory. `the-output` is mapped to the new name `demo-disk`. The artifact `demo-disk` is now available in the rest of the [job plan](https://concourse-ci.org/jobs.html#schema.job.plan) for future [step](https://concourse-ci.org/jobs.html#steps)s to take as inputs. The remaining steps do this in various ways.
+
+The second task reads and prints the contents of the file under the new name `demo-disk`.
+
+The third task reads and prints the contents of the file under another name, `generic-input`. The `demo-disk` artifact in the [job plan](https://concourse-ci.org/jobs.html#schema.job.plan) is mapped to `generic-input`.
+
+The fourth task tries to use the artifact named `the-output` as its input. This task fails to even start because there was no artifact with the name `the-output` available in the [job plan](https://concourse-ci.org/jobs.html#schema.job.plan); it was remapped to `demo-disk`.
+
+Here's a visualization of the job.
+
+{{< image src="/images/2020/05/example-three-1.gif" width="100%" >}}
+
+Here's the pipeline YAML for you to run on your local Concourse.
+
+```yaml
+jobs:
+- name: a-job
+ plan:
+ - task: create-one-output
+ # The task config has the artifact `the-output`
+ # output_mapping will rename `the-output` to `demo-disk`
+ # in the rest of the job's plan
+ output_mapping:
+ the-output: demo-disk
+ config:
+ platform: linux
+ image_resource:
+ type: registry-image
+ source: {repository: busybox}
+ outputs:
+ - name: the-output
+ run:
+ path: /bin/sh
+ args:
+ - -cx
+ - |
+ ls -lah
+ date > ./the-output/file
+ # this task expects the artifact `demo-disk` so no mapping is needed
+ - task: read-ouput-from-previous-step
+ config:
+ platform: linux
+ image_resource:
+ type: registry-image
+ source: {repository: busybox}
+ inputs:
+ - name: demo-disk
+ run:
+ path: /bin/sh
+ args:
+ - -cx
+ - |
+ ls -lah
+ cat ./demo-disk/file
+ - task: rename-and-read-output
+ # This task expects the artifact `generic-input`.
+ # input_mapping will map the tasks `generic-input` to
+ # the job plans `demo-disk` artifact
+ input_mapping:
+ generic-input: demo-disk
+ config:
+ platform: linux
+ image_resource:
+ type: registry-image
+ source: {repository: busybox}
+ inputs:
+ - name: generic-input
+ run:
+ path: /bin/sh
+ args:
+ - -cx
+ - |
+ ls -lah
+ cat ./generic-input/file
+ - task: try-and-read-the-output
+ input_mapping:
+ generic-input: demo-disk
+ config:
+ platform: linux
+ image_resource:
+ type: registry-image
+ source: {repository: busybox}
+ # `the-output` is not available in the job plan
+ # so this task will error while initializing
+ # since there's no artiact named `the-output` in
+ # the job's plan
+ inputs:
+ - name: the-output
+ run:
+ path: /bin/sh
+ args:
+ - -cx
+ - |
+ ls -lah
+ cat ./generic-input/file
+```
+
+## Example Four - Can you add files to an existing output artifact?
+
+This pipeline will also have two jobs in order to illustrate this point. What happens if we add a file to an output? If you think back to example two you may already know the answer.
+
+The first task will create `the-output` with `file1`. The second task will add `file2` to the `the-output`. The last task will read the contents of `file1` and `file2`.
+
+As long as you re-declare the input as an output in the second task you can modify any of your outputs.
+
+This means you can pass something between a bunch of tasks and have each task add or modify something in the artifact.
+
+```yaml
+jobs:
+- name: add-file-to-output
+ plan:
+ - task: create-one-output
+ config:
+ platform: linux
+ image_resource:
+ type: registry-image
+ source: {repository: busybox}
+ outputs:
+ - name: the-output
+ run:
+ path: /bin/sh
+ args:
+ - -cx
+ - |
+ ls -lah
+ date > ./the-output/file1
+ - task: add-file-to-previous-output
+ config:
+ platform: linux
+ image_resource:
+ type: registry-image
+ source: {repository: busybox}
+ # this task lists the same artifact as
+ # its input and output
+ inputs:
+ - name: the-output
+ outputs:
+ - name: the-output
+ run:
+ path: /bin/sh
+ args:
+ - -cx
+ - |
+ ls -lah
+ date > ./the-output/file2
+ - task: read-ouput-from-previous-step
+ config:
+ platform: linux
+ image_resource:
+ type: registry-image
+ source: {repository: busybox}
+ inputs:
+ - name: the-output
+ run:
+ path: /bin/sh
+ args:
+ - -cx
+ - |
+ ls -lah ./the-output
+ cat ./the-output/file1 ./the-output/file2
+```
+
+Here's a visualization of the job.
+
+{{< image src="/images/2020/05/example-four.gif" width="100%" >}}
+
+## Example Five - Multiple Outputs
+
+What happens if you have a task that has multiple outputs and a second task that only lists one of the outputs? Does the second task get the extra outputs from the first task?
+
+The answer is no. A task will only get the artifacts that match the name of the inputs listed in the task's config.
+
+```yaml
+jobs:
+- name: multiple-outputs
+ plan:
+ - task: create-three-outputs
+ config:
+ platform: linux
+ image_resource:
+ type: registry-image
+ source: {repository: busybox}
+ outputs:
+ - name: the-output-1
+ - name: the-output-2
+ - name: the-output-3
+ run:
+ path: /bin/sh
+ args:
+ - -cx
+ - |
+ ls -lah
+ date > ./the-output-1/file
+ date > ./the-output-2/file
+ date > ./the-output-3/file
+ - task: take-one-output
+ config:
+ platform: linux
+ image_resource:
+ type: registry-image
+ source: {repository: busybox}
+ # only one of the three outputs are
+ # listed as inputs
+ inputs:
+ - name: the-output-1
+ run:
+ path: /bin/sh
+ args:
+ - -cx
+ - |
+ ls -lah ./
+ cat ./the-output-1/file
+ - task: take-two-outputs
+ config:
+ platform: linux
+ image_resource:
+ type: registry-image
+ source: {repository: busybox}
+ # this task pulls in the other
+ # two outputs, just for fun!
+ inputs:
+ - name: the-output-2
+ - name: the-output-3
+ run:
+ path: /bin/sh
+ args:
+ - -cx
+ - |
+ ls -lah ./
+ cat ./the-output-2/file
+ cat ./the-output-3/file
+```
+
+Here's a visualization of the above job.
+
+{{< image src="/images/2020/05/example-five.gif" width="100%" >}}
+
+## Example Six - Get Steps
+
+The majority of Concourse pipelines have at least one resource, which means they have at least one [get step](https://concourse-ci.org/jobs.html#get-step). Using a get step in a job makes an artifact with the name of the get step available for later steps in the [job plan](https://concourse-ci.org/jobs.html#schema.job.plan) to consume as inputs.
+
+```yaml
+resources:
+- name: concourse-examples
+ type: git
+ source: {uri: "https://github.com/concourse/examples"}
+
+jobs:
+- name: get-step
+ plan:
+ # there will be an artifact named
+ # "concourse-examples" available in the job plan
+ - get: concourse-examples
+ - task: take-one-output
+ config:
+ platform: linux
+ image_resource:
+ type: registry-image
+ source: {repository: busybox}
+ inputs:
+ - name: concourse-examples
+ run:
+ path: /bin/sh
+ args:
+ - -cx
+ - |
+ ls -lah ./
+ cat ./concourse-examples/README.md
+```
+
+Here's a visualization for the above job.
+
+{{< image src="/images/2020/05/example-six.gif" width="100%" >}}
+
+I hope you found these example helpful with figuring out how inputs and outputs work within a single Concourse job.
+
diff --git a/_posts/2020-06-10-rfc-roundup-june-10th-2020.markdown b/content/posts/2020-06-10-rfc-roundup-june-10th-2020.md
similarity index 92%
rename from _posts/2020-06-10-rfc-roundup-june-10th-2020.markdown
rename to content/posts/2020-06-10-rfc-roundup-june-10th-2020.md
index 1310f1f..9dc814a 100644
--- a/_posts/2020-06-10-rfc-roundup-june-10th-2020.markdown
+++ b/content/posts/2020-06-10-rfc-roundup-june-10th-2020.md
@@ -1,5 +1,4 @@
---
-layout: post
title: 'RFC round-up: June 10th, 2020'
date: '2020-06-10 19:39:40'
tags:
@@ -8,7 +7,7 @@ tags:
First off: sorry, I immediately failed to keep my target pace for these. 😓 I got wrapped up in a deadline, and since I alternate weeks between engineering and community duties like this post, when I miss a week for RFC updates the 2-week interval can quickly turn into 4 or 5.
-Owing to the missed round-up, and in hopes of burning through the backlog more quickly so that interested contributors may volunteer for merged RFCs, I'm going to expand the scope of this post to include more RFCs than the last one - primarily by proposing that we merge ones that are nearly certain for the [v10 roadmap]( __GHOST_URL__ /core-roadmap-towards-v10/).
+Owing to the missed round-up, and in hopes of burning through the backlog more quickly so that interested contributors may volunteer for merged RFCs, I'm going to expand the scope of this post to include more RFCs than the last one - primarily by proposing that we merge ones that are nearly certain for the [v10 roadmap](/posts/2019-07-17-core-roadmap-towards-v10/).
## Merged RFCs
@@ -30,7 +29,7 @@ Per the [resolution process](https://github.com/concourse/rfcs/blob/master/READM
Quite a few RFCs have had some pretty interesting discussions or developments since the last round-up:
- [RFC #36: manual step](https://github.com/concourse/rfcs/pull/36) has had some juicy conversation around how things like approval and manual gating in a pipeline should be expressed in a Concoursey way - if you have thoughts on this, please chime in!
-- [RFC #37: prototypes](https://github.com/concourse/rfcs/pull/37) is the RFC for the "Prototypes" concept introduced in the [Re-inventing resource types]( __GHOST_URL__ /reinventing-resource-types/) blog post. The latest revision introduces encryption, which will enable Prototypes to implement credential managers. If you are a resource type author or if you have a security background, please give it a look!
+- [RFC #37: prototypes](https://github.com/concourse/rfcs/pull/37) is the RFC for the "Prototypes" concept introduced in the [Re-inventing resource types](/posts/2019-10-15-reinventing-resource-types/) blog post. The latest revision introduces encryption, which will enable Prototypes to implement credential managers. If you are a resource type author or if you have a security background, please give it a look!
- [RFC #32: projects](https://github.com/concourse/rfcs/pull/32) now has a pretty radical new question: can Projects replace Teams in order to provide more complete cluster config automation? If you've ever had a need for automating team configuration, or if you have a thirst for GitOps, this should be a pretty interesting conversation!
## New RFCs
diff --git a/_posts/2020-06-19-how-to-build-and-publish-a-container-image.markdown b/content/posts/2020-06-19-how-to-build-and-publish-a-container-image.md
similarity index 60%
rename from _posts/2020-06-19-how-to-build-and-publish-a-container-image.markdown
rename to content/posts/2020-06-19-how-to-build-and-publish-a-container-image.md
index 7f16c47..17ad413 100644
--- a/_posts/2020-06-19-how-to-build-and-publish-a-container-image.markdown
+++ b/content/posts/2020-06-19-how-to-build-and-publish-a-container-image.md
@@ -16,11 +16,13 @@ First we need a Dockerfile. You can store this in your own repo or reference the
We are going to use a very basic [Dockerfile](https://github.com/concourse/examples/blob/master/Dockerfiles/simple/Dockerfile) so we can focus on building the Concourse pipeline.
- FROM busybox
-
- RUN echo "I'm simple!"
- COPY ./stranger /stranger
- RUN cat /stranger
+```dockerfile
+FROM busybox
+
+RUN echo "I'm simple!"
+COPY ./stranger /stranger
+RUN cat /stranger
+```
## Defining Pipeline Resources
@@ -28,39 +30,45 @@ Now we can start building out our pipeline. Let's declare our [resources](https:
_There are some [variables](https://concourse-ci.org/pipeline-vars-example.html#variables) in this file that we will fill out later._
- resources:
- # The repo with our Dockerfile
- - name: concourse-examples
- type: git
- icon: github
- source:
- uri: https://github.com/concourse/examples.git
- branch: master
-
- # Where we will push the image to
- - name: simple-image
- type: registry-image
- icon: docker
- source:
- repository: ((image-repo-name))/simple-image
- username: ((registry-username))
- password: ((registry-password))
+```yaml
+resources:
+# The repo with our Dockerfile
+- name: concourse-examples
+ type: git
+ icon: github
+ source:
+ uri: https://github.com/concourse/examples.git
+ branch: master
+
+# Where we will push the image to
+- name: simple-image
+ type: registry-image
+ icon: docker
+ source:
+ repository: ((image-repo-name))/simple-image
+ username: ((registry-username))
+ password: ((registry-password))
+```
## Create a Job
Next we will create a [job](https://concourse-ci.org/jobs.html) that will build and push our container image.
- jobs:
- - name: build-and-push
+```yaml
+jobs:
+- name: build-and-push
+```
### Retrieve the Dockerfile
The first [step](https://concourse-ci.org/jobs.html#schema.step) in the [job plan](https://concourse-ci.org/jobs.html#schema.job.plan) will be to retrieve the repo where our Dockerfile is.
- jobs:
- - name: build-and-push
- plan:
- - get: concourse-examples
+```yaml
+jobs:
+- name: build-and-push
+ plan:
+ - get: concourse-examples
+```
### Build the Container Image
@@ -70,117 +78,131 @@ To build the container image we are going to use the [oci-build-task](https://gi
Let's add a [task](https://concourse-ci.org/tasks.html) to our [job plan](https://concourse-ci.org/jobs.html#schema.job.plan) and give it a name.
- jobs:
- - name: build-and-push
- plan:
- - get: concourse-examples
- - task: build-task-image
+```yaml
+jobs:
+- name: build-and-push
+ plan:
+ - get: concourse-examples
+ - task: build-task-image
+```
All configuration of the `oci-build-task` is done through a [task config](https://concourse-ci.org/tasks.html). Viewing the [`README`](https://github.com/vito/oci-build-task/blob/master/README.md) from the repo we can see that the task needs to be run as a [privileged task](https://concourse-ci.org/jobs.html#schema.step.task-step.privileged) on a linux worker.
- jobs:
- - name: build-and-push
- plan:
- - get: concourse-examples
- - task: build-task-image
- privileged: true
- config:
- platform: linux
+```yaml
+jobs:
+- name: build-and-push
+ plan:
+ - get: concourse-examples
+ - task: build-task-image
+ privileged: true
+ config:
+ platform: linux
+```
To use the `oci-build-task` container image we specify the [`image_resource`](https://concourse-ci.org/tasks.html#schema.task.image_resource) that the task should use.
- jobs:
- - name: build-and-push
- plan:
- - get: concourse-examples
- - task: build-task-image
- privileged: true
- config:
- platform: linux
- image_resource:
- type: registry-image
- source:
- repository: vito/oci-build-task
+```yaml
+jobs:
+- name: build-and-push
+ plan:
+ - get: concourse-examples
+ - task: build-task-image
+ privileged: true
+ config:
+ platform: linux
+ image_resource:
+ type: registry-image
+ source:
+ repository: vito/oci-build-task
+```
Next we will add [`concourse-examples`](https://github.com/concourse/examples) as an [input](https://concourse-ci.org/tasks.html#schema.task.inputs) to the build task to ensure the artifact from the [get step](https://concourse-ci.org/jobs.html#get-step) (where our `Dockerfile` is fetched) is mounted in our `build-task-image` step.
- jobs:
- - name: build-and-push
- plan:
- - get: concourse-examples
- - task: build-task-image
- privileged: true
- config:
- platform: linux
- image_resource:
- type: registry-image
- source:
- repository: vito/oci-build-task
- inputs:
- - name: concourse-examples
+```yaml
+jobs:
+- name: build-and-push
+ plan:
+ - get: concourse-examples
+ - task: build-task-image
+ privileged: true
+ config:
+ platform: linux
+ image_resource:
+ type: registry-image
+ source:
+ repository: vito/oci-build-task
+ inputs:
+ - name: concourse-examples
+```
The `oci-build-task` [outputs the built container image](https://github.com/vito/oci-build-task#outputs) in a directory called `image`. Let's add `image` as an output artifact of our task so we can publish it in a later step.
- jobs:
- - name: build-and-push
- plan:
- - get: concourse-examples
- - task: build-task-image
- privileged: true
- config:
- platform: linux
- image_resource:
- type: registry-image
- source:
- repository: vito/oci-build-task
- inputs:
- - name: concourse-examples
- outputs:
- - name: image
+```yaml
+jobs:
+- name: build-and-push
+ plan:
+ - get: concourse-examples
+ - task: build-task-image
+ privileged: true
+ config:
+ platform: linux
+ image_resource:
+ type: registry-image
+ source:
+ repository: vito/oci-build-task
+ inputs:
+ - name: concourse-examples
+ outputs:
+ - name: image
+```
Next we need to tell the `oci-build-task` what the [build context](https://docs.docker.com/engine/reference/commandline/build/) of our Dockerfile is. The [`README`](https://github.com/vito/oci-build-task) goes over a few other methods of creating your build context. We are going to use the simplest use-case. By specifying `CONTEXT` the `oci-build-task` assumes a `Dockerfile` and its build context are in the same directory.
- jobs:
- - name: build-and-push
- plan:
- - get: concourse-examples
- - task: build-task-image
- privileged: true
- config:
- platform: linux
- image_resource:
- type: registry-image
- source:
- repository: vito/oci-build-task
- inputs:
- - name: concourse-examples
- outputs:
- - name: image
- params:
- CONTEXT: concourse-examples/Dockerfiles/simple
+```yaml
+jobs:
+- name: build-and-push
+ plan:
+ - get: concourse-examples
+ - task: build-task-image
+ privileged: true
+ config:
+ platform: linux
+ image_resource:
+ type: registry-image
+ source:
+ repository: vito/oci-build-task
+ inputs:
+ - name: concourse-examples
+ outputs:
+ - name: image
+ params:
+ CONTEXT: concourse-examples/Dockerfiles/simple
+```
The last step is specifying what our `build-task-image` should execute. The `oci-build-task` container image has a binary named [`build`](https://github.com/vito/oci-build-task/blob/230df3baa27fb389484ee0fb74355cd8b7977298/Dockerfile#L11) located in its `PATH` in the [`/usr/bin` directory](https://github.com/vito/oci-build-task/blob/230df3baa27fb389484ee0fb74355cd8b7977298/Dockerfile#L15). We'll tell our task to execute that binary, which will build our container image.
- jobs:
- - name: build-and-push
- plan:
- - get: concourse-examples
- - task: build-task-image
- privileged: true
- config:
- platform: linux
- image_resource:
- type: registry-image
- source:
- repository: vito/oci-build-task
- inputs:
- - name: concourse-examples
- outputs:
- - name: image
- run:
- path: build
- params:
- CONTEXT: concourse-examples/Dockerfiles/simple
+```yaml
+jobs:
+- name: build-and-push
+ plan:
+ - get: concourse-examples
+ - task: build-task-image
+ privileged: true
+ config:
+ platform: linux
+ image_resource:
+ type: registry-image
+ source:
+ repository: vito/oci-build-task
+ inputs:
+ - name: concourse-examples
+ outputs:
+ - name: image
+ run:
+ path: build
+ params:
+ CONTEXT: concourse-examples/Dockerfiles/simple
+```
At this point in our job the container image is built! The `oci-build-task` has saved the container image as a tarball named `image.tar` in the `image` artifact specified in the task outputs. This tar file is the same output you would get if you built the container image using Docker and then did [`docker save`](https://docs.docker.com/engine/reference/commandline/save/).
@@ -194,85 +216,92 @@ The put step will push the container image using the information defined in the
This is where you'll need to replace the three [variables](https://concourse-ci.org/vars.html) found under `resource_types`. You can define them [statically](https://concourse-ci.org/vars.html#static-vars) using `fly`'s `--var` flag when [setting](https://concourse-ci.org/setting-pipelines.html) the pipeline. _(In production make sure to use a [credential management system](https://concourse-ci.org/creds.html) to store your secrets!)_
- jobs:
- - name: build-and-push
- plan:
- - get: concourse-examples
- - task: build-task-image
- privileged: true
- config:
- platform: linux
- image_resource:
- type: registry-image
- source:
- repository: vito/oci-build-task
- inputs:
- - name: concourse-examples
- outputs:
- - name: image
- params:
- CONTEXT: concourse-examples/Dockerfiles/simple
- run:
- path: build
- - put: simple-image
- params:
- image: image/image.tar
+```yaml
+jobs:
+- name: build-and-push
+ plan:
+ - get: concourse-examples
+ - task: build-task-image
+ privileged: true
+ config:
+ platform: linux
+ image_resource:
+ type: registry-image
+ source:
+ repository: vito/oci-build-task
+ inputs:
+ - name: concourse-examples
+ outputs:
+ - name: image
+ params:
+ CONTEXT: concourse-examples/Dockerfiles/simple
+ run:
+ path: build
+ - put: simple-image
+ params:
+ image: image/image.tar
+```
## The Entire Pipeline
Putting all the pieces together, here is our pipeline that builds and pushes (publishes) a container image.
- resources:
- # The repo with our Dockerfile
- - name: concourse-examples
- type: git
- icon: github
- source:
- uri: https://github.com/concourse/examples.git
- branch: master
-
- # Where we will push the image
- - name: simple-image
- type: registry-image
- icon: docker
- source:
- repository: ((image-repo-name))/simple-image
- username: ((registry-username))
- password: ((registry-password))
-
- jobs:
- - name: build-and-push
- plan:
- - get: concourse-examples
- - task: build-task-image
- privileged: true
- config:
- platform: linux
- image_resource:
- type: registry-image
- source:
- repository: vito/oci-build-task
- inputs:
- - name: concourse-examples
- outputs:
- - name: image
- params:
- CONTEXT: concourse-examples/Dockerfiles/simple
- run:
- path: build
- - put: simple-image
- params:
- image: image/image.tar
+```yaml
+resources:
+# The repo with our Dockerfile
+- name: concourse-examples
+ type: git
+ icon: github
+ source:
+ uri: https://github.com/concourse/examples.git
+ branch: master
+
+# Where we will push the image
+- name: simple-image
+ type: registry-image
+ icon: docker
+ source:
+ repository: ((image-repo-name))/simple-image
+ username: ((registry-username))
+ password: ((registry-password))
+
+jobs:
+- name: build-and-push
+ plan:
+ - get: concourse-examples
+ - task: build-task-image
+ privileged: true
+ config:
+ platform: linux
+ image_resource:
+ type: registry-image
+ source:
+ repository: vito/oci-build-task
+ inputs:
+ - name: concourse-examples
+ outputs:
+ - name: image
+ params:
+ CONTEXT: concourse-examples/Dockerfiles/simple
+ run:
+ path: build
+ - put: simple-image
+ params:
+ image: image/image.tar
+```
You can set the pipeline with the following `fly` command, updating the variable values with real values the pipeline can use. The behaviour is similar to [`docker push`](https://docs.docker.com/engine/reference/commandline/push/):
- fly -t set-pipeline -p build-and-push-image \
- -c ./examples/pipelines/build-and-push-simple-image.yml \
- --var image-repo-name= \
- --var registry-username= \
- --var registry-password=
+```shell-session
+fly -t set-pipeline -p build-and-push-image \
+ -c ./examples/pipelines/build-and-push-simple-image.yml \
+ --var image-repo-name= \
+ --var registry-username= \
+ --var registry-password=
+```
+
+{{< image src="/images/2020/06/build-and-publish-pipeline-3.png" alt="build-and-push-pipeline" >}}
-
## Further Readings
Understanding what the _build context_ is is important when building container images. You can read [Dockerfile Best Practices](https://docs.docker.com/develop/develop-images/dockerfile_best-practices/#understand-build-context) for more details about _build contexts_.
@@ -281,5 +310,5 @@ The [inputs](https://github.com/vito/oci-build-task#inputs) section of the oci-b
Read the `README`'s in the [oci-build-task](https://github.com/vito/oci-build-task) and [registry-image resource](https://github.com/concourse/registry-image-resource/) to learn more about their other configuration options.
-If you had trouble following how the artifacts get passed between the steps of a job then read our other blog post about [task inputs and outputs]( __GHOST_URL__ /introduction-to-task-inputs-and-outputs/).
+If you had trouble following how the artifacts get passed between the steps of a job then read our other blog post about [task inputs and outputs](/posts/2020-05-25-introduction-to-task-inputs-and-outputs/).
diff --git a/_posts/2020-06-24-rfc-round-up-june-24th-2020.markdown b/content/posts/2020-06-24-rfc-round-up-june-24th-2020.md
similarity index 91%
rename from _posts/2020-06-24-rfc-round-up-june-24th-2020.markdown
rename to content/posts/2020-06-24-rfc-round-up-june-24th-2020.md
index d01598b..a5814c8 100644
--- a/_posts/2020-06-24-rfc-round-up-june-24th-2020.markdown
+++ b/content/posts/2020-06-24-rfc-round-up-june-24th-2020.md
@@ -1,5 +1,4 @@
---
-layout: post
title: 'RFC round-up: June 24th, 2020'
date: '2020-06-24 20:23:48'
tags:
@@ -17,7 +16,7 @@ With the four(!) RFCs from the last round-up now merged, it's time to move on to
## RFCs ready to merge 🤞
-- [RFC #37: Prototypes](https://github.com/concourse/rfcs/pull/37) is finally ready to go! For (much) further reading, check out the [Re-inventing resource types]( __GHOST_URL__ /reinventing-resource-types/) blog post. The importance of this RFC really cannot be overstated; it will be the most significant change to Concourse since its creation.
+- [RFC #37: Prototypes](https://github.com/concourse/rfcs/pull/37) is finally ready to go! For (much) further reading, check out the [Re-inventing resource types](/posts/2019-10-15-reinventing-resource-types/) blog post. The importance of this RFC really cannot be overstated; it will be the most significant change to Concourse since its creation.
- [RFC #38: Resource Prototypes](https://github.com/concourse/rfcs/pull/38) demonstrates how the Prototype protocol may be used to implement the next generation of resource prototypes (formerly resource types) and gain long-requested functionality along the way.
## Shiny new RFCs ✨
diff --git a/_posts/2020-07-10-rfc-round-up-july-10th-2020.markdown b/content/posts/2020-07-10-rfc-round-up-july-10th-2020.md
similarity index 100%
rename from _posts/2020-07-10-rfc-round-up-july-10th-2020.markdown
rename to content/posts/2020-07-10-rfc-round-up-july-10th-2020.md
diff --git a/_posts/2020-08-24-gitops-for-pipelines.markdown b/content/posts/2020-08-24-gitops-for-pipelines.md
similarity index 59%
rename from _posts/2020-08-24-gitops-for-pipelines.markdown
rename to content/posts/2020-08-24-gitops-for-pipelines.md
index fec223e..aa320d0 100644
--- a/_posts/2020-08-24-gitops-for-pipelines.markdown
+++ b/content/posts/2020-08-24-gitops-for-pipelines.md
@@ -18,87 +18,101 @@ To run the pipelines in this blog post for yourself you can get your own Concour
You will also need to fork the [github.com/concourse/examples](https://github.com/concourse/examples) repo and replace `USERNAME` with your github username in the below examples. We will continue to refer to the repo as `concourse/examples`. Once you have forked the repo clone it locally onto your machine and `cd` into the repo.
- $ git clone git@github.com:USERNAME/examples.git
- $ cd examples
+```shell-session
+$ git clone git@github.com:USERNAME/examples.git
+$ cd examples
+```
## Create the Parent Pipeline
Inside your fork of `concourse/examples` that you have cloned locally, create a file named `reconfigure-pipelines.yml` inside the `pipelines` folder. This is the pipeline that we are going to be building. We will refer to this pipeline as the _parent pipeline_.
- $ touch ./pipelines/reconfigure-pipelines.yml
+```shell-session
+$ touch ./pipelines/reconfigure-pipelines.yml
+```
Like the `fly set-pipeline` command, the `set_pipeline` step needs a YAML file containing a pipeline configuration. We will use the concourse/examples repo as the place to store our pipelines and thankfully it already contains many pipelines! Let's add the repo as a resource to our parent pipeline.
- resources:
- - name: concourse-examples
- type: git
- icon: github
- source:
- uri: git@github.com:USERNAME/examples.git
+```yaml
+resources:
+- name: concourse-examples
+ type: git
+ icon: github
+ source:
+ uri: git@github.com:USERNAME/examples.git
+```
Now we will add a job that will set our pipelines. The first step in the job will fetch the `concourse/examples` repo, making it available to future steps as the `concourse-examples` artifact. We will also add the `trigger` parameter to ensure that the job will run whenever a new commit is pushed to the `concourse/examples` repo.
- resources:
- - name: concourse-examples
- type: git
- icon: github
- source:
- uri: git@github.com:USERNAME/examples.git
-
- jobs:
- - name: configure-pipelines
- public: true
- plan:
- - get: concourse-examples
- trigger: true
+```yaml
+resources:
+- name: concourse-examples
+ type: git
+ icon: github
+ source:
+ uri: git@github.com:USERNAME/examples.git
+
+jobs:
+- name: configure-pipelines
+ public: true
+ plan:
+ - get: concourse-examples
+ trigger: true
+```
Next we will add the `set_pipeline` step to set one of the pipelines in the `concourse/examples` repo. We will set the `hello-world` pipeline first.
- resources:
- - name: concourse-examples
- type: git
- icon: github
- source:
- uri: git@github.com:USERNAME/examples.git
-
- jobs:
- - name: configure-pipelines
- public: true
- plan:
- - get: concourse-examples
- trigger: true
- - set_pipeline: hello-world
- file: concourse-examples/pipelines/hello-world.yml
+```yaml
+resources:
+- name: concourse-examples
+ type: git
+ icon: github
+ source:
+ uri: git@github.com:USERNAME/examples.git
+
+jobs:
+- name: configure-pipelines
+ public: true
+ plan:
+ - get: concourse-examples
+ trigger: true
+ - set_pipeline: hello-world
+ file: concourse-examples/pipelines/hello-world.yml
+```
Let's commit what we have so far and push it to github.
- $ git add pipelines/reconfigure-pipelines.yml
- $ git commit -m "add reconfigure-pipelines"
- $ git push -u origin head
+```shell-session
+$ git add pipelines/reconfigure-pipelines.yml
+$ git commit -m "add reconfigure-pipelines"
+$ git push -u origin head
+```
## Setting the Parent Pipeline
Now we have a [chicken or the egg](https://en.wikipedia.org/wiki/Chicken_or_the_egg) problem, except in this case we know our parent pipeline comes first! Let's set our pipeline with `fly` and execute the `configure-pipelines` job.
- $ fly -t local set-pipeline \
- -p reconfigure-pipelines \
- -c pipelines/reconfigure-pipelines.yaml
-
- ...
- apply configuration? [yN]: y
-
- $ fly -t local unpause-pipeline \
- -p reconfigure-pipelines
-
- unpaused 'reconfigure-pipelines'
-
- $ fly -t local trigger-job \
- -j reconfigure-pipelines/configure-pipelines \
- --watch
+```shell-session
+$ fly -t local set-pipeline \
+ -p reconfigure-pipelines \
+ -c pipelines/reconfigure-pipelines.yaml
+
+...
+apply configuration? [yN]: y
+
+$ fly -t local unpause-pipeline \
+ -p reconfigure-pipelines
+
+unpaused 'reconfigure-pipelines'
+
+$ fly -t local trigger-job \
+ -j reconfigure-pipelines/configure-pipelines \
+ --watch
+```
Once the job is done running you should see two pipelines, `reconfigure-pipelines` and `hello-world`.
-
+{{< image src="/images/2020/08/hello-world.png" alt="Concourse dashboard showing two pipelines" width="100%" >}}
Now any changes you make to the `hello-world` pipeline will be updated automatically in Concourse once it picks up the commit with your changes.
@@ -115,86 +129,97 @@ By doing the above we will never have to use `fly` to update the parent pipline
Here is what the above changes look like when implemented:
- resources:
- - name: concourse-examples
- type: git
- icon: github
- source:
- uri: git@github.com:USERNAME/examples.git
-
- jobs:
- - name: configure-self
- plan:
- - get: concourse-examples
- trigger: true
- - set_pipeline: reconfigure-pipelines
- file: concourse-examples/pipelines/reconfigure-pipelines.yml
- - name: configure-pipelines
- plan:
- - get: concourse-examples
- trigger: true
- passed: [configure-self]
- - set_pipeline: hello-world
- file: concourse-examples/pipelines/hello-world.yml
+```yaml
+resources:
+- name: concourse-examples
+ type: git
+ icon: github
+ source:
+ uri: git@github.com:USERNAME/examples.git
+
+jobs:
+- name: configure-self
+ plan:
+ - get: concourse-examples
+ trigger: true
+ - set_pipeline: reconfigure-pipelines
+ file: concourse-examples/pipelines/reconfigure-pipelines.yml
+- name: configure-pipelines
+ plan:
+ - get: concourse-examples
+ trigger: true
+ passed: [configure-self]
+ - set_pipeline: hello-world
+ file: concourse-examples/pipelines/hello-world.yml
+```
**Side-note** : for the `configure-self` job, you could also use the [`self` keyword](https://concourse-ci.org/jobs.html#schema.step.set-pipeline-step.set_pipeline), though this is labelled as experimental and may disappear in the future.
Lets set the parent pipeline one more time with `fly` and then we'll make commits to the repo to make all future changes.
- $ fly -t local set-pipeline \
- -p reconfigure-pipelines \
- -c pipelines/reconfigure-pipelines.yaml
-
- ...
- apply configuration? [yN]: y
+```shell-session
+$ fly -t local set-pipeline \
+ -p reconfigure-pipelines \
+ -c pipelines/reconfigure-pipelines.yaml
+
+...
+apply configuration? [yN]: y
+```
The parent pipeline should now look like this. Now the pipeline will first update itself and then update any existing child pipelines.
-
+{{< image src="/images/2020/08/set-self.png" alt="parent pipeline with config-self job" width="100%" >}}
Let's commit our changes, which will be a no-op since we've already updated the pipeline with the latest changes.
- $ git add pipelines/reconfigure-pipelines.yml
- $ git commit -m "add configure-self job"
- $ git push
+```shell-session
+$ git add pipelines/reconfigure-pipelines.yml
+$ git commit -m "add configure-self job"
+$ git push
+```
Now comes the real fun! To add a pipeline to Concourse all we need to do is add a `set_pipeline` step to the parent pipeline, commit it to the `concourse/examples` repo, and let the parent pipeline pick up the new commit and make the changes for us.
Lets add the `time-triggered` pipeline to our `reconfigure-pipelines.yml` file.
- resources:
- - name: concourse-examples
- type: git
- icon: github
- source:
- uri: git@github.com:USERNAME/examples.git
-
- jobs:
- - name: configure-self
- plan:
- - get: concourse-examples
- trigger: true
- - set_pipeline: reconfigure-pipelines
- file: concourse-examples/pipelines/reconfigure-pipelines.yml
- - name: configure-pipelines
- plan:
- - get: concourse-examples
- trigger: true
- passed: [configure-self]
- - set_pipeline: hello-world
- file: concourse-examples/pipelines/hello-world.yml
- - set_pipeline: time-triggered
- file: concourse-examples/pipelines/time-triggered.yml
+```yaml
+resources:
+- name: concourse-examples
+ type: git
+ icon: github
+ source:
+ uri: git@github.com:USERNAME/examples.git
+
+jobs:
+- name: configure-self
+ plan:
+ - get: concourse-examples
+ trigger: true
+ - set_pipeline: reconfigure-pipelines
+ file: concourse-examples/pipelines/reconfigure-pipelines.yml
+- name: configure-pipelines
+ plan:
+ - get: concourse-examples
+ trigger: true
+ passed: [configure-self]
+ - set_pipeline: hello-world
+ file: concourse-examples/pipelines/hello-world.yml
+ - set_pipeline: time-triggered
+ file: concourse-examples/pipelines/time-triggered.yml
+```
Commit and push the changes to github.
- $ git add pipelines/reconfigure-pipelines.yml
- $ git commit -m "add time-triggered pipeline"
- $ git push
+```shell-session
+$ git add pipelines/reconfigure-pipelines.yml
+$ git commit -m "add time-triggered pipeline"
+$ git push
+```
Once Concourse picks up the commit (may take up to a minute by default) you should see three pipelines on the dashboard. Now you never need to use `fly` to set pipelines!
-
+{{< image src="/images/2020/08/three-pipelines.png" alt="parent and child pipelines" width="100%" >}}
+
## Detour: A Future Alternative of Setting Pipelines
In the future there will be a different solution to setting parent pipelines: no more parent pipelines! How will Concourse eliminate the current need to start with a parent pipeline in order to set child pipelines? The answer is [RFC 32: Projects](https://github.com/concourse/rfcs/pull/32/).
@@ -219,33 +244,37 @@ A pipeline will only be considered for automatic archiving if it was previously
We can test this out with the parent pipeline we were just using. Let's remove the `hello-world` pipeline.
- resources:
- - name: concourse-examples
- type: git
- icon: github
- source:
- uri: git@github.com:USERNAME/examples.git
-
- jobs:
- - name: configure-self
- plan:
- - get: concourse-examples
- trigger: true
- - set_pipeline: reconfigure-pipelines
- file: concourse-examples/pipelines/reconfigure-pipelines.yml
- - name: configure-pipelines
- plan:
- - get: concourse-examples
- trigger: true
- passed: [configure-self]
- - set_pipeline: time-triggered
- file: concourse-examples/pipelines/time-triggered.yml
+```yaml
+resources:
+- name: concourse-examples
+ type: git
+ icon: github
+ source:
+ uri: git@github.com:USERNAME/examples.git
+
+jobs:
+- name: configure-self
+ plan:
+ - get: concourse-examples
+ trigger: true
+ - set_pipeline: reconfigure-pipelines
+ file: concourse-examples/pipelines/reconfigure-pipelines.yml
+- name: configure-pipelines
+ plan:
+ - get: concourse-examples
+ trigger: true
+ passed: [configure-self]
+ - set_pipeline: time-triggered
+ file: concourse-examples/pipelines/time-triggered.yml
+```
Commit and push the changes to github.
- $ git add pipelines/reconfigure-pipelines.yml
- $ git commit -m "remove hello-world pipeline"
- $ git push
+```shell-session
+$ git add pipelines/reconfigure-pipelines.yml
+$ git commit -m "remove hello-world pipeline"
+$ git push
+```
After a few seconds the pipeline should disappear from the dashboard (unless you toggle "show archived" on).
@@ -255,28 +284,28 @@ I suggest checking out the documentation for [`set_pipeline`](https://concourse-
## The Parent Pipeline Template (tl;dr)
- resources:
- - name: ci
- type: git
- icon: github
- source:
- uri: git@github.com:USERNAME/repo-where-pipelines-live.git
-
- jobs:
- - name: configure-self
- plan:
- - get: ci
- trigger: true
- - set_pipeline: self
- file: ci/path/to/parent-pipeline.yml
- - name: configure-pipelines
- plan:
- - get: ci
- trigger: true
- passed: [configure-self]
- - set_pipeline: some-pipeline
- file: ci/path/to/some-pipeline.yml
- - set_pipeline: another-pipeline
- file: ci/path/to/another-pipeline.yml
- `
-
+```yaml
+resources:
+- name: ci
+ type: git
+ icon: github
+ source:
+ uri: git@github.com:USERNAME/repo-where-pipelines-live.git
+
+jobs:
+- name: configure-self
+ plan:
+ - get: ci
+ trigger: true
+ - set_pipeline: self
+ file: ci/path/to/parent-pipeline.yml
+- name: configure-pipelines
+ plan:
+ - get: ci
+ trigger: true
+ passed: [configure-self]
+ - set_pipeline: some-pipeline
+ file: ci/path/to/some-pipeline.yml
+ - set_pipeline: another-pipeline
+ file: ci/path/to/another-pipeline.yml
+```
diff --git a/_posts/2020-12-29-running-docker-in-concourse.markdown b/content/posts/2020-12-29-running-docker-in-concourse.md
similarity index 96%
rename from _posts/2020-12-29-running-docker-in-concourse.markdown
rename to content/posts/2020-12-29-running-docker-in-concourse.md
index e613f4b..7475df5 100644
--- a/_posts/2020-12-29-running-docker-in-concourse.markdown
+++ b/content/posts/2020-12-29-running-docker-in-concourse.md
@@ -31,7 +31,7 @@ You can verify this by looking at the bash scripts for each of the above images
You should avoid having Docker fetch any images from inside your task step where you are running `docker-compose`. You should externalize these as [image resources](https://github.com/concourse/registry-image-resource) if they're a dependency of your application (e.g. Postgres, MySQL).
-For the container image that contains your application you should have that built in a previous [step](https://concourse-ci.org/jobs.html#schema.step) or [job](https://concourse-ci.org/pipelines.html#schema.pipeline.jobs). You can [build and publish an image]( __GHOST_URL__ /how-to-build-and-publish-a-container-image/) using the [oci-build task](https://github.com/vito/oci-build-task).
+For the container image that contains your application you should have that built in a previous [step](https://concourse-ci.org/jobs.html#schema.step) or [job](https://concourse-ci.org/pipelines.html#schema.pipeline.jobs). You can [build and publish an image](/posts/2020-06-19-how-to-build-and-publish-a-container-image/) using the [oci-build task](https://github.com/vito/oci-build-task).
To ensure Docker doesn't try to fetch the images itself you can use [`docker load`](https://docs.docker.com/engine/reference/commandline/load/) and [`docker tag`](https://docs.docker.com/engine/reference/commandline/tag/) to load your externalized images into Docker. [meAmidos's](https://github.com/meAmidos) has a great [example pipeline](https://github.com/meAmidos/dcind/blob/master/example/pipe.yml) that does exactly that.
diff --git a/hugo.yaml b/hugo.yaml
new file mode 100644
index 0000000..d957ede
--- /dev/null
+++ b/hugo.yaml
@@ -0,0 +1,4 @@
+baseURL: '/'
+languageCode: 'en-us'
+title: 'Concourse Blog'
+theme: 'concourse'
diff --git a/index.markdown b/index.markdown
deleted file mode 100644
index 0671507..0000000
--- a/index.markdown
+++ /dev/null
@@ -1,6 +0,0 @@
----
-# Feel free to add content and custom Front Matter to this file.
-# To modify the layout, see https://jekyllrb.com/docs/themes/#overriding-theme-defaults
-
-layout: home
----
diff --git a/layouts/.gitkeep b/layouts/.gitkeep
new file mode 100644
index 0000000..e69de29
diff --git a/assets/images/2019/06/CELLS-1.png b/static/images/2019/06/CELLS-1.png
similarity index 100%
rename from assets/images/2019/06/CELLS-1.png
rename to static/images/2019/06/CELLS-1.png
diff --git a/assets/images/2019/06/CELLS-2.png b/static/images/2019/06/CELLS-2.png
similarity index 100%
rename from assets/images/2019/06/CELLS-2.png
rename to static/images/2019/06/CELLS-2.png
diff --git a/assets/images/2019/06/CELLS-3.png b/static/images/2019/06/CELLS-3.png
similarity index 100%
rename from assets/images/2019/06/CELLS-3.png
rename to static/images/2019/06/CELLS-3.png
diff --git a/assets/images/2019/06/CELLS.png b/static/images/2019/06/CELLS.png
similarity index 100%
rename from assets/images/2019/06/CELLS.png
rename to static/images/2019/06/CELLS.png
diff --git a/assets/images/2019/06/CELLS_o-1.png b/static/images/2019/06/CELLS_o-1.png
similarity index 100%
rename from assets/images/2019/06/CELLS_o-1.png
rename to static/images/2019/06/CELLS_o-1.png
diff --git a/assets/images/2019/06/CELLS_o-2.png b/static/images/2019/06/CELLS_o-2.png
similarity index 100%
rename from assets/images/2019/06/CELLS_o-2.png
rename to static/images/2019/06/CELLS_o-2.png
diff --git a/assets/images/2019/06/CELLS_o-3.png b/static/images/2019/06/CELLS_o-3.png
similarity index 100%
rename from assets/images/2019/06/CELLS_o-3.png
rename to static/images/2019/06/CELLS_o-3.png
diff --git a/assets/images/2019/06/CELLS_o.png b/static/images/2019/06/CELLS_o.png
similarity index 100%
rename from assets/images/2019/06/CELLS_o.png
rename to static/images/2019/06/CELLS_o.png
diff --git a/assets/images/2019/06/Jun-27-2019-16-56-53-1.gif b/static/images/2019/06/Jun-27-2019-16-56-53-1.gif
similarity index 100%
rename from assets/images/2019/06/Jun-27-2019-16-56-53-1.gif
rename to static/images/2019/06/Jun-27-2019-16-56-53-1.gif
diff --git a/assets/images/2019/06/Jun-27-2019-16-56-53-2.gif b/static/images/2019/06/Jun-27-2019-16-56-53-2.gif
similarity index 100%
rename from assets/images/2019/06/Jun-27-2019-16-56-53-2.gif
rename to static/images/2019/06/Jun-27-2019-16-56-53-2.gif
diff --git a/assets/images/2019/06/Jun-27-2019-16-56-53.gif b/static/images/2019/06/Jun-27-2019-16-56-53.gif
similarity index 100%
rename from assets/images/2019/06/Jun-27-2019-16-56-53.gif
rename to static/images/2019/06/Jun-27-2019-16-56-53.gif
diff --git a/assets/images/2019/06/Jun-27-2019-16-58-01-1.gif b/static/images/2019/06/Jun-27-2019-16-58-01-1.gif
similarity index 100%
rename from assets/images/2019/06/Jun-27-2019-16-58-01-1.gif
rename to static/images/2019/06/Jun-27-2019-16-58-01-1.gif
diff --git a/assets/images/2019/06/Jun-27-2019-16-58-01.gif b/static/images/2019/06/Jun-27-2019-16-58-01.gif
similarity index 100%
rename from assets/images/2019/06/Jun-27-2019-16-58-01.gif
rename to static/images/2019/06/Jun-27-2019-16-58-01.gif
diff --git a/assets/images/2019/06/Screen-Shot-2018-11-12-at-11.44.32-AM.png b/static/images/2019/06/Screen-Shot-2018-11-12-at-11.44.32-AM.png
similarity index 100%
rename from assets/images/2019/06/Screen-Shot-2018-11-12-at-11.44.32-AM.png
rename to static/images/2019/06/Screen-Shot-2018-11-12-at-11.44.32-AM.png
diff --git a/assets/images/2019/06/Screen-Shot-2018-11-12-at-11.44.32-AM_o.png b/static/images/2019/06/Screen-Shot-2018-11-12-at-11.44.32-AM_o.png
similarity index 100%
rename from assets/images/2019/06/Screen-Shot-2018-11-12-at-11.44.32-AM_o.png
rename to static/images/2019/06/Screen-Shot-2018-11-12-at-11.44.32-AM_o.png
diff --git a/assets/images/2019/06/concourse_logo_blue_square.png b/static/images/2019/06/concourse_logo_blue_square.png
similarity index 100%
rename from assets/images/2019/06/concourse_logo_blue_square.png
rename to static/images/2019/06/concourse_logo_blue_square.png
diff --git a/assets/images/2019/06/concourse_logo_blue_square_o.png b/static/images/2019/06/concourse_logo_blue_square_o.png
similarity index 100%
rename from assets/images/2019/06/concourse_logo_blue_square_o.png
rename to static/images/2019/06/concourse_logo_blue_square_o.png
diff --git a/assets/images/2019/06/concourse_logo_blue_white_circle.png b/static/images/2019/06/concourse_logo_blue_white_circle.png
similarity index 100%
rename from assets/images/2019/06/concourse_logo_blue_white_circle.png
rename to static/images/2019/06/concourse_logo_blue_white_circle.png
diff --git a/assets/images/2019/06/concourse_logo_blue_white_circle_o.png b/static/images/2019/06/concourse_logo_blue_white_circle_o.png
similarity index 100%
rename from assets/images/2019/06/concourse_logo_blue_white_circle_o.png
rename to static/images/2019/06/concourse_logo_blue_white_circle_o.png
diff --git a/assets/images/2019/06/screenshot_2019-04-11_08.53.14.png b/static/images/2019/06/screenshot_2019-04-11_08.53.14.png
similarity index 100%
rename from assets/images/2019/06/screenshot_2019-04-11_08.53.14.png
rename to static/images/2019/06/screenshot_2019-04-11_08.53.14.png
diff --git a/assets/images/2019/06/screenshot_2019-04-11_08.53.14_o.png b/static/images/2019/06/screenshot_2019-04-11_08.53.14_o.png
similarity index 100%
rename from assets/images/2019/06/screenshot_2019-04-11_08.53.14_o.png
rename to static/images/2019/06/screenshot_2019-04-11_08.53.14_o.png
diff --git a/assets/images/2019/07/1-pjEzya_VmoSClRIGW8z38g.jpeg b/static/images/2019/07/1-pjEzya_VmoSClRIGW8z38g.jpeg
similarity index 100%
rename from assets/images/2019/07/1-pjEzya_VmoSClRIGW8z38g.jpeg
rename to static/images/2019/07/1-pjEzya_VmoSClRIGW8z38g.jpeg
diff --git a/assets/images/2019/07/1-pjEzya_VmoSClRIGW8z38g_o.jpeg b/static/images/2019/07/1-pjEzya_VmoSClRIGW8z38g_o.jpeg
similarity index 100%
rename from assets/images/2019/07/1-pjEzya_VmoSClRIGW8z38g_o.jpeg
rename to static/images/2019/07/1-pjEzya_VmoSClRIGW8z38g_o.jpeg
diff --git a/assets/images/2019/07/Screenshot-from-2019-07-16-11-49-33.png b/static/images/2019/07/Screenshot-from-2019-07-16-11-49-33.png
similarity index 100%
rename from assets/images/2019/07/Screenshot-from-2019-07-16-11-49-33.png
rename to static/images/2019/07/Screenshot-from-2019-07-16-11-49-33.png
diff --git a/assets/images/2019/07/Screenshot-from-2019-07-16-11-49-33_o.png b/static/images/2019/07/Screenshot-from-2019-07-16-11-49-33_o.png
similarity index 100%
rename from assets/images/2019/07/Screenshot-from-2019-07-16-11-49-33_o.png
rename to static/images/2019/07/Screenshot-from-2019-07-16-11-49-33_o.png
diff --git a/assets/images/2019/07/after-notifications.png b/static/images/2019/07/after-notifications.png
similarity index 100%
rename from assets/images/2019/07/after-notifications.png
rename to static/images/2019/07/after-notifications.png
diff --git a/assets/images/2019/07/after-notifications_o.png b/static/images/2019/07/after-notifications_o.png
similarity index 100%
rename from assets/images/2019/07/after-notifications_o.png
rename to static/images/2019/07/after-notifications_o.png
diff --git a/assets/images/2019/07/before-notifications-1.png b/static/images/2019/07/before-notifications-1.png
similarity index 100%
rename from assets/images/2019/07/before-notifications-1.png
rename to static/images/2019/07/before-notifications-1.png
diff --git a/assets/images/2019/07/before-notifications.png b/static/images/2019/07/before-notifications.png
similarity index 100%
rename from assets/images/2019/07/before-notifications.png
rename to static/images/2019/07/before-notifications.png
diff --git a/assets/images/2019/07/before-notifications_o-1.png b/static/images/2019/07/before-notifications_o-1.png
similarity index 100%
rename from assets/images/2019/07/before-notifications_o-1.png
rename to static/images/2019/07/before-notifications_o-1.png
diff --git a/assets/images/2019/07/before-notifications_o.png b/static/images/2019/07/before-notifications_o.png
similarity index 100%
rename from assets/images/2019/07/before-notifications_o.png
rename to static/images/2019/07/before-notifications_o.png
diff --git a/assets/images/2019/07/scaredy-cat-1.gif b/static/images/2019/07/scaredy-cat-1.gif
similarity index 100%
rename from assets/images/2019/07/scaredy-cat-1.gif
rename to static/images/2019/07/scaredy-cat-1.gif
diff --git a/assets/images/2019/07/scaredy-cat-2.gif b/static/images/2019/07/scaredy-cat-2.gif
similarity index 100%
rename from assets/images/2019/07/scaredy-cat-2.gif
rename to static/images/2019/07/scaredy-cat-2.gif
diff --git a/assets/images/2019/07/scaredy-cat.gif b/static/images/2019/07/scaredy-cat.gif
similarity index 100%
rename from assets/images/2019/07/scaredy-cat.gif
rename to static/images/2019/07/scaredy-cat.gif
diff --git a/assets/images/2019/08/Screen-Shot-2019-08-30-at-10.12.17-AM-1.png b/static/images/2019/08/Screen-Shot-2019-08-30-at-10.12.17-AM-1.png
similarity index 100%
rename from assets/images/2019/08/Screen-Shot-2019-08-30-at-10.12.17-AM-1.png
rename to static/images/2019/08/Screen-Shot-2019-08-30-at-10.12.17-AM-1.png
diff --git a/assets/images/2019/08/Screen-Shot-2019-08-30-at-10.12.17-AM-2.png b/static/images/2019/08/Screen-Shot-2019-08-30-at-10.12.17-AM-2.png
similarity index 100%
rename from assets/images/2019/08/Screen-Shot-2019-08-30-at-10.12.17-AM-2.png
rename to static/images/2019/08/Screen-Shot-2019-08-30-at-10.12.17-AM-2.png
diff --git a/assets/images/2019/08/Screen-Shot-2019-08-30-at-10.12.17-AM.png b/static/images/2019/08/Screen-Shot-2019-08-30-at-10.12.17-AM.png
similarity index 100%
rename from assets/images/2019/08/Screen-Shot-2019-08-30-at-10.12.17-AM.png
rename to static/images/2019/08/Screen-Shot-2019-08-30-at-10.12.17-AM.png
diff --git a/assets/images/2019/08/Screen-Shot-2019-08-30-at-10.12.17-AM_o-1.png b/static/images/2019/08/Screen-Shot-2019-08-30-at-10.12.17-AM_o-1.png
similarity index 100%
rename from assets/images/2019/08/Screen-Shot-2019-08-30-at-10.12.17-AM_o-1.png
rename to static/images/2019/08/Screen-Shot-2019-08-30-at-10.12.17-AM_o-1.png
diff --git a/assets/images/2019/08/Screen-Shot-2019-08-30-at-10.12.17-AM_o-2.png b/static/images/2019/08/Screen-Shot-2019-08-30-at-10.12.17-AM_o-2.png
similarity index 100%
rename from assets/images/2019/08/Screen-Shot-2019-08-30-at-10.12.17-AM_o-2.png
rename to static/images/2019/08/Screen-Shot-2019-08-30-at-10.12.17-AM_o-2.png
diff --git a/assets/images/2019/08/Screen-Shot-2019-08-30-at-10.12.17-AM_o.png b/static/images/2019/08/Screen-Shot-2019-08-30-at-10.12.17-AM_o.png
similarity index 100%
rename from assets/images/2019/08/Screen-Shot-2019-08-30-at-10.12.17-AM_o.png
rename to static/images/2019/08/Screen-Shot-2019-08-30-at-10.12.17-AM_o.png
diff --git a/assets/images/2019/08/Screen-Shot-2019-08-30-at-10.13.09-AM.png b/static/images/2019/08/Screen-Shot-2019-08-30-at-10.13.09-AM.png
similarity index 100%
rename from assets/images/2019/08/Screen-Shot-2019-08-30-at-10.13.09-AM.png
rename to static/images/2019/08/Screen-Shot-2019-08-30-at-10.13.09-AM.png
diff --git a/assets/images/2019/08/Screen-Shot-2019-08-30-at-10.13.09-AM_o.png b/static/images/2019/08/Screen-Shot-2019-08-30-at-10.13.09-AM_o.png
similarity index 100%
rename from assets/images/2019/08/Screen-Shot-2019-08-30-at-10.13.09-AM_o.png
rename to static/images/2019/08/Screen-Shot-2019-08-30-at-10.13.09-AM_o.png
diff --git a/assets/images/2019/08/Screen-Shot-2019-08-30-at-10.27.27-AM.png b/static/images/2019/08/Screen-Shot-2019-08-30-at-10.27.27-AM.png
similarity index 100%
rename from assets/images/2019/08/Screen-Shot-2019-08-30-at-10.27.27-AM.png
rename to static/images/2019/08/Screen-Shot-2019-08-30-at-10.27.27-AM.png
diff --git a/assets/images/2019/08/Screen-Shot-2019-08-30-at-10.27.27-AM_o.png b/static/images/2019/08/Screen-Shot-2019-08-30-at-10.27.27-AM_o.png
similarity index 100%
rename from assets/images/2019/08/Screen-Shot-2019-08-30-at-10.27.27-AM_o.png
rename to static/images/2019/08/Screen-Shot-2019-08-30-at-10.27.27-AM_o.png
diff --git a/assets/images/2019/09/image-1.png b/static/images/2019/09/image-1.png
similarity index 100%
rename from assets/images/2019/09/image-1.png
rename to static/images/2019/09/image-1.png
diff --git a/assets/images/2019/09/image.png b/static/images/2019/09/image.png
similarity index 100%
rename from assets/images/2019/09/image.png
rename to static/images/2019/09/image.png
diff --git a/assets/images/2019/09/image_o-1.png b/static/images/2019/09/image_o-1.png
similarity index 100%
rename from assets/images/2019/09/image_o-1.png
rename to static/images/2019/09/image_o-1.png
diff --git a/assets/images/2019/09/image_o.png b/static/images/2019/09/image_o.png
similarity index 100%
rename from assets/images/2019/09/image_o.png
rename to static/images/2019/09/image_o.png
diff --git a/assets/images/2019/10/image-1.png b/static/images/2019/10/image-1.png
similarity index 100%
rename from assets/images/2019/10/image-1.png
rename to static/images/2019/10/image-1.png
diff --git a/assets/images/2019/10/image-2.png b/static/images/2019/10/image-2.png
similarity index 100%
rename from assets/images/2019/10/image-2.png
rename to static/images/2019/10/image-2.png
diff --git a/assets/images/2019/10/image-3.png b/static/images/2019/10/image-3.png
similarity index 100%
rename from assets/images/2019/10/image-3.png
rename to static/images/2019/10/image-3.png
diff --git a/assets/images/2019/10/image-4.png b/static/images/2019/10/image-4.png
similarity index 100%
rename from assets/images/2019/10/image-4.png
rename to static/images/2019/10/image-4.png
diff --git a/assets/images/2019/10/image.png b/static/images/2019/10/image.png
similarity index 100%
rename from assets/images/2019/10/image.png
rename to static/images/2019/10/image.png
diff --git a/assets/images/2019/10/image_o-1.png b/static/images/2019/10/image_o-1.png
similarity index 100%
rename from assets/images/2019/10/image_o-1.png
rename to static/images/2019/10/image_o-1.png
diff --git a/assets/images/2019/10/image_o-2.png b/static/images/2019/10/image_o-2.png
similarity index 100%
rename from assets/images/2019/10/image_o-2.png
rename to static/images/2019/10/image_o-2.png
diff --git a/assets/images/2019/10/image_o-3.png b/static/images/2019/10/image_o-3.png
similarity index 100%
rename from assets/images/2019/10/image_o-3.png
rename to static/images/2019/10/image_o-3.png
diff --git a/assets/images/2019/10/image_o-4.png b/static/images/2019/10/image_o-4.png
similarity index 100%
rename from assets/images/2019/10/image_o-4.png
rename to static/images/2019/10/image_o-4.png
diff --git a/assets/images/2019/10/image_o.png b/static/images/2019/10/image_o.png
similarity index 100%
rename from assets/images/2019/10/image_o.png
rename to static/images/2019/10/image_o.png
diff --git a/assets/images/2019/11/image-1.png b/static/images/2019/11/image-1.png
similarity index 100%
rename from assets/images/2019/11/image-1.png
rename to static/images/2019/11/image-1.png
diff --git a/assets/images/2019/11/image-2.png b/static/images/2019/11/image-2.png
similarity index 100%
rename from assets/images/2019/11/image-2.png
rename to static/images/2019/11/image-2.png
diff --git a/assets/images/2019/11/image-3.png b/static/images/2019/11/image-3.png
similarity index 100%
rename from assets/images/2019/11/image-3.png
rename to static/images/2019/11/image-3.png
diff --git a/assets/images/2019/11/image-4.png b/static/images/2019/11/image-4.png
similarity index 100%
rename from assets/images/2019/11/image-4.png
rename to static/images/2019/11/image-4.png
diff --git a/assets/images/2019/11/image-5.png b/static/images/2019/11/image-5.png
similarity index 100%
rename from assets/images/2019/11/image-5.png
rename to static/images/2019/11/image-5.png
diff --git a/assets/images/2019/11/image.png b/static/images/2019/11/image.png
similarity index 100%
rename from assets/images/2019/11/image.png
rename to static/images/2019/11/image.png
diff --git a/assets/images/2019/11/image_o-1.png b/static/images/2019/11/image_o-1.png
similarity index 100%
rename from assets/images/2019/11/image_o-1.png
rename to static/images/2019/11/image_o-1.png
diff --git a/assets/images/2019/11/image_o-2.png b/static/images/2019/11/image_o-2.png
similarity index 100%
rename from assets/images/2019/11/image_o-2.png
rename to static/images/2019/11/image_o-2.png
diff --git a/assets/images/2019/11/image_o-3.png b/static/images/2019/11/image_o-3.png
similarity index 100%
rename from assets/images/2019/11/image_o-3.png
rename to static/images/2019/11/image_o-3.png
diff --git a/assets/images/2019/11/image_o-4.png b/static/images/2019/11/image_o-4.png
similarity index 100%
rename from assets/images/2019/11/image_o-4.png
rename to static/images/2019/11/image_o-4.png
diff --git a/assets/images/2019/11/image_o-5.png b/static/images/2019/11/image_o-5.png
similarity index 100%
rename from assets/images/2019/11/image_o-5.png
rename to static/images/2019/11/image_o-5.png
diff --git a/assets/images/2019/11/image_o.png b/static/images/2019/11/image_o.png
similarity index 100%
rename from assets/images/2019/11/image_o.png
rename to static/images/2019/11/image_o.png
diff --git a/assets/images/2020/01/T024LQKAS-UC30BHCRL-8218d25f0fe7-512.jpg b/static/images/2020/01/T024LQKAS-UC30BHCRL-8218d25f0fe7-512.jpg
similarity index 100%
rename from assets/images/2020/01/T024LQKAS-UC30BHCRL-8218d25f0fe7-512.jpg
rename to static/images/2020/01/T024LQKAS-UC30BHCRL-8218d25f0fe7-512.jpg
diff --git a/assets/images/2020/01/T024LQKAS-UC30BHCRL-8218d25f0fe7-512_o.jpg b/static/images/2020/01/T024LQKAS-UC30BHCRL-8218d25f0fe7-512_o.jpg
similarity index 100%
rename from assets/images/2020/01/T024LQKAS-UC30BHCRL-8218d25f0fe7-512_o.jpg
rename to static/images/2020/01/T024LQKAS-UC30BHCRL-8218d25f0fe7-512_o.jpg
diff --git a/assets/images/2020/03/Screen-Shot-2020-03-19-at-10.41.42-AM-1.png b/static/images/2020/03/Screen-Shot-2020-03-19-at-10.41.42-AM-1.png
similarity index 100%
rename from assets/images/2020/03/Screen-Shot-2020-03-19-at-10.41.42-AM-1.png
rename to static/images/2020/03/Screen-Shot-2020-03-19-at-10.41.42-AM-1.png
diff --git a/assets/images/2020/03/Screen-Shot-2020-03-19-at-10.41.42-AM.png b/static/images/2020/03/Screen-Shot-2020-03-19-at-10.41.42-AM.png
similarity index 100%
rename from assets/images/2020/03/Screen-Shot-2020-03-19-at-10.41.42-AM.png
rename to static/images/2020/03/Screen-Shot-2020-03-19-at-10.41.42-AM.png
diff --git a/assets/images/2020/03/Screen-Shot-2020-03-19-at-10.41.42-AM_o-1.png b/static/images/2020/03/Screen-Shot-2020-03-19-at-10.41.42-AM_o-1.png
similarity index 100%
rename from assets/images/2020/03/Screen-Shot-2020-03-19-at-10.41.42-AM_o-1.png
rename to static/images/2020/03/Screen-Shot-2020-03-19-at-10.41.42-AM_o-1.png
diff --git a/assets/images/2020/03/Screen-Shot-2020-03-19-at-10.41.42-AM_o.png b/static/images/2020/03/Screen-Shot-2020-03-19-at-10.41.42-AM_o.png
similarity index 100%
rename from assets/images/2020/03/Screen-Shot-2020-03-19-at-10.41.42-AM_o.png
rename to static/images/2020/03/Screen-Shot-2020-03-19-at-10.41.42-AM_o.png
diff --git a/assets/images/2020/03/Screen-Shot-2020-03-20-at-12.08.28-PM.png b/static/images/2020/03/Screen-Shot-2020-03-20-at-12.08.28-PM.png
similarity index 100%
rename from assets/images/2020/03/Screen-Shot-2020-03-20-at-12.08.28-PM.png
rename to static/images/2020/03/Screen-Shot-2020-03-20-at-12.08.28-PM.png
diff --git a/assets/images/2020/03/Screen-Shot-2020-03-20-at-12.08.28-PM_o.png b/static/images/2020/03/Screen-Shot-2020-03-20-at-12.08.28-PM_o.png
similarity index 100%
rename from assets/images/2020/03/Screen-Shot-2020-03-20-at-12.08.28-PM_o.png
rename to static/images/2020/03/Screen-Shot-2020-03-20-at-12.08.28-PM_o.png
diff --git a/assets/images/2020/03/Screen-Shot-2020-03-23-at-1.56.04-PM.png b/static/images/2020/03/Screen-Shot-2020-03-23-at-1.56.04-PM.png
similarity index 100%
rename from assets/images/2020/03/Screen-Shot-2020-03-23-at-1.56.04-PM.png
rename to static/images/2020/03/Screen-Shot-2020-03-23-at-1.56.04-PM.png
diff --git a/assets/images/2020/03/Screen-Shot-2020-03-23-at-1.56.04-PM_o.png b/static/images/2020/03/Screen-Shot-2020-03-23-at-1.56.04-PM_o.png
similarity index 100%
rename from assets/images/2020/03/Screen-Shot-2020-03-23-at-1.56.04-PM_o.png
rename to static/images/2020/03/Screen-Shot-2020-03-23-at-1.56.04-PM_o.png
diff --git a/assets/images/2020/03/why-concourse.png b/static/images/2020/03/why-concourse.png
similarity index 100%
rename from assets/images/2020/03/why-concourse.png
rename to static/images/2020/03/why-concourse.png
diff --git a/assets/images/2020/03/why-concourse_o.png b/static/images/2020/03/why-concourse_o.png
similarity index 100%
rename from assets/images/2020/03/why-concourse_o.png
rename to static/images/2020/03/why-concourse_o.png
diff --git a/assets/images/2020/03/whyconcourse.png b/static/images/2020/03/whyconcourse.png
similarity index 100%
rename from assets/images/2020/03/whyconcourse.png
rename to static/images/2020/03/whyconcourse.png
diff --git a/assets/images/2020/03/whyconcourse2.png b/static/images/2020/03/whyconcourse2.png
similarity index 100%
rename from assets/images/2020/03/whyconcourse2.png
rename to static/images/2020/03/whyconcourse2.png
diff --git a/assets/images/2020/03/whyconcourse2_o.png b/static/images/2020/03/whyconcourse2_o.png
similarity index 100%
rename from assets/images/2020/03/whyconcourse2_o.png
rename to static/images/2020/03/whyconcourse2_o.png
diff --git a/assets/images/2020/03/whyconcourse_o.png b/static/images/2020/03/whyconcourse_o.png
similarity index 100%
rename from assets/images/2020/03/whyconcourse_o.png
rename to static/images/2020/03/whyconcourse_o.png
diff --git a/assets/images/2020/04/Screen-Shot-2020-04-14-at-10.49.17-AM.png b/static/images/2020/04/Screen-Shot-2020-04-14-at-10.49.17-AM.png
similarity index 100%
rename from assets/images/2020/04/Screen-Shot-2020-04-14-at-10.49.17-AM.png
rename to static/images/2020/04/Screen-Shot-2020-04-14-at-10.49.17-AM.png
diff --git a/assets/images/2020/04/Screen-Shot-2020-04-14-at-10.49.17-AM_o.png b/static/images/2020/04/Screen-Shot-2020-04-14-at-10.49.17-AM_o.png
similarity index 100%
rename from assets/images/2020/04/Screen-Shot-2020-04-14-at-10.49.17-AM_o.png
rename to static/images/2020/04/Screen-Shot-2020-04-14-at-10.49.17-AM_o.png
diff --git a/assets/images/2020/04/Screen-Shot-2020-04-14-at-10.50.18-AM.png b/static/images/2020/04/Screen-Shot-2020-04-14-at-10.50.18-AM.png
similarity index 100%
rename from assets/images/2020/04/Screen-Shot-2020-04-14-at-10.50.18-AM.png
rename to static/images/2020/04/Screen-Shot-2020-04-14-at-10.50.18-AM.png
diff --git a/assets/images/2020/04/Screen-Shot-2020-04-14-at-10.50.18-AM_o.png b/static/images/2020/04/Screen-Shot-2020-04-14-at-10.50.18-AM_o.png
similarity index 100%
rename from assets/images/2020/04/Screen-Shot-2020-04-14-at-10.50.18-AM_o.png
rename to static/images/2020/04/Screen-Shot-2020-04-14-at-10.50.18-AM_o.png
diff --git a/assets/images/2020/04/Screen-Shot-2020-04-14-at-10.52.02-AM.png b/static/images/2020/04/Screen-Shot-2020-04-14-at-10.52.02-AM.png
similarity index 100%
rename from assets/images/2020/04/Screen-Shot-2020-04-14-at-10.52.02-AM.png
rename to static/images/2020/04/Screen-Shot-2020-04-14-at-10.52.02-AM.png
diff --git a/assets/images/2020/04/Screen-Shot-2020-04-14-at-10.52.02-AM_o.png b/static/images/2020/04/Screen-Shot-2020-04-14-at-10.52.02-AM_o.png
similarity index 100%
rename from assets/images/2020/04/Screen-Shot-2020-04-14-at-10.52.02-AM_o.png
rename to static/images/2020/04/Screen-Shot-2020-04-14-at-10.52.02-AM_o.png
diff --git a/assets/images/2020/04/Screen-Shot-2020-04-14-at-10.55.47-AM.png b/static/images/2020/04/Screen-Shot-2020-04-14-at-10.55.47-AM.png
similarity index 100%
rename from assets/images/2020/04/Screen-Shot-2020-04-14-at-10.55.47-AM.png
rename to static/images/2020/04/Screen-Shot-2020-04-14-at-10.55.47-AM.png
diff --git a/assets/images/2020/04/Screen-Shot-2020-04-14-at-10.55.47-AM_o.png b/static/images/2020/04/Screen-Shot-2020-04-14-at-10.55.47-AM_o.png
similarity index 100%
rename from assets/images/2020/04/Screen-Shot-2020-04-14-at-10.55.47-AM_o.png
rename to static/images/2020/04/Screen-Shot-2020-04-14-at-10.55.47-AM_o.png
diff --git a/assets/images/2020/04/Screen-Shot-2020-04-14-at-10.57.42-AM.png b/static/images/2020/04/Screen-Shot-2020-04-14-at-10.57.42-AM.png
similarity index 100%
rename from assets/images/2020/04/Screen-Shot-2020-04-14-at-10.57.42-AM.png
rename to static/images/2020/04/Screen-Shot-2020-04-14-at-10.57.42-AM.png
diff --git a/assets/images/2020/04/Screen-Shot-2020-04-14-at-10.57.42-AM_o.png b/static/images/2020/04/Screen-Shot-2020-04-14-at-10.57.42-AM_o.png
similarity index 100%
rename from assets/images/2020/04/Screen-Shot-2020-04-14-at-10.57.42-AM_o.png
rename to static/images/2020/04/Screen-Shot-2020-04-14-at-10.57.42-AM_o.png
diff --git a/assets/images/2020/04/Screen-Shot-2020-04-14-at-11.05.20-AM.png b/static/images/2020/04/Screen-Shot-2020-04-14-at-11.05.20-AM.png
similarity index 100%
rename from assets/images/2020/04/Screen-Shot-2020-04-14-at-11.05.20-AM.png
rename to static/images/2020/04/Screen-Shot-2020-04-14-at-11.05.20-AM.png
diff --git a/assets/images/2020/04/Screen-Shot-2020-04-14-at-11.05.20-AM_o.png b/static/images/2020/04/Screen-Shot-2020-04-14-at-11.05.20-AM_o.png
similarity index 100%
rename from assets/images/2020/04/Screen-Shot-2020-04-14-at-11.05.20-AM_o.png
rename to static/images/2020/04/Screen-Shot-2020-04-14-at-11.05.20-AM_o.png
diff --git a/assets/images/2020/04/Screen-Shot-2020-04-14-at-11.06.11-AM.png b/static/images/2020/04/Screen-Shot-2020-04-14-at-11.06.11-AM.png
similarity index 100%
rename from assets/images/2020/04/Screen-Shot-2020-04-14-at-11.06.11-AM.png
rename to static/images/2020/04/Screen-Shot-2020-04-14-at-11.06.11-AM.png
diff --git a/assets/images/2020/04/Screen-Shot-2020-04-14-at-11.06.11-AM_o.png b/static/images/2020/04/Screen-Shot-2020-04-14-at-11.06.11-AM_o.png
similarity index 100%
rename from assets/images/2020/04/Screen-Shot-2020-04-14-at-11.06.11-AM_o.png
rename to static/images/2020/04/Screen-Shot-2020-04-14-at-11.06.11-AM_o.png
diff --git a/assets/images/2020/04/Screen-Shot-2020-04-14-at-11.07.20-AM.png b/static/images/2020/04/Screen-Shot-2020-04-14-at-11.07.20-AM.png
similarity index 100%
rename from assets/images/2020/04/Screen-Shot-2020-04-14-at-11.07.20-AM.png
rename to static/images/2020/04/Screen-Shot-2020-04-14-at-11.07.20-AM.png
diff --git a/assets/images/2020/04/Screen-Shot-2020-04-14-at-11.07.20-AM_o.png b/static/images/2020/04/Screen-Shot-2020-04-14-at-11.07.20-AM_o.png
similarity index 100%
rename from assets/images/2020/04/Screen-Shot-2020-04-14-at-11.07.20-AM_o.png
rename to static/images/2020/04/Screen-Shot-2020-04-14-at-11.07.20-AM_o.png
diff --git a/assets/images/2020/04/Screen-Shot-2020-04-14-at-11.08.12-AM.png b/static/images/2020/04/Screen-Shot-2020-04-14-at-11.08.12-AM.png
similarity index 100%
rename from assets/images/2020/04/Screen-Shot-2020-04-14-at-11.08.12-AM.png
rename to static/images/2020/04/Screen-Shot-2020-04-14-at-11.08.12-AM.png
diff --git a/assets/images/2020/04/Screen-Shot-2020-04-14-at-11.08.12-AM_o.png b/static/images/2020/04/Screen-Shot-2020-04-14-at-11.08.12-AM_o.png
similarity index 100%
rename from assets/images/2020/04/Screen-Shot-2020-04-14-at-11.08.12-AM_o.png
rename to static/images/2020/04/Screen-Shot-2020-04-14-at-11.08.12-AM_o.png
diff --git a/assets/images/2020/04/Screen-Shot-2020-04-14-at-11.14.59-AM.png b/static/images/2020/04/Screen-Shot-2020-04-14-at-11.14.59-AM.png
similarity index 100%
rename from assets/images/2020/04/Screen-Shot-2020-04-14-at-11.14.59-AM.png
rename to static/images/2020/04/Screen-Shot-2020-04-14-at-11.14.59-AM.png
diff --git a/assets/images/2020/04/Screen-Shot-2020-04-14-at-11.14.59-AM_o.png b/static/images/2020/04/Screen-Shot-2020-04-14-at-11.14.59-AM_o.png
similarity index 100%
rename from assets/images/2020/04/Screen-Shot-2020-04-14-at-11.14.59-AM_o.png
rename to static/images/2020/04/Screen-Shot-2020-04-14-at-11.14.59-AM_o.png
diff --git a/assets/images/2020/04/Screen-Shot-2020-04-23-at-14.12.56.png b/static/images/2020/04/Screen-Shot-2020-04-23-at-14.12.56.png
similarity index 100%
rename from assets/images/2020/04/Screen-Shot-2020-04-23-at-14.12.56.png
rename to static/images/2020/04/Screen-Shot-2020-04-23-at-14.12.56.png
diff --git a/assets/images/2020/04/Screen-Shot-2020-04-23-at-14.12.56_o.png b/static/images/2020/04/Screen-Shot-2020-04-23-at-14.12.56_o.png
similarity index 100%
rename from assets/images/2020/04/Screen-Shot-2020-04-23-at-14.12.56_o.png
rename to static/images/2020/04/Screen-Shot-2020-04-23-at-14.12.56_o.png
diff --git a/assets/images/2020/04/Screen-Shot-2020-04-23-at-14.13.25-1.png b/static/images/2020/04/Screen-Shot-2020-04-23-at-14.13.25-1.png
similarity index 100%
rename from assets/images/2020/04/Screen-Shot-2020-04-23-at-14.13.25-1.png
rename to static/images/2020/04/Screen-Shot-2020-04-23-at-14.13.25-1.png
diff --git a/assets/images/2020/04/Screen-Shot-2020-04-23-at-14.13.25.png b/static/images/2020/04/Screen-Shot-2020-04-23-at-14.13.25.png
similarity index 100%
rename from assets/images/2020/04/Screen-Shot-2020-04-23-at-14.13.25.png
rename to static/images/2020/04/Screen-Shot-2020-04-23-at-14.13.25.png
diff --git a/assets/images/2020/04/Screen-Shot-2020-04-23-at-14.13.25_o-1.png b/static/images/2020/04/Screen-Shot-2020-04-23-at-14.13.25_o-1.png
similarity index 100%
rename from assets/images/2020/04/Screen-Shot-2020-04-23-at-14.13.25_o-1.png
rename to static/images/2020/04/Screen-Shot-2020-04-23-at-14.13.25_o-1.png
diff --git a/assets/images/2020/04/Screen-Shot-2020-04-23-at-14.13.25_o.png b/static/images/2020/04/Screen-Shot-2020-04-23-at-14.13.25_o.png
similarity index 100%
rename from assets/images/2020/04/Screen-Shot-2020-04-23-at-14.13.25_o.png
rename to static/images/2020/04/Screen-Shot-2020-04-23-at-14.13.25_o.png
diff --git a/assets/images/2020/04/Screen-Shot-2020-04-23-at-14.13.46.png b/static/images/2020/04/Screen-Shot-2020-04-23-at-14.13.46.png
similarity index 100%
rename from assets/images/2020/04/Screen-Shot-2020-04-23-at-14.13.46.png
rename to static/images/2020/04/Screen-Shot-2020-04-23-at-14.13.46.png
diff --git a/assets/images/2020/04/Screen-Shot-2020-04-23-at-14.13.46_o.png b/static/images/2020/04/Screen-Shot-2020-04-23-at-14.13.46_o.png
similarity index 100%
rename from assets/images/2020/04/Screen-Shot-2020-04-23-at-14.13.46_o.png
rename to static/images/2020/04/Screen-Shot-2020-04-23-at-14.13.46_o.png
diff --git a/assets/images/2020/04/Screen-Shot-2020-04-23-at-14.14.19.png b/static/images/2020/04/Screen-Shot-2020-04-23-at-14.14.19.png
similarity index 100%
rename from assets/images/2020/04/Screen-Shot-2020-04-23-at-14.14.19.png
rename to static/images/2020/04/Screen-Shot-2020-04-23-at-14.14.19.png
diff --git a/assets/images/2020/04/Screen-Shot-2020-04-23-at-14.14.19_o.png b/static/images/2020/04/Screen-Shot-2020-04-23-at-14.14.19_o.png
similarity index 100%
rename from assets/images/2020/04/Screen-Shot-2020-04-23-at-14.14.19_o.png
rename to static/images/2020/04/Screen-Shot-2020-04-23-at-14.14.19_o.png
diff --git a/assets/images/2020/04/Screen-Shot-2020-04-23-at-14.14.47.png b/static/images/2020/04/Screen-Shot-2020-04-23-at-14.14.47.png
similarity index 100%
rename from assets/images/2020/04/Screen-Shot-2020-04-23-at-14.14.47.png
rename to static/images/2020/04/Screen-Shot-2020-04-23-at-14.14.47.png
diff --git a/assets/images/2020/04/Screen-Shot-2020-04-23-at-14.14.47_o.png b/static/images/2020/04/Screen-Shot-2020-04-23-at-14.14.47_o.png
similarity index 100%
rename from assets/images/2020/04/Screen-Shot-2020-04-23-at-14.14.47_o.png
rename to static/images/2020/04/Screen-Shot-2020-04-23-at-14.14.47_o.png
diff --git a/assets/images/2020/04/Screen-Shot-2020-04-23-at-14.15.10.png b/static/images/2020/04/Screen-Shot-2020-04-23-at-14.15.10.png
similarity index 100%
rename from assets/images/2020/04/Screen-Shot-2020-04-23-at-14.15.10.png
rename to static/images/2020/04/Screen-Shot-2020-04-23-at-14.15.10.png
diff --git a/assets/images/2020/04/Screen-Shot-2020-04-23-at-14.15.10_o.png b/static/images/2020/04/Screen-Shot-2020-04-23-at-14.15.10_o.png
similarity index 100%
rename from assets/images/2020/04/Screen-Shot-2020-04-23-at-14.15.10_o.png
rename to static/images/2020/04/Screen-Shot-2020-04-23-at-14.15.10_o.png
diff --git a/assets/images/2020/04/Screen-Shot-2020-04-23-at-14.17.01.png b/static/images/2020/04/Screen-Shot-2020-04-23-at-14.17.01.png
similarity index 100%
rename from assets/images/2020/04/Screen-Shot-2020-04-23-at-14.17.01.png
rename to static/images/2020/04/Screen-Shot-2020-04-23-at-14.17.01.png
diff --git a/assets/images/2020/04/Screen-Shot-2020-04-23-at-14.17.01_o.png b/static/images/2020/04/Screen-Shot-2020-04-23-at-14.17.01_o.png
similarity index 100%
rename from assets/images/2020/04/Screen-Shot-2020-04-23-at-14.17.01_o.png
rename to static/images/2020/04/Screen-Shot-2020-04-23-at-14.17.01_o.png
diff --git a/assets/images/2020/04/Screen-Shot-2020-04-23-at-14.18.51.png b/static/images/2020/04/Screen-Shot-2020-04-23-at-14.18.51.png
similarity index 100%
rename from assets/images/2020/04/Screen-Shot-2020-04-23-at-14.18.51.png
rename to static/images/2020/04/Screen-Shot-2020-04-23-at-14.18.51.png
diff --git a/assets/images/2020/04/Screen-Shot-2020-04-23-at-14.18.51_o.png b/static/images/2020/04/Screen-Shot-2020-04-23-at-14.18.51_o.png
similarity index 100%
rename from assets/images/2020/04/Screen-Shot-2020-04-23-at-14.18.51_o.png
rename to static/images/2020/04/Screen-Shot-2020-04-23-at-14.18.51_o.png
diff --git a/assets/images/2020/04/Screen-Shot-2020-04-23-at-14.23.41.png b/static/images/2020/04/Screen-Shot-2020-04-23-at-14.23.41.png
similarity index 100%
rename from assets/images/2020/04/Screen-Shot-2020-04-23-at-14.23.41.png
rename to static/images/2020/04/Screen-Shot-2020-04-23-at-14.23.41.png
diff --git a/assets/images/2020/04/Screen-Shot-2020-04-23-at-14.23.41_o.png b/static/images/2020/04/Screen-Shot-2020-04-23-at-14.23.41_o.png
similarity index 100%
rename from assets/images/2020/04/Screen-Shot-2020-04-23-at-14.23.41_o.png
rename to static/images/2020/04/Screen-Shot-2020-04-23-at-14.23.41_o.png
diff --git a/assets/images/2020/05/Screen-Shot-2020-05-14-at-1.10.07-PM.png b/static/images/2020/05/Screen-Shot-2020-05-14-at-1.10.07-PM.png
similarity index 100%
rename from assets/images/2020/05/Screen-Shot-2020-05-14-at-1.10.07-PM.png
rename to static/images/2020/05/Screen-Shot-2020-05-14-at-1.10.07-PM.png
diff --git a/assets/images/2020/05/Screen-Shot-2020-05-14-at-1.10.07-PM_o.png b/static/images/2020/05/Screen-Shot-2020-05-14-at-1.10.07-PM_o.png
similarity index 100%
rename from assets/images/2020/05/Screen-Shot-2020-05-14-at-1.10.07-PM_o.png
rename to static/images/2020/05/Screen-Shot-2020-05-14-at-1.10.07-PM_o.png
diff --git a/assets/images/2020/05/Screen-Shot-2020-05-14-at-11.22.23-AM.png b/static/images/2020/05/Screen-Shot-2020-05-14-at-11.22.23-AM.png
similarity index 100%
rename from assets/images/2020/05/Screen-Shot-2020-05-14-at-11.22.23-AM.png
rename to static/images/2020/05/Screen-Shot-2020-05-14-at-11.22.23-AM.png
diff --git a/assets/images/2020/05/Screen-Shot-2020-05-14-at-11.22.23-AM_o.png b/static/images/2020/05/Screen-Shot-2020-05-14-at-11.22.23-AM_o.png
similarity index 100%
rename from assets/images/2020/05/Screen-Shot-2020-05-14-at-11.22.23-AM_o.png
rename to static/images/2020/05/Screen-Shot-2020-05-14-at-11.22.23-AM_o.png
diff --git a/assets/images/2020/05/Screen-Shot-2020-05-14-at-11.22.53-AM.png b/static/images/2020/05/Screen-Shot-2020-05-14-at-11.22.53-AM.png
similarity index 100%
rename from assets/images/2020/05/Screen-Shot-2020-05-14-at-11.22.53-AM.png
rename to static/images/2020/05/Screen-Shot-2020-05-14-at-11.22.53-AM.png
diff --git a/assets/images/2020/05/Screen-Shot-2020-05-14-at-11.22.53-AM_o.png b/static/images/2020/05/Screen-Shot-2020-05-14-at-11.22.53-AM_o.png
similarity index 100%
rename from assets/images/2020/05/Screen-Shot-2020-05-14-at-11.22.53-AM_o.png
rename to static/images/2020/05/Screen-Shot-2020-05-14-at-11.22.53-AM_o.png
diff --git a/assets/images/2020/05/Screen-Shot-2020-05-14-at-11.23.29-AM.png b/static/images/2020/05/Screen-Shot-2020-05-14-at-11.23.29-AM.png
similarity index 100%
rename from assets/images/2020/05/Screen-Shot-2020-05-14-at-11.23.29-AM.png
rename to static/images/2020/05/Screen-Shot-2020-05-14-at-11.23.29-AM.png
diff --git a/assets/images/2020/05/Screen-Shot-2020-05-14-at-11.23.29-AM_o.png b/static/images/2020/05/Screen-Shot-2020-05-14-at-11.23.29-AM_o.png
similarity index 100%
rename from assets/images/2020/05/Screen-Shot-2020-05-14-at-11.23.29-AM_o.png
rename to static/images/2020/05/Screen-Shot-2020-05-14-at-11.23.29-AM_o.png
diff --git a/assets/images/2020/05/Screen-Shot-2020-05-14-at-11.23.48-AM.png b/static/images/2020/05/Screen-Shot-2020-05-14-at-11.23.48-AM.png
similarity index 100%
rename from assets/images/2020/05/Screen-Shot-2020-05-14-at-11.23.48-AM.png
rename to static/images/2020/05/Screen-Shot-2020-05-14-at-11.23.48-AM.png
diff --git a/assets/images/2020/05/Screen-Shot-2020-05-14-at-11.23.48-AM_o.png b/static/images/2020/05/Screen-Shot-2020-05-14-at-11.23.48-AM_o.png
similarity index 100%
rename from assets/images/2020/05/Screen-Shot-2020-05-14-at-11.23.48-AM_o.png
rename to static/images/2020/05/Screen-Shot-2020-05-14-at-11.23.48-AM_o.png
diff --git a/assets/images/2020/05/Screen-Shot-2020-05-14-at-11.24.03-AM-1.png b/static/images/2020/05/Screen-Shot-2020-05-14-at-11.24.03-AM-1.png
similarity index 100%
rename from assets/images/2020/05/Screen-Shot-2020-05-14-at-11.24.03-AM-1.png
rename to static/images/2020/05/Screen-Shot-2020-05-14-at-11.24.03-AM-1.png
diff --git a/assets/images/2020/05/Screen-Shot-2020-05-14-at-11.24.03-AM.png b/static/images/2020/05/Screen-Shot-2020-05-14-at-11.24.03-AM.png
similarity index 100%
rename from assets/images/2020/05/Screen-Shot-2020-05-14-at-11.24.03-AM.png
rename to static/images/2020/05/Screen-Shot-2020-05-14-at-11.24.03-AM.png
diff --git a/assets/images/2020/05/Screen-Shot-2020-05-14-at-11.24.03-AM_o-1.png b/static/images/2020/05/Screen-Shot-2020-05-14-at-11.24.03-AM_o-1.png
similarity index 100%
rename from assets/images/2020/05/Screen-Shot-2020-05-14-at-11.24.03-AM_o-1.png
rename to static/images/2020/05/Screen-Shot-2020-05-14-at-11.24.03-AM_o-1.png
diff --git a/assets/images/2020/05/Screen-Shot-2020-05-14-at-11.24.03-AM_o.png b/static/images/2020/05/Screen-Shot-2020-05-14-at-11.24.03-AM_o.png
similarity index 100%
rename from assets/images/2020/05/Screen-Shot-2020-05-14-at-11.24.03-AM_o.png
rename to static/images/2020/05/Screen-Shot-2020-05-14-at-11.24.03-AM_o.png
diff --git a/assets/images/2020/05/Screen-Shot-2020-05-14-at-11.24.16-AM.png b/static/images/2020/05/Screen-Shot-2020-05-14-at-11.24.16-AM.png
similarity index 100%
rename from assets/images/2020/05/Screen-Shot-2020-05-14-at-11.24.16-AM.png
rename to static/images/2020/05/Screen-Shot-2020-05-14-at-11.24.16-AM.png
diff --git a/assets/images/2020/05/Screen-Shot-2020-05-14-at-11.24.16-AM_o.png b/static/images/2020/05/Screen-Shot-2020-05-14-at-11.24.16-AM_o.png
similarity index 100%
rename from assets/images/2020/05/Screen-Shot-2020-05-14-at-11.24.16-AM_o.png
rename to static/images/2020/05/Screen-Shot-2020-05-14-at-11.24.16-AM_o.png
diff --git a/assets/images/2020/05/Screen-Shot-2020-05-14-at-11.24.35-AM-1.png b/static/images/2020/05/Screen-Shot-2020-05-14-at-11.24.35-AM-1.png
similarity index 100%
rename from assets/images/2020/05/Screen-Shot-2020-05-14-at-11.24.35-AM-1.png
rename to static/images/2020/05/Screen-Shot-2020-05-14-at-11.24.35-AM-1.png
diff --git a/assets/images/2020/05/Screen-Shot-2020-05-14-at-11.24.35-AM.png b/static/images/2020/05/Screen-Shot-2020-05-14-at-11.24.35-AM.png
similarity index 100%
rename from assets/images/2020/05/Screen-Shot-2020-05-14-at-11.24.35-AM.png
rename to static/images/2020/05/Screen-Shot-2020-05-14-at-11.24.35-AM.png
diff --git a/assets/images/2020/05/Screen-Shot-2020-05-14-at-11.24.35-AM_o-1.png b/static/images/2020/05/Screen-Shot-2020-05-14-at-11.24.35-AM_o-1.png
similarity index 100%
rename from assets/images/2020/05/Screen-Shot-2020-05-14-at-11.24.35-AM_o-1.png
rename to static/images/2020/05/Screen-Shot-2020-05-14-at-11.24.35-AM_o-1.png
diff --git a/assets/images/2020/05/Screen-Shot-2020-05-14-at-11.24.35-AM_o.png b/static/images/2020/05/Screen-Shot-2020-05-14-at-11.24.35-AM_o.png
similarity index 100%
rename from assets/images/2020/05/Screen-Shot-2020-05-14-at-11.24.35-AM_o.png
rename to static/images/2020/05/Screen-Shot-2020-05-14-at-11.24.35-AM_o.png
diff --git a/assets/images/2020/05/Screen-Shot-2020-05-14-at-11.24.53-AM.png b/static/images/2020/05/Screen-Shot-2020-05-14-at-11.24.53-AM.png
similarity index 100%
rename from assets/images/2020/05/Screen-Shot-2020-05-14-at-11.24.53-AM.png
rename to static/images/2020/05/Screen-Shot-2020-05-14-at-11.24.53-AM.png
diff --git a/assets/images/2020/05/Screen-Shot-2020-05-14-at-11.24.53-AM_o.png b/static/images/2020/05/Screen-Shot-2020-05-14-at-11.24.53-AM_o.png
similarity index 100%
rename from assets/images/2020/05/Screen-Shot-2020-05-14-at-11.24.53-AM_o.png
rename to static/images/2020/05/Screen-Shot-2020-05-14-at-11.24.53-AM_o.png
diff --git a/assets/images/2020/05/Screen-Shot-2020-05-14-at-11.50.37-AM.png b/static/images/2020/05/Screen-Shot-2020-05-14-at-11.50.37-AM.png
similarity index 100%
rename from assets/images/2020/05/Screen-Shot-2020-05-14-at-11.50.37-AM.png
rename to static/images/2020/05/Screen-Shot-2020-05-14-at-11.50.37-AM.png
diff --git a/assets/images/2020/05/Screen-Shot-2020-05-14-at-11.50.37-AM_o.png b/static/images/2020/05/Screen-Shot-2020-05-14-at-11.50.37-AM_o.png
similarity index 100%
rename from assets/images/2020/05/Screen-Shot-2020-05-14-at-11.50.37-AM_o.png
rename to static/images/2020/05/Screen-Shot-2020-05-14-at-11.50.37-AM_o.png
diff --git a/assets/images/2020/05/Screen-Shot-2020-05-14-at-11.53.24-AM.png b/static/images/2020/05/Screen-Shot-2020-05-14-at-11.53.24-AM.png
similarity index 100%
rename from assets/images/2020/05/Screen-Shot-2020-05-14-at-11.53.24-AM.png
rename to static/images/2020/05/Screen-Shot-2020-05-14-at-11.53.24-AM.png
diff --git a/assets/images/2020/05/Screen-Shot-2020-05-14-at-11.53.24-AM_o.png b/static/images/2020/05/Screen-Shot-2020-05-14-at-11.53.24-AM_o.png
similarity index 100%
rename from assets/images/2020/05/Screen-Shot-2020-05-14-at-11.53.24-AM_o.png
rename to static/images/2020/05/Screen-Shot-2020-05-14-at-11.53.24-AM_o.png
diff --git a/assets/images/2020/05/Screen-Shot-2020-05-14-at-11.57.17-AM.png b/static/images/2020/05/Screen-Shot-2020-05-14-at-11.57.17-AM.png
similarity index 100%
rename from assets/images/2020/05/Screen-Shot-2020-05-14-at-11.57.17-AM.png
rename to static/images/2020/05/Screen-Shot-2020-05-14-at-11.57.17-AM.png
diff --git a/assets/images/2020/05/Screen-Shot-2020-05-14-at-11.57.17-AM_o.png b/static/images/2020/05/Screen-Shot-2020-05-14-at-11.57.17-AM_o.png
similarity index 100%
rename from assets/images/2020/05/Screen-Shot-2020-05-14-at-11.57.17-AM_o.png
rename to static/images/2020/05/Screen-Shot-2020-05-14-at-11.57.17-AM_o.png
diff --git a/assets/images/2020/05/example-five.gif b/static/images/2020/05/example-five.gif
similarity index 100%
rename from assets/images/2020/05/example-five.gif
rename to static/images/2020/05/example-five.gif
diff --git a/assets/images/2020/05/example-four.gif b/static/images/2020/05/example-four.gif
similarity index 100%
rename from assets/images/2020/05/example-four.gif
rename to static/images/2020/05/example-four.gif
diff --git a/assets/images/2020/05/example-one-1.gif b/static/images/2020/05/example-one-1.gif
similarity index 100%
rename from assets/images/2020/05/example-one-1.gif
rename to static/images/2020/05/example-one-1.gif
diff --git a/assets/images/2020/05/example-one-10.gif b/static/images/2020/05/example-one-10.gif
similarity index 100%
rename from assets/images/2020/05/example-one-10.gif
rename to static/images/2020/05/example-one-10.gif
diff --git a/assets/images/2020/05/example-one-2.gif b/static/images/2020/05/example-one-2.gif
similarity index 100%
rename from assets/images/2020/05/example-one-2.gif
rename to static/images/2020/05/example-one-2.gif
diff --git a/assets/images/2020/05/example-one-3.gif b/static/images/2020/05/example-one-3.gif
similarity index 100%
rename from assets/images/2020/05/example-one-3.gif
rename to static/images/2020/05/example-one-3.gif
diff --git a/assets/images/2020/05/example-one-4.gif b/static/images/2020/05/example-one-4.gif
similarity index 100%
rename from assets/images/2020/05/example-one-4.gif
rename to static/images/2020/05/example-one-4.gif
diff --git a/assets/images/2020/05/example-one-5.gif b/static/images/2020/05/example-one-5.gif
similarity index 100%
rename from assets/images/2020/05/example-one-5.gif
rename to static/images/2020/05/example-one-5.gif
diff --git a/assets/images/2020/05/example-one-6.gif b/static/images/2020/05/example-one-6.gif
similarity index 100%
rename from assets/images/2020/05/example-one-6.gif
rename to static/images/2020/05/example-one-6.gif
diff --git a/assets/images/2020/05/example-one-7.gif b/static/images/2020/05/example-one-7.gif
similarity index 100%
rename from assets/images/2020/05/example-one-7.gif
rename to static/images/2020/05/example-one-7.gif
diff --git a/assets/images/2020/05/example-one-8.gif b/static/images/2020/05/example-one-8.gif
similarity index 100%
rename from assets/images/2020/05/example-one-8.gif
rename to static/images/2020/05/example-one-8.gif
diff --git a/assets/images/2020/05/example-one-9.gif b/static/images/2020/05/example-one-9.gif
similarity index 100%
rename from assets/images/2020/05/example-one-9.gif
rename to static/images/2020/05/example-one-9.gif
diff --git a/assets/images/2020/05/example-one.gif b/static/images/2020/05/example-one.gif
similarity index 100%
rename from assets/images/2020/05/example-one.gif
rename to static/images/2020/05/example-one.gif
diff --git a/assets/images/2020/05/example-six.gif b/static/images/2020/05/example-six.gif
similarity index 100%
rename from assets/images/2020/05/example-six.gif
rename to static/images/2020/05/example-six.gif
diff --git a/assets/images/2020/05/example-three-1.gif b/static/images/2020/05/example-three-1.gif
similarity index 100%
rename from assets/images/2020/05/example-three-1.gif
rename to static/images/2020/05/example-three-1.gif
diff --git a/assets/images/2020/05/example-three.gif b/static/images/2020/05/example-three.gif
similarity index 100%
rename from assets/images/2020/05/example-three.gif
rename to static/images/2020/05/example-three.gif
diff --git a/assets/images/2020/05/example-two-parallel.gif b/static/images/2020/05/example-two-parallel.gif
similarity index 100%
rename from assets/images/2020/05/example-two-parallel.gif
rename to static/images/2020/05/example-two-parallel.gif
diff --git a/assets/images/2020/05/example-two-serial-1.gif b/static/images/2020/05/example-two-serial-1.gif
similarity index 100%
rename from assets/images/2020/05/example-two-serial-1.gif
rename to static/images/2020/05/example-two-serial-1.gif
diff --git a/assets/images/2020/05/example-two-serial.gif b/static/images/2020/05/example-two-serial.gif
similarity index 100%
rename from assets/images/2020/05/example-two-serial.gif
rename to static/images/2020/05/example-two-serial.gif
diff --git a/assets/images/2020/05/image.png b/static/images/2020/05/image.png
similarity index 100%
rename from assets/images/2020/05/image.png
rename to static/images/2020/05/image.png
diff --git a/assets/images/2020/05/image_o.png b/static/images/2020/05/image_o.png
similarity index 100%
rename from assets/images/2020/05/image_o.png
rename to static/images/2020/05/image_o.png
diff --git a/assets/images/2020/06/IMG_20170930_144603.jpg b/static/images/2020/06/IMG_20170930_144603.jpg
similarity index 100%
rename from assets/images/2020/06/IMG_20170930_144603.jpg
rename to static/images/2020/06/IMG_20170930_144603.jpg
diff --git a/assets/images/2020/06/IMG_20170930_144603_o.jpg b/static/images/2020/06/IMG_20170930_144603_o.jpg
similarity index 100%
rename from assets/images/2020/06/IMG_20170930_144603_o.jpg
rename to static/images/2020/06/IMG_20170930_144603_o.jpg
diff --git a/assets/images/2020/06/Screen-Shot-2020-06-05-at-11.00.57-PM.png b/static/images/2020/06/Screen-Shot-2020-06-05-at-11.00.57-PM.png
similarity index 100%
rename from assets/images/2020/06/Screen-Shot-2020-06-05-at-11.00.57-PM.png
rename to static/images/2020/06/Screen-Shot-2020-06-05-at-11.00.57-PM.png
diff --git a/assets/images/2020/06/Screen-Shot-2020-06-05-at-11.00.57-PM_o.png b/static/images/2020/06/Screen-Shot-2020-06-05-at-11.00.57-PM_o.png
similarity index 100%
rename from assets/images/2020/06/Screen-Shot-2020-06-05-at-11.00.57-PM_o.png
rename to static/images/2020/06/Screen-Shot-2020-06-05-at-11.00.57-PM_o.png
diff --git a/assets/images/2020/06/build-and-publish-pipeline-1.png b/static/images/2020/06/build-and-publish-pipeline-1.png
similarity index 100%
rename from assets/images/2020/06/build-and-publish-pipeline-1.png
rename to static/images/2020/06/build-and-publish-pipeline-1.png
diff --git a/assets/images/2020/06/build-and-publish-pipeline-2.png b/static/images/2020/06/build-and-publish-pipeline-2.png
similarity index 100%
rename from assets/images/2020/06/build-and-publish-pipeline-2.png
rename to static/images/2020/06/build-and-publish-pipeline-2.png
diff --git a/assets/images/2020/06/build-and-publish-pipeline-3.png b/static/images/2020/06/build-and-publish-pipeline-3.png
similarity index 100%
rename from assets/images/2020/06/build-and-publish-pipeline-3.png
rename to static/images/2020/06/build-and-publish-pipeline-3.png
diff --git a/assets/images/2020/06/build-and-publish-pipeline.png b/static/images/2020/06/build-and-publish-pipeline.png
similarity index 100%
rename from assets/images/2020/06/build-and-publish-pipeline.png
rename to static/images/2020/06/build-and-publish-pipeline.png
diff --git a/assets/images/2020/06/build-and-publish-pipeline_o-1.png b/static/images/2020/06/build-and-publish-pipeline_o-1.png
similarity index 100%
rename from assets/images/2020/06/build-and-publish-pipeline_o-1.png
rename to static/images/2020/06/build-and-publish-pipeline_o-1.png
diff --git a/assets/images/2020/06/build-and-publish-pipeline_o-2.png b/static/images/2020/06/build-and-publish-pipeline_o-2.png
similarity index 100%
rename from assets/images/2020/06/build-and-publish-pipeline_o-2.png
rename to static/images/2020/06/build-and-publish-pipeline_o-2.png
diff --git a/assets/images/2020/06/build-and-publish-pipeline_o-3.png b/static/images/2020/06/build-and-publish-pipeline_o-3.png
similarity index 100%
rename from assets/images/2020/06/build-and-publish-pipeline_o-3.png
rename to static/images/2020/06/build-and-publish-pipeline_o-3.png
diff --git a/assets/images/2020/06/build-and-publish-pipeline_o.png b/static/images/2020/06/build-and-publish-pipeline_o.png
similarity index 100%
rename from assets/images/2020/06/build-and-publish-pipeline_o.png
rename to static/images/2020/06/build-and-publish-pipeline_o.png
diff --git a/assets/images/2020/06/profile.jpg b/static/images/2020/06/profile.jpg
similarity index 100%
rename from assets/images/2020/06/profile.jpg
rename to static/images/2020/06/profile.jpg
diff --git a/assets/images/2020/06/profile_o.jpg b/static/images/2020/06/profile_o.jpg
similarity index 100%
rename from assets/images/2020/06/profile_o.jpg
rename to static/images/2020/06/profile_o.jpg
diff --git a/assets/images/2020/08/example-one-03.png b/static/images/2020/08/example-one-03.png
similarity index 100%
rename from assets/images/2020/08/example-one-03.png
rename to static/images/2020/08/example-one-03.png
diff --git a/assets/images/2020/08/example-one-03_o.png b/static/images/2020/08/example-one-03_o.png
similarity index 100%
rename from assets/images/2020/08/example-one-03_o.png
rename to static/images/2020/08/example-one-03_o.png
diff --git a/assets/images/2020/08/hello-world-1.png b/static/images/2020/08/hello-world-1.png
similarity index 100%
rename from assets/images/2020/08/hello-world-1.png
rename to static/images/2020/08/hello-world-1.png
diff --git a/assets/images/2020/08/hello-world.png b/static/images/2020/08/hello-world.png
similarity index 100%
rename from assets/images/2020/08/hello-world.png
rename to static/images/2020/08/hello-world.png
diff --git a/assets/images/2020/08/hello-world_o-1.png b/static/images/2020/08/hello-world_o-1.png
similarity index 100%
rename from assets/images/2020/08/hello-world_o-1.png
rename to static/images/2020/08/hello-world_o-1.png
diff --git a/assets/images/2020/08/hello-world_o.png b/static/images/2020/08/hello-world_o.png
similarity index 100%
rename from assets/images/2020/08/hello-world_o.png
rename to static/images/2020/08/hello-world_o.png
diff --git a/assets/images/2020/08/set-self.png b/static/images/2020/08/set-self.png
similarity index 100%
rename from assets/images/2020/08/set-self.png
rename to static/images/2020/08/set-self.png
diff --git a/assets/images/2020/08/set-self_o.png b/static/images/2020/08/set-self_o.png
similarity index 100%
rename from assets/images/2020/08/set-self_o.png
rename to static/images/2020/08/set-self_o.png
diff --git a/assets/images/2020/08/three-pipelines.png b/static/images/2020/08/three-pipelines.png
similarity index 100%
rename from assets/images/2020/08/three-pipelines.png
rename to static/images/2020/08/three-pipelines.png
diff --git a/assets/images/2020/08/three-pipelines_o.png b/static/images/2020/08/three-pipelines_o.png
similarity index 100%
rename from assets/images/2020/08/three-pipelines_o.png
rename to static/images/2020/08/three-pipelines_o.png
diff --git a/static/images/downloaded_images/0_Iz72Bh80-LNbQc-I.png b/static/images/downloaded_images/0_Iz72Bh80-LNbQc-I.png
new file mode 100644
index 0000000..0769b38
Binary files /dev/null and b/static/images/downloaded_images/0_Iz72Bh80-LNbQc-I.png differ
diff --git a/static/images/downloaded_images/0_V2tAM1z62u0gd-Sx.png b/static/images/downloaded_images/0_V2tAM1z62u0gd-Sx.png
new file mode 100644
index 0000000..cf2ab0f
Binary files /dev/null and b/static/images/downloaded_images/0_V2tAM1z62u0gd-Sx.png differ
diff --git a/static/images/downloaded_images/0_VKfa4IVa51zOWoiU.png b/static/images/downloaded_images/0_VKfa4IVa51zOWoiU.png
new file mode 100644
index 0000000..feb83df
Binary files /dev/null and b/static/images/downloaded_images/0_VKfa4IVa51zOWoiU.png differ
diff --git a/static/images/downloaded_images/0_bJ8wRINc9fo3aZ5L.png b/static/images/downloaded_images/0_bJ8wRINc9fo3aZ5L.png
new file mode 100644
index 0000000..a75575d
Binary files /dev/null and b/static/images/downloaded_images/0_bJ8wRINc9fo3aZ5L.png differ
diff --git a/static/images/downloaded_images/1_fnSsJkhigoNgfuURiOPCpg.png b/static/images/downloaded_images/1_fnSsJkhigoNgfuURiOPCpg.png
new file mode 100644
index 0000000..6e21e1e
Binary files /dev/null and b/static/images/downloaded_images/1_fnSsJkhigoNgfuURiOPCpg.png differ
diff --git a/static/images/downloaded_images/1_nU107xCbOq-21YkWl2OBXQ.png b/static/images/downloaded_images/1_nU107xCbOq-21YkWl2OBXQ.png
new file mode 100644
index 0000000..7735f22
Binary files /dev/null and b/static/images/downloaded_images/1_nU107xCbOq-21YkWl2OBXQ.png differ
diff --git a/assets/images/downloaded_images/An-Overview-of-Authorization-in-Concourse-3--4-and-5/1-c4yd3A2DIIrRYF8uqh9_fw.png b/static/images/downloaded_images/An-Overview-of-Authorization-in-Concourse-3--4-and-5/1-c4yd3A2DIIrRYF8uqh9_fw.png
similarity index 100%
rename from assets/images/downloaded_images/An-Overview-of-Authorization-in-Concourse-3--4-and-5/1-c4yd3A2DIIrRYF8uqh9_fw.png
rename to static/images/downloaded_images/An-Overview-of-Authorization-in-Concourse-3--4-and-5/1-c4yd3A2DIIrRYF8uqh9_fw.png
diff --git a/assets/images/downloaded_images/An-Overview-of-Authorization-in-Concourse-3--4-and-5/1-cNIh0ygLLcNnPbGEDOhcig.png b/static/images/downloaded_images/An-Overview-of-Authorization-in-Concourse-3--4-and-5/1-cNIh0ygLLcNnPbGEDOhcig.png
similarity index 100%
rename from assets/images/downloaded_images/An-Overview-of-Authorization-in-Concourse-3--4-and-5/1-cNIh0ygLLcNnPbGEDOhcig.png
rename to static/images/downloaded_images/An-Overview-of-Authorization-in-Concourse-3--4-and-5/1-cNIh0ygLLcNnPbGEDOhcig.png
diff --git a/assets/images/downloaded_images/An-Overview-of-Authorization-in-Concourse-3--4-and-5/1-sh1rcJO5eSRDQrmxIF8qTA.jpeg b/static/images/downloaded_images/An-Overview-of-Authorization-in-Concourse-3--4-and-5/1-sh1rcJO5eSRDQrmxIF8qTA.jpeg
similarity index 100%
rename from assets/images/downloaded_images/An-Overview-of-Authorization-in-Concourse-3--4-and-5/1-sh1rcJO5eSRDQrmxIF8qTA.jpeg
rename to static/images/downloaded_images/An-Overview-of-Authorization-in-Concourse-3--4-and-5/1-sh1rcJO5eSRDQrmxIF8qTA.jpeg
diff --git a/assets/images/downloaded_images/Build-Page-Improvements/1-8-_eZ3qsDLB8Sqq5I-9vTw.png b/static/images/downloaded_images/Build-Page-Improvements/1-8-_eZ3qsDLB8Sqq5I-9vTw.png
similarity index 100%
rename from assets/images/downloaded_images/Build-Page-Improvements/1-8-_eZ3qsDLB8Sqq5I-9vTw.png
rename to static/images/downloaded_images/Build-Page-Improvements/1-8-_eZ3qsDLB8Sqq5I-9vTw.png
diff --git a/assets/images/downloaded_images/Build-Page-Improvements/1-vjvvVZAw9nO4yRrveU0Ojg.gif b/static/images/downloaded_images/Build-Page-Improvements/1-vjvvVZAw9nO4yRrveU0Ojg.gif
similarity index 100%
rename from assets/images/downloaded_images/Build-Page-Improvements/1-vjvvVZAw9nO4yRrveU0Ojg.gif
rename to static/images/downloaded_images/Build-Page-Improvements/1-vjvvVZAw9nO4yRrveU0Ojg.gif
diff --git a/assets/images/downloaded_images/CI-CD-for-Product-Managers/1-P8ZJvuoaVp1-m5GcgbNevw.png b/static/images/downloaded_images/CI-CD-for-Product-Managers/1-P8ZJvuoaVp1-m5GcgbNevw.png
similarity index 100%
rename from assets/images/downloaded_images/CI-CD-for-Product-Managers/1-P8ZJvuoaVp1-m5GcgbNevw.png
rename to static/images/downloaded_images/CI-CD-for-Product-Managers/1-P8ZJvuoaVp1-m5GcgbNevw.png
diff --git a/assets/images/downloaded_images/CI-CD-for-Product-Managers/1-btEhqEYXxGy1V9luW0t1yA.png b/static/images/downloaded_images/CI-CD-for-Product-Managers/1-btEhqEYXxGy1V9luW0t1yA.png
similarity index 100%
rename from assets/images/downloaded_images/CI-CD-for-Product-Managers/1-btEhqEYXxGy1V9luW0t1yA.png
rename to static/images/downloaded_images/CI-CD-for-Product-Managers/1-btEhqEYXxGy1V9luW0t1yA.png
diff --git a/assets/images/downloaded_images/Composable-resources/1-HT3unmqUeCac5YMFI85FVQ.png b/static/images/downloaded_images/Composable-resources/1-HT3unmqUeCac5YMFI85FVQ.png
similarity index 100%
rename from assets/images/downloaded_images/Composable-resources/1-HT3unmqUeCac5YMFI85FVQ.png
rename to static/images/downloaded_images/Composable-resources/1-HT3unmqUeCac5YMFI85FVQ.png
diff --git a/assets/images/downloaded_images/Composable-resources/1-QZFfl_f03XirjGU6o0Id5w.png b/static/images/downloaded_images/Composable-resources/1-QZFfl_f03XirjGU6o0Id5w.png
similarity index 100%
rename from assets/images/downloaded_images/Composable-resources/1-QZFfl_f03XirjGU6o0Id5w.png
rename to static/images/downloaded_images/Composable-resources/1-QZFfl_f03XirjGU6o0Id5w.png
diff --git a/assets/images/downloaded_images/Concourse-2018-Year-in-Review/1-pzx9yhOYi-XyEFUgqnxBfw.jpeg b/static/images/downloaded_images/Concourse-2018-Year-in-Review/1-pzx9yhOYi-XyEFUgqnxBfw.jpeg
similarity index 100%
rename from assets/images/downloaded_images/Concourse-2018-Year-in-Review/1-pzx9yhOYi-XyEFUgqnxBfw.jpeg
rename to static/images/downloaded_images/Concourse-2018-Year-in-Review/1-pzx9yhOYi-XyEFUgqnxBfw.jpeg
diff --git a/assets/images/downloaded_images/Concourse-RBAC-Preview/0-oy1M_w9ksoAje2LR.jpg b/static/images/downloaded_images/Concourse-RBAC-Preview/0-oy1M_w9ksoAje2LR.jpg
similarity index 100%
rename from assets/images/downloaded_images/Concourse-RBAC-Preview/0-oy1M_w9ksoAje2LR.jpg
rename to static/images/downloaded_images/Concourse-RBAC-Preview/0-oy1M_w9ksoAje2LR.jpg
diff --git a/assets/images/downloaded_images/Concourse-Update-----April-1--2019-/1-7Ox9ZUESMtTgP-wCg5gaww.png b/static/images/downloaded_images/Concourse-Update-----April-1--2019-/1-7Ox9ZUESMtTgP-wCg5gaww.png
similarity index 100%
rename from assets/images/downloaded_images/Concourse-Update-----April-1--2019-/1-7Ox9ZUESMtTgP-wCg5gaww.png
rename to static/images/downloaded_images/Concourse-Update-----April-1--2019-/1-7Ox9ZUESMtTgP-wCg5gaww.png
diff --git a/assets/images/downloaded_images/Concourse-Update-----April-1--2019-/1-Z49uzJr_wqYlpCGLBpnoXQ.jpeg b/static/images/downloaded_images/Concourse-Update-----April-1--2019-/1-Z49uzJr_wqYlpCGLBpnoXQ.jpeg
similarity index 100%
rename from assets/images/downloaded_images/Concourse-Update-----April-1--2019-/1-Z49uzJr_wqYlpCGLBpnoXQ.jpeg
rename to static/images/downloaded_images/Concourse-Update-----April-1--2019-/1-Z49uzJr_wqYlpCGLBpnoXQ.jpeg
diff --git a/assets/images/downloaded_images/Concourse-Update-----April-1--2019-/1-mPK8DgHmIv36A0Z6pNebjg.png b/static/images/downloaded_images/Concourse-Update-----April-1--2019-/1-mPK8DgHmIv36A0Z6pNebjg.png
similarity index 100%
rename from assets/images/downloaded_images/Concourse-Update-----April-1--2019-/1-mPK8DgHmIv36A0Z6pNebjg.png
rename to static/images/downloaded_images/Concourse-Update-----April-1--2019-/1-mPK8DgHmIv36A0Z6pNebjg.png
diff --git a/assets/images/downloaded_images/Concourse-Update--April-1-5-/1-dEssJTEo9_VnNszNDUj6gQ.png b/static/images/downloaded_images/Concourse-Update--April-1-5-/1-dEssJTEo9_VnNszNDUj6gQ.png
similarity index 100%
rename from assets/images/downloaded_images/Concourse-Update--April-1-5-/1-dEssJTEo9_VnNszNDUj6gQ.png
rename to static/images/downloaded_images/Concourse-Update--April-1-5-/1-dEssJTEo9_VnNszNDUj6gQ.png
diff --git a/assets/images/downloaded_images/Concourse-Update--April-1-5-/1-nZQ4xbWXguDpNQzLEkcJcA.jpeg b/static/images/downloaded_images/Concourse-Update--April-1-5-/1-nZQ4xbWXguDpNQzLEkcJcA.jpeg
similarity index 100%
rename from assets/images/downloaded_images/Concourse-Update--April-1-5-/1-nZQ4xbWXguDpNQzLEkcJcA.jpeg
rename to static/images/downloaded_images/Concourse-Update--April-1-5-/1-nZQ4xbWXguDpNQzLEkcJcA.jpeg
diff --git a/assets/images/downloaded_images/Concourse-Update--April-23-27-/1-1T4dM1zWpCx5NvHFnhK2Lw.jpeg b/static/images/downloaded_images/Concourse-Update--April-23-27-/1-1T4dM1zWpCx5NvHFnhK2Lw.jpeg
similarity index 100%
rename from assets/images/downloaded_images/Concourse-Update--April-23-27-/1-1T4dM1zWpCx5NvHFnhK2Lw.jpeg
rename to static/images/downloaded_images/Concourse-Update--April-23-27-/1-1T4dM1zWpCx5NvHFnhK2Lw.jpeg
diff --git a/assets/images/downloaded_images/Concourse-Update--April-30---May-4-/1-K13pFduQtcsPeX3VH6crQQ.png b/static/images/downloaded_images/Concourse-Update--April-30---May-4-/1-K13pFduQtcsPeX3VH6crQQ.png
similarity index 100%
rename from assets/images/downloaded_images/Concourse-Update--April-30---May-4-/1-K13pFduQtcsPeX3VH6crQQ.png
rename to static/images/downloaded_images/Concourse-Update--April-30---May-4-/1-K13pFduQtcsPeX3VH6crQQ.png
diff --git a/assets/images/downloaded_images/Concourse-Update--April-30---May-4-/1-_ndF5rSNwVlKJWTj2_vxUQ.png b/static/images/downloaded_images/Concourse-Update--April-30---May-4-/1-_ndF5rSNwVlKJWTj2_vxUQ.png
similarity index 100%
rename from assets/images/downloaded_images/Concourse-Update--April-30---May-4-/1-_ndF5rSNwVlKJWTj2_vxUQ.png
rename to static/images/downloaded_images/Concourse-Update--April-30---May-4-/1-_ndF5rSNwVlKJWTj2_vxUQ.png
diff --git a/assets/images/downloaded_images/Concourse-Update--April-30---May-4-/1-kBELwDyhYQwPchw7J-O0eQ.png b/static/images/downloaded_images/Concourse-Update--April-30---May-4-/1-kBELwDyhYQwPchw7J-O0eQ.png
similarity index 100%
rename from assets/images/downloaded_images/Concourse-Update--April-30---May-4-/1-kBELwDyhYQwPchw7J-O0eQ.png
rename to static/images/downloaded_images/Concourse-Update--April-30---May-4-/1-kBELwDyhYQwPchw7J-O0eQ.png
diff --git a/assets/images/downloaded_images/Concourse-Update--April-8-18-/1-QqwW-_RArz5a_sprZC7PZw.png b/static/images/downloaded_images/Concourse-Update--April-8-18-/1-QqwW-_RArz5a_sprZC7PZw.png
similarity index 100%
rename from assets/images/downloaded_images/Concourse-Update--April-8-18-/1-QqwW-_RArz5a_sprZC7PZw.png
rename to static/images/downloaded_images/Concourse-Update--April-8-18-/1-QqwW-_RArz5a_sprZC7PZw.png
diff --git a/assets/images/downloaded_images/Concourse-Update--April-8-18-/1-gTTAFBV8KHzEL0CV-I-_kA.jpeg b/static/images/downloaded_images/Concourse-Update--April-8-18-/1-gTTAFBV8KHzEL0CV-I-_kA.jpeg
similarity index 100%
rename from assets/images/downloaded_images/Concourse-Update--April-8-18-/1-gTTAFBV8KHzEL0CV-I-_kA.jpeg
rename to static/images/downloaded_images/Concourse-Update--April-8-18-/1-gTTAFBV8KHzEL0CV-I-_kA.jpeg
diff --git a/assets/images/downloaded_images/Concourse-Update--April-9-13-/1-cS-JeBD00f0h7vhlpYTE7w.png b/static/images/downloaded_images/Concourse-Update--April-9-13-/1-cS-JeBD00f0h7vhlpYTE7w.png
similarity index 100%
rename from assets/images/downloaded_images/Concourse-Update--April-9-13-/1-cS-JeBD00f0h7vhlpYTE7w.png
rename to static/images/downloaded_images/Concourse-Update--April-9-13-/1-cS-JeBD00f0h7vhlpYTE7w.png
diff --git a/assets/images/downloaded_images/Concourse-Update--April-9-13-/1-thrSlXnAzYewzqirHjukWA.png b/static/images/downloaded_images/Concourse-Update--April-9-13-/1-thrSlXnAzYewzqirHjukWA.png
similarity index 100%
rename from assets/images/downloaded_images/Concourse-Update--April-9-13-/1-thrSlXnAzYewzqirHjukWA.png
rename to static/images/downloaded_images/Concourse-Update--April-9-13-/1-thrSlXnAzYewzqirHjukWA.png
diff --git a/assets/images/downloaded_images/Concourse-Update--Aug-27-31-/0-39sBwa4rlBwJYlH4.jpg b/static/images/downloaded_images/Concourse-Update--Aug-27-31-/0-39sBwa4rlBwJYlH4.jpg
similarity index 100%
rename from assets/images/downloaded_images/Concourse-Update--Aug-27-31-/0-39sBwa4rlBwJYlH4.jpg
rename to static/images/downloaded_images/Concourse-Update--Aug-27-31-/0-39sBwa4rlBwJYlH4.jpg
diff --git a/assets/images/downloaded_images/Concourse-Update--Aug-7-10-/1-QBeLayNVacbJGgBW-BhGSw.jpeg b/static/images/downloaded_images/Concourse-Update--Aug-7-10-/1-QBeLayNVacbJGgBW-BhGSw.jpeg
similarity index 100%
rename from assets/images/downloaded_images/Concourse-Update--Aug-7-10-/1-QBeLayNVacbJGgBW-BhGSw.jpeg
rename to static/images/downloaded_images/Concourse-Update--Aug-7-10-/1-QBeLayNVacbJGgBW-BhGSw.jpeg
diff --git a/assets/images/downloaded_images/Concourse-Update--August-13-17-/1-tElpiP87T2Ee3rXKJP88QQ.gif b/static/images/downloaded_images/Concourse-Update--August-13-17-/1-tElpiP87T2Ee3rXKJP88QQ.gif
similarity index 100%
rename from assets/images/downloaded_images/Concourse-Update--August-13-17-/1-tElpiP87T2Ee3rXKJP88QQ.gif
rename to static/images/downloaded_images/Concourse-Update--August-13-17-/1-tElpiP87T2Ee3rXKJP88QQ.gif
diff --git a/assets/images/downloaded_images/Concourse-Update--August-20-24-/0-9tKyl-ikt-ttbS_z.jpg b/static/images/downloaded_images/Concourse-Update--August-20-24-/0-9tKyl-ikt-ttbS_z.jpg
similarity index 100%
rename from assets/images/downloaded_images/Concourse-Update--August-20-24-/0-9tKyl-ikt-ttbS_z.jpg
rename to static/images/downloaded_images/Concourse-Update--August-20-24-/0-9tKyl-ikt-ttbS_z.jpg
diff --git a/assets/images/downloaded_images/Concourse-Update--Dec-3-7-/1-9QGCZafW4o8rGIVxN4QvYA.jpeg b/static/images/downloaded_images/Concourse-Update--Dec-3-7-/1-9QGCZafW4o8rGIVxN4QvYA.jpeg
similarity index 100%
rename from assets/images/downloaded_images/Concourse-Update--Dec-3-7-/1-9QGCZafW4o8rGIVxN4QvYA.jpeg
rename to static/images/downloaded_images/Concourse-Update--Dec-3-7-/1-9QGCZafW4o8rGIVxN4QvYA.jpeg
diff --git a/assets/images/downloaded_images/Concourse-Update--Jan-14-18-/1-6MKC6FrHvi5u_9yZCklyeA.png b/static/images/downloaded_images/Concourse-Update--Jan-14-18-/1-6MKC6FrHvi5u_9yZCklyeA.png
similarity index 100%
rename from assets/images/downloaded_images/Concourse-Update--Jan-14-18-/1-6MKC6FrHvi5u_9yZCklyeA.png
rename to static/images/downloaded_images/Concourse-Update--Jan-14-18-/1-6MKC6FrHvi5u_9yZCklyeA.png
diff --git a/assets/images/downloaded_images/Concourse-Update--Jan-21-25-/1-t_CkNyt-IVxZrxMiARCJLQ.jpeg b/static/images/downloaded_images/Concourse-Update--Jan-21-25-/1-t_CkNyt-IVxZrxMiARCJLQ.jpeg
similarity index 100%
rename from assets/images/downloaded_images/Concourse-Update--Jan-21-25-/1-t_CkNyt-IVxZrxMiARCJLQ.jpeg
rename to static/images/downloaded_images/Concourse-Update--Jan-21-25-/1-t_CkNyt-IVxZrxMiARCJLQ.jpeg
diff --git a/assets/images/downloaded_images/Concourse-Update--Jan-7-11-/1-xc1d4AtxzZanyNVDiEPrvg.jpeg b/static/images/downloaded_images/Concourse-Update--Jan-7-11-/1-xc1d4AtxzZanyNVDiEPrvg.jpeg
similarity index 100%
rename from assets/images/downloaded_images/Concourse-Update--Jan-7-11-/1-xc1d4AtxzZanyNVDiEPrvg.jpeg
rename to static/images/downloaded_images/Concourse-Update--Jan-7-11-/1-xc1d4AtxzZanyNVDiEPrvg.jpeg
diff --git a/assets/images/downloaded_images/Concourse-Update--Jul-16-20-/1-CIxNgJ_FKbnacEpUI588nw.jpeg b/static/images/downloaded_images/Concourse-Update--Jul-16-20-/1-CIxNgJ_FKbnacEpUI588nw.jpeg
similarity index 100%
rename from assets/images/downloaded_images/Concourse-Update--Jul-16-20-/1-CIxNgJ_FKbnacEpUI588nw.jpeg
rename to static/images/downloaded_images/Concourse-Update--Jul-16-20-/1-CIxNgJ_FKbnacEpUI588nw.jpeg
diff --git a/assets/images/downloaded_images/Concourse-Update--Jul-23-27-/1-A7zDAYYisJzHjZldrxqneg.gif b/static/images/downloaded_images/Concourse-Update--Jul-23-27-/1-A7zDAYYisJzHjZldrxqneg.gif
similarity index 100%
rename from assets/images/downloaded_images/Concourse-Update--Jul-23-27-/1-A7zDAYYisJzHjZldrxqneg.gif
rename to static/images/downloaded_images/Concourse-Update--Jul-23-27-/1-A7zDAYYisJzHjZldrxqneg.gif
diff --git a/assets/images/downloaded_images/Concourse-Update--Jul-23-27-/1-tfhJwBRSLe9wrc2-a7MwpQ.png b/static/images/downloaded_images/Concourse-Update--Jul-23-27-/1-tfhJwBRSLe9wrc2-a7MwpQ.png
similarity index 100%
rename from assets/images/downloaded_images/Concourse-Update--Jul-23-27-/1-tfhJwBRSLe9wrc2-a7MwpQ.png
rename to static/images/downloaded_images/Concourse-Update--Jul-23-27-/1-tfhJwBRSLe9wrc2-a7MwpQ.png
diff --git a/assets/images/downloaded_images/Concourse-Update--Jul-9-13-/1-AuH8VYkniNetbpZtRBjTuA.png b/static/images/downloaded_images/Concourse-Update--Jul-9-13-/1-AuH8VYkniNetbpZtRBjTuA.png
similarity index 100%
rename from assets/images/downloaded_images/Concourse-Update--Jul-9-13-/1-AuH8VYkniNetbpZtRBjTuA.png
rename to static/images/downloaded_images/Concourse-Update--Jul-9-13-/1-AuH8VYkniNetbpZtRBjTuA.png
diff --git a/assets/images/downloaded_images/Concourse-Update--July-21-2019-/0-ywZaAHKMEtZGTx5c.png b/static/images/downloaded_images/Concourse-Update--July-21-2019-/0-ywZaAHKMEtZGTx5c.png
similarity index 100%
rename from assets/images/downloaded_images/Concourse-Update--July-21-2019-/0-ywZaAHKMEtZGTx5c.png
rename to static/images/downloaded_images/Concourse-Update--July-21-2019-/0-ywZaAHKMEtZGTx5c.png
diff --git a/assets/images/downloaded_images/Concourse-Update--July-21-2019-/1-pjEzya_VmoSClRIGW8z38g.jpeg b/static/images/downloaded_images/Concourse-Update--July-21-2019-/1-pjEzya_VmoSClRIGW8z38g.jpeg
similarity index 100%
rename from assets/images/downloaded_images/Concourse-Update--July-21-2019-/1-pjEzya_VmoSClRIGW8z38g.jpeg
rename to static/images/downloaded_images/Concourse-Update--July-21-2019-/1-pjEzya_VmoSClRIGW8z38g.jpeg
diff --git a/assets/images/downloaded_images/Concourse-Update--July-30---Aug-3-/1--syJtPB3nj0x2z8AVEh7zA.png b/static/images/downloaded_images/Concourse-Update--July-30---Aug-3-/1--syJtPB3nj0x2z8AVEh7zA.png
similarity index 100%
rename from assets/images/downloaded_images/Concourse-Update--July-30---Aug-3-/1--syJtPB3nj0x2z8AVEh7zA.png
rename to static/images/downloaded_images/Concourse-Update--July-30---Aug-3-/1--syJtPB3nj0x2z8AVEh7zA.png
diff --git a/assets/images/downloaded_images/Concourse-Update--Jun-18-22-/0-iPsCYY5ob7h-bSKD.jpg b/static/images/downloaded_images/Concourse-Update--Jun-18-22-/0-iPsCYY5ob7h-bSKD.jpg
similarity index 100%
rename from assets/images/downloaded_images/Concourse-Update--Jun-18-22-/0-iPsCYY5ob7h-bSKD.jpg
rename to static/images/downloaded_images/Concourse-Update--Jun-18-22-/0-iPsCYY5ob7h-bSKD.jpg
diff --git a/assets/images/downloaded_images/Concourse-Update--Jun-25-29-/1-KEWandpQWRWRFcBvLRwbog.jpeg b/static/images/downloaded_images/Concourse-Update--Jun-25-29-/1-KEWandpQWRWRFcBvLRwbog.jpeg
similarity index 100%
rename from assets/images/downloaded_images/Concourse-Update--Jun-25-29-/1-KEWandpQWRWRFcBvLRwbog.jpeg
rename to static/images/downloaded_images/Concourse-Update--Jun-25-29-/1-KEWandpQWRWRFcBvLRwbog.jpeg
diff --git a/assets/images/downloaded_images/Concourse-Update--Jun-25-29-/1-eGvw-f2AjgJvsWN9pdikBg.gif b/static/images/downloaded_images/Concourse-Update--Jun-25-29-/1-eGvw-f2AjgJvsWN9pdikBg.gif
similarity index 100%
rename from assets/images/downloaded_images/Concourse-Update--Jun-25-29-/1-eGvw-f2AjgJvsWN9pdikBg.gif
rename to static/images/downloaded_images/Concourse-Update--Jun-25-29-/1-eGvw-f2AjgJvsWN9pdikBg.gif
diff --git a/assets/images/downloaded_images/Concourse-Update--June-4-8-/1-C8RdmEmjBxrG5pzamGDMSg.png b/static/images/downloaded_images/Concourse-Update--June-4-8-/1-C8RdmEmjBxrG5pzamGDMSg.png
similarity index 100%
rename from assets/images/downloaded_images/Concourse-Update--June-4-8-/1-C8RdmEmjBxrG5pzamGDMSg.png
rename to static/images/downloaded_images/Concourse-Update--June-4-8-/1-C8RdmEmjBxrG5pzamGDMSg.png
diff --git a/assets/images/downloaded_images/Concourse-Update--June-4-8-/1-XZfbfSSmYOJi2Ujc1uDP7Q.png b/static/images/downloaded_images/Concourse-Update--June-4-8-/1-XZfbfSSmYOJi2Ujc1uDP7Q.png
similarity index 100%
rename from assets/images/downloaded_images/Concourse-Update--June-4-8-/1-XZfbfSSmYOJi2Ujc1uDP7Q.png
rename to static/images/downloaded_images/Concourse-Update--June-4-8-/1-XZfbfSSmYOJi2Ujc1uDP7Q.png
diff --git a/assets/images/downloaded_images/Concourse-Update--May-28---June-1-/1-GfBC0PNc6p2DOiGAbcxKnA.png b/static/images/downloaded_images/Concourse-Update--May-28---June-1-/1-GfBC0PNc6p2DOiGAbcxKnA.png
similarity index 100%
rename from assets/images/downloaded_images/Concourse-Update--May-28---June-1-/1-GfBC0PNc6p2DOiGAbcxKnA.png
rename to static/images/downloaded_images/Concourse-Update--May-28---June-1-/1-GfBC0PNc6p2DOiGAbcxKnA.png
diff --git a/assets/images/downloaded_images/Concourse-Update--May-28---June-1-/1-VzHW0teV3e1DfrqcYWc_-w.png b/static/images/downloaded_images/Concourse-Update--May-28---June-1-/1-VzHW0teV3e1DfrqcYWc_-w.png
similarity index 100%
rename from assets/images/downloaded_images/Concourse-Update--May-28---June-1-/1-VzHW0teV3e1DfrqcYWc_-w.png
rename to static/images/downloaded_images/Concourse-Update--May-28---June-1-/1-VzHW0teV3e1DfrqcYWc_-w.png
diff --git a/assets/images/downloaded_images/Concourse-Update--May-28---June-1-/1-kJxF-3MOSqElyItFT2ec-A.png b/static/images/downloaded_images/Concourse-Update--May-28---June-1-/1-kJxF-3MOSqElyItFT2ec-A.png
similarity index 100%
rename from assets/images/downloaded_images/Concourse-Update--May-28---June-1-/1-kJxF-3MOSqElyItFT2ec-A.png
rename to static/images/downloaded_images/Concourse-Update--May-28---June-1-/1-kJxF-3MOSqElyItFT2ec-A.png
diff --git a/assets/images/downloaded_images/Concourse-Update--May-28---June-1-/1-n8Ea93MfUmDIGaPLtdU37Q.png b/static/images/downloaded_images/Concourse-Update--May-28---June-1-/1-n8Ea93MfUmDIGaPLtdU37Q.png
similarity index 100%
rename from assets/images/downloaded_images/Concourse-Update--May-28---June-1-/1-n8Ea93MfUmDIGaPLtdU37Q.png
rename to static/images/downloaded_images/Concourse-Update--May-28---June-1-/1-n8Ea93MfUmDIGaPLtdU37Q.png
diff --git a/assets/images/downloaded_images/Concourse-Update--Nov-19-23-/1-fBOnArsQyRfYMLYGB4Uk_w.jpeg b/static/images/downloaded_images/Concourse-Update--Nov-19-23-/1-fBOnArsQyRfYMLYGB4Uk_w.jpeg
similarity index 100%
rename from assets/images/downloaded_images/Concourse-Update--Nov-19-23-/1-fBOnArsQyRfYMLYGB4Uk_w.jpeg
rename to static/images/downloaded_images/Concourse-Update--Nov-19-23-/1-fBOnArsQyRfYMLYGB4Uk_w.jpeg
diff --git a/assets/images/downloaded_images/Concourse-Update--Nov-5-9-/1-JcXgBDqfq8Lwc4WNwyJgQg.jpeg b/static/images/downloaded_images/Concourse-Update--Nov-5-9-/1-JcXgBDqfq8Lwc4WNwyJgQg.jpeg
similarity index 100%
rename from assets/images/downloaded_images/Concourse-Update--Nov-5-9-/1-JcXgBDqfq8Lwc4WNwyJgQg.jpeg
rename to static/images/downloaded_images/Concourse-Update--Nov-5-9-/1-JcXgBDqfq8Lwc4WNwyJgQg.jpeg
diff --git a/assets/images/downloaded_images/Concourse-Update--Oct-15-19-/1-I0qcGZPL9DOugmQ6eC_xVQ.png b/static/images/downloaded_images/Concourse-Update--Oct-15-19-/1-I0qcGZPL9DOugmQ6eC_xVQ.png
similarity index 100%
rename from assets/images/downloaded_images/Concourse-Update--Oct-15-19-/1-I0qcGZPL9DOugmQ6eC_xVQ.png
rename to static/images/downloaded_images/Concourse-Update--Oct-15-19-/1-I0qcGZPL9DOugmQ6eC_xVQ.png
diff --git a/assets/images/downloaded_images/Concourse-Update--Oct-15-19-/1-Y05yilBhjLQKwCftw39ZVw.jpeg b/static/images/downloaded_images/Concourse-Update--Oct-15-19-/1-Y05yilBhjLQKwCftw39ZVw.jpeg
similarity index 100%
rename from assets/images/downloaded_images/Concourse-Update--Oct-15-19-/1-Y05yilBhjLQKwCftw39ZVw.jpeg
rename to static/images/downloaded_images/Concourse-Update--Oct-15-19-/1-Y05yilBhjLQKwCftw39ZVw.jpeg
diff --git a/assets/images/downloaded_images/Concourse-Update--Oct-22-26-/1-MnGUtwM_fDCZBeKhYrlwqA.jpeg b/static/images/downloaded_images/Concourse-Update--Oct-22-26-/1-MnGUtwM_fDCZBeKhYrlwqA.jpeg
similarity index 100%
rename from assets/images/downloaded_images/Concourse-Update--Oct-22-26-/1-MnGUtwM_fDCZBeKhYrlwqA.jpeg
rename to static/images/downloaded_images/Concourse-Update--Oct-22-26-/1-MnGUtwM_fDCZBeKhYrlwqA.jpeg
diff --git a/assets/images/downloaded_images/Concourse-Update--Oct-22-26-/1-yxHddOEl3sz5TqCy7M0q_A.png b/static/images/downloaded_images/Concourse-Update--Oct-22-26-/1-yxHddOEl3sz5TqCy7M0q_A.png
similarity index 100%
rename from assets/images/downloaded_images/Concourse-Update--Oct-22-26-/1-yxHddOEl3sz5TqCy7M0q_A.png
rename to static/images/downloaded_images/Concourse-Update--Oct-22-26-/1-yxHddOEl3sz5TqCy7M0q_A.png
diff --git a/assets/images/downloaded_images/Concourse-Update--Oct-29--Nov-2-/1-7C_nS91OafAnN5DWBtN4SA.jpeg b/static/images/downloaded_images/Concourse-Update--Oct-29--Nov-2-/1-7C_nS91OafAnN5DWBtN4SA.jpeg
similarity index 100%
rename from assets/images/downloaded_images/Concourse-Update--Oct-29--Nov-2-/1-7C_nS91OafAnN5DWBtN4SA.jpeg
rename to static/images/downloaded_images/Concourse-Update--Oct-29--Nov-2-/1-7C_nS91OafAnN5DWBtN4SA.jpeg
diff --git a/assets/images/downloaded_images/Concourse-Update--Oct-9-12-/1-beC36nbzVbF57aHcM2jEyQ.jpeg b/static/images/downloaded_images/Concourse-Update--Oct-9-12-/1-beC36nbzVbF57aHcM2jEyQ.jpeg
similarity index 100%
rename from assets/images/downloaded_images/Concourse-Update--Oct-9-12-/1-beC36nbzVbF57aHcM2jEyQ.jpeg
rename to static/images/downloaded_images/Concourse-Update--Oct-9-12-/1-beC36nbzVbF57aHcM2jEyQ.jpeg
diff --git a/assets/images/downloaded_images/Concourse-Update--Sept-10---Sept-14-/1-oJ9JKLsPYwX6YtLNEibR0w.png b/static/images/downloaded_images/Concourse-Update--Sept-10---Sept-14-/1-oJ9JKLsPYwX6YtLNEibR0w.png
similarity index 100%
rename from assets/images/downloaded_images/Concourse-Update--Sept-10---Sept-14-/1-oJ9JKLsPYwX6YtLNEibR0w.png
rename to static/images/downloaded_images/Concourse-Update--Sept-10---Sept-14-/1-oJ9JKLsPYwX6YtLNEibR0w.png
diff --git a/assets/images/downloaded_images/Concourse-Update--Sept-17-21-/1-7EmboSXNrRcSwtYmV9WSLQ.jpeg b/static/images/downloaded_images/Concourse-Update--Sept-17-21-/1-7EmboSXNrRcSwtYmV9WSLQ.jpeg
similarity index 100%
rename from assets/images/downloaded_images/Concourse-Update--Sept-17-21-/1-7EmboSXNrRcSwtYmV9WSLQ.jpeg
rename to static/images/downloaded_images/Concourse-Update--Sept-17-21-/1-7EmboSXNrRcSwtYmV9WSLQ.jpeg
diff --git a/assets/images/downloaded_images/Concourse-Update--Sept-24-28-/1-f2DIMOJRMC4Cm8YG-iWGXw.png b/static/images/downloaded_images/Concourse-Update--Sept-24-28-/1-f2DIMOJRMC4Cm8YG-iWGXw.png
similarity index 100%
rename from assets/images/downloaded_images/Concourse-Update--Sept-24-28-/1-f2DIMOJRMC4Cm8YG-iWGXw.png
rename to static/images/downloaded_images/Concourse-Update--Sept-24-28-/1-f2DIMOJRMC4Cm8YG-iWGXw.png
diff --git a/assets/images/downloaded_images/Concourse-Update--Sept-24-28-/1-hrYofU4YBkZ9SWkt4fUPZA.jpeg b/static/images/downloaded_images/Concourse-Update--Sept-24-28-/1-hrYofU4YBkZ9SWkt4fUPZA.jpeg
similarity index 100%
rename from assets/images/downloaded_images/Concourse-Update--Sept-24-28-/1-hrYofU4YBkZ9SWkt4fUPZA.jpeg
rename to static/images/downloaded_images/Concourse-Update--Sept-24-28-/1-hrYofU4YBkZ9SWkt4fUPZA.jpeg
diff --git a/assets/images/downloaded_images/Concourse-Update--Sept-24-28-/1-kTNsddsROpolUBj1oiJ6Mg.png b/static/images/downloaded_images/Concourse-Update--Sept-24-28-/1-kTNsddsROpolUBj1oiJ6Mg.png
similarity index 100%
rename from assets/images/downloaded_images/Concourse-Update--Sept-24-28-/1-kTNsddsROpolUBj1oiJ6Mg.png
rename to static/images/downloaded_images/Concourse-Update--Sept-24-28-/1-kTNsddsROpolUBj1oiJ6Mg.png
diff --git a/assets/images/downloaded_images/Concourse-Update--Sept-24-28-/1-syqGOwSEdWFE5CvrkZT-Kg.jpeg b/static/images/downloaded_images/Concourse-Update--Sept-24-28-/1-syqGOwSEdWFE5CvrkZT-Kg.jpeg
similarity index 100%
rename from assets/images/downloaded_images/Concourse-Update--Sept-24-28-/1-syqGOwSEdWFE5CvrkZT-Kg.jpeg
rename to static/images/downloaded_images/Concourse-Update--Sept-24-28-/1-syqGOwSEdWFE5CvrkZT-Kg.jpeg
diff --git a/assets/images/downloaded_images/Concourse-Update-April-29-3/1-08IsVksi-Nc9O0BnmW5MiA.png b/static/images/downloaded_images/Concourse-Update-April-29-3/1-08IsVksi-Nc9O0BnmW5MiA.png
similarity index 100%
rename from assets/images/downloaded_images/Concourse-Update-April-29-3/1-08IsVksi-Nc9O0BnmW5MiA.png
rename to static/images/downloaded_images/Concourse-Update-April-29-3/1-08IsVksi-Nc9O0BnmW5MiA.png
diff --git a/assets/images/downloaded_images/Concourse-Update-April-29-3/1-T8nBx-2mNbjK-nnGoo_PgQ.png b/static/images/downloaded_images/Concourse-Update-April-29-3/1-T8nBx-2mNbjK-nnGoo_PgQ.png
similarity index 100%
rename from assets/images/downloaded_images/Concourse-Update-April-29-3/1-T8nBx-2mNbjK-nnGoo_PgQ.png
rename to static/images/downloaded_images/Concourse-Update-April-29-3/1-T8nBx-2mNbjK-nnGoo_PgQ.png
diff --git a/assets/images/downloaded_images/Concourse-Update-June-7/1-GfQE6uQunGxomjqeYdsjUA.jpeg b/static/images/downloaded_images/Concourse-Update-June-7/1-GfQE6uQunGxomjqeYdsjUA.jpeg
similarity index 100%
rename from assets/images/downloaded_images/Concourse-Update-June-7/1-GfQE6uQunGxomjqeYdsjUA.jpeg
rename to static/images/downloaded_images/Concourse-Update-June-7/1-GfQE6uQunGxomjqeYdsjUA.jpeg
diff --git a/assets/images/downloaded_images/Concourse-Updates--July-3-6-/0-BrjbFvtgpagi0Ag3.png b/static/images/downloaded_images/Concourse-Updates--July-3-6-/0-BrjbFvtgpagi0Ag3.png
similarity index 100%
rename from assets/images/downloaded_images/Concourse-Updates--July-3-6-/0-BrjbFvtgpagi0Ag3.png
rename to static/images/downloaded_images/Concourse-Updates--July-3-6-/0-BrjbFvtgpagi0Ag3.png
diff --git a/assets/images/downloaded_images/Concourse-Updates--July-3-6-/1-Xp51wHexBz5wx1GcqaCvwA.png b/static/images/downloaded_images/Concourse-Updates--July-3-6-/1-Xp51wHexBz5wx1GcqaCvwA.png
similarity index 100%
rename from assets/images/downloaded_images/Concourse-Updates--July-3-6-/1-Xp51wHexBz5wx1GcqaCvwA.png
rename to static/images/downloaded_images/Concourse-Updates--July-3-6-/1-Xp51wHexBz5wx1GcqaCvwA.png
diff --git a/assets/images/downloaded_images/Concourse-Updates--Nov-26-30-/1-BFgbR-J5U389pc0g9nDi_Q.jpeg b/static/images/downloaded_images/Concourse-Updates--Nov-26-30-/1-BFgbR-J5U389pc0g9nDi_Q.jpeg
similarity index 100%
rename from assets/images/downloaded_images/Concourse-Updates--Nov-26-30-/1-BFgbR-J5U389pc0g9nDi_Q.jpeg
rename to static/images/downloaded_images/Concourse-Updates--Nov-26-30-/1-BFgbR-J5U389pc0g9nDi_Q.jpeg
diff --git a/assets/images/downloaded_images/Concourse-at-SpringOne-2017/1-JzJoM_Man8MYThde2qy7Zg.png b/static/images/downloaded_images/Concourse-at-SpringOne-2017/1-JzJoM_Man8MYThde2qy7Zg.png
similarity index 100%
rename from assets/images/downloaded_images/Concourse-at-SpringOne-2017/1-JzJoM_Man8MYThde2qy7Zg.png
rename to static/images/downloaded_images/Concourse-at-SpringOne-2017/1-JzJoM_Man8MYThde2qy7Zg.png
diff --git a/assets/images/downloaded_images/How-the-Concourse-Team-Organize-Issues/1--19t4s8wuBf9tUCiluO_mQ.png b/static/images/downloaded_images/How-the-Concourse-Team-Organize-Issues/1--19t4s8wuBf9tUCiluO_mQ.png
similarity index 100%
rename from assets/images/downloaded_images/How-the-Concourse-Team-Organize-Issues/1--19t4s8wuBf9tUCiluO_mQ.png
rename to static/images/downloaded_images/How-the-Concourse-Team-Organize-Issues/1--19t4s8wuBf9tUCiluO_mQ.png
diff --git a/assets/images/downloaded_images/How-the-Concourse-Team-Organize-Issues/1-5wA-RflsG_zFAyYMw0O95w.png b/static/images/downloaded_images/How-the-Concourse-Team-Organize-Issues/1-5wA-RflsG_zFAyYMw0O95w.png
similarity index 100%
rename from assets/images/downloaded_images/How-the-Concourse-Team-Organize-Issues/1-5wA-RflsG_zFAyYMw0O95w.png
rename to static/images/downloaded_images/How-the-Concourse-Team-Organize-Issues/1-5wA-RflsG_zFAyYMw0O95w.png
diff --git a/assets/images/downloaded_images/Sneak-Peek--Spatial-Resources/1-9vFBBZBYtFvCxsDnoMZszw.jpeg b/static/images/downloaded_images/Sneak-Peek--Spatial-Resources/1-9vFBBZBYtFvCxsDnoMZszw.jpeg
similarity index 100%
rename from assets/images/downloaded_images/Sneak-Peek--Spatial-Resources/1-9vFBBZBYtFvCxsDnoMZszw.jpeg
rename to static/images/downloaded_images/Sneak-Peek--Spatial-Resources/1-9vFBBZBYtFvCxsDnoMZszw.jpeg
diff --git a/assets/images/downloaded_images/Sneak-Peek--Spatial-Resources/1-agN3JPhVv4Fyfvp-2VQsRQ.png b/static/images/downloaded_images/Sneak-Peek--Spatial-Resources/1-agN3JPhVv4Fyfvp-2VQsRQ.png
similarity index 100%
rename from assets/images/downloaded_images/Sneak-Peek--Spatial-Resources/1-agN3JPhVv4Fyfvp-2VQsRQ.png
rename to static/images/downloaded_images/Sneak-Peek--Spatial-Resources/1-agN3JPhVv4Fyfvp-2VQsRQ.png
diff --git a/static/images/downloaded_images/Strategic-Plan_Page_13_Image_0001-750.jpg b/static/images/downloaded_images/Strategic-Plan_Page_13_Image_0001-750.jpg
new file mode 100644
index 0000000..bdda04d
Binary files /dev/null and b/static/images/downloaded_images/Strategic-Plan_Page_13_Image_0001-750.jpg differ
diff --git a/assets/images/downloaded_images/Suspicious-Volume-Usage-on-Workers/1-afxjY-fNHqW6BPik1xdGVQ.png b/static/images/downloaded_images/Suspicious-Volume-Usage-on-Workers/1-afxjY-fNHqW6BPik1xdGVQ.png
similarity index 100%
rename from assets/images/downloaded_images/Suspicious-Volume-Usage-on-Workers/1-afxjY-fNHqW6BPik1xdGVQ.png
rename to static/images/downloaded_images/Suspicious-Volume-Usage-on-Workers/1-afxjY-fNHqW6BPik1xdGVQ.png
diff --git a/assets/images/downloaded_images/Suspicious-Volume-Usage-on-Workers/1-m-1ouUbMQEVv9gPJ3wggug.png b/static/images/downloaded_images/Suspicious-Volume-Usage-on-Workers/1-m-1ouUbMQEVv9gPJ3wggug.png
similarity index 100%
rename from assets/images/downloaded_images/Suspicious-Volume-Usage-on-Workers/1-m-1ouUbMQEVv9gPJ3wggug.png
rename to static/images/downloaded_images/Suspicious-Volume-Usage-on-Workers/1-m-1ouUbMQEVv9gPJ3wggug.png
diff --git a/assets/images/downloaded_images/The-Concourse-Crew--2017-/1-Q5Wx-Lltp5MDzh1rE2Yw0g.png b/static/images/downloaded_images/The-Concourse-Crew--2017-/1-Q5Wx-Lltp5MDzh1rE2Yw0g.png
similarity index 100%
rename from assets/images/downloaded_images/The-Concourse-Crew--2017-/1-Q5Wx-Lltp5MDzh1rE2Yw0g.png
rename to static/images/downloaded_images/The-Concourse-Crew--2017-/1-Q5Wx-Lltp5MDzh1rE2Yw0g.png
diff --git a/assets/images/downloaded_images/The-Great-Process-Update-of-2018/1-Fdk1aihMwmllUR7HOBp2kg.jpeg b/static/images/downloaded_images/The-Great-Process-Update-of-2018/1-Fdk1aihMwmllUR7HOBp2kg.jpeg
similarity index 100%
rename from assets/images/downloaded_images/The-Great-Process-Update-of-2018/1-Fdk1aihMwmllUR7HOBp2kg.jpeg
rename to static/images/downloaded_images/The-Great-Process-Update-of-2018/1-Fdk1aihMwmllUR7HOBp2kg.jpeg
diff --git a/themes/concourse/LICENSE b/themes/concourse/LICENSE
new file mode 100644
index 0000000..8aa2645
--- /dev/null
+++ b/themes/concourse/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) [year] [fullname]
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/themes/concourse/README.md b/themes/concourse/README.md
new file mode 100644
index 0000000..7cec74e
--- /dev/null
+++ b/themes/concourse/README.md
@@ -0,0 +1,7 @@
+# Theme Name
+
+## Features
+
+## Installation
+
+## Configuration
diff --git a/themes/concourse/archetypes/posts.md b/themes/concourse/archetypes/posts.md
new file mode 100644
index 0000000..0bbf6c4
--- /dev/null
+++ b/themes/concourse/archetypes/posts.md
@@ -0,0 +1,8 @@
++++
+title = "{{ replace .TranslationBaseName "-" " " | title }}"
+date = "{{ .Date }}"
+author = ""
+tags = ["", ""]
+keywords = ["", ""]
+description = ""
++++
diff --git a/themes/concourse/assets/css/booklit.css b/themes/concourse/assets/css/booklit.css
new file mode 100644
index 0000000..a27f2e9
--- /dev/null
+++ b/themes/concourse/assets/css/booklit.css
@@ -0,0 +1,1498 @@
+* {
+ box-sizing: border-box;
+}
+
+html,
+body {
+ min-height: 100vh;
+}
+
+body {
+ font-family: 'Barlow', Helvetica, Arial, sans-serif;
+ font-size: 16px;
+ font-weight: 400;
+ line-height: 1.6;
+ color: #2a2929;
+ background: white;
+}
+
+.page-top {
+ background: #4a90e2;
+}
+
+.page-top .top-nav {
+ max-width: 1100px;
+ margin: 0 auto;
+}
+
+.body-content {
+ background: white;
+ max-width: 860px;
+ flex-grow: 1;
+}
+
+.page-body {
+ max-width: 1100px;
+ margin: 0 auto;
+ display: flex;
+ flex-direction: row;
+}
+
+.page-body .page-nav {
+ width: 240px;
+ flex-shrink: 0;
+}
+
+a {
+ color: #2d76cc;
+}
+
+a:hover {
+ color: #4a90e2;
+}
+
+a:visited {
+ color: #7a7373;
+}
+
+a:hover {
+ text-decoration: underline;
+}
+
+code,
+pre {
+ font-family: 'Iosevka', monospace;
+}
+
+pre {
+ background: #efeeee;
+ color: #3d3c3c;
+ padding: 0.5rem;
+ overflow-x: auto;
+}
+
+p,
+pre,
+.highlight,
+ul,
+ol,
+dl,
+iframe {
+ margin: 0 0 1.5em;
+}
+
+dd,
+li {
+ margin-bottom: 1em;
+}
+
+p:first-child,
+pre:first-child {
+ margin-top: 0;
+}
+
+p:last-child,
+pre:last-child {
+ margin-bottom: 0;
+}
+
+li:last-child,
+dd:last-child {
+ margin-bottom: 0;
+}
+
+dt code,
+p code {
+ font-size: 0.9em;
+}
+
+code code {
+ font-size: 1em;
+}
+
+table,
+tr,
+td {
+ padding: 0;
+ border-collapse: collapse;
+}
+
+h1 code,
+h2 code,
+h3 code {
+ font-weight: 600;
+ font-size: 0.9em;
+}
+
+nav ul {
+ list-style-type: none;
+}
+
+h1,
+h2,
+h3,
+h4,
+h5,
+h6 {
+ font-family: 'Roboto Slab', serif;
+ font-weight: normal;
+}
+
+h1 {
+ font-size: 32px;
+ margin-top: 0;
+ font-weight: 500;
+}
+
+h2 {
+ font-size: 24px;
+ font-weight: 500;
+}
+
+h3 {
+ font-size: 20px;
+}
+
+h2,
+h3 {
+ margin: 3rem 0 0.8rem;
+}
+
+.top-logo,
+.top-nav,
+.top-search {
+ background: #4a90e2;
+ color: white;
+ font-family: 'Roboto Slab', serif;
+ line-height: 70px;
+}
+
+.page-nav {
+ padding: 30px;
+}
+
+.page-partial h2 {
+ margin-top: 0;
+}
+
+.page-content {
+ background: white;
+ position: relative;
+ min-width: 300px;
+}
+
+.page-content,
+.page-partial {
+ padding: 70px;
+}
+
+.top-nav {
+ position: relative;
+ white-space: nowrap;
+ display: flex;
+ flex-direction: row;
+}
+
+.top-link {
+ color: white;
+ font-size: 16px;
+ text-transform: lowercase;
+ line-height: 70px;
+ display: inline-block;
+ padding: 0 25px;
+}
+
+.top-link.logo-link {
+ color: white;
+ margin: 0;
+ font-size: 22px;
+ width: 240px;
+ padding: 0 50px 0 70px;
+ line-height: 70px;
+ display: inline-block;
+ vertical-align: top;
+ text-decoration: none;
+ position: relative;
+ text-transform: initial;
+}
+
+.top-link.logo-link img {
+ width: 35px;
+ height: 35px;
+ vertical-align: middle;
+ position: absolute;
+ top: 15.5px;
+ left: 14.5px;
+}
+
+.top-link,
+.top-link:visited {
+ color: white;
+ text-decoration: none;
+}
+
+.top-link:hover {
+ color: white;
+ text-decoration: underline;
+}
+
+.top-link.active {
+ background: #2d76cc;
+ text-decoration: underline;
+}
+
+.icon-link {
+ background-repeat: no-repeat;
+ background-size: 22px 22px;
+ background-position: 20px 30px;
+ padding-left: 54px;
+}
+
+/* shoutout to hashicorp who i've pretty much copied this from */
+.download-link {
+ background-image: url("/images/icons/arrow-down-box.svg");
+}
+
+.github-link {
+ background-image: url("/images/icons/github-box.svg");
+}
+
+.page-nav {
+ font-family: 'Roboto Slab', serif;
+ font-size: 14px;
+ background: #2a2929;
+ color: #7a7373;
+ display: flex;
+ flex-direction: column;
+}
+
+.page-nav a {
+ color: #9b9b9b;
+ text-decoration: none;
+}
+
+.page-nav a:hover {
+ text-decoration: underline;
+}
+
+.page-content {
+ background: white;
+}
+
+.page-content ul,
+.page-content ol,
+.page-content dl {
+ padding-left: 30px;
+}
+
+.page-content code {
+ background: rgba(30, 29, 29, 0.07);
+ padding: 3px;
+ border-radius: 5px;
+}
+
+.page-content pre code {
+ background: transparent;
+ padding: 0;
+ border-radius: 0;
+}
+
+.page-content code code,
+.definition-thumb code {
+ border: 0;
+ padding: 0;
+}
+
+.page-content a code {
+ color: #3d3c3c;
+}
+
+.page-content a:hover code {
+ color: #5a5555;
+}
+
+.page-content a:hover code strong {
+ text-decoration: underline;
+}
+
+.page-content table {
+ margin-bottom: 1em;
+}
+
+.page-content tr:first-child {
+ font-family: 'Roboto Slab', serif;
+ font-weight: 500;
+ border-bottom: 2px solid #2a2929;
+}
+
+.page-content td {
+ padding: 0.3em 1em 0.3em 0;
+}
+
+.page-content td:last-child {
+ padding-right: 0;
+}
+
+.top-nav {
+ position: relative;
+}
+
+.search-input {
+ z-index: 101;
+ border: 1px solid transparent;
+ background: rgba(255, 255, 255, 0.25) url('/images/search_icon.svg') no-repeat top 3.5px right 2.5px;
+ padding: 5px;
+ transition: all 0.25s ease-out;
+ width: 32px;
+ height: 32px;
+ position: absolute;
+ right: 19px;
+ top: 19px;
+}
+
+.search-input::placeholder {
+ color: transparent;
+}
+
+.search-input:focus::placeholder {
+ color: rgba(0, 0, 0, 0.5);
+}
+
+.search-input:focus,
+.search-input:valid {
+ outline: none;
+ background: white;
+ border-color: #e6e5e5;
+ width: 500px;
+}
+
+.search-results {
+ background: white;
+ list-style-type: none;
+ box-shadow: 0 0 10px rgba(0, 0, 0, 0.125);
+ padding: 0;
+ z-index: 100;
+ border-left: 1px solid #e6e5e5;
+ border-right: 1px solid #e6e5e5;
+ color: #2a2929;
+ width: 500px;
+ position: absolute;
+ top: 51px;
+ right: 19px;
+ margin: 0;
+ overflow-y: auto;
+ overflow-x: hidden;
+ line-height: 1.6;
+ height: 90vh;
+}
+
+.search-results li {
+ margin-bottom: 0;
+}
+
+.search-results:empty {
+ display: none;
+}
+
+.search-results mark {
+ font-weight: bold;
+ border-bottom: 1px solid;
+ background: transparent;
+}
+
+.search-results li a {
+ padding: 10px;
+ margin: 0;
+ display: block;
+ border-bottom: 1px solid #efeeee;
+ text-decoration: none;
+}
+
+.search-results li a:hover {
+ background: #ffffdc;
+ border-color: #efeeee;
+ text-decoration: none;
+}
+
+.search-results li .result-header {
+ display: flex;
+ flex-direction: row;
+ justify-content: space-between;
+}
+
+.search-results li h3,
+.search-results li h4 {
+ margin: 0;
+ line-height: 1;
+}
+
+.search-results li h3 {
+ font-size: 18px;
+}
+
+.search-results li h4 {
+ font-size: 14px;
+ margin-top: 4px;
+}
+
+.search-results li h4:before {
+ content: "in ";
+ font-size: 12px;
+}
+
+.search-results li p {
+ margin: 0;
+ margin-top: 6px;
+ font-family: 'PT Sans', Helvetica, Arial, sans-serif;
+ font-size: 14px;
+ color: #7a7373;
+}
+
+.search-results a,
+.search-results a:visited {
+ color: #2a2929;
+}
+
+body {
+ background: #2a2929;
+}
+
+.page-nav .context {
+ position: relative;
+ margin-bottom: 2rem;
+}
+
+.page-nav .context .children a.active {
+ text-decoration: underline;
+}
+
+.page-nav .context a.self {
+ color: white;
+ text-decoration: underline;
+}
+
+.page-nav .context .top {
+ font-size: 1.1em;
+}
+
+.page-nav .children {
+ margin-left: 0.5em;
+}
+
+.page-nav .children table {
+ border-spacing: 0;
+ border-collapse: collapse;
+}
+
+.page-nav .children table td {
+ vertical-align: top;
+}
+
+.page-nav .section-number {
+ width: 100px;
+ display: inline-block;
+ text-align: right;
+ margin-left: -100px;
+ padding-right: 0.5rem;
+}
+
+.page-nav .children {
+ margin-left: -100px;
+}
+
+.page-nav .children .number-cell {
+ text-align: right;
+ padding-right: 0.5rem;
+ width: 100px;
+}
+
+.page-nav .children .title-cell {
+ display: inline-block;
+ padding-left: 5px;
+ text-indent: -5px;
+}
+
+.page-aside pre {
+ background: #e6e5e5;
+ color: #3d3c3c;
+}
+
+.page-toc h2 {
+ margin-top: 0;
+ color: #5a5555;
+}
+
+.page-toc .section-number {
+ color: #7a7373;
+}
+
+.page-toc a {
+ color: #9b9b9b;
+}
+
+.page-toc a:hover {
+ text-decoration: underline;
+}
+
+.page-toc ol {
+ padding-left: 30px;
+}
+
+.page-toc>.toc {
+ padding-left: 0px;
+}
+
+.page-aside {
+ background: #f6f5f5;
+}
+
+.page-content.full {
+ grid-column-start: 2;
+ grid-column-end: span 2;
+}
+
+.page-content h1 {
+ border-top: 4px solid #2a2929;
+ padding-top: 10px;
+}
+
+.toc {
+ font-family: 'Roboto Slab', serif;
+}
+
+.page-toc>.toc>li>.toc {
+ margin-bottom: 1.5em;
+}
+
+.toc li {
+ margin-bottom: 10px;
+}
+
+.toc li li {
+ margin-bottom: 0;
+}
+
+.toc a {
+ text-decoration: none;
+}
+
+.toc ol a,
+.toc ol .section-number {
+ font-size: 16px;
+}
+
+.toc,
+.toc ol {
+ list-style: none;
+}
+
+.table-of-contents {
+ margin: 2em 0;
+}
+
+.table-of-contents .toc-header {
+ font-family: 'Roboto Slab', serif;
+}
+
+.page-content ol.toc {
+ margin-top: 1em;
+ margin-bottom: 1.5em;
+}
+
+.page-content ol.toc ol.toc {
+ margin-top: 0;
+}
+
+.page-content ol.toc .section-number {
+ color: #5a5555;
+ padding-right: 5px;
+}
+
+.improve-docs {
+ position: fixed;
+ bottom: 0;
+ left: 0;
+ color: #7a7373;
+ font-size: 13px;
+ list-style-type: none;
+ margin: 0;
+ padding: 30px;
+}
+
+.improve-docs a {
+ text-decoration: none;
+}
+
+.improve-docs a,
+.improve-docs a:visited {
+ color: #9b9b9b;
+}
+
+.improve-docs a:hover {
+ text-decoration: underline;
+}
+
+.improve-docs li {
+ margin-top: 5px;
+ margin-left: -4px;
+}
+
+.improve-docs img {
+ width: 16px;
+ height: 16px;
+ margin-bottom: -4px;
+ margin-right: 4px;
+ filter: grayscale(100%);
+ opacity: 0.5;
+}
+
+.improve-docs li:hover a {
+ color: white;
+}
+
+.improve-docs li:hover img {
+ filter: none;
+ opacity: 1;
+}
+
+.definition-thumb a {
+ color: inherit;
+}
+
+.definition-thumb pre {
+ background: #f6f5f5;
+ border-left: 1px solid #2a2929;
+ color: #2a2929;
+ margin-bottom: 0;
+}
+
+.definition-thumb a:hover {
+ text-decoration: underline;
+}
+
+.definition-content {
+ padding: 1em;
+}
+
+.definition-content .definition {
+ margin: 1em;
+}
+
+.aside {
+ color: #5a5555;
+ font-style: italic;
+ background: #f6f5f5;
+ padding: 1em;
+ margin: 2em;
+}
+
+.definition {
+ margin-top: 2em;
+}
+
+.definition-content {
+ border-left: 1px solid #e6e5e5;
+}
+
+.page-aside .example {
+ margin-bottom: 3em;
+}
+
+.example h3 {
+ font-size: 20px;
+}
+
+.trademark-guidelines {
+ font-family: 'Iosevka', monospace;
+}
+
+.trademark-guidelines li::before {
+ display: none;
+}
+
+.trademark-guidelines ul>li {
+ list-style-type: decimal;
+}
+
+.trademark-guidelines ul ul>li {
+ list-style-type: lower-alpha;
+}
+
+.trademark-guidelines ul ul ul>li {
+ list-style-type: lower-roman;
+}
+
+.trademark-guidelines ul ul ul ul>li {
+ list-style-type: decimal;
+}
+
+.trademark-guidelines img {
+ display: block;
+ width: 100px;
+ height: auto;
+ margin-right: 20px;
+}
+
+.trademark-guidelines h1 {
+ text-align: center;
+ margin: 10px 0 30px;
+}
+
+.warning {
+ background: #ffffdc;
+ padding: 5px 10px;
+ margin: 1em 0;
+}
+
+.warning p {
+ color: #434300;
+}
+
+.diagram {
+ text-align: center;
+}
+
+.anchor-target {
+ display: inline-block;
+ position: absolute;
+ box-sizing: content-box;
+ left: -35px;
+ width: 27px;
+ height: 100%;
+ padding-right: 10px;
+ background: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB3aWR0aD0iMTIwMCIgaGVpZ2h0PSIxMjAwIiB2aWV3Qm94PSIwIDAgMTIwMCAxMjAwIj48Zz48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSg2MDAgNjAwKSBzY2FsZSgwLjY5IDAuNjkpIHJvdGF0ZSgwKSB0cmFuc2xhdGUoLTYwMCAtNjAwKSIgc3R5bGU9ImZpbGw6IzJhMjkyOSI+PHN2ZyBmaWxsPSIjMmEyOTI5IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4bWxuczpza2V0Y2g9Imh0dHA6Ly93d3cuYm9oZW1pYW5jb2RpbmcuY29tL3NrZXRjaC9ucyIgdmlld0JveD0iMCAwIDM1IDM0IiB2ZXJzaW9uPSIxLjEiIHg9IjBweCIgeT0iMHB4Ij48dGl0bGU+TGluazwvdGl0bGU+PGRlc2M+Q3JlYXRlZCB3aXRoIFNrZXRjaC48L2Rlc2M+PGcgc3Ryb2tlPSJub25lIiBzdHJva2Utd2lkdGg9IjEiIGZpbGw9Im5vbmUiIGZpbGwtcnVsZT0iZXZlbm9kZCIgc2tldGNoOnR5cGU9Ik1TUGFnZSI+PHBhdGggZD0iTTE2LjQsMjYuMSBMMTIuNSwzMCBDMTEuMSwzMS40IDgsMzAuOCA1LjksMjguNyBDNC44LDI3LjYgNC4xLDI2LjIgMy45LDI0LjkgQzMuNywyMy43IDQsMjIuNyA0LjYsMjIuMSBMMTIsMTQuNyBDMTIuNywxNC4xIDEzLjcsMTMuOCAxNC44LDE0IEMxNi4xLDE0LjIgMTcuNSwxNC45IDE4LjYsMTYgQzE5LjEsMTYuNSAxOS42LDE3LjEgMTkuOSwxNy43IEMyMC4zLDE4LjQgMjEuMiwxOC43IDIxLjksMTguMyBDMjIuNiwxNy45IDIyLjksMTcgMjIuNSwxNi4zIEMyMiwxNS41IDIxLjQsMTQuNyAyMC43LDE0IEMxOS4xLDEyLjQgMTcuMiwxMS40IDE1LjIsMTEuMSBDMTMuMSwxMC44IDExLjEsMTEuMyA5LjgsMTIuNyBMMi40LDIwLjEgQzEuMSwyMS40IDAuNSwyMy40IDAuOCwyNS41IEMxLjEsMjcuNSAyLjEsMjkuNCAzLjcsMzEgQzUuNiwzMi45IDguMSwzNCAxMC4zLDM0IEMxMS45LDM0IDEzLjQsMzMuNSAxNC41LDMyLjMgTDE4LjQsMjguNCBDMTksMjcuOCAxOSwyNi45IDE4LjQsMjYuMyBDMTcuOSwyNS41IDE3LDI1LjUgMTYuNCwyNi4xIEwxNi40LDI2LjEgWiBNMzQuNCw4LjcgQzM0LjIsNi42IDMzLjIsNC42IDMxLjYsMyBDMzAsMS40IDI4LDAuNCAyNS45LDAuMiBDMjMuNywtMS4xMzI0Mjc0OWUtMTQgMjEuNywwLjYgMjAuMywyLjEgTDE1LjUsNi45IEMxNC45LDcuNSAxNC45LDguNCAxNS41LDkgQzE2LjEsOS42IDE3LDkuNiAxNy42LDkgTDIyLjQsNC4yIEMyMy4yLDMuNCAyNC4zLDMuMSAyNS42LDMuMiBDMjcsMy4zIDI4LjQsNCAyOS41LDUuMSBDMzAuNiw2LjIgMzEuMyw3LjYgMzEuNCw5IEMzMS41LDEwLjMgMzEuMiwxMS40IDMwLjQsMTIuMiBMMjIuMiwyMC40IEMyMS40LDIxLjIgMjAuMywyMS41IDE5LDIxLjQgQzE3LjYsMjEuMyAxNi4yLDIwLjYgMTUuMSwxOS41IEMxNC41LDE4LjkgMTQsMTguMiAxMy43LDE3LjUgQzEzLjQsMTYuNyAxMi41LDE2LjQgMTEuNywxNi44IEMxMC45LDE3LjEgMTAuNiwxOCAxMSwxOC44IEMxMS41LDE5LjkgMTIuMiwyMC44IDEzLDIxLjcgQzE0LjYsMjMuMyAxNi42LDI0LjMgMTguNywyNC41IEwxOS41LDI0LjUgQzIxLjQsMjQuNSAyMywyMy44IDI0LjMsMjIuNiBMMzIuNSwxNC40IEMzMy45LDEyLjkgMzQuNiwxMC45IDM0LjQsOC43IEwzNC40LDguNyBaIiBmaWxsPSIjMmEyOTI5IiBza2V0Y2g6dHlwZT0iTVNTaGFwZUdyb3VwIj48L3BhdGg+PC9nPjwvc3ZnPjwvZz48L2c+PC9zdmc+");
+ background-repeat: no-repeat;
+ background-size: 22px 22px;
+ background-position: 3px center;
+ opacity: 0.5;
+}
+
+.anchor-target:hover {
+ opacity: 1;
+}
+
+.section-header {
+ position: relative;
+}
+
+h1 .anchor {
+ top: 23px;
+}
+
+h2 .anchor {
+ top: 5px;
+}
+
+h3 .anchor {
+ top: 3px;
+}
+
+.prev-next {
+ border-top: 1px solid #2a2929;
+ color: #9b9b9b;
+ padding: 1rem 0;
+ margin-top: 50px;
+ display: block;
+ font-family: 'Roboto Slab', serif;
+ font-weight: 500;
+ display: flex;
+ flex-direction: row;
+}
+
+.prev-next .prev,
+.prev-next .next {
+ flex-grow: 1;
+}
+
+.prev-next .next {
+ text-align: right;
+}
+
+.prev-next .section-number {
+ margin-left: 0.4rem;
+ margin-right: 0.2rem;
+ color: #7a7373;
+}
+
+.prev-next a {
+ color: #5a5555;
+ text-decoration: none;
+}
+
+.prev-next a:hover {
+ text-decoration: underline;
+}
+
+a.github-user {
+ font-weight: 600;
+ color: #3d3c3c;
+ text-decoration: none;
+}
+
+a.github-user:hover {
+ text-decoration: underline;
+}
+
+body.index {
+ background: url('/images/concourse-pattern.svg') center center no-repeat;
+ background-size: cover;
+ background-attachment: fixed;
+}
+
+body.index .page-content p {
+ font-size: 18px;
+}
+
+body.index .page-content a {
+ color: #1e1d1d;
+}
+
+.pipeline-image {
+ margin-top: 2em;
+ margin-bottom: 1em;
+}
+
+.pipeline-image .pipeline-svg {
+ display: block;
+ width: 100%;
+ margin: 0 auto;
+ background: #3d3c3c;
+}
+
+.splash {
+ color: white;
+}
+
+.splash .splash-content {
+ padding: 140px 70px;
+ background: rgba(255, 255, 255, 0.1);
+ max-width: 1100px;
+ margin: 0 auto;
+}
+
+.splash .button a {
+ display: inline-block;
+ margin-top: 10px;
+ font-family: 'Roboto Slab', serif;
+ background: #4a90e2;
+ padding: 0 20px;
+ line-height: 40px;
+ font-size: 18px;
+ color: white;
+ text-decoration: none;
+}
+
+.splash .button a:hover {
+ background: #2d76cc;
+}
+
+body.index .page-content h2 {
+ margin-bottom: 14px;
+ font-size: 19px;
+ border: 0;
+}
+
+.splash-intro,
+.splash-downloads {
+ justify-content: center;
+}
+
+.splash-intro {
+ font-size: 18px;
+}
+
+.splash-intro h2 {
+ font-style: italic;
+ color: white;
+ font-family: 'Roboto Slab', serif;
+ font-style: normal;
+ margin-top: 0;
+ border: 0;
+ font-size: 26px;
+ font-weight: 500;
+}
+
+.splash-intro a,
+.splash-intro a:visited {
+ color: white;
+}
+
+.icon-button {
+ font-family: 'Roboto Slab', serif;
+ font-size: 16px;
+ display: inline-block;
+ padding: 4px 8px;
+ margin: -5px -8px;
+ padding-left: 34px;
+ background-repeat: no-repeat;
+ background-size: 18px 18px;
+ background-position: 8px center;
+}
+
+.icon-button,
+.icon-button:visited,
+.icon-button:hover {
+ color: white;
+ text-decoration: none;
+}
+
+.release-link {
+ background-color: #f5a623;
+ background-image: url("/images/icons/tag.svg");
+}
+
+.release-link:hover {
+ background-color: #ec9910;
+}
+
+.next-release {
+ font-size: 16px;
+ background-color: #4a90e2;
+ background-image: url("/images/icons/project.svg");
+ background-size: 15px 16px;
+}
+
+.next-release:hover {
+ background-color: #2d76cc;
+}
+
+.splash-downloads {
+ background: #2a2929;
+ justify-self: stretch;
+ position: relative;
+}
+
+.splash-downloads h3 {
+ margin-top: 0;
+ margin-bottom: 0;
+ line-height: 1;
+}
+
+.splash-downloads h3.whats-next {
+ margin-top: 25px;
+ margin-bottom: 0;
+}
+
+.splash-downloads .splash-split {
+ padding: 35px;
+}
+
+.splash-downloads .splash-split:not(:first-child) {
+ border-top: 2px solid #3d3c3c;
+}
+
+.splash-downloads .button a {
+ background: #3d3c3c;
+ font-size: 16px;
+}
+
+.splash-downloads .whats-next {
+ margin: 0 -40px -40px;
+ display: block;
+ padding: 5px;
+ color: #f6f5f5;
+ margin-top: 24px;
+ background: #3d3c3c;
+}
+
+.download-info {
+ margin-top: 25px;
+ margin-bottom: 0;
+ list-style-type: none;
+ padding-left: 0 !important;
+}
+
+.download-info>li {
+ color: white;
+ display: grid;
+ grid-template-columns: 1fr auto;
+}
+
+.download-info>li:not(:last-child) {
+ margin-bottom: 10px;
+}
+
+.download-info code {
+ background-color: #3d3c3c;
+ padding: 3px;
+ border-radius: 5px;
+}
+
+.download-info .download-links {
+ list-style-type: none;
+ padding-left: 0 !important;
+ margin-bottom: 0;
+ display: flex;
+ flex-direction: row;
+}
+
+.download-info .download-links>li {
+ margin-bottom: 0;
+ white-space: nowrap;
+ margin-right: 16px;
+}
+
+.download-info .download-links>li:last-child {
+ margin-right: 0;
+}
+
+.download-info .download-links .icon {
+ width: 16px;
+ height: 16px;
+ vertical-align: middle;
+ margin-right: 4px;
+ margin-top: -4px;
+}
+
+.download-info .download-links a,
+.download-info .download-links a:visited {
+ display: inline-block;
+ padding-bottom: 3px;
+ margin-bottom: -3px;
+ box-sizing: content-box;
+ position: relative;
+ bottom: -1px;
+ color: white;
+ text-decoration: none;
+ border-bottom: 1px solid transparent;
+}
+
+.download-info .download-links a .icon path,
+.download-info .download-links a:visited .icon path {
+ fill: white;
+}
+
+.download-info .download-links a:hover {
+ border-bottom-color: white;
+}
+
+.split-header {
+ display: flex;
+ flex-direction: row;
+ justify-content: space-between;
+}
+
+.side-by-side {
+ display: grid;
+ margin-bottom: 1em;
+ grid-template-columns: 48% 48%;
+ grid-gap: 0 4%;
+}
+
+.side-by-side .segment {
+ display: flex;
+ flex-direction: column;
+}
+
+.side-by-side .segment.example {
+ margin: 0;
+}
+
+.side-by-side .segment.example pre,
+.side-by-side .segment.example p {
+ margin: 0;
+}
+
+.side-by-side .pipeline-svg {
+ padding: 48px;
+}
+
+@media (max-width: 1100px) {
+ .side-by-side {
+ grid-template-columns: 100%;
+ grid-gap: 30px 0;
+ }
+}
+
+.rfcs {
+ width: 100%;
+ font-size: 18px;
+}
+
+.rfcs a {
+ text-decoration: none;
+}
+
+.rfcs a:hover {
+ text-decoration: underline;
+}
+
+.rfcs tr:nth-child(odd) {
+ background: #f6f5f5;
+}
+
+.rfcs tr:nth-child(odd).header {
+ background: transparent;
+}
+
+.rfcs .rfc-number,
+.rfcs .rfc-status,
+.rfcs .rfc-questions {
+ padding: 3px 5px;
+ color: white;
+}
+
+.rfcs .rfc-number,
+.rfcs .rfc-questions {
+ font-family: 'Iosevka', monospace;
+ background: #3d3c3c;
+ color: white !important;
+}
+
+.rfcs .rfc-status a {
+ color: white !important;
+}
+
+.rfcs .rfc-status.no-reviews {
+ background: #5a5555;
+}
+
+.rfcs .rfc-status.open {
+ background: #4a90e2;
+}
+
+.rfcs .rfc-status.pending-merge {
+ background: #11c560;
+}
+
+.rfcs .rfc-status.pending-close {
+ background: #ed4b35;
+}
+
+.rfcs .rfc-status.pending-postpone {
+ background: #f5a623;
+}
+
+.rfcs .rfc-questions {
+ background: #f5a623;
+ color: white !important;
+}
+
+.rfcs .reaction {
+ padding: 3px 5px;
+ line-height: 18px;
+ border-radius: 5px;
+ width: 50px;
+ display: inline-block;
+}
+
+.rfcs .reaction .emoji {
+ font-size: 14px;
+}
+
+.rfcs .reaction .count {
+ margin-left: 5px;
+ font-size: 14px;
+}
+
+.rfcs .rfc-col {
+ width: 150px;
+}
+
+.rfcs .status-col {
+ width: 150px;
+}
+
+.rfcs .reactions-col {
+ width: 150px;
+}
+
+.rfcs tr.footer {
+ background: transparent;
+}
+
+.rfcs .view-all-col a {
+ text-align: center;
+ line-height: 40px;
+ font-family: 'Roboto Slab', serif;
+ font-size: 18px;
+ color: white !important;
+ background: #3d3c3c;
+ display: block;
+}
+
+.rfcs .view-all-col a:hover {
+ text-decoration: none;
+ background: #2a2929;
+}
+
+.page-region p {
+ font-size: 18px;
+}
+
+.page-region .page-content {
+ padding: 70px;
+ max-width: 1100px;
+ margin: 0 auto;
+}
+
+.page-region .page-content h1 {
+ border: 0;
+ padding-top: 0;
+}
+
+.page-region.dark {
+ background: #2a2929;
+ color: white;
+}
+
+.page-region.dark .page-content {
+ background: #3d3c3c;
+}
+
+.page-region.dark .page-content a {
+ color: white;
+}
+
+.page-region.dark .page-content a code {
+ color: white;
+ background: #2a2929;
+}
+
+.page-region+.page-region .page-content {
+ border-top: 2px dashed #e6e5e5;
+}
+
+.schema {
+ margin: 1.5em 0;
+ margin-bottom: 1.5em;
+}
+
+.schema .schema-header {
+ margin-top: 0;
+ margin-bottom: 1.5rem;
+ position: relative;
+}
+
+.schema .schema .schema-header {
+ font-size: 18px;
+}
+
+.schema-scalar {
+ background: rgba(30, 29, 29, 0.07);
+ padding: 3px;
+ border-radius: 5px;
+}
+
+.toggleable .toggle {
+ display: none;
+}
+
+.toggleable .toggle-title {
+ cursor: pointer;
+ user-select: none;
+ display: block;
+ padding: 0.25rem 0.5rem;
+ padding-left: 32px;
+ background-image: url('/images/icons/chevron-down.svg');
+ background-repeat: no-repeat;
+ background-size: 12px;
+ background-position-x: 10px;
+ background-position-y: calc(50% + 1px);
+ position: relative;
+}
+
+.toggleable .toggle-title:after {
+ font-family: 'Barlow', Helvetica, Arial, sans-serif;
+ font-style: italic;
+ margin-left: 0.5rem;
+ position: absolute;
+ right: 0.5rem;
+}
+
+.toggleable .toggle-content {
+ display: none;
+ padding: 1em;
+ padding-left: 32px;
+}
+
+.toggleable .toggle:checked+label.toggle-title {
+ background-image: url('/images/icons/chevron-up.svg');
+ background-position-y: center;
+}
+
+.toggleable .toggle:checked+label+.toggle-content {
+ display: block;
+}
+
+.example {
+ margin-top: 1em;
+}
+
+.example .toggle-title {
+ background-color: rgba(74, 144, 226, 0.1);
+}
+
+.example .toggle-title:after {
+ content: "example";
+ color: #4a90e2;
+}
+
+.schema-group {
+ margin: 1em 0;
+}
+
+.schema-one-of {
+ border-bottom: 0.5em solid #f6f5f5;
+ border-left: 0.5em solid #f6f5f5;
+ border-right: 0.5em solid #f6f5f5;
+ margin: 1em -1.5em;
+}
+
+.schema-one-of .one-of-header {
+ display: block;
+ line-height: 32px;
+ padding: 0 0.5rem;
+ font-style: italic;
+ font-weight: bold;
+ background-color: #f6f5f5;
+}
+
+.schema-one-of .one-of-option {
+ padding: 0 1em;
+ border-bottom: 0.5rem solid #f6f5f5;
+}
+
+.schema-one-of .one-of-option:last-child {
+ border-bottom: 0;
+}
+
+.schema-one-of .schema-one-of {
+ border-color: #f0f;
+}
+
+.schema-one-of .schema-one-of .one-of-header {
+ background-color: #f0f;
+}
+
+.schema-one-of .schema-one-of .one-of-option {
+ border-color: #f0f;
+}
+
+.schema-attribute {
+ margin-top: 1em;
+}
+
+.schema-attribute:first-child {
+ margin-top: 0;
+}
+
+.schema-attribute .toggle-title a {
+ color: inherit;
+}
+
+.schema-attribute .toggle-title a:hover {
+ text-decoration: underline;
+}
+
+.schema-attribute .toggle-title code {
+ background: initial;
+ padding: initial;
+ border-radius: initial;
+}
+
+.schema-attribute .toggle-title .attribute-name {
+ font-weight: bold;
+ text-decoration: none;
+}
+
+.schema-attribute .toggle-title .attribute-name:hover {
+ text-decoration: underline;
+}
+
+.schema-attribute .toggle-title .attribute-type {
+ color: #9b9b9b;
+}
+
+.schema-attribute .toggle-title .attribute-type .schema-scalar,
+.schema-attribute .toggle-title .attribute-type a {
+ color: #2a2929;
+}
+
+.schema-attribute .attribute-content .schema-header {
+ margin-bottom: 1rem;
+}
+
+.schema-attribute .attribute-content .example {
+ margin-right: -1em;
+}
+
+.schema-attribute.required>.toggle-title {
+ background-color: #ffffdc;
+}
+
+.schema-attribute.required>.toggle-title:after {
+ content: "required";
+ color: #ec9910;
+}
+
+.schema-attribute.optional>.toggle-title {
+ background-color: #f6f5f5;
+}
+
+.schema-attribute.optional>.toggle-title:after {
+ content: "optional";
+ color: #3d3c3c;
+}
+
+.toggleable.metric {
+ margin-top: 1em;
+}
+
+.toggleable.metric .toggle-title {
+ background-color: #f6f5f5;
+}
+
+.toggleable.metric .toggle-title code {
+ background: 0;
+ padding: 0;
+ border-radius: 0;
+}
+
+.toggleable.metric .toggle-title .metric-name {
+ font-weight: bold;
+}
+
+.toggleable.metric .toggle-title .metric-labels {
+ color: #9b9b9b;
+}
+
+.toggleable.metric .toggle-title .metric-labels .metric-label {
+ color: #2a2929;
+}
+
+.toggleable.metric .toggle-title .metric-type {
+ float: right;
+ font-style: italic;
+ color: #3d3c3c;
+}
+
+.dim {
+ opacity: 0.5;
+}
+
+.top-banner {
+ background-color: #1e1d1d;
+ color: white;
+ font-family: 'Roboto Slab', serif;
+}
+
+.top-banner .banner-text {
+ max-width: 1100px;
+ margin: 0 auto;
+ padding: 10px 0;
+ text-align: center;
+}
+
+.top-banner a {
+ font-weight: bold;
+}
+
+.top-banner a,
+.top-banner a:visited {
+ color: #e6e5e5;
+}
+
+.top-banner a:hover {
+ color: white;
+}
diff --git a/themes/concourse/assets/css/main.css b/themes/concourse/assets/css/main.css
new file mode 100644
index 0000000..48eb54f
--- /dev/null
+++ b/themes/concourse/assets/css/main.css
@@ -0,0 +1,656 @@
+* {
+ box-sizing: border-box;
+}
+
+html,
+body {
+ min-height: 100vh;
+}
+
+body {
+ font-family: 'Barlow', Helvetica, Arial, sans-serif;
+ font-size: 16px;
+ font-weight: 400;
+ line-height: 1.6;
+ color: #2a2929;
+ background: white;
+}
+
+.page-top {
+ background: #4a90e2;
+}
+
+.page-top .top-nav {
+ max-width: 1100px;
+ margin: 0 auto;
+}
+
+.body-content {
+ background: white;
+ max-width: 860px;
+ flex-grow: 1;
+}
+
+.page-body {
+ max-width: 1100px;
+ margin: 0 auto;
+ display: flex;
+ flex-direction: row;
+}
+
+.page-body .page-nav {
+ width: 240px;
+ flex-shrink: 0;
+}
+
+a {
+ color: #2d76cc;
+}
+
+a:hover {
+ color: #4a90e2;
+}
+
+a:visited {
+ color: #7a7373;
+}
+
+a:hover {
+ text-decoration: underline;
+}
+
+code,
+pre {
+ font-family: 'Iosevka', monospace;
+}
+
+pre {
+ background: #efeeee;
+ color: #3d3c3c;
+ padding: 0.5rem;
+ overflow-x: auto;
+}
+
+p,
+pre,
+.highlight,
+ul,
+ol,
+dl,
+iframe {
+ margin: 0 0 1.5em;
+}
+
+dd,
+li {
+ margin-bottom: 1em;
+}
+
+p:first-child,
+pre:first-child {
+ margin-top: 0;
+}
+
+p:last-child,
+pre:last-child {
+ margin-bottom: 0;
+}
+
+li:last-child,
+dd:last-child {
+ margin-bottom: 0;
+}
+
+dt code,
+p code {
+ font-size: 0.9em;
+}
+
+code code {
+ font-size: 1em;
+}
+
+table,
+tr,
+td {
+ padding: 0;
+ border-collapse: collapse;
+}
+
+h1 code,
+h2 code,
+h3 code {
+ font-weight: 600;
+ font-size: 0.9em;
+}
+
+nav ul {
+ list-style-type: none;
+}
+
+h1,
+h2,
+h3,
+h4,
+h5,
+h6 {
+ font-family: 'Roboto Slab', serif;
+ font-weight: normal;
+}
+
+h1 {
+ font-size: 32px;
+ margin-top: 0;
+ font-weight: 500;
+}
+
+h2 {
+ font-size: 24px;
+ font-weight: 500;
+}
+
+h3 {
+ font-size: 20px;
+}
+
+h2,
+h3 {
+ margin: 3rem 0 0.8rem;
+}
+
+.top-logo,
+.top-nav,
+.top-search {
+ background: #4a90e2;
+ color: white;
+ font-family: 'Roboto Slab', serif;
+ line-height: 70px;
+}
+
+.page-nav {
+ padding: 30px;
+}
+
+.page-partial h2 {
+ margin-top: 0;
+}
+
+.page-content {
+ background: white;
+ position: relative;
+ min-width: 300px;
+}
+
+.page-content,
+.page-partial {
+ padding: 70px;
+}
+
+.top-nav {
+ position: relative;
+ white-space: nowrap;
+ display: flex;
+ flex-direction: row;
+}
+
+.top-link {
+ color: white;
+ font-size: 16px;
+ text-transform: lowercase;
+ line-height: 70px;
+ display: inline-block;
+ padding: 0 25px;
+}
+
+.top-link.logo-link {
+ color: white;
+ margin: 0;
+ font-size: 22px;
+ width: 240px;
+ padding: 0 50px 0 70px;
+ line-height: 70px;
+ display: inline-block;
+ vertical-align: top;
+ text-decoration: none;
+ position: relative;
+ text-transform: initial;
+}
+
+.top-link.logo-link img {
+ width: 35px;
+ height: 35px;
+ vertical-align: middle;
+ position: absolute;
+ top: 15.5px;
+ left: 14.5px;
+}
+
+.top-link,
+.top-link:visited {
+ color: white;
+ text-decoration: none;
+}
+
+.top-link:hover {
+ color: white;
+ text-decoration: underline;
+}
+
+.top-link.active {
+ background: #2d76cc;
+ text-decoration: underline;
+}
+
+.icon-link {
+ background-repeat: no-repeat;
+ background-size: 22px 22px;
+ background-position: 20px 30px;
+ padding-left: 54px;
+}
+
+/* shoutout to hashicorp who i've pretty much copied this from */
+.download-link {
+ background-image: url("../images/icons/arrow-down-box.svg");
+}
+
+.github-link {
+ background-image: url("../images/icons/github-box.svg");
+}
+
+.page-nav {
+ font-family: 'Roboto Slab', serif;
+ font-size: 14px;
+ background: #2a2929;
+ color: #7a7373;
+ display: flex;
+ flex-direction: column;
+}
+
+.page-nav a {
+ color: #9b9b9b;
+ text-decoration: none;
+}
+
+.page-nav a:hover {
+ text-decoration: underline;
+}
+
+.page-content {
+ background: white;
+}
+
+.page-content ul,
+.page-content ol,
+.page-content dl {
+ padding-left: 30px;
+}
+
+.page-content code {
+ background: rgba(30, 29, 29, 0.07);
+ padding: 3px;
+ border-radius: 5px;
+}
+
+.page-content pre code {
+ background: transparent;
+ padding: 0;
+ border-radius: 0;
+}
+
+.page-content code code,
+.definition-thumb code {
+ border: 0;
+ padding: 0;
+}
+
+.page-content a code {
+ color: #3d3c3c;
+}
+
+.page-content a:hover code {
+ color: #5a5555;
+}
+
+.page-content a:hover code strong {
+ text-decoration: underline;
+}
+
+.page-content table {
+ margin-bottom: 1em;
+}
+
+.page-content tr:first-child {
+ font-family: 'Roboto Slab', serif;
+ font-weight: 500;
+ border-bottom: 2px solid #2a2929;
+}
+
+.page-content td {
+ padding: 0.3em 1em 0.3em 0;
+}
+
+.page-content td:last-child {
+ padding-right: 0;
+}
+
+body {
+ background: #2a2929;
+}
+
+.page-nav {
+ text-align: right;
+}
+
+.page-nav ul {
+ margin: 0;
+ padding: 0;
+}
+
+.page-nav li {
+ line-height: 18px;
+}
+
+.page-nav a.self {
+ color: white;
+}
+
+.post-meta {
+ color: #5a5555;
+}
+
+.post-meta a {
+ color: inherit;
+ text-decoration: none;
+ border-bottom: 1px solid #e6e5e5;
+}
+
+.post-meta a:hover {
+ color: #4a90e2;
+ border-color: #4a90e2;
+}
+
+.post-content {
+ font-size: 18px;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+}
+
+.post-content blockquote,
+.post-content dl,
+.post-content h1,
+.post-content h2,
+.post-content h3,
+.post-content h4,
+.post-content h5,
+.post-content h6,
+.post-content ol,
+.post-content p,
+.post-content pre,
+.post-content ul {
+ min-width: 100%;
+}
+
+.post-content h1 {
+ margin-top: 1.5em;
+}
+
+.post-content h3 {
+ font-size: initial;
+}
+
+.post-content p:first-child {
+ font-size: 1.25em;
+ line-height: 1.5em;
+}
+
+.post-content a {
+ color: inherit;
+ text-decoration: none;
+ border-bottom: 1px solid #4a90e2;
+}
+
+.post-content a:hover {
+ color: #4a90e2;
+}
+
+.post-title {
+ margin: 0;
+}
+
+.post-title a {
+ text-decoration: none;
+ color: #2a2929;
+}
+
+.posts-title {
+ border-top: 4px solid #2a2929;
+ padding-top: 10px;
+}
+
+.posts .post {
+ margin-bottom: 4em;
+}
+
+.posts .post-title {
+ margin-top: 0;
+}
+
+.posts .post-header {
+ margin-bottom: 1em;
+}
+
+.posts .post-title {
+ border: 0;
+ padding: 0;
+}
+
+.post-template .post-header {
+ margin-bottom: 2em;
+}
+
+.post-template .post-title {
+ font-size: 40px;
+}
+
+.pagination {
+ margin-top: 2em;
+}
+
+.author-image {
+ width: 24px;
+ height: 24px;
+ border-radius: 12px;
+ vertical-align: middle;
+ margin-top: -1px;
+ margin-right: 4px;
+}
+
+h1 .author-image {
+ width: 40px;
+ height: 40px;
+ border-radius: 20px;
+ margin-top: -5px;
+}
+
+.posts .author-image {
+ width: 20px;
+ height: 20px;
+ margin-right: 2px;
+ margin-top: 0;
+}
+
+.kg-image-card {
+ margin: 2em 0;
+}
+
+.kg-image-card.kg-width-wide {
+ max-width: 48em !important;
+ min-width: 100%;
+ width: 75vw;
+}
+
+.kg-image-card.kg-width-full {
+ max-width: none;
+ width: 98vw;
+ margin-top: 2em;
+}
+
+.kg-gallery-card {
+ margin: 0 0 2em;
+ max-width: 48em !important;
+ min-width: 100%;
+ width: 75vw;
+}
+
+.kg-image-card img,
+.kg-gallery-card img {
+ max-width: 100%;
+}
+
+.kg-image-card figcaption,
+.kg-gallery-card figcaption {
+ color: #5a5555;
+ text-align: center;
+ max-width: 32em;
+ margin: auto;
+ font-size: 0.9em;
+ line-height: 1.25em;
+ padding: 0.66666em 0;
+}
+
+.kg-image-card .kg-image-full+figcaption,
+.kg-gallery-card .kg-image-full+figcaption {
+ margin-bottom: 1.33333em;
+}
+
+.kg-gallery-container {
+ display: flex;
+ flex-direction: column;
+}
+
+.kg-gallery-row {
+ display: flex;
+ flex-direction: row;
+ justify-content: center;
+}
+
+.kg-gallery-image img {
+ display: block;
+ margin: 0;
+ width: 100%;
+ height: 100%;
+}
+
+.kg-gallery-row:not(:first-of-type) {
+ margin: 0.75em 0 0 0;
+}
+
+.kg-gallery-image:not(:first-of-type) {
+ margin: 0 0 0 0.75em;
+}
+
+.kg-embed-card {
+ margin: 0 0 2em;
+}
+
+.kg-embed-card>* {
+ margin-left: auto;
+ margin-right: auto;
+}
+
+.kg-code-card {
+ min-width: 100%;
+ margin: 0 0 2em;
+}
+
+.kg-code-card pre {
+ margin: 0;
+}
+
+.kg-bookmark-card {
+ width: 100%;
+ position: relative;
+}
+
+.kg-bookmark-container {
+ display: flex;
+ flex-wrap: wrap;
+ flex-direction: row-reverse;
+ color: currentColor;
+ font-family: inherit;
+ text-decoration: none;
+ border: 1px solid rgba(0, 0, 0, 0.1);
+}
+
+.kg-bookmark-container:hover {
+ text-decoration: none;
+}
+
+.kg-bookmark-content {
+ flex-basis: 0;
+ flex-grow: 999;
+ padding: 20px;
+ order: 1;
+}
+
+.kg-bookmark-title {
+ font-weight: 600;
+}
+
+.kg-bookmark-metadata,
+.kg-bookmark-description {
+ margin-top: 0.5em;
+}
+
+.kg-bookmark-metadata {
+ align-items: center;
+ white-space: nowrap;
+ overflow: hidden;
+ text-overflow: ellipsis;
+}
+
+.kg-bookmark-description {
+ display: -webkit-box;
+ -webkit-box-orient: vertical;
+ -webkit-line-clamp: 2;
+ overflow: hidden;
+}
+
+.kg-bookmark-icon {
+ display: inline-block;
+ width: 1em;
+ height: 1em;
+ vertical-align: text-bottom;
+ margin-right: 0.5em;
+ margin-bottom: 0.05em;
+}
+
+.kg-bookmark-thumbnail {
+ display: flex;
+ flex-basis: 24rem;
+ flex-grow: 1;
+}
+
+.kg-bookmark-thumbnail img {
+ max-width: 100%;
+ height: auto;
+ vertical-align: bottom;
+ object-fit: cover;
+}
+
+.kg-bookmark-author {
+ white-space: nowrap;
+ text-overflow: ellipsis;
+ overflow: hidden;
+}
+
+.kg-bookmark-publisher::before {
+ content: "•";
+ margin: 0 0.5em;
+}
+
+img {
+ display: block;
+ margin-bottom: 0.5em;
+}
diff --git a/themes/concourse/assets/css/normalize.css b/themes/concourse/assets/css/normalize.css
new file mode 100644
index 0000000..136354c
--- /dev/null
+++ b/themes/concourse/assets/css/normalize.css
@@ -0,0 +1,371 @@
+/*! normalize.css v8.0.0 | MIT License | github.com/necolas/normalize.css */
+
+/* Document
+ ========================================================================== */
+
+/**
+ * 1. Correct the line height in all browsers.
+ * 2. Prevent adjustments of font size after orientation changes in iOS.
+ */
+
+html {
+ line-height: 1.15;
+ /* 1 */
+ -webkit-text-size-adjust: 100%;
+ /* 2 */
+}
+
+/* Sections
+ ========================================================================== */
+
+/**
+ * Remove the margin in all browsers.
+ */
+
+body {
+ margin: 0;
+}
+
+/**
+ * Correct the font size and margin on `h1` elements within `section` and
+ * `article` contexts in Chrome, Firefox, and Safari.
+ */
+
+h1 {
+ font-size: 2em;
+ margin: 0.67em 0;
+}
+
+/* Grouping content
+ ========================================================================== */
+
+/**
+ * 1. Add the correct box sizing in Firefox.
+ * 2. Show the overflow in Edge and IE.
+ */
+
+hr {
+ box-sizing: content-box;
+ /* 1 */
+ height: 0;
+ /* 1 */
+ overflow: visible;
+ /* 2 */
+}
+
+/**
+ * 1. Correct the inheritance and scaling of font size in all browsers.
+ * 2. Correct the odd `em` font sizing in all browsers.
+ */
+
+pre {
+ font-family: monospace, monospace;
+ /* 1 */
+ font-size: 1em;
+ /* 2 */
+}
+
+/* Text-level semantics
+ ========================================================================== */
+
+/**
+ * Remove the gray background on active links in IE 10.
+ */
+
+a {
+ background-color: transparent;
+}
+
+/**
+ * 1. Remove the bottom border in Chrome 57-
+ * 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari.
+ */
+
+abbr[title] {
+ border-bottom: none;
+ /* 1 */
+ text-decoration: underline;
+ /* 2 */
+ text-decoration: underline dotted;
+ /* 2 */
+}
+
+/**
+ * Add the correct font weight in Chrome, Edge, and Safari.
+ */
+
+b,
+strong {
+ font-weight: bolder;
+}
+
+/**
+ * 1. Correct the inheritance and scaling of font size in all browsers.
+ * 2. Correct the odd `em` font sizing in all browsers.
+ */
+
+code,
+kbd,
+samp {
+ font-family: monospace, monospace;
+ /* 1 */
+ font-size: 1em;
+ /* 2 */
+}
+
+/**
+ * Add the correct font size in all browsers.
+ */
+
+small {
+ font-size: 80%;
+}
+
+/**
+ * Prevent `sub` and `sup` elements from affecting the line height in
+ * all browsers.
+ */
+
+sub,
+sup {
+ font-size: 75%;
+ line-height: 0;
+ position: relative;
+ vertical-align: baseline;
+}
+
+sub {
+ bottom: -0.25em;
+}
+
+sup {
+ top: -0.5em;
+}
+
+/* Embedded content
+ ========================================================================== */
+
+/**
+ * Remove the border on images inside links in IE 10.
+ */
+
+img {
+ border-style: none;
+}
+
+/* Forms
+ ========================================================================== */
+
+/**
+ * 1. Change the font styles in all browsers.
+ * 2. Remove the margin in Firefox and Safari.
+ */
+
+button,
+input,
+optgroup,
+select,
+textarea {
+ font-family: inherit;
+ /* 1 */
+ font-size: 100%;
+ /* 1 */
+ line-height: 1.15;
+ /* 1 */
+ margin: 0;
+ /* 2 */
+}
+
+/**
+ * Show the overflow in IE.
+ * 1. Show the overflow in Edge.
+ */
+
+button,
+input {
+ /* 1 */
+ overflow: visible;
+}
+
+/**
+ * Remove the inheritance of text transform in Edge, Firefox, and IE.
+ * 1. Remove the inheritance of text transform in Firefox.
+ */
+
+button,
+select {
+ /* 1 */
+ text-transform: none;
+}
+
+/**
+ * Correct the inability to style clickable types in iOS and Safari.
+ */
+
+button,
+[type="button"],
+[type="reset"],
+[type="submit"] {
+ -webkit-appearance: button;
+}
+
+/**
+ * Remove the inner border and padding in Firefox.
+ */
+
+button::-moz-focus-inner,
+[type="button"]::-moz-focus-inner,
+[type="reset"]::-moz-focus-inner,
+[type="submit"]::-moz-focus-inner {
+ border-style: none;
+ padding: 0;
+}
+
+/**
+ * Restore the focus styles unset by the previous rule.
+ */
+
+button:-moz-focusring,
+[type="button"]:-moz-focusring,
+[type="reset"]:-moz-focusring,
+[type="submit"]:-moz-focusring {
+ outline: 1px dotted ButtonText;
+}
+
+/**
+ * Correct the padding in Firefox.
+ */
+
+fieldset {
+ padding: 0.35em 0.75em 0.625em;
+}
+
+/**
+ * 1. Correct the text wrapping in Edge and IE.
+ * 2. Correct the color inheritance from `fieldset` elements in IE.
+ * 3. Remove the padding so developers are not caught out when they zero out
+ * `fieldset` elements in all browsers.
+ */
+
+legend {
+ box-sizing: border-box;
+ /* 1 */
+ color: inherit;
+ /* 2 */
+ display: table;
+ /* 1 */
+ max-width: 100%;
+ /* 1 */
+ padding: 0;
+ /* 3 */
+ white-space: normal;
+ /* 1 */
+}
+
+/**
+ * Add the correct vertical alignment in Chrome, Firefox, and Opera.
+ */
+
+progress {
+ vertical-align: baseline;
+}
+
+/**
+ * Remove the default vertical scrollbar in IE 10+.
+ */
+
+textarea {
+ overflow: auto;
+}
+
+/**
+ * 1. Add the correct box sizing in IE 10.
+ * 2. Remove the padding in IE 10.
+ */
+
+[type="checkbox"],
+[type="radio"] {
+ box-sizing: border-box;
+ /* 1 */
+ padding: 0;
+ /* 2 */
+}
+
+/**
+ * Correct the cursor style of increment and decrement buttons in Chrome.
+ */
+
+[type="number"]::-webkit-inner-spin-button,
+[type="number"]::-webkit-outer-spin-button {
+ height: auto;
+}
+
+/**
+ * 1. Correct the odd appearance in Chrome and Safari.
+ * 2. Correct the outline style in Safari.
+ */
+
+[type="search"] {
+ -webkit-appearance: textfield;
+ /* 1 */
+ outline-offset: -2px;
+ /* 2 */
+}
+
+/**
+ * Remove the inner padding in Chrome and Safari on macOS.
+ */
+
+[type="search"]::-webkit-search-decoration {
+ -webkit-appearance: none;
+}
+
+/**
+ * 1. Correct the inability to style clickable types in iOS and Safari.
+ * 2. Change font properties to `inherit` in Safari.
+ */
+
+::-webkit-file-upload-button {
+ -webkit-appearance: button;
+ /* 1 */
+ font: inherit;
+ /* 2 */
+}
+
+/* Interactive
+ ========================================================================== */
+
+/*
+ * Add the correct display in Edge, IE 10+, and Firefox.
+ */
+
+details {
+ display: block;
+}
+
+/*
+ * Add the correct display in all browsers.
+ */
+
+summary {
+ display: list-item;
+}
+
+/* Misc
+ ========================================================================== */
+
+/**
+ * Add the correct display in IE 10+.
+ */
+
+template {
+ display: none;
+}
+
+/**
+ * Add the correct display in IE 10.
+ */
+
+[hidden] {
+ display: none;
+}
diff --git a/themes/concourse/assets/css/pipeline.css b/themes/concourse/assets/css/pipeline.css
new file mode 100644
index 0000000..3b440ac
--- /dev/null
+++ b/themes/concourse/assets/css/pipeline.css
@@ -0,0 +1,157 @@
+/* light grey (pending) */
+/* red */
+/* orange */
+/* yellow */
+/* green */
+/* cyan */
+/* blue */
+/* purple */
+/* brown */
+/* 17 color palettes are 1 better than 16 */
+.pipeline-svg {
+ display: block;
+ font-family: 'Iosevka', monospace;
+ letter-spacing: 0.0425em;
+ font-weight: bold;
+ font-size: 12px;
+ line-height: 1.4;
+ background: #3d3c3c;
+ flex-grow: 1;
+ justify-self: stretch;
+ padding: 32px;
+}
+
+.pipeline-svg .node rect {
+ fill: #1e1d1d;
+}
+
+.pipeline-svg .node text {
+ fill: white;
+}
+
+.pipeline-svg .node.pending rect {
+ fill: #9b9b9b;
+}
+
+.pipeline-svg .node.succeeded rect {
+ fill: #11c560;
+}
+
+.pipeline-svg .node.failed rect {
+ fill: #ed4b35;
+}
+
+.pipeline-svg .node.errored rect {
+ fill: #f5a623;
+}
+
+.pipeline-svg .node.aborted rect {
+ fill: #8b572a;
+}
+
+.pipeline-svg .node.failing rect {
+ fill: #f5a623;
+}
+
+.pipeline-svg .node.paused rect {
+ fill: #4a90e2;
+}
+
+.pipeline-svg .node.job.no-builds rect {
+ fill: #9b9b9b;
+}
+
+.pipeline-svg .node.resource a {
+ color: #f5f5f5;
+}
+
+.pipeline-svg .node.pinned rect {
+ fill: #5C3BD1;
+}
+
+.pipeline-svg .node.constrained-input.pinned rect {
+ fill: #5C3BD1;
+ opacity: 0.8;
+}
+
+.pipeline-svg .node.constrained-input.pinned image {
+ opacity: 0.7;
+}
+
+.pipeline-svg .edge {
+ stroke: #7a7373;
+}
+
+.pipeline-svg .edge.pending {
+ stroke: #868585;
+}
+
+.pipeline-svg .edge.succeeded {
+ stroke: #11c560;
+}
+
+.pipeline-svg .edge.failed {
+ stroke: #ed4b35;
+}
+
+.pipeline-svg .edge.errored {
+ stroke: #f5a623;
+}
+
+.pipeline-svg .edge.aborted {
+ stroke: #8b572a;
+}
+
+.pipeline-svg .edge.paused {
+ stroke: #4a90e2;
+}
+
+.pipeline-svg .edge.trigger-false {
+ stroke-dasharray: 5, 5;
+}
+
+.pipeline-svg .node a {
+ cursor: pointer;
+}
+
+.pipeline-svg .node rect {
+ shape-rendering: crispEdges;
+}
+
+.pipeline-svg .edge path {
+ stroke-width: 2px;
+ fill: none;
+}
+
+.pipeline-svg .node text {
+ fill: #fff;
+}
+
+.pipeline-svg .node.constrained-input text {
+ fill: #868585;
+}
+
+.pipeline-svg .node.constrained-input.pinned text {
+ fill: #fff;
+ opacity: 0.7;
+}
+
+.pipeline-svg .active path {
+ stroke-width: 4px;
+}
+
+.pipeline-svg .active.node rect {
+ filter: url(#embiggen);
+}
+
+.pipeline-svg .active.node image {
+ transform: scale(1.09) translate(-5px, -1px);
+}
+
+.pipeline-svg .active.node text {
+ font-size: 1.06em;
+}
+
+.pipeline-svg .active.node use {
+ transform: scale(1.09) translate(-5px, -1px);
+}
diff --git a/themes/concourse/assets/css/prism.css b/themes/concourse/assets/css/prism.css
new file mode 100644
index 0000000..543ff8d
--- /dev/null
+++ b/themes/concourse/assets/css/prism.css
@@ -0,0 +1,222 @@
+/* PrismJS 1.29.0
+https://prismjs.com/download.html#themes=prism-tomorrow&languages=markup+css+clike+javascript+aspnet+bash+csharp+cmake+docker+elm+git+go+go-module+hcl+ini+java+javadoclike+jq+jsdoc+js-extras+json+json5+jsonp+log+makefile+markdown+markup-templating+nginx+powershell+properties+python+regex+ruby+rust+shell-session+sql+toml+typescript+uri+xml-doc+yaml&plugins=line-highlight+command-line */
+code[class*=language-],
+pre[class*=language-] {
+ color: #ccc;
+ background: 0 0;
+ font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;
+ font-size: 1em;
+ text-align: left;
+ white-space: pre;
+ word-spacing: normal;
+ word-break: normal;
+ word-wrap: normal;
+ line-height: 1.5;
+ -moz-tab-size: 4;
+ -o-tab-size: 4;
+ tab-size: 4;
+ -webkit-hyphens: none;
+ -moz-hyphens: none;
+ -ms-hyphens: none;
+ hyphens: none
+}
+
+pre[class*=language-] {
+ padding: 1em;
+ margin: .5em 0;
+ overflow: auto
+}
+
+:not(pre)>code[class*=language-],
+pre[class*=language-] {
+ background: #2d2d2d
+}
+
+:not(pre)>code[class*=language-] {
+ padding: .1em;
+ border-radius: .3em;
+ white-space: normal
+}
+
+.token.block-comment,
+.token.cdata,
+.token.comment,
+.token.doctype,
+.token.prolog {
+ color: #999
+}
+
+.token.punctuation {
+ color: #ccc
+}
+
+.token.attr-name,
+.token.deleted,
+.token.namespace,
+.token.tag {
+ color: #e2777a
+}
+
+.token.function-name {
+ color: #6196cc
+}
+
+.token.boolean,
+.token.function,
+.token.number {
+ color: #f08d49
+}
+
+.token.class-name,
+.token.constant,
+.token.property,
+.token.symbol {
+ color: #f8c555
+}
+
+.token.atrule,
+.token.builtin,
+.token.important,
+.token.keyword,
+.token.selector {
+ color: #cc99cd
+}
+
+.token.attr-value,
+.token.char,
+.token.regex,
+.token.string,
+.token.variable {
+ color: #7ec699
+}
+
+.token.entity,
+.token.operator,
+.token.url {
+ color: #67cdcc
+}
+
+.token.bold,
+.token.important {
+ font-weight: 700
+}
+
+.token.italic {
+ font-style: italic
+}
+
+.token.entity {
+ cursor: help
+}
+
+.token.inserted {
+ color: green
+}
+
+pre[data-line] {
+ position: relative;
+ padding: 1em 0 1em 3em
+}
+
+.line-highlight {
+ position: absolute;
+ left: 0;
+ right: 0;
+ padding: inherit 0;
+ margin-top: 1em;
+ background: hsla(24, 20%, 50%, .08);
+ background: linear-gradient(to right, hsla(24, 20%, 50%, .1) 70%, hsla(24, 20%, 50%, 0));
+ pointer-events: none;
+ line-height: inherit;
+ white-space: pre
+}
+
+@media print {
+ .line-highlight {
+ -webkit-print-color-adjust: exact;
+ color-adjust: exact
+ }
+}
+
+.line-highlight:before,
+.line-highlight[data-end]:after {
+ content: attr(data-start);
+ position: absolute;
+ top: .4em;
+ left: .6em;
+ min-width: 1em;
+ padding: 0 .5em;
+ background-color: hsla(24, 20%, 50%, .4);
+ color: #f4f1ef;
+ font: bold 65%/1.5 sans-serif;
+ text-align: center;
+ vertical-align: .3em;
+ border-radius: 999px;
+ text-shadow: none;
+ box-shadow: 0 1px #fff
+}
+
+.line-highlight[data-end]:after {
+ content: attr(data-end);
+ top: auto;
+ bottom: .4em
+}
+
+.line-numbers .line-highlight:after,
+.line-numbers .line-highlight:before {
+ content: none
+}
+
+pre[id].linkable-line-numbers span.line-numbers-rows {
+ pointer-events: all
+}
+
+pre[id].linkable-line-numbers span.line-numbers-rows>span:before {
+ cursor: pointer
+}
+
+pre[id].linkable-line-numbers span.line-numbers-rows>span:hover:before {
+ background-color: rgba(128, 128, 128, .2)
+}
+
+.command-line-prompt {
+ border-right: 1px solid #999;
+ display: block;
+ float: left;
+ font-size: 100%;
+ letter-spacing: -1px;
+ margin-right: 1em;
+ pointer-events: none;
+ text-align: right;
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none
+}
+
+.command-line-prompt>span:before {
+ opacity: .7;
+ content: ' ';
+ display: block;
+ padding-right: .8em
+}
+
+.command-line-prompt>span[data-user]:before {
+ content: "[" attr(data-user) "@" attr(data-host) "] $"
+}
+
+.command-line-prompt>span[data-user=root]:before {
+ content: "[" attr(data-user) "@" attr(data-host) "] #"
+}
+
+.command-line-prompt>span[data-prompt]:before {
+ content: attr(data-prompt)
+}
+
+.command-line-prompt>span[data-continuation-prompt]:before {
+ content: attr(data-continuation-prompt)
+}
+
+.command-line span.token.output {
+ opacity: .7
+}
diff --git a/themes/concourse/assets/js/prism.js b/themes/concourse/assets/js/prism.js
new file mode 100644
index 0000000..3be833b
--- /dev/null
+++ b/themes/concourse/assets/js/prism.js
@@ -0,0 +1,47 @@
+/* PrismJS 1.29.0
+https://prismjs.com/download.html#themes=prism-tomorrow&languages=markup+css+clike+javascript+aspnet+bash+csharp+cmake+docker+elm+git+go+go-module+hcl+ini+java+javadoclike+jq+jsdoc+js-extras+json+json5+jsonp+log+makefile+markdown+markup-templating+nginx+powershell+properties+python+regex+ruby+rust+shell-session+sql+toml+typescript+uri+xml-doc+yaml&plugins=line-highlight+command-line */
+var _self="undefined"!=typeof window?window:"undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope?self:{},Prism=function(e){var n=/(?:^|\s)lang(?:uage)?-([\w-]+)(?=\s|$)/i,t=0,r={},a={manual:e.Prism&&e.Prism.manual,disableWorkerMessageHandler:e.Prism&&e.Prism.disableWorkerMessageHandler,util:{encode:function e(n){return n instanceof i?new i(n.type,e(n.content),n.alias):Array.isArray(n)?n.map(e):n.replace(/&/g,"&").replace(/=g.reach);A+=w.value.length,w=w.next){var E=w.value;if(n.length>e.length)return;if(!(E instanceof i)){var P,L=1;if(y){if(!(P=l(b,A,e,m))||P.index>=e.length)break;var S=P.index,O=P.index+P[0].length,j=A;for(j+=w.value.length;S>=j;)j+=(w=w.next).value.length;if(A=j-=w.value.length,w.value instanceof i)continue;for(var C=w;C!==n.tail&&(jg.reach&&(g.reach=W);var z=w.prev;if(_&&(z=u(n,z,_),A+=_.length),c(n,z,L),w=u(n,z,new i(f,p?a.tokenize(N,p):N,k,N)),M&&u(n,w,M),L>1){var I={cause:f+","+d,reach:W};o(e,n,t,w.prev,A,I),g&&I.reach>g.reach&&(g.reach=I.reach)}}}}}}function s(){var e={value:null,prev:null,next:null},n={value:null,prev:e,next:null};e.next=n,this.head=e,this.tail=n,this.length=0}function u(e,n,t){var r=n.next,a={value:t,prev:n,next:r};return n.next=a,r.prev=a,e.length++,a}function c(e,n,t){for(var r=n.next,a=0;a"+i.content+""+i.tag+">"},!e.document)return e.addEventListener?(a.disableWorkerMessageHandler||e.addEventListener("message",(function(n){var t=JSON.parse(n.data),r=t.language,i=t.code,l=t.immediateClose;e.postMessage(a.highlight(i,a.languages[r],r)),l&&e.close()}),!1),a):a;var g=a.util.currentScript();function f(){a.manual||a.highlightAll()}if(g&&(a.filename=g.src,g.hasAttribute("data-manual")&&(a.manual=!0)),!a.manual){var h=document.readyState;"loading"===h||"interactive"===h&&g&&g.defer?document.addEventListener("DOMContentLoaded",f):window.requestAnimationFrame?window.requestAnimationFrame(f):window.setTimeout(f,16)}return a}(_self);"undefined"!=typeof module&&module.exports&&(module.exports=Prism),"undefined"!=typeof global&&(global.Prism=Prism);
+Prism.languages.markup={comment:{pattern://,greedy:!0},prolog:{pattern:/<\?[\s\S]+?\?>/,greedy:!0},doctype:{pattern:/"'[\]]|"[^"]*"|'[^']*')+(?:\[(?:[^<"'\]]|"[^"]*"|'[^']*'|<(?!!--)|)*\]\s*)?>/i,greedy:!0,inside:{"internal-subset":{pattern:/(^[^\[]*\[)[\s\S]+(?=\]>$)/,lookbehind:!0,greedy:!0,inside:null},string:{pattern:/"[^"]*"|'[^']*'/,greedy:!0},punctuation:/^$|[[\]]/,"doctype-tag":/^DOCTYPE/i,name:/[^\s<>'"]+/}},cdata:{pattern://i,greedy:!0},tag:{pattern:/<\/?(?!\d)[^\s>\/=$<%]+(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s/>])))+)?\s*\/?>/,greedy:!0,inside:{tag:{pattern:/^<\/?[^\s>\/]+/,inside:{punctuation:/^<\/?/,namespace:/^[^\s>\/:]+:/}},"special-attr":[],"attr-value":{pattern:/=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+)/,inside:{punctuation:[{pattern:/^=/,alias:"attr-equals"},{pattern:/^(\s*)["']|["']$/,lookbehind:!0}]}},punctuation:/\/?>/,"attr-name":{pattern:/[^\s>\/]+/,inside:{namespace:/^[^\s>\/:]+:/}}}},entity:[{pattern:/&[\da-z]{1,8};/i,alias:"named-entity"},/?[\da-f]{1,8};/i]},Prism.languages.markup.tag.inside["attr-value"].inside.entity=Prism.languages.markup.entity,Prism.languages.markup.doctype.inside["internal-subset"].inside=Prism.languages.markup,Prism.hooks.add("wrap",(function(a){"entity"===a.type&&(a.attributes.title=a.content.replace(/&/,"&"))})),Object.defineProperty(Prism.languages.markup.tag,"addInlined",{value:function(a,e){var s={};s["language-"+e]={pattern:/(^$)/i,lookbehind:!0,inside:Prism.languages[e]},s.cdata=/^$/i;var t={"included-cdata":{pattern://i,inside:s}};t["language-"+e]={pattern:/[\s\S]+/,inside:Prism.languages[e]};var n={};n[a]={pattern:RegExp("(<__[^>]*>)(?:))*\\]\\]>|(?!)".replace(/__/g,(function(){return a})),"i"),lookbehind:!0,greedy:!0,inside:t},Prism.languages.insertBefore("markup","cdata",n)}}),Object.defineProperty(Prism.languages.markup.tag,"addAttribute",{value:function(a,e){Prism.languages.markup.tag.inside["special-attr"].push({pattern:RegExp("(^|[\"'\\s])(?:"+a+")\\s*=\\s*(?:\"[^\"]*\"|'[^']*'|[^\\s'\">=]+(?=[\\s>]))","i"),lookbehind:!0,inside:{"attr-name":/^[^\s=]+/,"attr-value":{pattern:/=[\s\S]+/,inside:{value:{pattern:/(^=\s*(["']|(?!["'])))\S[\s\S]*(?=\2$)/,lookbehind:!0,alias:[e,"language-"+e],inside:Prism.languages[e]},punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}}}})}}),Prism.languages.html=Prism.languages.markup,Prism.languages.mathml=Prism.languages.markup,Prism.languages.svg=Prism.languages.markup,Prism.languages.xml=Prism.languages.extend("markup",{}),Prism.languages.ssml=Prism.languages.xml,Prism.languages.atom=Prism.languages.xml,Prism.languages.rss=Prism.languages.xml;
+!function(s){var e=/(?:"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n])*')/;s.languages.css={comment:/\/\*[\s\S]*?\*\//,atrule:{pattern:RegExp("@[\\w-](?:[^;{\\s\"']|\\s+(?!\\s)|"+e.source+")*?(?:;|(?=\\s*\\{))"),inside:{rule:/^@[\w-]+/,"selector-function-argument":{pattern:/(\bselector\s*\(\s*(?![\s)]))(?:[^()\s]|\s+(?![\s)])|\((?:[^()]|\([^()]*\))*\))+(?=\s*\))/,lookbehind:!0,alias:"selector"},keyword:{pattern:/(^|[^\w-])(?:and|not|only|or)(?![\w-])/,lookbehind:!0}}},url:{pattern:RegExp("\\burl\\((?:"+e.source+"|(?:[^\\\\\r\n()\"']|\\\\[^])*)\\)","i"),greedy:!0,inside:{function:/^url/i,punctuation:/^\(|\)$/,string:{pattern:RegExp("^"+e.source+"$"),alias:"url"}}},selector:{pattern:RegExp("(^|[{}\\s])[^{}\\s](?:[^{};\"'\\s]|\\s+(?![\\s{])|"+e.source+")*(?=\\s*\\{)"),lookbehind:!0},string:{pattern:e,greedy:!0},property:{pattern:/(^|[^-\w\xA0-\uFFFF])(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*(?=\s*:)/i,lookbehind:!0},important:/!important\b/i,function:{pattern:/(^|[^-a-z0-9])[-a-z0-9]+(?=\()/i,lookbehind:!0},punctuation:/[(){};:,]/},s.languages.css.atrule.inside.rest=s.languages.css;var t=s.languages.markup;t&&(t.tag.addInlined("style","css"),t.tag.addAttribute("style","css"))}(Prism);
+Prism.languages.clike={comment:[{pattern:/(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,lookbehind:!0,greedy:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},"class-name":{pattern:/(\b(?:class|extends|implements|instanceof|interface|new|trait)\s+|\bcatch\s+\()[\w.\\]+/i,lookbehind:!0,inside:{punctuation:/[.\\]/}},keyword:/\b(?:break|catch|continue|do|else|finally|for|function|if|in|instanceof|new|null|return|throw|try|while)\b/,boolean:/\b(?:false|true)\b/,function:/\b\w+(?=\()/,number:/\b0x[\da-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?/i,operator:/[<>]=?|[!=]=?=?|--?|\+\+?|&&?|\|\|?|[?*/~^%]/,punctuation:/[{}[\];(),.:]/};
+Prism.languages.javascript=Prism.languages.extend("clike",{"class-name":[Prism.languages.clike["class-name"],{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$A-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\.(?:constructor|prototype))/,lookbehind:!0}],keyword:[{pattern:/((?:^|\})\s*)catch\b/,lookbehind:!0},{pattern:/(^|[^.]|\.\.\.\s*)\b(?:as|assert(?=\s*\{)|async(?=\s*(?:function\b|\(|[$\w\xA0-\uFFFF]|$))|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally(?=\s*(?:\{|$))|for|from(?=\s*(?:['"]|$))|function|(?:get|set)(?=\s*(?:[#\[$\w\xA0-\uFFFF]|$))|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)\b/,lookbehind:!0}],function:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*(?:\.\s*(?:apply|bind|call)\s*)?\()/,number:{pattern:RegExp("(^|[^\\w$])(?:NaN|Infinity|0[bB][01]+(?:_[01]+)*n?|0[oO][0-7]+(?:_[0-7]+)*n?|0[xX][\\dA-Fa-f]+(?:_[\\dA-Fa-f]+)*n?|\\d+(?:_\\d+)*n|(?:\\d+(?:_\\d+)*(?:\\.(?:\\d+(?:_\\d+)*)?)?|\\.\\d+(?:_\\d+)*)(?:[Ee][+-]?\\d+(?:_\\d+)*)?)(?![\\w$])"),lookbehind:!0},operator:/--|\+\+|\*\*=?|=>|&&=?|\|\|=?|[!=]==|<<=?|>>>?=?|[-+*/%&|^!=<>]=?|\.{3}|\?\?=?|\?\.?|[~:]/}),Prism.languages.javascript["class-name"][0].pattern=/(\b(?:class|extends|implements|instanceof|interface|new)\s+)[\w.\\]+/,Prism.languages.insertBefore("javascript","keyword",{regex:{pattern:RegExp("((?:^|[^$\\w\\xA0-\\uFFFF.\"'\\])\\s]|\\b(?:return|yield))\\s*)/(?:(?:\\[(?:[^\\]\\\\\r\n]|\\\\.)*\\]|\\\\.|[^/\\\\\\[\r\n])+/[dgimyus]{0,7}|(?:\\[(?:[^[\\]\\\\\r\n]|\\\\.|\\[(?:[^[\\]\\\\\r\n]|\\\\.|\\[(?:[^[\\]\\\\\r\n]|\\\\.)*\\])*\\])*\\]|\\\\.|[^/\\\\\\[\r\n])+/[dgimyus]{0,7}v[dgimyus]{0,7})(?=(?:\\s|/\\*(?:[^*]|\\*(?!/))*\\*/)*(?:$|[\r\n,.;:})\\]]|//))"),lookbehind:!0,greedy:!0,inside:{"regex-source":{pattern:/^(\/)[\s\S]+(?=\/[a-z]*$)/,lookbehind:!0,alias:"language-regex",inside:Prism.languages.regex},"regex-delimiter":/^\/|\/$/,"regex-flags":/^[a-z]+$/}},"function-variable":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*[=:]\s*(?:async\s*)?(?:\bfunction\b|(?:\((?:[^()]|\([^()]*\))*\)|(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)\s*=>))/,alias:"function"},parameter:[{pattern:/(function(?:\s+(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)?\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\))/,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*=>)/i,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/(\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*=>)/,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/((?:\b|\s|^)(?!(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)(?![$\w\xA0-\uFFFF]))(?:(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*)\(\s*|\]\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*\{)/,lookbehind:!0,inside:Prism.languages.javascript}],constant:/\b[A-Z](?:[A-Z_]|\dx?)*\b/}),Prism.languages.insertBefore("javascript","string",{hashbang:{pattern:/^#!.*/,greedy:!0,alias:"comment"},"template-string":{pattern:/`(?:\\[\s\S]|\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}|(?!\$\{)[^\\`])*`/,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}/,lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^\$\{|\}$/,alias:"punctuation"},rest:Prism.languages.javascript}},string:/[\s\S]+/}},"string-property":{pattern:/((?:^|[,{])[ \t]*)(["'])(?:\\(?:\r\n|[\s\S])|(?!\2)[^\\\r\n])*\2(?=\s*:)/m,lookbehind:!0,greedy:!0,alias:"property"}}),Prism.languages.insertBefore("javascript","operator",{"literal-property":{pattern:/((?:^|[,{])[ \t]*)(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*:)/m,lookbehind:!0,alias:"property"}}),Prism.languages.markup&&(Prism.languages.markup.tag.addInlined("script","javascript"),Prism.languages.markup.tag.addAttribute("on(?:abort|blur|change|click|composition(?:end|start|update)|dblclick|error|focus(?:in|out)?|key(?:down|up)|load|mouse(?:down|enter|leave|move|out|over|up)|reset|resize|scroll|select|slotchange|submit|unload|wheel)","javascript")),Prism.languages.js=Prism.languages.javascript;
+!function(e){function n(e,n){return e.replace(/<<(\d+)>>/g,(function(e,s){return"(?:"+n[+s]+")"}))}function s(e,s,a){return RegExp(n(e,s),a||"")}function a(e,n){for(var s=0;s>/g,(function(){return"(?:"+e+")"}));return e.replace(/<>/g,"[^\\s\\S]")}var t="bool byte char decimal double dynamic float int long object sbyte short string uint ulong ushort var void",r="class enum interface record struct",i="add alias and ascending async await by descending from(?=\\s*(?:\\w|$)) get global group into init(?=\\s*;) join let nameof not notnull on or orderby partial remove select set unmanaged value when where with(?=\\s*{)",o="abstract as base break case catch checked const continue default delegate do else event explicit extern finally fixed for foreach goto if implicit in internal is lock namespace new null operator out override params private protected public readonly ref return sealed sizeof stackalloc static switch this throw try typeof unchecked unsafe using virtual volatile while yield";function l(e){return"\\b(?:"+e.trim().replace(/ /g,"|")+")\\b"}var d=l(r),p=RegExp(l(t+" "+r+" "+i+" "+o)),c=l(r+" "+i+" "+o),u=l(t+" "+r+" "+o),g=a("<(?:[^<>;=+\\-*/%&|^]|<>)*>",2),b=a("\\((?:[^()]|<>)*\\)",2),h="@?\\b[A-Za-z_]\\w*\\b",f=n("<<0>>(?:\\s*<<1>>)?",[h,g]),m=n("(?!<<0>>)<<1>>(?:\\s*\\.\\s*<<1>>)*",[c,f]),k="\\[\\s*(?:,\\s*)*\\]",y=n("<<0>>(?:\\s*(?:\\?\\s*)?<<1>>)*(?:\\s*\\?)?",[m,k]),w=n("[^,()<>[\\];=+\\-*/%&|^]|<<0>>|<<1>>|<<2>>",[g,b,k]),v=n("\\(<<0>>+(?:,<<0>>+)+\\)",[w]),x=n("(?:<<0>>|<<1>>)(?:\\s*(?:\\?\\s*)?<<2>>)*(?:\\s*\\?)?",[v,m,k]),$={keyword:p,punctuation:/[<>()?,.:[\]]/},_="'(?:[^\r\n'\\\\]|\\\\.|\\\\[Uux][\\da-fA-F]{1,8})'",B='"(?:\\\\.|[^\\\\"\r\n])*"';e.languages.csharp=e.languages.extend("clike",{string:[{pattern:s("(^|[^$\\\\])<<0>>",['@"(?:""|\\\\[^]|[^\\\\"])*"(?!")']),lookbehind:!0,greedy:!0},{pattern:s("(^|[^@$\\\\])<<0>>",[B]),lookbehind:!0,greedy:!0}],"class-name":[{pattern:s("(\\busing\\s+static\\s+)<<0>>(?=\\s*;)",[m]),lookbehind:!0,inside:$},{pattern:s("(\\busing\\s+<<0>>\\s*=\\s*)<<1>>(?=\\s*;)",[h,x]),lookbehind:!0,inside:$},{pattern:s("(\\busing\\s+)<<0>>(?=\\s*=)",[h]),lookbehind:!0},{pattern:s("(\\b<<0>>\\s+)<<1>>",[d,f]),lookbehind:!0,inside:$},{pattern:s("(\\bcatch\\s*\\(\\s*)<<0>>",[m]),lookbehind:!0,inside:$},{pattern:s("(\\bwhere\\s+)<<0>>",[h]),lookbehind:!0},{pattern:s("(\\b(?:is(?:\\s+not)?|as)\\s+)<<0>>",[y]),lookbehind:!0,inside:$},{pattern:s("\\b<<0>>(?=\\s+(?!<<1>>|with\\s*\\{)<<2>>(?:\\s*[=,;:{)\\]]|\\s+(?:in|when)\\b))",[x,u,h]),inside:$}],keyword:p,number:/(?:\b0(?:x[\da-f_]*[\da-f]|b[01_]*[01])|(?:\B\.\d+(?:_+\d+)*|\b\d+(?:_+\d+)*(?:\.\d+(?:_+\d+)*)?)(?:e[-+]?\d+(?:_+\d+)*)?)(?:[dflmu]|lu|ul)?\b/i,operator:/>>=?|<<=?|[-=]>|([-+&|])\1|~|\?\?=?|[-+*/%&|^!=<>]=?/,punctuation:/\?\.?|::|[{}[\];(),.:]/}),e.languages.insertBefore("csharp","number",{range:{pattern:/\.\./,alias:"operator"}}),e.languages.insertBefore("csharp","punctuation",{"named-parameter":{pattern:s("([(,]\\s*)<<0>>(?=\\s*:)",[h]),lookbehind:!0,alias:"punctuation"}}),e.languages.insertBefore("csharp","class-name",{namespace:{pattern:s("(\\b(?:namespace|using)\\s+)<<0>>(?:\\s*\\.\\s*<<0>>)*(?=\\s*[;{])",[h]),lookbehind:!0,inside:{punctuation:/\./}},"type-expression":{pattern:s("(\\b(?:default|sizeof|typeof)\\s*\\(\\s*(?!\\s))(?:[^()\\s]|\\s(?!\\s)|<<0>>)*(?=\\s*\\))",[b]),lookbehind:!0,alias:"class-name",inside:$},"return-type":{pattern:s("<<0>>(?=\\s+(?:<<1>>\\s*(?:=>|[({]|\\.\\s*this\\s*\\[)|this\\s*\\[))",[x,m]),inside:$,alias:"class-name"},"constructor-invocation":{pattern:s("(\\bnew\\s+)<<0>>(?=\\s*[[({])",[x]),lookbehind:!0,inside:$,alias:"class-name"},"generic-method":{pattern:s("<<0>>\\s*<<1>>(?=\\s*\\()",[h,g]),inside:{function:s("^<<0>>",[h]),generic:{pattern:RegExp(g),alias:"class-name",inside:$}}},"type-list":{pattern:s("\\b((?:<<0>>\\s+<<1>>|record\\s+<<1>>\\s*<<5>>|where\\s+<<2>>)\\s*:\\s*)(?:<<3>>|<<4>>|<<1>>\\s*<<5>>|<<6>>)(?:\\s*,\\s*(?:<<3>>|<<4>>|<<6>>))*(?=\\s*(?:where|[{;]|=>|$))",[d,f,h,x,p.source,b,"\\bnew\\s*\\(\\s*\\)"]),lookbehind:!0,inside:{"record-arguments":{pattern:s("(^(?!new\\s*\\()<<0>>\\s*)<<1>>",[f,b]),lookbehind:!0,greedy:!0,inside:e.languages.csharp},keyword:p,"class-name":{pattern:RegExp(x),greedy:!0,inside:$},punctuation:/[,()]/}},preprocessor:{pattern:/(^[\t ]*)#.*/m,lookbehind:!0,alias:"property",inside:{directive:{pattern:/(#)\b(?:define|elif|else|endif|endregion|error|if|line|nullable|pragma|region|undef|warning)\b/,lookbehind:!0,alias:"keyword"}}}});var E=B+"|"+_,R=n("/(?![*/])|//[^\r\n]*[\r\n]|/\\*(?:[^*]|\\*(?!/))*\\*/|<<0>>",[E]),z=a(n("[^\"'/()]|<<0>>|\\(<>*\\)",[R]),2),S="\\b(?:assembly|event|field|method|module|param|property|return|type)\\b",j=n("<<0>>(?:\\s*\\(<<1>>*\\))?",[m,z]);e.languages.insertBefore("csharp","class-name",{attribute:{pattern:s("((?:^|[^\\s\\w>)?])\\s*\\[\\s*)(?:<<0>>\\s*:\\s*)?<<1>>(?:\\s*,\\s*<<1>>)*(?=\\s*\\])",[S,j]),lookbehind:!0,greedy:!0,inside:{target:{pattern:s("^<<0>>(?=\\s*:)",[S]),alias:"keyword"},"attribute-arguments":{pattern:s("\\(<<0>>*\\)",[z]),inside:e.languages.csharp},"class-name":{pattern:RegExp(m),inside:{punctuation:/\./}},punctuation:/[:,]/}}});var A=":[^}\r\n]+",F=a(n("[^\"'/()]|<<0>>|\\(<>*\\)",[R]),2),P=n("\\{(?!\\{)(?:(?![}:])<<0>>)*<<1>>?\\}",[F,A]),U=a(n("[^\"'/()]|/(?!\\*)|/\\*(?:[^*]|\\*(?!/))*\\*/|<<0>>|\\(<>*\\)",[E]),2),Z=n("\\{(?!\\{)(?:(?![}:])<<0>>)*<<1>>?\\}",[U,A]);function q(n,a){return{interpolation:{pattern:s("((?:^|[^{])(?:\\{\\{)*)<<0>>",[n]),lookbehind:!0,inside:{"format-string":{pattern:s("(^\\{(?:(?![}:])<<0>>)*)<<1>>(?=\\}$)",[a,A]),lookbehind:!0,inside:{punctuation:/^:/}},punctuation:/^\{|\}$/,expression:{pattern:/[\s\S]+/,alias:"language-csharp",inside:e.languages.csharp}}},string:/[\s\S]+/}}e.languages.insertBefore("csharp","string",{"interpolation-string":[{pattern:s('(^|[^\\\\])(?:\\$@|@\\$)"(?:""|\\\\[^]|\\{\\{|<<0>>|[^\\\\{"])*"',[P]),lookbehind:!0,greedy:!0,inside:q(P,F)},{pattern:s('(^|[^@\\\\])\\$"(?:\\\\.|\\{\\{|<<0>>|[^\\\\"{])*"',[Z]),lookbehind:!0,greedy:!0,inside:q(Z,U)}],char:{pattern:RegExp(_),greedy:!0}}),e.languages.dotnet=e.languages.cs=e.languages.csharp}(Prism);
+Prism.languages.aspnet=Prism.languages.extend("markup",{"page-directive":{pattern:/<%\s*@.*%>/,alias:"tag",inside:{"page-directive":{pattern:/<%\s*@\s*(?:Assembly|Control|Implements|Import|Master(?:Type)?|OutputCache|Page|PreviousPageType|Reference|Register)?|%>/i,alias:"tag"},rest:Prism.languages.markup.tag.inside}},directive:{pattern:/<%.*%>/,alias:"tag",inside:{directive:{pattern:/<%\s*?[$=%#:]{0,2}|%>/,alias:"tag"},rest:Prism.languages.csharp}}}),Prism.languages.aspnet.tag.pattern=/<(?!%)\/?[^\s>\/]+(?:\s+[^\s>\/=]+(?:=(?:("|')(?:\\[\s\S]|(?!\1)[^\\])*\1|[^\s'">=]+))?)*\s*\/?>/,Prism.languages.insertBefore("inside","punctuation",{directive:Prism.languages.aspnet.directive},Prism.languages.aspnet.tag.inside["attr-value"]),Prism.languages.insertBefore("aspnet","comment",{"asp-comment":{pattern:/<%--[\s\S]*?--%>/,alias:["asp","comment"]}}),Prism.languages.insertBefore("aspnet",Prism.languages.javascript?"script":"tag",{"asp-script":{pattern:/(
+ {{- end }}
+{{- end }}
diff --git a/themes/concourse/layouts/partials/header.html b/themes/concourse/layouts/partials/header.html
new file mode 100644
index 0000000..3c49abb
--- /dev/null
+++ b/themes/concourse/layouts/partials/header.html
@@ -0,0 +1,4 @@
+
+
diff --git a/themes/concourse/layouts/partials/menu.html b/themes/concourse/layouts/partials/menu.html
new file mode 100644
index 0000000..9f04b7b
--- /dev/null
+++ b/themes/concourse/layouts/partials/menu.html
@@ -0,0 +1,15 @@
+ Concourse
+
+ Docs
+
+ Examples
+
+ Project
+
+ Ecosystem
+
+ Resource Types
+
+ blog
+
+ discuss
diff --git a/themes/concourse/layouts/partials/terms.html b/themes/concourse/layouts/partials/terms.html
new file mode 100644
index 0000000..8a6ebec
--- /dev/null
+++ b/themes/concourse/layouts/partials/terms.html
@@ -0,0 +1,23 @@
+{{- /*
+For a given taxonomy, renders a list of terms assigned to the page.
+
+@context {page} page The current page.
+@context {string} taxonomy The taxonomy.
+
+@example: {{ partial "terms.html" (dict "taxonomy" "tags" "page" .) }}
+*/}}
+
+{{- $page := .page }}
+{{- $taxonomy := .taxonomy }}
+
+{{- with $page.GetTerms $taxonomy }}
+ {{- $label := (index . 0).Parent.LinkTitle }}
+
+{{- end }}
diff --git a/themes/concourse/layouts/shortcodes/image.html b/themes/concourse/layouts/shortcodes/image.html
new file mode 100644
index 0000000..fb20a38
--- /dev/null
+++ b/themes/concourse/layouts/shortcodes/image.html
@@ -0,0 +1,3 @@
+{{ if .Get "src" }}
+
+{{ end }}
diff --git a/themes/concourse/layouts/shortcodes/youtube.html b/themes/concourse/layouts/shortcodes/youtube.html
new file mode 100644
index 0000000..9dd5f01
--- /dev/null
+++ b/themes/concourse/layouts/shortcodes/youtube.html
@@ -0,0 +1,3 @@
+{{ if .Get "src" }}
+
+{{ end }}
diff --git a/themes/concourse/static/favicon.png b/themes/concourse/static/favicon.png
new file mode 100644
index 0000000..a17bf67
Binary files /dev/null and b/themes/concourse/static/favicon.png differ
diff --git a/themes/concourse/static/images/concourse-pattern.svg b/themes/concourse/static/images/concourse-pattern.svg
new file mode 100644
index 0000000..562b95a
--- /dev/null
+++ b/themes/concourse/static/images/concourse-pattern.svg
@@ -0,0 +1,216 @@
+
diff --git a/themes/concourse/static/images/logo-white.svg b/themes/concourse/static/images/logo-white.svg
new file mode 100644
index 0000000..31baacd
--- /dev/null
+++ b/themes/concourse/static/images/logo-white.svg
@@ -0,0 +1,17 @@
+
+
\ No newline at end of file
diff --git a/themes/concourse/theme.toml b/themes/concourse/theme.toml
new file mode 100644
index 0000000..3ba3164
--- /dev/null
+++ b/themes/concourse/theme.toml
@@ -0,0 +1,31 @@
+name = 'Theme name'
+license = 'MIT'
+licenselink = 'https://github.com/owner/repo/LICENSE'
+description = 'Theme description'
+
+# The home page of the theme, where the source can be found
+homepage = 'https://github.com/owner/repo'
+
+# If you have a running demo of the theme
+demosite = 'https://owner.github.io/repo'
+
+# Taxonomy terms
+tags = ['blog', 'company']
+features = ['some', 'awesome', 'features']
+
+# If the theme has multiple authors
+authors = [
+ {name = 'Name of author', homepage = 'Website of author'},
+ {name = 'Name of author', homepage = 'Website of author'}
+]
+
+# If the theme has a single author
+[author]
+ name = 'Your name'
+ homepage = 'Your website'
+
+# If porting an existing theme
+[original]
+ author = 'Name of original author'
+ homepage = 'Website of original author'
+ repo = 'https://github.com/owner/repo'