From 0dac6ccc91c438a3b0ff493a3c49b30bc6e15c0f Mon Sep 17 00:00:00 2001 From: Danny Joyce Date: Mon, 29 Oct 2018 12:30:21 -0400 Subject: [PATCH 1/3] Handle stack association when upgrading buildpacks --- ci/pcf-pipelines/pipeline.yml | 46 ++++++++++----------- tasks/promote-buildpack/task.sh | 37 +++++++++-------- tasks/promote-buildpack/task.yml | 1 + tasks/stage-buildpack/task.sh | 26 +++++++----- tasks/stage-buildpack/task.yml | 1 + upgrade-buildpacks/pipeline.yml | 70 ++++++++++++++++++++------------ 6 files changed, 105 insertions(+), 76 deletions(-) diff --git a/ci/pcf-pipelines/pipeline.yml b/ci/pcf-pipelines/pipeline.yml index 1e6482858..45e48e37d 100644 --- a/ci/pcf-pipelines/pipeline.yml +++ b/ci/pcf-pipelines/pipeline.yml @@ -1,3 +1,26 @@ +atc_creds: &atc_creds + ATC_EXTERNAL_URL: {{atc_external_url}} + ATC_BASIC_AUTH_USERNAME: {{fly_basic_auth_username}} + ATC_BASIC_AUTH_PASSWORD: {{fly_basic_auth_password}} + ATC_TEAM_NAME: {{atc_team_name}} + +vsphere_atc_creds: &vsphere_atc_creds + ATC_EXTERNAL_URL: {{atc_external_url}} + ATC_BASIC_AUTH_USERNAME: {{fly_basic_auth_username}} + ATC_BASIC_AUTH_PASSWORD: {{fly_basic_auth_password}} + ATC_TEAM_NAME: vsphere + +notify_slack: ¬ify_slack + put: slack + params: + text: "$BUILD_PIPELINE_NAME/$BUILD_JOB_NAME failed: $ATC_EXTERNAL_URL/builds/$BUILD_ID" + +norm-ci-locks-params: &norm-ci-locks-params + uri: git@github.com:pivotal-cf/norm-ci-locks.git + branch: master + private_key: {{locks_git_ssh_key}} + retry_delay: 1m + groups: - name: all jobs: @@ -1304,26 +1327,3 @@ jobs: on_failure: <<: *notify_slack ####### END VSPHERE OFFLINE - -atc_creds: &atc_creds - ATC_EXTERNAL_URL: {{atc_external_url}} - ATC_BASIC_AUTH_USERNAME: {{fly_basic_auth_username}} - ATC_BASIC_AUTH_PASSWORD: {{fly_basic_auth_password}} - ATC_TEAM_NAME: {{atc_team_name}} - -vsphere_atc_creds: &vsphere_atc_creds - ATC_EXTERNAL_URL: {{atc_external_url}} - ATC_BASIC_AUTH_USERNAME: {{fly_basic_auth_username}} - ATC_BASIC_AUTH_PASSWORD: {{fly_basic_auth_password}} - ATC_TEAM_NAME: vsphere - -notify_slack: ¬ify_slack - put: slack - params: - text: "$BUILD_PIPELINE_NAME/$BUILD_JOB_NAME failed: $ATC_EXTERNAL_URL/builds/$BUILD_ID" - -norm-ci-locks-params: &norm-ci-locks-params - uri: git@github.com:pivotal-cf/norm-ci-locks.git - branch: master - private_key: {{locks_git_ssh_key}} - retry_delay: 1m diff --git a/tasks/promote-buildpack/task.sh b/tasks/promote-buildpack/task.sh index dc343d789..538c36941 100755 --- a/tasks/promote-buildpack/task.sh +++ b/tasks/promote-buildpack/task.sh @@ -19,20 +19,23 @@ set -eu cf api $CF_API_URI --skip-ssl-validation cf auth $CF_USERNAME $CF_PASSWORD -echo Enabling buildpack ${SOURCE_BUILDPACK_NAME}... -cf update-buildpack $SOURCE_BUILDPACK_NAME --enable - -set +e -old_buildpack=$(cf buildpacks | grep "${TARGET_BUILDPACK_NAME}\s") -set -e -if [ -n "$old_buildpack" ]; then - index=$(echo $old_buildpack | cut -d' ' -f2) - name=$(echo $old_buildpack | cut -d' ' -f1) - - cf delete-buildpack -f $TARGET_BUILDPACK_NAME - - echo Updating buildpack ${SOURCE_BUILDPACK_NAME} index... - cf update-buildpack $SOURCE_BUILDPACK_NAME -i $index -fi - -cf rename-buildpack $SOURCE_BUILDPACK_NAME $TARGET_BUILDPACK_NAME +for STACK_NAME in $STACKS; +do + echo Enabling buildpack ${SOURCE_BUILDPACK_NAME} ${STACK_NAME}... + cf update-buildpack $SOURCE_BUILDPACK_NAME -s $STACK_NAME --enable + + set +e + old_buildpack=$(cf buildpacks | grep "${TARGET_BUILDPACK_NAME}\s" | grep "${STACK_NAME}") + set -e + if [ -n "$old_buildpack" ]; then + index=$(echo $old_buildpack | cut -d' ' -f2) + name=$(echo $old_buildpack | cut -d' ' -f1) + + cf delete-buildpack -f $TARGET_BUILDPACK_NAME -s $STACK_NAME + + echo Updating buildpack ${SOURCE_BUILDPACK_NAME} ${STACK_NAME} index... + cf update-buildpack $SOURCE_BUILDPACK_NAME -s $STACK_NAME -i $index + fi + + cf rename-buildpack $SOURCE_BUILDPACK_NAME $TARGET_BUILDPACK_NAME -s $STACK_NAME +done \ No newline at end of file diff --git a/tasks/promote-buildpack/task.yml b/tasks/promote-buildpack/task.yml index ada290993..f74c253c5 100644 --- a/tasks/promote-buildpack/task.yml +++ b/tasks/promote-buildpack/task.yml @@ -30,6 +30,7 @@ params: CF_PASSWORD: SOURCE_BUILDPACK_NAME: TARGET_BUILDPACK_NAME: + STACKS: run: path: pcf-pipelines/tasks/promote-buildpack/task.sh diff --git a/tasks/stage-buildpack/task.sh b/tasks/stage-buildpack/task.sh index 93d02212b..0db130614 100755 --- a/tasks/stage-buildpack/task.sh +++ b/tasks/stage-buildpack/task.sh @@ -19,14 +19,18 @@ set -eu cf api $CF_API_URI --skip-ssl-validation cf auth $CF_USERNAME $CF_PASSWORD -set +e -existing_buildpack=$(cf buildpacks | grep "${BUILDPACK_NAME}\s") -set -e -if [ -z "${existing_buildpack}" ]; then - COUNT=$(cf buildpacks | grep --regexp=".zip" --count) - NEW_POSITION=$(expr $COUNT + 1) - cf create-buildpack $BUILDPACK_NAME buildpack/*.zip $NEW_POSITION --enable -else - index=$(echo $existing_buildpack | cut -d' ' -f2) - cf update-buildpack $BUILDPACK_NAME -p buildpack/*.zip -i $index --enable -fi + +for STACK_NAME in $STACKS; +do + set +e + existing_buildpack=$(cf buildpacks | grep "${BUILDPACK_NAME}\s" | grep "${STACK_NAME}") + set -e + if [ -z "${existing_buildpack}" ]; then + COUNT=$(cf buildpacks | grep --regexp=".zip" --count) + NEW_POSITION=$(expr $COUNT + 1) + cf create-buildpack $BUILDPACK_NAME buildpack/*-$STACK_NAME-*.zip $NEW_POSITION --enable + else + index=$(echo $existing_buildpack | cut -d' ' -f2) + cf update-buildpack $BUILDPACK_NAME -p buildpack/*-$STACK_NAME-*.zip -s $STACK_NAME -i $index --enable + fi +done \ No newline at end of file diff --git a/tasks/stage-buildpack/task.yml b/tasks/stage-buildpack/task.yml index 285d1786a..1a97e31df 100644 --- a/tasks/stage-buildpack/task.yml +++ b/tasks/stage-buildpack/task.yml @@ -30,6 +30,7 @@ params: CF_USERNAME: CF_PASSWORD: BUILDPACK_NAME: + STACKS: run: path: pcf-pipelines/tasks/stage-buildpack/task.sh diff --git a/upgrade-buildpacks/pipeline.yml b/upgrade-buildpacks/pipeline.yml index 696fc66e5..675b88046 100644 --- a/upgrade-buildpacks/pipeline.yml +++ b/upgrade-buildpacks/pipeline.yml @@ -12,6 +12,11 @@ # See the License for the specific language governing permissions and # limitations under the License. +cf_api_params: &cf_api_params + CF_API_URI: {{cf_api_uri}} + CF_USERNAME: {{cf_user}} + CF_PASSWORD: {{cf_password}} + resource_types: - name: pivnet type: docker-image @@ -31,71 +36,71 @@ resources: type: pivnet source: api_token: {{pivnet_token}} - product_slug: buildpacks - product_version: Binary* + product_slug: binary-buildpack + product_version: \d+\.\d+\.\d+ - name: dotnet-core-buildpack type: pivnet source: api_token: {{pivnet_token}} - product_slug: buildpacks - product_version: \.NET* + product_slug: dotnet-core-buildpack + product_version: \d+\.\d+\.\d+ - name: go-buildpack type: pivnet source: api_token: {{pivnet_token}} - product_slug: buildpacks - product_version: ^Go.* + product_slug: go-buildpack + product_version: \d+\.\d+\.\d+ - name: java-buildpack type: pivnet source: api_token: {{pivnet_token}} - product_slug: buildpacks - product_version: Java* + product_slug: java-buildpack + product_version: \d+\.\d+(\.\d+)? - name: nodejs-buildpack type: pivnet source: api_token: {{pivnet_token}} - product_slug: buildpacks - product_version: NodeJS* + product_slug: nodejs-buildpack + product_version: \d+\.\d+\.\d+ - name: php-buildpack type: pivnet source: api_token: {{pivnet_token}} - product_slug: buildpacks - product_version: PHP* + product_slug: php-buildpack + product_version: \d+\.\d+\.\d+ - name: python-buildpack type: pivnet source: api_token: {{pivnet_token}} - product_slug: buildpacks - product_version: Python* + product_slug: python-buildpack + product_version: \d+\.\d+\.\d+ - name: ruby-buildpack type: pivnet source: api_token: {{pivnet_token}} - product_slug: buildpacks - product_version: Ruby* + product_slug: ruby-buildpack + product_version: \d+\.\d+\.\d+ - name: staticfile-buildpack type: pivnet source: api_token: {{pivnet_token}} - product_slug: buildpacks - product_version: Staticfile* + product_slug: staticfile-buildpack + product_version: \d+\.\d+\.\d+ - name: tc-buildpack type: pivnet source: api_token: {{pivnet_token}} - product_slug: buildpacks - product_version: "tc Server*" + product_slug: tc-server-buildpack + product_version: \d+\.\d+(\.\d+)? - name: schedule type: time @@ -148,6 +153,7 @@ jobs: params: <<: *cf_api_params BUILDPACK_NAME: binary_buildpack_latest + STACKS: "cflinuxfs2 cflinuxfs3 windows2012R2 windows2016" - name: promote-binary-buildpack serial_groups: [cc-api] @@ -164,6 +170,7 @@ jobs: <<: *cf_api_params SOURCE_BUILDPACK_NAME: binary_buildpack_latest TARGET_BUILDPACK_NAME: binary_buildpack + STACKS: "cflinuxfs2 cflinuxfs3 windows2012R2 windows2016" - name: stage-dotnet-buildpack serial_groups: [cc-api] @@ -180,6 +187,7 @@ jobs: params: <<: *cf_api_params BUILDPACK_NAME: dotnet_core_buildpack_offline_latest + STACKS: "cflinuxfs2 cflinuxfs3" - name: promote-dotnet-buildpack serial_groups: [cc-api] @@ -196,6 +204,7 @@ jobs: <<: *cf_api_params SOURCE_BUILDPACK_NAME: dotnet_core_buildpack_offline_latest TARGET_BUILDPACK_NAME: dotnet_core_buildpack_offline + STACKS: "cflinuxfs2 cflinuxfs3" - name: stage-go-buildpack serial_groups: [cc-api] @@ -212,6 +221,7 @@ jobs: params: <<: *cf_api_params BUILDPACK_NAME: go_buildpack_latest + STACKS: "cflinuxfs2 cflinuxfs3" - name: promote-go-buildpack serial_groups: [cc-api] @@ -228,6 +238,7 @@ jobs: <<: *cf_api_params SOURCE_BUILDPACK_NAME: go_buildpack_latest TARGET_BUILDPACK_NAME: go_buildpack + STACKS: "cflinuxfs2 cflinuxfs3" - name: stage-java-buildpack serial_groups: [cc-api] @@ -247,6 +258,7 @@ jobs: params: <<: *cf_api_params BUILDPACK_NAME: java_buildpack_offline_latest + STACKS: "cflinuxfs2 cflinuxfs3" - name: promote-java-buildpack serial_groups: [cc-api] @@ -263,6 +275,7 @@ jobs: <<: *cf_api_params SOURCE_BUILDPACK_NAME: java_buildpack_offline_latest TARGET_BUILDPACK_NAME: java_buildpack_offline + STACKS: "cflinuxfs2 cflinuxfs3" - name: stage-nodejs-buildpack serial_groups: [cc-api] @@ -279,6 +292,7 @@ jobs: params: <<: *cf_api_params BUILDPACK_NAME: nodejs_buildpack_latest + STACKS: "cflinuxfs2 cflinuxfs3" - name: promote-nodejs-buildpack serial_groups: [cc-api] @@ -295,6 +309,7 @@ jobs: <<: *cf_api_params SOURCE_BUILDPACK_NAME: nodejs_buildpack_latest TARGET_BUILDPACK_NAME: nodejs_buildpack + STACKS: "cflinuxfs2 cflinuxfs3" - name: stage-php-buildpack serial_groups: [cc-api] @@ -311,6 +326,7 @@ jobs: params: <<: *cf_api_params BUILDPACK_NAME: php_buildpack_latest + STACKS: "cflinuxfs2 cflinuxfs3" - name: promote-php-buildpack serial_groups: [cc-api] @@ -327,6 +343,7 @@ jobs: <<: *cf_api_params SOURCE_BUILDPACK_NAME: php_buildpack_latest TARGET_BUILDPACK_NAME: php_buildpack + STACKS: "cflinuxfs2 cflinuxfs3" - name: stage-python-buildpack serial_groups: [cc-api] @@ -343,6 +360,7 @@ jobs: params: <<: *cf_api_params BUILDPACK_NAME: python_buildpack_latest + STACKS: "cflinuxfs2 cflinuxfs3" - name: promote-python-buildpack serial_groups: [cc-api] @@ -359,6 +377,7 @@ jobs: <<: *cf_api_params SOURCE_BUILDPACK_NAME: python_buildpack_latest TARGET_BUILDPACK_NAME: python_buildpack + STACKS: "cflinuxfs2 cflinuxfs3" - name: stage-ruby-buildpack serial_groups: [cc-api] @@ -375,6 +394,7 @@ jobs: params: <<: *cf_api_params BUILDPACK_NAME: ruby_buildpack_latest + STACKS: "cflinuxfs2 cflinuxfs3" - name: promote-ruby-buildpack serial_groups: [cc-api] @@ -391,6 +411,7 @@ jobs: <<: *cf_api_params SOURCE_BUILDPACK_NAME: ruby_buildpack_latest TARGET_BUILDPACK_NAME: ruby_buildpack + STACKS: "cflinuxfs2 cflinuxfs3" - name: stage-staticfile-buildpack serial_groups: [cc-api] @@ -407,6 +428,7 @@ jobs: params: <<: *cf_api_params BUILDPACK_NAME: staticfile_buildpack_latest + STACKS: "cflinuxfs2 cflinuxfs3" - name: promote-staticfile-buildpack serial_groups: [cc-api] @@ -423,6 +445,7 @@ jobs: <<: *cf_api_params SOURCE_BUILDPACK_NAME: staticfile_buildpack_latest TARGET_BUILDPACK_NAME: staticfile_buildpack + STACKS: "cflinuxfs2 cflinuxfs3" - name: stage-tcserver-buildpack serial_groups: [cc-api] @@ -442,6 +465,7 @@ jobs: params: <<: *cf_api_params BUILDPACK_NAME: tc_buildpack_latest + STACKS: "cflinuxfs2 cflinuxfs3" - name: promote-tcserver-buildpack serial_groups: [cc-api] @@ -459,8 +483,4 @@ jobs: <<: *cf_api_params SOURCE_BUILDPACK_NAME: tc_buildpack_latest TARGET_BUILDPACK_NAME: tc_buildpack - -cf_api_params: &cf_api_params - CF_API_URI: {{cf_api_uri}} - CF_USERNAME: {{cf_user}} - CF_PASSWORD: {{cf_password}} + STACKS: "cflinuxfs2 cflinuxfs3" From 2e185adf2634d08ca54542540ea7917dd18bf579 Mon Sep 17 00:00:00 2001 From: Danny Joyce Date: Wed, 31 Oct 2018 11:07:32 -0400 Subject: [PATCH 2/3] Upgrade the java and tc server buildpacks directly - The java and tc server buildpacks work with both cflinuxfs2 and cflinuxfs3. We have to upgrade them directly instead of using stage and promote phases because there is no way to stage them with stack association. We assume that older versions of these buildpacks already exist on the foundation and that they are stack associated when we perform an upgrade. Co-authored-by: Daniel Thornton --- tasks/upgrade-buildpack/task.sh | 26 ++++++++++++++++ tasks/upgrade-buildpack/task.yml | 36 ++++++++++++++++++++++ upgrade-buildpacks/pipeline.yml | 51 +++++--------------------------- 3 files changed, 70 insertions(+), 43 deletions(-) create mode 100755 tasks/upgrade-buildpack/task.sh create mode 100644 tasks/upgrade-buildpack/task.yml diff --git a/tasks/upgrade-buildpack/task.sh b/tasks/upgrade-buildpack/task.sh new file mode 100755 index 000000000..5c729f611 --- /dev/null +++ b/tasks/upgrade-buildpack/task.sh @@ -0,0 +1,26 @@ +#!/bin/bash + +set -eu + +# Copyright 2017-Present Pivotal Software, Inc. All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +cf api $CF_API_URI --skip-ssl-validation +cf auth $CF_USERNAME $CF_PASSWORD + +for STACK_NAME in $STACKS; +do + echo Upgrading ${TARGET_BUILDPACK_NAME} ${STACK_NAME}... + cf update-buildpack $TARGET_BUILDPACK_NAME -s $STACK_NAME -p buildpack/*.zip --enable +done \ No newline at end of file diff --git a/tasks/upgrade-buildpack/task.yml b/tasks/upgrade-buildpack/task.yml new file mode 100644 index 000000000..1eba6c059 --- /dev/null +++ b/tasks/upgrade-buildpack/task.yml @@ -0,0 +1,36 @@ +# Copyright 2017-Present Pivotal Software, Inc. All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +--- +platform: linux + +image_resource: + type: docker-image + source: + repository: pcfnorm/rootfs + + +inputs: +- name: buildpack +- name: pcf-pipelines + +params: + CF_API_URI: + CF_USERNAME: + CF_PASSWORD: + TARGET_BUILDPACK_NAME: + STACKS: + +run: + path: pcf-pipelines/tasks/upgrade-buildpack/task.sh diff --git a/upgrade-buildpacks/pipeline.yml b/upgrade-buildpacks/pipeline.yml index 675b88046..a8152efd3 100644 --- a/upgrade-buildpacks/pipeline.yml +++ b/upgrade-buildpacks/pipeline.yml @@ -240,40 +240,23 @@ jobs: TARGET_BUILDPACK_NAME: go_buildpack STACKS: "cflinuxfs2 cflinuxfs3" -- name: stage-java-buildpack +- name: upgrade-java-buildpack serial_groups: [cc-api] plan: - aggregate: - get: pcf-pipelines - get: buildpack - passed: [regulator] resource: java-buildpack + passed: [regulator] trigger: true params: globs: - "*offline*" - - task: stage - file: pcf-pipelines/tasks/stage-buildpack/task.yml - params: - <<: *cf_api_params - BUILDPACK_NAME: java_buildpack_offline_latest - STACKS: "cflinuxfs2 cflinuxfs3" - -- name: promote-java-buildpack - serial_groups: [cc-api] - plan: - - aggregate: - - get: java-buildpack - passed: [stage-java-buildpack] - trigger: true - params: {globs: []} - - get: pcf-pipelines - - task: promote - file: pcf-pipelines/tasks/promote-buildpack/task.yml + - task: upgrade + file: pcf-pipelines/tasks/upgrade-buildpack/task.yml params: <<: *cf_api_params - SOURCE_BUILDPACK_NAME: java_buildpack_offline_latest TARGET_BUILDPACK_NAME: java_buildpack_offline STACKS: "cflinuxfs2 cflinuxfs3" @@ -447,40 +430,22 @@ jobs: TARGET_BUILDPACK_NAME: staticfile_buildpack STACKS: "cflinuxfs2 cflinuxfs3" -- name: stage-tcserver-buildpack +- name: upgrade-tcserver-buildpack serial_groups: [cc-api] plan: - aggregate: - get: pcf-pipelines - get: buildpack - passed: [regulator] resource: tc-buildpack + passed: [regulator] trigger: true params: globs: - "*offline*" - - task: stage - file: pcf-pipelines/tasks/stage-buildpack/task.yml - params: - <<: *cf_api_params - BUILDPACK_NAME: tc_buildpack_latest - STACKS: "cflinuxfs2 cflinuxfs3" - -- name: promote-tcserver-buildpack - serial_groups: [cc-api] - plan: - - aggregate: - - get: tc-buildpack - passed: [stage-tcserver-buildpack] - trigger: true - params: {globs: []} - - get: pcf-pipelines - - - task: promote - file: pcf-pipelines/tasks/promote-buildpack/task.yml + - task: upgrade + file: pcf-pipelines/tasks/upgrade-buildpack/task.yml params: <<: *cf_api_params - SOURCE_BUILDPACK_NAME: tc_buildpack_latest TARGET_BUILDPACK_NAME: tc_buildpack STACKS: "cflinuxfs2 cflinuxfs3" From 0767dbcf46c926220e0caa44a7021e8bbc9d2a6a Mon Sep 17 00:00:00 2001 From: Ben Fickes Date: Mon, 19 Nov 2018 11:15:11 -0500 Subject: [PATCH 3/3] Pin docker image to version 1.0.28 for buildpacks tasks [#161882391] Co-authored-by: Danny Joyce --- tasks/promote-buildpack/task.yml | 1 + tasks/stage-buildpack/task.yml | 1 + tasks/upgrade-buildpack/task.yml | 1 + 3 files changed, 3 insertions(+) diff --git a/tasks/promote-buildpack/task.yml b/tasks/promote-buildpack/task.yml index f74c253c5..6f98fce15 100644 --- a/tasks/promote-buildpack/task.yml +++ b/tasks/promote-buildpack/task.yml @@ -19,6 +19,7 @@ image_resource: type: docker-image source: repository: pcfnorm/rootfs + tag: 1.0.28 inputs: diff --git a/tasks/stage-buildpack/task.yml b/tasks/stage-buildpack/task.yml index 1a97e31df..b4c32b4aa 100644 --- a/tasks/stage-buildpack/task.yml +++ b/tasks/stage-buildpack/task.yml @@ -19,6 +19,7 @@ image_resource: type: docker-image source: repository: pcfnorm/rootfs + tag: 1.0.28 inputs: diff --git a/tasks/upgrade-buildpack/task.yml b/tasks/upgrade-buildpack/task.yml index 1eba6c059..1a226f21e 100644 --- a/tasks/upgrade-buildpack/task.yml +++ b/tasks/upgrade-buildpack/task.yml @@ -19,6 +19,7 @@ image_resource: type: docker-image source: repository: pcfnorm/rootfs + tag: 1.0.28 inputs: