From f24b4181ddb99c4e2a8abfdd74db24898e5a6560 Mon Sep 17 00:00:00 2001 From: Andriy Knysh Date: Sun, 31 Jan 2021 01:54:58 -0500 Subject: [PATCH] Add catalogs of reusable Codefresh pipelines, pipeline specs, and pipeline shared steps (#7) --- .dockerignore | 44 ++++ .editorconfig | 26 ++ .gitignore | 46 +++- Dockerfile | 39 +++ LICENSE | 201 ++++++++++++++ Makefile | 40 ++- README.md | 214 +++++++++------ README.yaml | 78 +++++- codefresh-apply.yml | 11 - codefresh-diff.yml | 11 - codefresh/terraform.yml | 14 - .../codefresh-cli-create-new-pipelines.png | Bin 0 -> 194142 bytes pipelines/README.md | 3 + pipelines/microservice/build.yaml | 68 +++++ pipelines/microservice/deploy.yaml | 185 +++++++++++++ pipelines/microservice/destroy.yaml | 123 +++++++++ pipelines/microservice/preview.yaml | 245 ++++++++++++++++++ pipelines/microservice/release.yaml | 108 ++++++++ pipelines/spa/.gitignore | 43 +++ repositories.txt | 6 - specs/README.md | 80 ++++++ specs/microservice/build.yaml | 33 +++ specs/microservice/deploy.yaml | 37 +++ specs/microservice/destroy.yaml | 37 +++ specs/microservice/preview.yaml | 39 +++ specs/microservice/release.yaml | 36 +++ specs/spa/.gitignore | 43 +++ steps/README.md | 3 + templates/cloudposse/lint.yaml | 32 --- 29 files changed, 1662 insertions(+), 183 deletions(-) create mode 100644 .dockerignore create mode 100644 .editorconfig create mode 100644 Dockerfile create mode 100644 LICENSE delete mode 100644 codefresh-apply.yml delete mode 100644 codefresh-diff.yml delete mode 100644 codefresh/terraform.yml create mode 100644 docs/img/codefresh-cli-create-new-pipelines.png create mode 100644 pipelines/README.md create mode 100644 pipelines/microservice/build.yaml create mode 100644 pipelines/microservice/deploy.yaml create mode 100644 pipelines/microservice/destroy.yaml create mode 100644 pipelines/microservice/preview.yaml create mode 100644 pipelines/microservice/release.yaml create mode 100644 pipelines/spa/.gitignore delete mode 100644 repositories.txt create mode 100644 specs/README.md create mode 100644 specs/microservice/build.yaml create mode 100644 specs/microservice/deploy.yaml create mode 100644 specs/microservice/destroy.yaml create mode 100644 specs/microservice/preview.yaml create mode 100644 specs/microservice/release.yaml create mode 100644 specs/spa/.gitignore create mode 100644 steps/README.md delete mode 100644 templates/cloudposse/lint.yaml diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..d555a2d --- /dev/null +++ b/.dockerignore @@ -0,0 +1,44 @@ +# Things that could be checked into Git but need not be in the Docker image +.git +.editorconfig + +# Below here should be pretty much a copy of .gitignore +.build-harness +build-harness/ +aws-assumed-role/ +.idea/ +*.iml + +# Compiled and auto-generated files +**/nohup.out +**/*.tfstate +**/*.tfstate.* +**/planfile +**/*.planfile +**/*.kubeconfig +**/terraform.tfvars.json +**/terraform.auto.tfvars.json +**/*.terraform.tfvars.json +**/*.terraform.auto.tfvars.json +**/*.helmfile.vars.yaml +**/crash.log + +# Module directory +**/.terraform/ +**/.module/ +**/.helmfile/ + + +# Draft or auto-saved version +# Note that the leading "**/" appears necessary for Docker even if not for Git +**/*.draft.* +**/*.draft +**/*.orig +**/*.bak +**/*~ + +# macOS special files and folders +**/.DS_Store +**/.CFUserTextEncoding +**/.Trash/ +**/$RECYCLE.BIN/ diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..1316191 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,26 @@ +[*] +insert_final_newline = true + +# Override for Makefile +[{Makefile,makefile,GNUmakefile}] +indent_style = tab +indent_size = 4 + +[Makefile.*] +indent_style = tab +indent_size = 4 + +[*.yaml] +intent_style = space +indent_size = 2 + +[*.sh] +indent_style = tab +indent_size = 2 + +[*.{tf,tfvars,tpl,variant}] +indent_style = space +indent_size = 2 + +[*.json] +insert_final_newline = false diff --git a/.gitignore b/.gitignore index a6ed347..8f606a6 100644 --- a/.gitignore +++ b/.gitignore @@ -1,7 +1,43 @@ -# IDE files -.idea +.build-harness +build-harness/ +aws-assumed-role/ +.idea/ *.iml -# Build harness files -.build-harness -build-harness +vendir.lock.yml + +# Compiled and auto-generated files +# Note that the leading "**/" appears necessary for Docker even if not for Git +**/nohup.out +**/*.tfstate +**/*.tfstate.* +**/planfile +**/*.planfile +**/*.kubeconfig +**/terraform.tfvars.json +**/terraform.auto.tfvars.json +**/*.terraform.tfvars.json +**/*.terraform.auto.tfvars.json +**/*.helmfile.vars.yaml +**/crash.log + +# Module directory +# Note that the leading "**/" appears necessary for Docker even if not for Git +**/.terraform/ +**/.module/ +**/.helmfile/ + + +# Draft or auto-saved version +# Note that the leading "**/" appears necessary for Docker even if not for Git +**/*.draft.* +**/*.draft +**/*.orig +**/*.bak +**/*~ + +# macOS special files and folders +**/.DS_Store +**/.CFUserTextEncoding +**/.Trash/ +**/$RECYCLE.BIN/ diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..c40a389 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,39 @@ +ARG VERSION=0.141.3 +ARG OS=debian + +FROM cloudposse/geodesic:$VERSION-$OS + +# Geodesic message of the day +ENV MOTD_URL="https://geodesic.sh/motd" + +# Some configuration options for Geodesic +ENV AWS_SAML2AWS_ENABLED=false +ENV AWS_VAULT_ENABLED=false +ENV AWS_VAULT_SERVER_ENABLED=false +ENV GEODESIC_TF_PROMPT_ACTIVE=false +ENV DIRENV_ENABLED=false + +ENV DOCKER_IMAGE="cloudposse/codefresh" +ENV DOCKER_TAG="latest" + +# Geodesic banner message +ENV BANNER="Codefresh" + +RUN apt-get update + +# https://github.com/nodesource/distributions/blob/master/README.md#debinstall +RUN sudo curl -sL https://deb.nodesource.com/setup_15.x | bash - +RUN sudo apt-get install -y nodejs + +# Install Codefresh CLI +# https://codefresh-io.github.io/cli/installation/npm/ +RUN sudo npm install -g codefresh@latest + +# https://github.com/codefresh-io/cli/blob/master/Dockerfile +RUN sudo codefresh components update --location components + +COPY pipelines/ /pipelines/ +COPY specs/ /specs/ +COPY steps/ /steps/ + +WORKDIR / diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..ec88914 --- /dev/null +++ b/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright 2019-2021 Cloud Posse, LLC + + 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. diff --git a/Makefile b/Makefile index 61d8204..b803bc8 100644 --- a/Makefile +++ b/Makefile @@ -1,16 +1,34 @@ -export DEFAULT_HELP_TARGET ?= help -export HELP_FILTER ?= help|init|codefresh/sync -export BUILD_HARNESS_BRANCH ?= 0.15.3 +export DOCKER_ORG ?= cloudposse +export DOCKER_IMAGE ?= $(DOCKER_ORG)/codefresh +export DOCKER_TAG ?= latest +export DOCKER_IMAGE_NAME ?= $(DOCKER_IMAGE):$(DOCKER_TAG) +export APP_NAME = codefresh +GEODESIC_INSTALL_PATH ?= /usr/local/bin +export INSTALL_PATH ?= $(GEODESIC_INSTALL_PATH) +export SCRIPT = $(INSTALL_PATH)/$(APP_NAME) + -include $(shell curl -sSL -o .build-harness "https://git.io/build-harness"; echo .build-harness) -## Project name -PROJECT ?= cloudposse-pipelines +## Initialize build-harness, install deps, build docker container, install wrapper script and run shell +all: init deps build install run + @exit 0 + +## Install dependencies (if any) +deps: + @exit 0 + +## Build docker image +build: + @make --no-print-directory docker/build -## Repos to sync pipelines -REPOSITORIES ?= $(shell cat repositories.txt) +## Push docker image to registry +push: + docker push $(DOCKER_IMAGE) -## Codefresh accounts to operate with -ACCOUNTS ?= cloudposse +## Install wrapper script from geodesic container +install: + @docker run --rm $(DOCKER_IMAGE_NAME) | bash -s $(DOCKER_TAG) || (echo "Try: sudo make install"; exit 1) -## Pipelines for `cloudposse` -CLOUDPOSSE_PIPELINES ?= lint \ No newline at end of file +## Start the geodesic shell by calling wrapper script +run: + $(SCRIPT) diff --git a/README.md b/README.md index 4eb90b8..8df6f1b 100644 --- a/README.md +++ b/README.md @@ -1,17 +1,38 @@ - + +# codefresh [![Latest Release](https://img.shields.io/github/release/cloudposse/codefresh.svg)](https://github.com/cloudposse/codefresh/releases/latest) [![Slack Community](https://slack.cloudposse.com/badge.svg)](https://slack.cloudposse.com) + + [![README Header][readme_header_img]][readme_header_link] [![Cloud Posse][logo]](https://cpco.io/homepage) -# Codefresh pipelines [![Build Status](https://g.codefresh.io/api/badges/pipeline/cloudposse/cloudposse%2Fcodefresh%2Fcodefresh?type=cf-1)](https://g.codefresh.io/public/accounts/cloudposse/pipelines/cloudposse/codefresh/codefresh) [![Latest Release](https://img.shields.io/github/release/cloudposse/codefresh.svg)](https://github.com/cloudposse/codefresh/releases) [![Slack Community](https://slack.cloudposse.com/badge.svg)](https://slack.cloudposse.com) + + +Catalog of reusable Codefresh pipelines, pipeline specs, and pipeline shared steps. --- -This project is part of our comprehensive ["SweetOps"](https://cpco.io/sweetops) approach towards DevOps. +This project is part of our comprehensive ["SweetOps"](https://cpco.io/sweetops) approach towards DevOps. [][share_email] [][share_googleplus] [][share_facebook] @@ -35,12 +56,27 @@ It's 100% Open Source and licensed under the [APACHE2](LICENSE). +## Introduction + + +This repository contains catalogs of reusable Codefresh [pipelines]((pipelines/README.md)), [pipeline specs]((specs/README.md)), and [pipeline shared steps]((steps/README.md)). -## Usage -If you need to add new repo, just update `Makefile` adding new repo to `REPOSITORIES` variable. Open a PR and as soon as it's closed, a new `Codefresh` repository will be created with proper pipeline. -If you need to update pipelines, feel free to update the files in `templates` folder, open a PR and as soon as it's closed all supported pipelines will be updated. +## References +- https://codefresh.io/docs/docs/configure-ci-cd-pipeline/introduction-to-codefresh-pipelines/ +- https://codefresh.io/devops-tutorial/programmatic-creation-codefresh-pipelines-part1/ +- https://codefresh.io/devops-tutorial/programmatic-creation-codefresh-pipelines-part2/ +- https://codefresh.io/docs/docs/codefresh-yaml/steps/#creating-a-typed-codefresh-plugin +- https://codefresh-io.github.io/cli/ +- https://codefresh.io/codefresh-news/introducing-codefresh-cli +- https://codefresh.io/docs/docs/integrations/codefresh-api/#example---creating-codefresh-pipelines-externally +- https://codefresh-io.github.io/cli/pipelines/spec/ +- https://docs.github.com/en/actions/reference/context-and-expression-syntax-for-github-actions#contexts +- https://docs.github.com/en/actions/reference/context-and-expression-syntax-for-github-actions#github-context +- https://docs.github.com/en/actions/reference/events-that-trigger-workflows +- https://docs.github.com/en/developers/webhooks-and-events/webhook-events-and-payloads +- https://docs.github.com/en/rest/reference/repos @@ -48,9 +84,11 @@ If you need to update pipelines, feel free to update the files in `templates` fo -## Share the Love -Like this project? Please give it a ★ on [our GitHub](https://github.com/cloudposse/codefresh-pipelines)! (it helps us **a lot**) + +## Share the Love + +Like this project? Please give it a ★ on [our GitHub](https://github.com/cloudposse/codefresh)! (it helps us **a lot**) Are you using this project or any of our other projects? Consider [leaving a testimonial][testimonial]. =) @@ -60,50 +98,63 @@ Are you using this project or any of our other projects? Consider [leaving a tes Check out these related projects. - [build-harness](https://github.com/cloudposse/build-harness) - Collection of Makefiles to facilitate building Golang projects, Dockerfiles, Helm charts, and more -- [Packages](https://github.com/cloudposse/packages) - Cloud Posse installer and distribution of native apps +- [packages](https://github.com/cloudposse/packages) - Cloud Posse installer and distribution of native apps ## Help -**Got a question?** +**Got a question?** We got answers. -File a GitHub [issue](https://github.com/cloudposse/codefresh-pipelines/issues), send us an [email][email] or join our [Slack Community][slack]. +File a GitHub [issue](https://github.com/cloudposse/codefresh/issues), send us an [email][email] or join our [Slack Community][slack]. [![README Commercial Support][readme_commercial_support_img]][readme_commercial_support_link] -## Commercial Support - -Work directly with our team of DevOps experts via email, slack, and video conferencing. +## DevOps Accelerator for Startups -We provide [*commercial support*][commercial_support] for all of our [Open Source][github] projects. As a *Dedicated Support* customer, you have access to our team of subject matter experts at a fraction of the cost of a full-time engineer. -[![E-Mail](https://img.shields.io/badge/email-hello@cloudposse.com-blue.svg)][email] +We are a [**DevOps Accelerator**][commercial_support]. We'll help you build your cloud infrastructure from the ground up so you can own it. Then we'll show you how to operate it and stick around for as long as you need us. -- **Questions.** We'll use a Shared Slack channel between your team and ours. -- **Troubleshooting.** We'll help you triage why things aren't working. -- **Code Reviews.** We'll review your Pull Requests and provide constructive feedback. -- **Bug Fixes.** We'll rapidly work to fix any bugs in our projects. -- **Build New Terraform Modules.** We'll [develop original modules][module_development] to provision infrastructure. -- **Cloud Architecture.** We'll assist with your cloud strategy and design. -- **Implementation.** We'll provide hands-on support to implement our reference architectures. +[![Learn More](https://img.shields.io/badge/learn%20more-success.svg?style=for-the-badge)][commercial_support] +Work directly with our team of DevOps experts via email, slack, and video conferencing. +We deliver 10x the value for a fraction of the cost of a full-time engineer. Our track record is not even funny. If you want things done right and you need it done FAST, then we're your best bet. +- **Reference Architecture.** You'll get everything you need from the ground up built using 100% infrastructure as code. +- **Release Engineering.** You'll have end-to-end CI/CD with unlimited staging environments. +- **Site Reliability Engineering.** You'll have total visibility into your apps and microservices. +- **Security Baseline.** You'll have built-in governance with accountability and audit logs for all changes. +- **GitOps.** You'll be able to operate your infrastructure via Pull Requests. +- **Training.** You'll receive hands-on training so your team can operate what we build. +- **Questions.** You'll have a direct line of communication between our teams via a Shared Slack channel. +- **Troubleshooting.** You'll get help to triage when things aren't working. +- **Code Reviews.** You'll receive constructive feedback on Pull Requests. +- **Bug Fixes.** We'll rapidly work with you to fix any bugs in our projects. ## Slack Community Join our [Open Source Community][slack] on Slack. It's **FREE** for everyone! Our "SweetOps" community is where you get to talk with others who share a similar vision for how to rollout and manage infrastructure. This is the best place to talk shop, ask questions, solicit feedback, and work together as a community to build totally *sweet* infrastructure. +## Discourse Forums + +Participate in our [Discourse Forums][discourse]. Here you'll find answers to commonly asked questions. Most questions will be related to the enormous number of projects we support on our GitHub. Come here to collaborate on answers, find solutions, and get ideas about the products and services we value. It only takes a minute to get started! Just sign in with SSO using your GitHub account. + ## Newsletter -Signup for [our newsletter][newsletter] that covers everything on our technology radar. Receive updates on what we're up to on GitHub as well as awesome new projects we discover. +Sign up for [our newsletter][newsletter] that covers everything on our technology radar. Receive updates on what we're up to on GitHub as well as awesome new projects we discover. + +## Office Hours + +[Join us every Wednesday via Zoom][office_hours] for our weekly "Lunch & Learn" sessions. It's **FREE** for everyone! + +[![zoom](https://img.cloudposse.com/fit-in/200x200/https://cloudposse.com/wp-content/uploads/2019/08/Powered-by-Zoom.png")][office_hours] ## Contributing ### Bug Reports & Feature Requests -Please use the [issue tracker](https://github.com/cloudposse/codefresh-pipelines/issues) to report any bugs or file feature requests. +Please use the [issue tracker](https://github.com/cloudposse/codefresh/issues) to report any bugs or file feature requests. ### Developing @@ -123,34 +174,36 @@ In general, PRs are welcome. We follow the typical "fork-and-pull" Git workflow. ## Copyrights -Copyright © 2019-2019 [Cloud Posse, LLC](https://cloudposse.com) +Copyright © 2021-2021 [Cloud Posse, LLC](https://cloudposse.com) -## License +## License -[![License](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](https://opensource.org/licenses/Apache-2.0) +[![License](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](https://opensource.org/licenses/Apache-2.0) See [LICENSE](LICENSE) for full details. - Licensed to the Apache Software Foundation (ASF) under one - or more contributor license agreements. See the NOTICE file - distributed with this work for additional information - regarding copyright ownership. The ASF licenses this file - to you 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 +```text +Licensed to the Apache Software Foundation (ASF) under one +or more contributor license agreements. See the NOTICE file +distributed with this work for additional information +regarding copyright ownership. The ASF licenses this file +to you 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 - https://www.apache.org/licenses/LICENSE-2.0 + https://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. +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. +``` @@ -172,7 +225,7 @@ This project is maintained and funded by [Cloud Posse, LLC][website]. Like it? P We're a [DevOps Professional Services][hire] company based in Los Angeles, CA. We ❤️ [Open Source Software][we_love_open_source]. -We offer [paid support][commercial_support] on all of our projects. +We offer [paid support][commercial_support] on all of our projects. Check out [our other projects][github], [follow us on twitter][twitter], [apply for a job][jobs], or [hire us][hire] to help with your cloud strategy and implementation. @@ -180,47 +233,50 @@ Check out [our other projects][github], [follow us on twitter][twitter], [apply ### Contributors -| [![Erik Osterman][osterman_avatar]][osterman_homepage]
[Erik Osterman][osterman_homepage] | [![Igor Rodionov][goruha_avatar]][goruha_homepage]
[Igor Rodionov][goruha_homepage] | [![Maxim Mironenko][maximmi_avatar]][maximmi_homepage]
[Maxim Mironenko][maximmi_homepage] | -|---|---|---| + +| [![Erik Osterman][osterman_avatar]][osterman_homepage]
[Erik Osterman][osterman_homepage] | [![Igor Rodionov][goruha_avatar]][goruha_homepage]
[Igor Rodionov][goruha_homepage] | [![Maxim Mironenko][maximmi_avatar]][maximmi_homepage]
[Maxim Mironenko][maximmi_homepage] | [![Andriy Knysh][aknysh_avatar]][aknysh_homepage]
[Andriy Knysh][aknysh_homepage] | +|---|---|---|---| + [osterman_homepage]: https://github.com/osterman - [osterman_avatar]: https://github.com/osterman.png?size=150 + [osterman_avatar]: https://img.cloudposse.com/150x150/https://github.com/osterman.png [goruha_homepage]: https://github.com/goruha - [goruha_avatar]: https://github.com/goruha.png?size=150 + [goruha_avatar]: https://img.cloudposse.com/150x150/https://github.com/goruha.png [maximmi_homepage]: https://github.com/maximmi - [maximmi_avatar]: https://github.com/maximmi.png?size=150 - - + [maximmi_avatar]: https://img.cloudposse.com/150x150/https://github.com/maximmi.png + [aknysh_homepage]: https://github.com/aknysh + [aknysh_avatar]: https://img.cloudposse.com/150x150/https://github.com/aknysh.png [![README Footer][readme_footer_img]][readme_footer_link] [![Beacon][beacon]][website] [logo]: https://cloudposse.com/logo-300x69.svg - [docs]: https://cpco.io/docs - [website]: https://cpco.io/homepage - [github]: https://cpco.io/github - [jobs]: https://cpco.io/jobs - [hire]: https://cpco.io/hire - [slack]: https://cpco.io/slack - [linkedin]: https://cpco.io/linkedin - [twitter]: https://cpco.io/twitter - [testimonial]: https://cpco.io/leave-testimonial - [newsletter]: https://cpco.io/newsletter - [email]: https://cpco.io/email - [commercial_support]: https://cpco.io/commercial-support - [we_love_open_source]: https://cpco.io/we-love-open-source - [module_development]: https://cpco.io/module-development - [terraform_modules]: https://cpco.io/terraform-modules - [readme_header_img]: https://cloudposse.com/readme/header/img?repo=cloudposse/codefresh-pipelines - [readme_header_link]: https://cloudposse.com/readme/header/link?repo=cloudposse/codefresh-pipelines - [readme_footer_img]: https://cloudposse.com/readme/footer/img?repo=cloudposse/codefresh-pipelines - [readme_footer_link]: https://cloudposse.com/readme/footer/link?repo=cloudposse/codefresh-pipelines - [readme_commercial_support_img]: https://cloudposse.com/readme/commercial-support/img?repo=cloudposse/codefresh-pipelines - [readme_commercial_support_link]: https://cloudposse.com/readme/commercial-support/link?repo=cloudposse/codefresh-pipelines - [share_twitter]: https://twitter.com/intent/tweet/?text=Codefresh+pipelines&url=https://github.com/cloudposse/codefresh-pipelines - [share_linkedin]: https://www.linkedin.com/shareArticle?mini=true&title=Codefresh+pipelines&url=https://github.com/cloudposse/codefresh-pipelines - [share_reddit]: https://reddit.com/submit/?url=https://github.com/cloudposse/codefresh-pipelines - [share_facebook]: https://facebook.com/sharer/sharer.php?u=https://github.com/cloudposse/codefresh-pipelines - [share_googleplus]: https://plus.google.com/share?url=https://github.com/cloudposse/codefresh-pipelines - [share_email]: mailto:?subject=Codefresh+pipelines&body=https://github.com/cloudposse/codefresh-pipelines - [beacon]: https://ga-beacon.cloudposse.com/UA-76589703-4/cloudposse/codefresh-pipelines?pixel&cs=github&cm=readme&an=codefresh-pipelines + [docs]: https://cpco.io/docs?utm_source=github&utm_medium=readme&utm_campaign=cloudposse/codefresh&utm_content=docs + [website]: https://cpco.io/homepage?utm_source=github&utm_medium=readme&utm_campaign=cloudposse/codefresh&utm_content=website + [github]: https://cpco.io/github?utm_source=github&utm_medium=readme&utm_campaign=cloudposse/codefresh&utm_content=github + [jobs]: https://cpco.io/jobs?utm_source=github&utm_medium=readme&utm_campaign=cloudposse/codefresh&utm_content=jobs + [hire]: https://cpco.io/hire?utm_source=github&utm_medium=readme&utm_campaign=cloudposse/codefresh&utm_content=hire + [slack]: https://cpco.io/slack?utm_source=github&utm_medium=readme&utm_campaign=cloudposse/codefresh&utm_content=slack + [linkedin]: https://cpco.io/linkedin?utm_source=github&utm_medium=readme&utm_campaign=cloudposse/codefresh&utm_content=linkedin + [twitter]: https://cpco.io/twitter?utm_source=github&utm_medium=readme&utm_campaign=cloudposse/codefresh&utm_content=twitter + [testimonial]: https://cpco.io/leave-testimonial?utm_source=github&utm_medium=readme&utm_campaign=cloudposse/codefresh&utm_content=testimonial + [office_hours]: https://cloudposse.com/office-hours?utm_source=github&utm_medium=readme&utm_campaign=cloudposse/codefresh&utm_content=office_hours + [newsletter]: https://cpco.io/newsletter?utm_source=github&utm_medium=readme&utm_campaign=cloudposse/codefresh&utm_content=newsletter + [discourse]: https://ask.sweetops.com/?utm_source=github&utm_medium=readme&utm_campaign=cloudposse/codefresh&utm_content=discourse + [email]: https://cpco.io/email?utm_source=github&utm_medium=readme&utm_campaign=cloudposse/codefresh&utm_content=email + [commercial_support]: https://cpco.io/commercial-support?utm_source=github&utm_medium=readme&utm_campaign=cloudposse/codefresh&utm_content=commercial_support + [we_love_open_source]: https://cpco.io/we-love-open-source?utm_source=github&utm_medium=readme&utm_campaign=cloudposse/codefresh&utm_content=we_love_open_source + [terraform_modules]: https://cpco.io/terraform-modules?utm_source=github&utm_medium=readme&utm_campaign=cloudposse/codefresh&utm_content=terraform_modules + [readme_header_img]: https://cloudposse.com/readme/header/img + [readme_header_link]: https://cloudposse.com/readme/header/link?utm_source=github&utm_medium=readme&utm_campaign=cloudposse/codefresh&utm_content=readme_header_link + [readme_footer_img]: https://cloudposse.com/readme/footer/img + [readme_footer_link]: https://cloudposse.com/readme/footer/link?utm_source=github&utm_medium=readme&utm_campaign=cloudposse/codefresh&utm_content=readme_footer_link + [readme_commercial_support_img]: https://cloudposse.com/readme/commercial-support/img + [readme_commercial_support_link]: https://cloudposse.com/readme/commercial-support/link?utm_source=github&utm_medium=readme&utm_campaign=cloudposse/codefresh&utm_content=readme_commercial_support_link + [share_twitter]: https://twitter.com/intent/tweet/?text=codefresh&url=https://github.com/cloudposse/codefresh + [share_linkedin]: https://www.linkedin.com/shareArticle?mini=true&title=codefresh&url=https://github.com/cloudposse/codefresh + [share_reddit]: https://reddit.com/submit/?url=https://github.com/cloudposse/codefresh + [share_facebook]: https://facebook.com/sharer/sharer.php?u=https://github.com/cloudposse/codefresh + [share_googleplus]: https://plus.google.com/share?url=https://github.com/cloudposse/codefresh + [share_email]: mailto:?subject=codefresh&body=https://github.com/cloudposse/codefresh + [beacon]: https://ga-beacon.cloudposse.com/UA-76589703-4/cloudposse/codefresh?pixel&cs=github&cm=readme&an=codefresh diff --git a/README.yaml b/README.yaml index 2a40f95..01b253d 100644 --- a/README.yaml +++ b/README.yaml @@ -1,5 +1,14 @@ +--- +# +# This is the canonical configuration for the `README.md` +# Run `make readme` to rebuild the `README.md` +# + # Name of this project -name: Codefresh pipelines +name: codefresh + +# Logo for this project +#logo: docs/logo.png # License of this project license: "APACHE2" @@ -8,39 +17,78 @@ license: "APACHE2" copyrights: - name: "Cloud Posse, LLC" url: "https://cloudposse.com" - year: "2019" + year: "2021" -# Canonical GitHub repo -github_repo: cloudposse/codefresh-pipelines +# Canonical GitHub repo +github_repo: cloudposse/codefresh # Badges to display badges: - - name: "Build Status" - image: "https://g.codefresh.io/api/badges/pipeline/cloudposse/cloudposse%2Fcodefresh%2Fcodefresh?type=cf-1" - url: "https://g.codefresh.io/public/accounts/cloudposse/pipelines/cloudposse/codefresh/codefresh" - name: "Latest Release" image: "https://img.shields.io/github/release/cloudposse/codefresh.svg" - url: "https://github.com/cloudposse/codefresh/releases" + url: "https://github.com/cloudposse/codefresh/releases/latest" - name: "Slack Community" image: "https://slack.cloudposse.com/badge.svg" url: "https://slack.cloudposse.com" +categories: + - codefresh-pipelines + - codefresh + - pipelines + - pipeline + - cicd + - ci-cd + - ci-cd-pipeline + - cicd-pipeline + - gitops + - catalog + - steps + - spec + - specifications + - specification + - build + - deploy + - release + - destroy + +# List any related terraform modules that this module may be used with or that this module depends on. related: - name: "build-harness" description: "Collection of Makefiles to facilitate building Golang projects, Dockerfiles, Helm charts, and more" url: "https://github.com/cloudposse/build-harness" - - name: "Packages" + - name: "packages" description: "Cloud Posse installer and distribution of native apps" url: "https://github.com/cloudposse/packages" # Short description of this project description: |- - This `codefresh` repo allows to create and update `Codefresh` pipelines for a collection of terraform modules and other repos. + Catalog of reusable Codefresh pipelines, pipeline specs, and pipeline shared steps. + +# Introduction to the project +introduction: |- + + This repository contains catalogs of reusable Codefresh [pipelines]((pipelines/README.md)), [pipeline specs]((specs/README.md)), and [pipeline shared steps]((steps/README.md)). + + + ## References + + - https://codefresh.io/docs/docs/configure-ci-cd-pipeline/introduction-to-codefresh-pipelines/ + - https://codefresh.io/devops-tutorial/programmatic-creation-codefresh-pipelines-part1/ + - https://codefresh.io/devops-tutorial/programmatic-creation-codefresh-pipelines-part2/ + - https://codefresh.io/docs/docs/codefresh-yaml/steps/#creating-a-typed-codefresh-plugin + - https://codefresh-io.github.io/cli/ + - https://codefresh.io/codefresh-news/introducing-codefresh-cli + - https://codefresh.io/docs/docs/integrations/codefresh-api/#example---creating-codefresh-pipelines-externally + - https://codefresh-io.github.io/cli/pipelines/spec/ + - https://docs.github.com/en/actions/reference/context-and-expression-syntax-for-github-actions#contexts + - https://docs.github.com/en/actions/reference/context-and-expression-syntax-for-github-actions#github-context + - https://docs.github.com/en/actions/reference/events-that-trigger-workflows + - https://docs.github.com/en/developers/webhooks-and-events/webhook-events-and-payloads + - https://docs.github.com/en/rest/reference/repos -# How to use this project -usage: |- - If you need to add new repo, just update `Makefile` adding new repo to `REPOSITORIES` variable. Open a PR and as soon as it's closed, a new `Codefresh` repository will be created with proper pipeline. - If you need to update pipelines, feel free to update the files in `templates` folder, open a PR and as soon as it's closed all supported pipelines will be updated. +# How to get started quickly +#quickstart: |- +# Here's how to get started... # Contributors to this project contributors: @@ -50,3 +98,5 @@ contributors: github: "goruha" - name: "Maxim Mironenko" github: "maximmi" + - name: "Andriy Knysh" + github: "aknysh" diff --git a/codefresh-apply.yml b/codefresh-apply.yml deleted file mode 100644 index aa08e28..0000000 --- a/codefresh-apply.yml +++ /dev/null @@ -1,11 +0,0 @@ -# Build a service with environment variables -version: '1.0' - -steps: - apply_codefresh_sync: - title: Sync codefresh pipelines - image: cloudposse/build-harness:${{BUILD_HARNESS_VERSION}} - commands: - # Requires CF_API_KEY, here it will get it from Shared Configuration - - make codefresh/sync/auth/cloudposse - - make codefresh/sync/apply diff --git a/codefresh-diff.yml b/codefresh-diff.yml deleted file mode 100644 index a97a4d0..0000000 --- a/codefresh-diff.yml +++ /dev/null @@ -1,11 +0,0 @@ -# Build a service with environment variables -version: '1.0' - -steps: - diff_codefresh_sync: - title: Diff codefresh pipelines - image: cloudposse/build-harness:${{BUILD_HARNESS_VERSION}} - commands: - # Requires CF_API_KEY, here it will get it from Shared Configuration - - make codefresh/sync/auth/cloudposse - - make codefresh/sync/diff diff --git a/codefresh/terraform.yml b/codefresh/terraform.yml deleted file mode 100644 index f3c26f6..0000000 --- a/codefresh/terraform.yml +++ /dev/null @@ -1,14 +0,0 @@ -version: '1.0' - -steps: - test: - title: Terraform Module Integration Tests - image: cloudposse/build-harness:${{BUILD_HARNESS_VERSION}} - commands: - - make init - - make terraform/install - - make terraform/get-plugins - - make terraform/get-modules - - make terraform/lint - - make terraform/validate - - make readme/lint \ No newline at end of file diff --git a/docs/img/codefresh-cli-create-new-pipelines.png b/docs/img/codefresh-cli-create-new-pipelines.png new file mode 100644 index 0000000000000000000000000000000000000000..d4a15812a7d422b822154c28ce19cce57df2e052 GIT binary patch literal 194142 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%0A-J@6VzyJjn` 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νu3F4@c-ThcE{eW>Gy>y^3f>$G4wAyVBf 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[:thumbsup:](https://cloudposse.com/urand/familyguy.gif)' + when: + condition: + all: + githubNotificationsEnabled: "'${{GITHUB_NOTIFICATIONS_ENABLED}}' == 'true'" + + # https://docs.datadoghq.com/api/v1/events/ + # https://docs.datadoghq.com/tracing/deployment_tracking/ + # https://docs.datadoghq.com/getting_started/tagging/unified_service_tagging/?tab=kubernetes + send_datadog_notification: + title: "Send notification to Datadog" + stage: Deploy + image: alpine + environment: + - CF_REPO_NAME=${{CF_REPO_NAME}} + - CF_BRANCH=${{CF_BRANCH}} + - CF_RELEASE_TAG=${{CF_RELEASE_TAG}} + - CF_REVISION=${{CF_REVISION}} + - CF_SHORT_REVISION=${{CF_SHORT_REVISION}} + - CF_BUILD_INITIATOR=${{CF_BUILD_INITIATOR}} + - CF_BUILD_DATE_TIME=${{CF_BUILD_DATE_TIME}} + - DATADOG_API_KEY=${{DATADOG_API_KEY}} + - IMAGE_NAME=${{IMAGE_NAME}} + - IMAGE_TAG=${{IMAGE_TAG}} + - STAGE=${{STAGE}} + - APP_SCHEME=${{APP_SCHEME}} + - APP_HOST=${{APP_HOST}} + commands: + - |- + set -e + apk add --update curl bash + api="https://app.datadoghq.com/api/v1/events?api_key=${DATADOG_API_KEY}" + payload=$(cat <<-EOJ + { + "title": "Deployed $IMAGE_NAME:$IMAGE_TAG to $STAGE", + "text": "Version $CF_SHORT_REVISION deployed to $STAGE at $CF_BUILD_DATE_TIME: $APP_SCHEME://$APP_HOST", + "alert_type": "info", + "device_name": "Codefresh", + "tags": [ + "env:$STAGE", + "service:$CF_REPO_NAME", + "version:$CF_REVISION", + "stage:$STAGE", + "branch:$CF_BRANCH", + "release:$CF_RELEASE_TAG" + ] + } + EOJ + ) + echo -e "$payload" + curl -v -s -X POST -H "Content-type: application/json" -d "$payload" "$api" + when: + condition: + all: + githubNotificationsEnabled: "'${{DATADOG_NOTIFICATIONS_ENABLED}}' == 'true'" diff --git a/pipelines/microservice/destroy.yaml b/pipelines/microservice/destroy.yaml new file mode 100644 index 0000000..c933e24 --- /dev/null +++ b/pipelines/microservice/destroy.yaml @@ -0,0 +1,123 @@ +version: '1.0' + +stages: + - Prepare + - Build + - Destroy + +steps: + + main_clone: + # https://codefresh.io/docs/docs/codefresh-yaml/steps/git-clone/ + title: "Clone repository" + type: git-clone + stage: Prepare + description: "Clone repository" + repo: ${{CF_REPO_OWNER}}/${{CF_REPO_NAME}} + git: github + revision: ${{CF_REVISION}} + + set_stage: + title: "Set stage" + stage: Prepare + image: alpine + commands: + - cf_export STAGE=preview + + set_codefresh_variables: + title: "Set Codefresh variables" + stage: Build + image: alpine + commands: + - "[ ! -f ./codefresh/defaults.env ] || cat ./codefresh/defaults.env | tee -a ${{CF_VOLUME_PATH}}/env_vars_to_export" + - "[ ! -f ./codefresh/${{STAGE}}.env ] || cat ./codefresh/${{STAGE}}.env | tee -a ${{CF_VOLUME_PATH}}/env_vars_to_export" + + export: + title: "Export environment" + stage: Prepare + image: alpine + commands: + - cf_export NAMESPACE=pr-${{CF_PULL_REQUEST_NUMBER}}-${{CF_REPO_NAME}} + - cf_export CF_BUILD_DATE_TIME=$(date +"%Y-%m-%d/%H:%M:%S" -d @$((${{CF_BUILD_TIMESTAMP}}/1000))) + + show_context: + title: "Show context" + stage: Prepare + image: alpine + commands: + - |- + echo "Repo owner: $CF_REPO_OWNER" + echo "Repo name: $CF_REPO_NAME" + echo "Branch: $CF_BRANCH" + echo "Release tag: $CF_RELEASE_TAG" + echo "Commit URL: $CF_COMMIT_URL" + echo "Commit message: $CF_COMMIT_MESSAGE" + echo "Commit author: $CF_COMMIT_AUTHOR" + echo "Revision: $CF_REVISION" + echo "Short revision: $CF_SHORT_REVISION" + echo "Pull Request action: $CF_PULL_REQUEST_ACTION" + echo "Stage: $STAGE" + echo "Namespace: $NAMESPACE" + + build_image: + title: "Build Docker image" + stage: Build + type: build + description: "Build Docker image" + image_name: ${{CF_REPO_NAME}} + tag: ${{CF_SHORT_REVISION}} + dockerfile: Dockerfile + no_cache: false + no_cf_cache: false + + wait: + title: "Wait" + stage: Destroy + image: codefresh/cli:latest + commands: + - codefresh get builds --pipeline=destroy --pipeline=preview --branch=${{CF_BRANCH}} --status running --limit 1000 -o json | jq --arg id ${{CF_BUILD_ID}} -ser 'flatten|.[-1].id==$id' + retry: + maxAttempts: 10 + delay: 20 + exponentialFactor: 1.1 + when: + condition: + any: + deployLabel: "match('${{CF_PULL_REQUEST_LABELS}}', 'deploy', false) == false" + validatePRAction: "'${{CF_PULL_REQUEST_ACTION}}' == 'closed'" + + destroy: + title: "Destroy Preview Environment" + stage: Destroy + image: ${{build_image}} + working_directory: /deploy/ + commands: + - echo 'Destroying ${{CF_REPO_NAME}} and namespace ${{NAMESPACE}}' + - apk add kubectl@cloudposse + - kubectl config use-context ${{KUBE_CONTEXT}} + - kubectl delete namespace ${{NAMESPACE}} --ignore-not-found --cascade=true + when: + condition: + any: + deployLabel: "match('${{CF_PULL_REQUEST_LABELS}}', 'deploy', false) == false" + validatePRAction: "'${{CF_PULL_REQUEST_ACTION}}' == 'closed'" + + set_github_destroy_status_to_success: + title: Set GitHub destroy status to "success" + stage: Destroy + image: cloudposse/github-status-updater + environment: + - GITHUB_ACTION=update_state + - GITHUB_TOKEN=${{GITHUB_TOKEN}} + - GITHUB_OWNER=${{CF_REPO_OWNER}} + - GITHUB_REPO=${{CF_REPO_NAME}} + - GITHUB_REF=${{CF_REVISION}} + - GITHUB_CONTEXT=preview/env + - GITHUB_STATE=success + - GITHUB_DESCRIPTION=Destroyed by @${{CF_BUILD_INITIATOR}} + - GITHUB_TARGET_URL=${{CF_BUILD_URL}} + when: + condition: + any: + deployLabel: "match('${{CF_PULL_REQUEST_LABELS}}', 'deploy', false) == false && '${{GITHUB_NOTIFICATIONS_ENABLED}}' == 'true'" + validatePRAction: "'${{CF_PULL_REQUEST_ACTION}}' == 'closed' && '${{GITHUB_NOTIFICATIONS_ENABLED}}' == 'true'" diff --git a/pipelines/microservice/preview.yaml b/pipelines/microservice/preview.yaml new file mode 100644 index 0000000..5bd25c9 --- /dev/null +++ b/pipelines/microservice/preview.yaml @@ -0,0 +1,245 @@ +version: '1.0' + +stages: + - Prepare + - Build + - Test + - Deploy + +steps: + + main_clone: + # https://codefresh.io/docs/docs/codefresh-yaml/steps/git-clone/ + title: "Clone repository" + type: git-clone + stage: Prepare + description: "Clone repository" + repo: ${{CF_REPO_OWNER}}/${{CF_REPO_NAME}} + git: github + revision: ${{CF_REVISION}} + + set_stage: + title: "Set stage" + stage: Prepare + image: alpine + commands: + - cf_export STAGE=preview + + set_codefresh_variables: + title: "Set Codefresh variables" + stage: Build + image: alpine + commands: + - "[ ! -f ./codefresh/defaults.env ] || cat ./codefresh/defaults.env | tee -a ${{CF_VOLUME_PATH}}/env_vars_to_export" + - "[ ! -f ./codefresh/${{STAGE}}.env ] || cat ./codefresh/${{STAGE}}.env | tee -a ${{CF_VOLUME_PATH}}/env_vars_to_export" + + export: + title: "Export environment" + stage: Prepare + image: alpine + commands: + - cf_export NAMESPACE=pr-${{CF_PULL_REQUEST_NUMBER}}-${{CF_REPO_NAME}} + - cf_export APP_NAME=${{CF_REPO_NAME}} + - cf_export APP_SCHEME=https + - cf_export CF_BUILD_DATE_TIME=$(date +"%Y-%m-%d/%H:%M:%S" -d @$((${{CF_BUILD_TIMESTAMP}}/1000))) + - cf_export APP_HOST=pr-${{CF_PULL_REQUEST_NUMBER}}-${{CF_REPO_NAME}}.${{BASE_HOST}} + + # Docker image name and tag for Kubernetes to pull the image from (used as ENV vars in the helmfile) + # ECR_BASE_NAME is set as a shared environment variable in Codefresh + - cf_export IMAGE_NAME=${{ECR_BASE_NAME}}/${{CF_REPO_NAME}} + - cf_export IMAGE_TAG=${{CF_REVISION}} + + show_context: + title: "Show context" + stage: Prepare + image: alpine + commands: + - |- + echo "Repo owner: $CF_REPO_OWNER" + echo "Repo name: $CF_REPO_NAME" + echo "Branch: $CF_BRANCH" + echo "Release tag: $CF_RELEASE_TAG" + echo "Commit URL: $CF_COMMIT_URL" + echo "Commit message: $CF_COMMIT_MESSAGE" + echo "Commit author: $CF_COMMIT_AUTHOR" + echo "Revision: $CF_REVISION" + echo "Short revision: $CF_SHORT_REVISION" + echo "Pull Request action: $CF_PULL_REQUEST_ACTION" + echo "Stage: $STAGE" + echo "Namespace: $NAMESPACE" + echo "App host: $APP_HOST" + + build: + type: parallel + stage: Build + steps: + build_image: + title: "Build Docker image" + type: build + description: "Build Docker image" + image_name: ${{CF_REPO_NAME}} + tag: ${{CF_SHORT_REVISION}} + dockerfile: Dockerfile + no_cache: false + no_cf_cache: false + + build_test: + title: "Build test Docker image" + type: build + description: "Build test Docker image" + dockerfile: Dockerfile + image_name: ${{CF_REPO_NAME}} + tag: ${{CF_SHORT_REVISION}}-test + when: + condition: + all: + testsEnabled: "'${{INTEGRATION_TESTS_ENABLED}}' == 'true'" + + test: + title: "Run tests" + stage: Test + type: composition + fail_fast: true + # Run the docker-composition defined in the file + composition: codefresh/test/docker-compose.yml + # Run tests against the composition + composition_candidates: + app: + image: ${{build_test}} + entrypoint: /bin/sh -c + command: codefresh/test/test.sh + env_file: + - codefresh/test/test.env + volumes: + - '${{CF_VOLUME_NAME}}:${{CF_VOLUME_PATH}}' + working_dir: '${{CF_VOLUME_PATH}}/${{CF_REPO_NAME}}' + when: + condition: + all: + testsEnabled: "'${{INTEGRATION_TESTS_ENABLED}}' == 'true'" + + set_github_deployment_status_to_pending: + title: Set GitHub deployment status to "pending" + stage: Deploy + image: cloudposse/github-status-updater + environment: + - GITHUB_ACTION=update_state + - GITHUB_TOKEN=${{GITHUB_TOKEN}} + - GITHUB_OWNER=${{CF_REPO_OWNER}} + - GITHUB_REPO=${{CF_REPO_NAME}} + - GITHUB_REF=${{CF_REVISION}} + - GITHUB_CONTEXT=${{STAGE}}/env + - GITHUB_STATE=pending + - GITHUB_DESCRIPTION=Deploying changes to ${{NAMESPACE}} namespace + - GITHUB_TARGET_URL=${{APP_SCHEME}}://${{APP_HOST}} + when: + condition: + all: + deployLabel: "match('${{CF_PULL_REQUEST_LABELS}}', 'deploy', false) == true" + githubNotificationsEnabled: "'${{GITHUB_NOTIFICATIONS_ENABLED}}' == 'true'" + + push_image_commit: + title: "Push image with commit SHA tag" + stage: Deploy + type: push + registry: ecr + candidate: ${{build_image}} + tags: + - "${{CF_REVISION}}" + + wait: + title: "Wait" + stage: Deploy + image: codefresh/cli:latest + commands: + - codefresh get builds --pipeline=destroy --pipeline=preview --branch=${{CF_BRANCH}} --status running --limit 1000 -o json | jq --arg id ${{CF_BUILD_ID}} -ser 'flatten|.[-1].id==$id' + retry: + maxAttempts: 10 + delay: 20 + exponentialFactor: 1.1 + when: + condition: + all: + deployLabel: "match('${{CF_PULL_REQUEST_LABELS}}', 'deploy', false) == true" + + deploy_helmfile: + title: "Deploy with helmfile" + stage: Deploy + image: ${{build_image}} + working_directory: /deploy/ + commands: + - echo 'Deploying ${{CF_REPO_NAME}}:${{CF_REVISION}} to namespace ${{NAMESPACE}}' + - apk add --update curl make bash git kubectl@cloudposse helm@cloudposse helmfile@cloudposse + - kubectl config use-context ${{KUBE_CONTEXT}} + # Deploy to the cluster in the namespace + - helmfile --namespace ${{NAMESPACE}} sync + when: + condition: + all: + deployLabel: "match('${{CF_PULL_REQUEST_LABELS}}', 'deploy', false) == true" + + set_github_deployment_status_to_success: + title: Set GitHub deployment status to "success" + stage: Deploy + image: cloudposse/github-status-updater + environment: + - GITHUB_ACTION=update_state + - GITHUB_TOKEN=${{GITHUB_TOKEN}} + - GITHUB_OWNER=${{CF_REPO_OWNER}} + - GITHUB_REPO=${{CF_REPO_NAME}} + - GITHUB_REF=${{CF_REVISION}} + - GITHUB_CONTEXT=${{STAGE}}/env + - GITHUB_STATE=success + - GITHUB_DESCRIPTION=Deployed to ${{NAMESPACE}} by @${{CF_BUILD_INITIATOR}} + - GITHUB_TARGET_URL=${{APP_SCHEME}}://${{APP_HOST}} + when: + condition: + all: + deployLabel: "match('${{CF_PULL_REQUEST_LABELS}}', 'deploy', false) == true" + githubNotificationsEnabled: "'${{GITHUB_NOTIFICATIONS_ENABLED}}' == 'true'" + + send_slack_notification: + title: "Send notification to Slack channel" + stage: Deploy + image: cloudposse/build-harness + working_directory: /build-harness + environment: + - SLACK_WEBHOOK_URL=${{SLACK_WEBHOOK_URL}} + - APP_HOST="${{APP_SCHEME}}://${{APP_HOST}}" + - PIPELINE_ENV=${{STAGE}} + - PIPELINE_ACTION=deploy + - CHART_NAME=${{CF_REPO_NAME}} + - CF_BUILD_URL=${{CF_BUILD_URL}} + - CF_REPO_OWNER=${{CF_REPO_OWNER}} + - CF_REPO_NAME=${{CF_REPO_NAME}} + - CF_BUILD_TIMESTAMP=${{CF_BUILD_TIMESTAMP}} + - CF_BUILD_TRIGGER=${{CF_BUILD_TRIGGER}} + - GIT_COMMIT_SHORT=${{CF_SHORT_REVISION}} + - GIT_COMMIT_URL=${{CF_COMMIT_URL}} + - GIT_COMMIT_MESSAGE=${{CF_COMMIT_MESSAGE}} + - GIT_COMMIT_AUTHOR=${{CF_COMMIT_AUTHOR}} + - GIT_BRANCH_TAG=${{CF_BRANCH_TAG_NORMALIZED}} + commands: + - make codefresh/notify/slack/deploy/webapp GIT_COMMIT_TIMESTAMP=$((${{CF_BUILD_TIMESTAMP}}/1000)) + when: + condition: + all: + deployLabel: "match('${{CF_PULL_REQUEST_LABELS}}', 'deploy', false) == true" + slackNotificationsEnabled: "'${{SLACK_NOTIFICATIONS_ENABLED}}' == 'true'" + + add_url_to_comment_on_commit: + title: "Comment on commit with the deployed URL" + stage: Deploy + image: cloudposse/github-commenter + environment: + - GITHUB_TOKEN=${{GITHUB_TOKEN}} + - GITHUB_OWNER=${{CF_REPO_OWNER}} + - GITHUB_REPO=${{CF_REPO_NAME}} + - GITHUB_COMMENT_TYPE=commit + - GITHUB_COMMIT_SHA=${{CF_SHORT_REVISION}} + - 'GITHUB_COMMENT=Version ${{CF_SHORT_REVISION}} deployed by @${{CF_BUILD_INITIATOR}} to the [`${{NAMESPACE}}`](${{APP_SCHEME}}://${{APP_HOST}}) namespace on `${{STAGE}}` at ${{CF_BUILD_DATE_TIME}}
![:thumbsup:](https://cloudposse.com/urand/familyguy.gif)
' + when: + condition: + all: + deployLabel: "match('${{CF_PULL_REQUEST_LABELS}}', 'deploy', false) == true" + githubNotificationsEnabled: "'${{GITHUB_NOTIFICATIONS_ENABLED}}' == 'true'" diff --git a/pipelines/microservice/release.yaml b/pipelines/microservice/release.yaml new file mode 100644 index 0000000..af4969e --- /dev/null +++ b/pipelines/microservice/release.yaml @@ -0,0 +1,108 @@ +version: '1.0' + +stages: + - Prepare + - Promote + - UAT + - Staging + - Production + +steps: + export: + title: "Export environment" + stage: Prepare + image: alpine + commands: + # ECR_BASE_NAME is set as a shared environment variable in Codefresh + - cf_export IMAGE_NAME=${{ECR_BASE_NAME}}/${{CF_REPO_NAME}} + + show_context: + title: "Show context" + stage: Prepare + image: alpine + commands: + - |- + echo "Repo owner: $CF_REPO_OWNER" + echo "Repo name: $CF_REPO_NAME" + echo "Branch: $CF_BRANCH" + echo "Release tag: $CF_RELEASE_TAG" + echo "Commit URL: $CF_COMMIT_URL" + echo "Commit message: $CF_COMMIT_MESSAGE" + echo "Commit author: $CF_COMMIT_AUTHOR" + echo "Revision: $CF_REVISION" + echo "Short revision: $CF_SHORT_REVISION" + + announce: + title: "Announce release deployment" + stage: Promote + image: alpine + commands: + - echo "Preparing deployment of ${{CF_RELEASE_TAG}} release at revision ${{CF_REVISION}}" + + pull_image_sha: + title: "Pull image with commit SHA" + stage: Promote + image: "${{IMAGE_NAME}}:${{CF_REVISION}}" + registry: ecr + retry: + maxAttempts: 10 + delay: 20 + exponentialFactor: 1.1 + commands: + - "true" + + push_image_tag: + title: "Push image with release tag" + stage: Promote + type: push + registry: ecr + candidate: "${{IMAGE_NAME}}:${{CF_REVISION}}" + tags: + - "${{CF_RELEASE_TAG}}" + + deploy_uat: + title: "Releasing to uat" + stage: UAT + image: 'codefresh/cli:latest' + environment: + - STAGE=uat + commands: + - codefresh run ${{CF_REPO_NAME}}/deploy -b=${{CF_BRANCH}} -v CF_BRANCH=${{CF_BRANCH}} -v CF_REPO_OWNER=${{CF_REPO_OWNER}} -v CF_REPO_NAME=${{CF_REPO_NAME}} -v CF_REVISION=${{CF_REVISION}} -v CF_RELEASE_TAG=${{CF_RELEASE_TAG}} -v CF_PRERELEASE_FLAG=${{CF_PRERELEASE_FLAG}} -v CF_SHORT_REVISION=${{CF_SHORT_REVISION}} -v CF_COMMIT_URL=${{CF_COMMIT_URL}} -v "CF_COMMIT_MESSAGE=${{CF_COMMIT_MESSAGE}}" -v CF_COMMIT_AUTHOR=${{CF_COMMIT_AUTHOR}} -v CF_BRANCH_TAG_NORMALIZED=${{CF_BRANCH_TAG_NORMALIZED}} -v CF_BUILD_ID=${{CF_BUILD_ID}} -v STAGE=${STAGE} + + deploy_staging_confirmation: + type: pending-approval + title: "Deploy Release to staging?" + stage: Staging + + deploy_staging: + title: "Releasing to staging" + stage: Staging + image: 'codefresh/cli:latest' + environment: + - STAGE=staging + commands: + - codefresh run ${{CF_REPO_NAME}}/deploy -b=${{CF_BRANCH}} -v CF_BRANCH=${{CF_BRANCH}} -v CF_REPO_OWNER=${{CF_REPO_OWNER}} -v CF_REPO_NAME=${{CF_REPO_NAME}} -v CF_REVISION=${{CF_REVISION}} -v CF_RELEASE_TAG=${{CF_RELEASE_TAG}} -v CF_PRERELEASE_FLAG=${{CF_PRERELEASE_FLAG}} -v CF_SHORT_REVISION=${{CF_SHORT_REVISION}} -v CF_COMMIT_URL=${{CF_COMMIT_URL}} -v "CF_COMMIT_MESSAGE=${{CF_COMMIT_MESSAGE}}" -v CF_COMMIT_AUTHOR=${{CF_COMMIT_AUTHOR}} -v CF_BRANCH_TAG_NORMALIZED=${{CF_BRANCH_TAG_NORMALIZED}} -v CF_BUILD_ID=${{CF_BUILD_ID}} -v STAGE=${STAGE} + when: + steps: + - name: deploy_staging_confirmation + on: + - approved + + deploy_prod_confirmation: + type: pending-approval + title: "Deploy Release to prod?" + stage: Production + + deploy_prod: + title: "Releasing to prod" + stage: Production + image: 'codefresh/cli:latest' + environment: + - STAGE=prod + commands: + - codefresh run ${{CF_REPO_NAME}}/deploy -b=${{CF_BRANCH}} -v CF_BRANCH=${{CF_BRANCH}} -v CF_REPO_OWNER=${{CF_REPO_OWNER}} -v CF_REPO_NAME=${{CF_REPO_NAME}} -v CF_REVISION=${{CF_REVISION}} -v CF_RELEASE_TAG=${{CF_RELEASE_TAG}} -v CF_PRERELEASE_FLAG=${{CF_PRERELEASE_FLAG}} -v CF_SHORT_REVISION=${{CF_SHORT_REVISION}} -v CF_COMMIT_URL=${{CF_COMMIT_URL}} -v "CF_COMMIT_MESSAGE=${{CF_COMMIT_MESSAGE}}" -v CF_COMMIT_AUTHOR=${{CF_COMMIT_AUTHOR}} -v CF_BRANCH_TAG_NORMALIZED=${{CF_BRANCH_TAG_NORMALIZED}} -v CF_BUILD_ID=${{CF_BUILD_ID}} -v STAGE=${STAGE} + when: + steps: + - name: deploy_prod_confirmation + on: + - approved diff --git a/pipelines/spa/.gitignore b/pipelines/spa/.gitignore new file mode 100644 index 0000000..8f606a6 --- /dev/null +++ b/pipelines/spa/.gitignore @@ -0,0 +1,43 @@ +.build-harness +build-harness/ +aws-assumed-role/ +.idea/ +*.iml + +vendir.lock.yml + +# Compiled and auto-generated files +# Note that the leading "**/" appears necessary for Docker even if not for Git +**/nohup.out +**/*.tfstate +**/*.tfstate.* +**/planfile +**/*.planfile +**/*.kubeconfig +**/terraform.tfvars.json +**/terraform.auto.tfvars.json +**/*.terraform.tfvars.json +**/*.terraform.auto.tfvars.json +**/*.helmfile.vars.yaml +**/crash.log + +# Module directory +# Note that the leading "**/" appears necessary for Docker even if not for Git +**/.terraform/ +**/.module/ +**/.helmfile/ + + +# Draft or auto-saved version +# Note that the leading "**/" appears necessary for Docker even if not for Git +**/*.draft.* +**/*.draft +**/*.orig +**/*.bak +**/*~ + +# macOS special files and folders +**/.DS_Store +**/.CFUserTextEncoding +**/.Trash/ +**/$RECYCLE.BIN/ diff --git a/repositories.txt b/repositories.txt deleted file mode 100644 index 725ca27..0000000 --- a/repositories.txt +++ /dev/null @@ -1,6 +0,0 @@ -cloudposse/terraform-aws-s3-bucket -cloudposse/terraform-aws-mq-broker -cloudposse/terraform-aws-iam-chamber-s3-role -cloudposse/terraform-aws-iam-policy-document-aggregator -cloudposse/terraform-aws-iam-role -cloudposse/terraform-aws-organization-access-group diff --git a/specs/README.md b/specs/README.md new file mode 100644 index 0000000..be4848d --- /dev/null +++ b/specs/README.md @@ -0,0 +1,80 @@ +# Codefresh Pipeline Specs + +## Install Codefresh CLI + +Refer to [Codefresh CLI installation](https://codefresh-io.github.io/cli/installation) for more details. + +__NOTE:__ If you are running the Docker container using the [Dockerfile](../Dockerfile), Codefresh CLI is already installed. + +```sh +npm install -g codefresh +``` + +## Generate Codefresh API Key + +In Codefresh, create an API key by going to your [User settings](https://g.codefresh.io/user/settings), then clicking the "GENERATE" button under the "API Keys" section. + +Use the following scopes for the API Key: + +- Pipeline: `read`, `write` +- Project: `read`, `write` + +
+ +Refer to [Authentication in Codefresh CLI](https://codefresh.io/codefresh-news/introducing-codefresh-cli) for more details. + +## Authenticate + +Create Codefresh login context by executing this command: + +```sh +codefresh auth create-context --api-key XXXXXXXXXXXXXXX.YYYYYYYYYYYYYYYYYYYYYYYYYYYYYY +``` + +__NOTE:__ Replace `XXXXXXXXXXXXXXX.YYYYYYYYYYYYYYYYYYYYYYYYYYYYYY` with the API Key created in the previous step. + +To check if you have successfully authenticated to Codefresh, run the following commands: + +```sh +codefresh get pipelines +codefresh get projects +``` + +## Get existing pipelines specs + +```sh +codefresh get pipeline example-app/preview -o yaml > preview-spec.yaml +codefresh get pipeline example-app/destroy -o yaml > destroy-spec.yaml +codefresh get pipeline example-app/build -o yaml > build-spec.yaml +codefresh get pipeline example-app/deploy -o yaml > deploy-spec.yaml +codefresh get pipeline example-app/release -o yaml > release-spec.yaml +``` + +## Create pipelines + +### Create new project + +```sh +codefresh create project pipeline-test +``` + + +### Create new pipelines + +```sh +codefresh create pipeline -f preview-spec.yaml +codefresh create pipeline -f destroy-spec.yaml +codefresh create pipeline -f build-spec.yaml +codefresh create pipeline -f deploy-spec.yaml +codefresh create pipeline -f release-spec.yaml +``` + +
Show details + +
+ +![Codefresh CLI create new pipelines](../docs/img/codefresh-cli-create-new-pipelines.png) + +
+ +
diff --git a/specs/microservice/build.yaml b/specs/microservice/build.yaml new file mode 100644 index 0000000..a90ea97 --- /dev/null +++ b/specs/microservice/build.yaml @@ -0,0 +1,33 @@ +version: '1.0' +kind: pipeline +metadata: + name: {{ .Env.PROJECT }}/build + deprecate: {} + labels: + tags: [] +spec: + triggers: + - name: build + type: git + repo: {{ .Env.REPO }} + events: + - push.heads + pullRequestAllowForkEvents: false + commentRegex: /.*/gi + branchRegex: /.*/gi + branchRegexInput: regex + provider: github + disabled: false + options: + noCache: false + noCfCache: false + resetVolume: false + verified: true + context: github + contexts: [] + variables: [] + variables: [] + contexts: [] + terminationPolicy: [] + externalResources: [] +{{ (include "pipeline" | strings.ReplaceAll `version: '1.0'` "") | indent 2 }} diff --git a/specs/microservice/deploy.yaml b/specs/microservice/deploy.yaml new file mode 100644 index 0000000..c94c5e3 --- /dev/null +++ b/specs/microservice/deploy.yaml @@ -0,0 +1,37 @@ +version: '1.0' +kind: pipeline +metadata: + name: {{ .Env.PROJECT }}/deploy + deprecate: {} + labels: + tags: [] +spec: + triggers: + - name: deploy + type: git + repo: {{ .Env.REPO }} + events: + - pullrequest.commentAdded + pullRequestAllowForkEvents: false + commentRegex: /.*/gi + branchRegex: /.*/gi + branchRegexInput: regex + provider: github + disabled: true + options: + noCache: false + noCfCache: false + resetVolume: false + verified: true + context: github + contexts: [] + variables: [] + variables: [] + contexts: + - ECR + - Datadog + - GitHub + - Slack + terminationPolicy: [] + externalResources: [] +{{ (include "pipeline" | strings.ReplaceAll `version: '1.0'` "") | indent 2 }} diff --git a/specs/microservice/destroy.yaml b/specs/microservice/destroy.yaml new file mode 100644 index 0000000..9c87d9f --- /dev/null +++ b/specs/microservice/destroy.yaml @@ -0,0 +1,37 @@ +version: '1.0' +kind: pipeline +metadata: + name: {{ .Env.PROJECT }}/destroy + deprecate: {} + labels: + tags: [] +spec: + triggers: + - name: destroy + type: git + repo: {{ .Env.REPO }} + events: + - pullrequest.closed + - pullrequest.merged + - pullrequest.unmerged-closed + - pullrequest.unlabeled + pullRequestAllowForkEvents: false + commentRegex: /.*/gi + branchRegex: /.*/gi + branchRegexInput: regex + provider: github + disabled: false + options: + noCache: false + noCfCache: false + resetVolume: false + verified: true + context: github + contexts: [] + variables: [] + variables: [] + contexts: + - GitHub + terminationPolicy: [] + externalResources: [] +{{ (include "pipeline" | strings.ReplaceAll `version: '1.0'` "") | indent 2 }} diff --git a/specs/microservice/preview.yaml b/specs/microservice/preview.yaml new file mode 100644 index 0000000..dff940a --- /dev/null +++ b/specs/microservice/preview.yaml @@ -0,0 +1,39 @@ +version: '1.0' +kind: pipeline +metadata: + name: {{ .Env.PROJECT }}/preview + deprecate: {} + labels: + tags: [] +spec: + triggers: + - name: preview + type: git + repo: {{ .Env.REPO }} + events: + - pullrequest.opened + - pullrequest.reopened + - pullrequest.labeled + - pullrequest.synchronize + pullRequestAllowForkEvents: false + commentRegex: /.*/gi + branchRegex: /.*/gi + branchRegexInput: regex + provider: github + disabled: false + options: + noCache: false + noCfCache: false + resetVolume: false + verified: true + context: github + contexts: [] + variables: [] + variables: [] + contexts: + - ECR + - GitHub + - Slack + terminationPolicy: [] + externalResources: [] +{{ (include "pipeline" | strings.ReplaceAll `version: '1.0'` "") | indent 2 }} diff --git a/specs/microservice/release.yaml b/specs/microservice/release.yaml new file mode 100644 index 0000000..c88acdf --- /dev/null +++ b/specs/microservice/release.yaml @@ -0,0 +1,36 @@ +version: '1.0' +kind: pipeline +metadata: + name: {{ .Env.PROJECT }}/release + deprecate: {} + labels: + tags: [] +spec: + triggers: + - name: release + type: git + repo: {{ .Env.REPO }} + events: + - release + pullRequestAllowForkEvents: false + commentRegex: /.*/gi + branchRegex: /.*/gi + branchRegexInput: regex + provider: github + disabled: false + options: + noCache: false + noCfCache: false + resetVolume: false + verified: true + context: github + contexts: [] + variables: [] + variables: [] + contexts: + - ECR + terminationPolicy: [] + externalResources: [] + options: + keepPVCsForPendingApproval: true +{{ (include "pipeline" | strings.ReplaceAll `version: '1.0'` "") | indent 2 }} diff --git a/specs/spa/.gitignore b/specs/spa/.gitignore new file mode 100644 index 0000000..8f606a6 --- /dev/null +++ b/specs/spa/.gitignore @@ -0,0 +1,43 @@ +.build-harness +build-harness/ +aws-assumed-role/ +.idea/ +*.iml + +vendir.lock.yml + +# Compiled and auto-generated files +# Note that the leading "**/" appears necessary for Docker even if not for Git +**/nohup.out +**/*.tfstate +**/*.tfstate.* +**/planfile +**/*.planfile +**/*.kubeconfig +**/terraform.tfvars.json +**/terraform.auto.tfvars.json +**/*.terraform.tfvars.json +**/*.terraform.auto.tfvars.json +**/*.helmfile.vars.yaml +**/crash.log + +# Module directory +# Note that the leading "**/" appears necessary for Docker even if not for Git +**/.terraform/ +**/.module/ +**/.helmfile/ + + +# Draft or auto-saved version +# Note that the leading "**/" appears necessary for Docker even if not for Git +**/*.draft.* +**/*.draft +**/*.orig +**/*.bak +**/*~ + +# macOS special files and folders +**/.DS_Store +**/.CFUserTextEncoding +**/.Trash/ +**/$RECYCLE.BIN/ diff --git a/steps/README.md b/steps/README.md new file mode 100644 index 0000000..488386d --- /dev/null +++ b/steps/README.md @@ -0,0 +1,3 @@ +# Codefresh Pipeline Shared Steps + +https://codefresh.io/docs/docs/codefresh-yaml/steps/#creating-a-typed-codefresh-plugin diff --git a/templates/cloudposse/lint.yaml b/templates/cloudposse/lint.yaml deleted file mode 100644 index 21d5f8f..0000000 --- a/templates/cloudposse/lint.yaml +++ /dev/null @@ -1,32 +0,0 @@ -version: "1.0" -kind: "pipeline" -metadata: - name: {{ (ds "repository") }}/lint - isPublic: true - labels: - tags: [] - deprecate: - applicationPort: '8080' - repoPipeline: true - project: {{ (ds "repository") }} -spec: - triggers: - - branchRegex: /.*/gi - branchRegexInput: regex - commentRegex: /.*/gi - context: github-webhooks - events: - - push - provider: github - pullRequestAllowForkEvents: false - repo: {{ (ds "repository") }} - type: git - contexts: - - terraform modules - variables: [] - specTemplate: - location: url - url: >- - https://raw.githubusercontent.com/cloudposse/codefresh/master/codefresh/terraform.yml - stages: [] - steps: {}