Skip to content

Commit

Permalink
Merge pull request #1 from FernandoArteaga/add-example-app-and-ci
Browse files Browse the repository at this point in the history
Add example app and GitHub workflows
  • Loading branch information
FernandoArteaga authored Feb 10, 2024
2 parents 870f6cc + bf06def commit ad4578f
Show file tree
Hide file tree
Showing 20 changed files with 4,201 additions and 2 deletions.
32 changes: 32 additions & 0 deletions .github/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
# CI/CD

Since we're hosting our source code on GitHub, we'll leverage GitHub Actions to automate our CI/CD pipeline.

GitHub's pipelines are written in YAML files and located within a special directory called `.github`. This directory
contains two subdirectories, [workflows and actions](https://docs.github.com/en/actions/learn-github-actions/understanding-github-actions).
Which are used to define the CI/CD pipeline and to create custom actions, respectively.

## Workflows

### [check-docker-build.yaml](./workflows/check-docker-build.yaml)

This workflow runs on every pull request and checks if the Docker image can be built successfully. It's a good practice
to check if the Docker image can be built before merging the pull request to the `main` branch.

We'll leverage the following reusable actions from GitHub's marketplace to build the image.

- [docker/build-push-action](https://github.com/docker/build-push-action): Builds and pushes the Docker image.

### [publish-docker-image.yaml](./workflows/publish-docker-image.yaml)

This workflow is triggered when a new commit is pushed to the `main` branch. It builds the Docker image and pushes it
to the Container Registry. In our case, we'll use the [GitHub Container Registry](https://docs.github.com/en/packages/guides/about-github-container-registry)
and the [Docker Hub Container Registry](https://www.docker.com/products/docker-hub/) as examples.

We'll leverage the following reusable actions from GitHub's marketplace to build and push the image.

- [docker/login-action](https://github.com/docker/login-action): For authenticating with the Docker Hub and the GitHub Container Registry.
Make sure to provide the right credentials to authenticate with your registry.
- [docker/metadata-action](https://github.com/docker/metadata-action): Extracts metadata from the Docker image.
- [docker/build-push-action](https://github.com/docker/build-push-action): Builds and pushes the Docker image.

18 changes: 18 additions & 0 deletions .github/workflows/check-docker-build.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
name: "Check Docker build"
on:
pull_request: {}

jobs:
build:
name: "Build docker image"
runs-on: ubuntu-latest
steps:
- name: "Checkout"
uses: actions/checkout@v4

- name: "Docker build"
uses: docker/build-push-action@v5
with:
context: ./my-awesome-app
push: false
tags: my-awesome-app:latest
48 changes: 48 additions & 0 deletions .github/workflows/publish-docker-image.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
name: "Publish Docker image"
on:
push:
branches:
- main

jobs:
publish:
name: "Build and publish Docker image"
runs-on: ubuntu-latest
steps:
- name: "Checkout"
uses: actions/checkout@v4

- name: "Login to Docker Hub"
uses: docker/login-action@v3
with:
username: fernandoarteaga
password: ${{ secrets.FERNANDO_DOCKER_HUB_TOKEN }}

- name: "Login to GitHub Container Registry"
uses: docker/login-action@v3
with:
registry: "ghcr.io"
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}

- name: "Extract metadata (tags, labels) for Docker"
id: meta
uses: docker/metadata-action@v5
with:
images: |
fernandoarteaga/${{ inputs.image-name }}
ghcr.io/${{ github.repository }}/${{ inputs.image-name }}
flavor: |
latest=auto
tags: |
type=sha
# set latest tag for main branch
type=raw,value=latest,enable=${{ github.ref == format('refs/heads/{0}', 'main') }}
- name: "Build and push Docker images"
uses: docker/build-push-action@v5
with:
context: ./my-awesome-app
push: true
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
121 changes: 121 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,121 @@
### VisualStudioCode template
.vscode/*
!.vscode/settings.json
!.vscode/tasks.json
!.vscode/launch.json
!.vscode/extensions.json
!.vscode/*.code-snippets

# Local History for Visual Studio Code
.history/

# Built Visual Studio Code Extensions
*.vsix

### JetBrains template
# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio, WebStorm and Rider
# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839

# User-specific stuff
.idea/**/workspace.xml
.idea/**/tasks.xml
.idea/**/usage.statistics.xml
.idea/**/dictionaries
.idea/**/shelf

# AWS User-specific
.idea/**/aws.xml

# Generated files
.idea/**/contentModel.xml

# Sensitive or high-churn files
.idea/**/dataSources/
.idea/**/dataSources.ids
.idea/**/dataSources.local.xml
.idea/**/sqlDataSources.xml
.idea/**/dynamic.xml
.idea/**/uiDesigner.xml
.idea/**/dbnavigator.xml

# Gradle
.idea/**/gradle.xml
.idea/**/libraries

# Gradle and Maven with auto-import
# When using Gradle or Maven with auto-import, you should exclude module files,
# since they will be recreated, and may cause churn. Uncomment if using
# auto-import.
# .idea/artifacts
# .idea/compiler.xml
# .idea/jarRepositories.xml
# .idea/modules.xml
# .idea/*.iml
# .idea/modules
# *.iml
# *.ipr

# CMake
cmake-build-*/

# Mongo Explorer plugin
.idea/**/mongoSettings.xml

# File-based project format
*.iws

# IntelliJ
out/

# mpeltonen/sbt-idea plugin
.idea_modules/

# JIRA plugin
atlassian-ide-plugin.xml

# Cursive Clojure plugin
.idea/replstate.xml

# SonarLint plugin
.idea/sonarlint/

# Crashlytics plugin (for Android Studio and IntelliJ)
com_crashlytics_export_strings.xml
crashlytics.properties
crashlytics-build.properties
fabric.properties

# Editor-based Rest Client
.idea/httpRequests

# Android studio 3.1+ serialized cache file
.idea/caches/build_file_checksums.ser

### macOS template
# General
.DS_Store
.AppleDouble
.LSOverride

# Icon must end with two \r
Icon

# Thumbnails
._*

# Files that might appear in the root of a volume
.DocumentRevisions-V100
.fseventsd
.Spotlight-V100
.TemporaryItems
.Trashes
.VolumeIcon.icns
.com.apple.timemachine.donotpresent

# Directories potentially created on remote AFP share
.AppleDB
.AppleDesktop
Network Trash Folder
Temporary Items
.apdisk

1 change: 1 addition & 0 deletions CODEOWNERS
Validating CODEOWNERS rules …
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
* @FernandoArteaga
17 changes: 15 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,2 +1,15 @@
# learn-devops
DevOps examples and hand-ons
# Learn DevOps

![Docker](https://img.shields.io/badge/docker-%230db7ed.svg?style=for-the-badge&logo=docker&logoColor=white)
![Kubernetes](https://img.shields.io/badge/kubernetes-%23326ce5.svg?style=for-the-badge&logo=kubernetes&logoColor=white)
![Terraform](https://img.shields.io/badge/terraform-%235835CC.svg?style=for-the-badge&logo=terraform&logoColor=white)


Here you can find several examples and guides on some fundamental DevOps concepts.

* [Docker](./my-awesome-app/README.md)
* [Docker compose](./my-awesome-app/README.md#docker-compose)
* Kubernetes Manifests
* Terraform
* Helm Charts
* [CI/CD](./.github)
133 changes: 133 additions & 0 deletions my-awesome-app/.dockerignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,133 @@
### Node template
# Logs
logs
*.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*
lerna-debug.log*
.pnpm-debug.log*

# Diagnostic reports (https://nodejs.org/api/report.html)
report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json

# Runtime data
pids
*.pid
*.seed
*.pid.lock

# Directory for instrumented libs generated by jscoverage/JSCover
lib-cov

# Coverage directory used by tools like istanbul
coverage
*.lcov

# nyc test coverage
.nyc_output

# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files)
.grunt

# Bower dependency directory (https://bower.io/)
bower_components

# node-waf configuration
.lock-wscript

# Compiled binary addons (https://nodejs.org/api/addons.html)
build/Release

# Dependency directories
node_modules/
jspm_packages/

# Snowpack dependency directory (https://snowpack.dev/)
web_modules/

# TypeScript cache
*.tsbuildinfo

# Optional npm cache directory
.npm

# Optional eslint cache
.eslintcache

# Optional stylelint cache
.stylelintcache

# Microbundle cache
.rpt2_cache/
.rts2_cache_cjs/
.rts2_cache_es/
.rts2_cache_umd/

# Optional REPL history
.node_repl_history

# Output of 'npm pack'
*.tgz

# Yarn Integrity file
.yarn-integrity

# dotenv environment variable files
.env
.env.development.local
.env.test.local
.env.production.local
.env.local

# parcel-bundler cache (https://parceljs.org/)
.cache
.parcel-cache

# Next.js build output
.next
out

# Nuxt.js build / generate output
.nuxt
dist

# Gatsby files
.cache/
# Comment in the public line in if your project uses Gatsby and not Next.js
# https://nextjs.org/blog/next-9-1#public-directory-support
# public

# vuepress build output
.vuepress/dist

# vuepress v2.x temp and cache directory
.temp
.cache

# Docusaurus cache and generated files
.docusaurus

# Serverless directories
.serverless/

# FuseBox cache
.fusebox/

# DynamoDB Local files
.dynamodb/

# TernJS port file
.tern-port

# Stores VSCode versions used for testing VSCode extensions
.vscode-test

# yarn v2
.yarn/cache
.yarn/unplugged
.yarn/build-state.yml
.yarn/install-state.gz
.pnp.*

README.md
Loading

0 comments on commit ad4578f

Please sign in to comment.