Skip to content

Commit 6530de5

Browse files
authored
Merge pull request #2 from kodustech/feat/update-cicd
Update CI/CD process
2 parents 6d0df97 + 94157c2 commit 6530de5

17 files changed

+1155
-484
lines changed

Diff for: .dockerignore

+2
Original file line numberDiff line numberDiff line change
@@ -4,3 +4,5 @@ npm-debug.log
44
*.test.js
55
*.md
66
.DS_Store
7+
.git
8+
.gitignore

Diff for: .github/workflows/actions/setup-env/action.yml

+21
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
name: Setup Environment
2+
description: "Busca parâmetros do AWS Parameter Store e gera o arquivo .env"
3+
inputs:
4+
parameters:
5+
description: "Lista de parâmetros separados por espaço"
6+
required: true
7+
runs:
8+
using: "composite"
9+
steps:
10+
- name: Remover arquivo .env antigo (se existir)
11+
shell: bash
12+
run: |
13+
[ -f .env ] && rm .env
14+
15+
- name: Gerar arquivo .env
16+
shell: bash
17+
run: |
18+
for PARAM in ${{ inputs.parameters }}; do
19+
VALUE=$(aws ssm get-parameter --name "/prod/kodus-web/$PARAM" --query 'Parameter.Value' --output text)
20+
echo "$PARAM=$VALUE" >> .env
21+
done

Diff for: .github/workflows/build-and-push-production.yml

+85
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
name: Build and Publish Docker Images for Cloud
2+
3+
on:
4+
release:
5+
types: [published]
6+
7+
jobs:
8+
build-and-push:
9+
name: Build and Push Docker Image for Production (Cloud)
10+
runs-on: ubuntu-latest
11+
permissions:
12+
contents: read
13+
14+
steps:
15+
- name: Checkout Repository
16+
uses: actions/[email protected]
17+
18+
- name: Capture Release Version
19+
run: echo "RELEASE_VERSION=${{ github.event.release.tag_name }}" >> $GITHUB_ENV
20+
21+
- name: Configure AWS Credentials
22+
uses: aws-actions/[email protected]
23+
with:
24+
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
25+
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
26+
aws-region: ${{ secrets.AWS_REGION }}
27+
28+
- name: Set up Environment File
29+
uses: ./.github/actions/setup-env
30+
with:
31+
parameters: "WEB_NODE_ENV WEB_HOSTNAME_API WEB_HOSTNAME_BILLING WEB_JWT_SECRET_KEY WEB_NEXTAUTH_SECRET NEXTAUTH_URL WEB_CONNECTION_SLACK GLOBAL_JIRA_CLIENT_ID GLOBAL_JIRA_REDIRECT_URL WEB_JIRA_SCOPES GLOBAL_GITHUB_CLIENT_ID GLOBAL_GITHUB_REDIRECT_URL WEB_GITHUB_INSTALL_URL GITHUB_CLIENT_SECRET GLOBAL_GITLAB_CLIENT_ID GLOBAL_GITLAB_REDIRECT_URL WEB_GITLAB_SCOPES WEB_GITLAB_OAUTH_URL GLOBAL_GITLAB_CLIENT_SECRET WEB_TERMS_AND_CONDITIONS GLOBAL_SLACK_HOSTNAME GLOBAL_DISCORD_HOSTNAME WEB_DISCORD_HOSTNAME AZURE_REPOS_HOSTNAME WEB_OAUTH_GITLAB_CLIENT_ID WEB_OAUTH_GITLAB_CLIENT_SECRET WEB_OAUTH_GITHUB_CLIENT_ID WEB_OAUTH_GITHUB_CLIENT_SECRET WEB_ANALYTICS_HOSTNAME WEB_ANALYTICS_SECRET WEB_SUPPORT_DOCS_URL WEB_SUPPORT_DISCORD_INVITE_URL WEB_SUPPORT_TALK_TO_FOUNDER_URL"
32+
33+
- name: Login to Amazon ECR
34+
id: login-ecr
35+
uses: aws-actions/[email protected]
36+
37+
- name: Set up Docker Buildx
38+
uses: docker/[email protected]
39+
40+
- name: Build and Push Docker Image
41+
env:
42+
ECR_REGISTRY: ${{ steps.login-ecr.outputs.registry }}
43+
ECR_REPOSITORY: kodus-web-prod
44+
IMAGE_TAG_SHA: ${{ github.sha }}
45+
IMAGE_TAG_VERSION: ${{ github.event.release.tag_name }}
46+
run: |
47+
docker buildx build \
48+
--build-arg RELEASE_VERSION=$IMAGE_TAG_VERSION \
49+
--build-arg API_CLOUD_MODE=true \
50+
--cache-from=type=local,src=/tmp/.buildx-cache \
51+
--cache-to=type=local,dest=/tmp/.buildx-cache-new,mode=max \
52+
--platform linux/amd64,linux/arm64 \
53+
-f DockerFiles/Dockerfile.prod \
54+
-t $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG_SHA \
55+
-t $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG_VERSION \
56+
-t $ECR_REGISTRY/$ECR_REPOSITORY:latest \
57+
--push .
58+
59+
- name: Cleanup Docker Images
60+
if: always()
61+
run: |
62+
docker rmi $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG_SHA || true
63+
docker rmi $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG_VERSION || true
64+
docker rmi $ECR_REGISTRY/$ECR_REPOSITORY:latest || true
65+
docker image prune -f || true
66+
67+
- name: Notify Discord on Success
68+
if: success()
69+
uses: sarisia/[email protected]
70+
with:
71+
webhook: ${{ secrets.DISCORD_WEBHOOK }}
72+
content: ":tada: A imagem Docker `${{ env.RELEASE_VERSION }}` foi construída e enviada com sucesso para o Amazon ECR."
73+
title: "Build e Push: kodus-web (Cloud)"
74+
username: "GitHub Actions"
75+
color: 0x00FF00
76+
77+
- name: Notify Discord on Failure
78+
if: failure()
79+
uses: sarisia/[email protected]
80+
with:
81+
webhook: ${{ secrets.DISCORD_WEBHOOK }}
82+
content: ":x: Falha ao construir ou enviar a imagem Docker `${{ env.RELEASE_VERSION }}` para o Amazon ECR. Verifique os logs para mais detalhes."
83+
title: "Build e Push: kodus-web (Cloud)"
84+
username: "GitHub Actions"
85+
color: 0xFF0000

Diff for: .github/workflows/build-and-push-selfhosted.yml

+83
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
name: Build and Publish Docker Images for Self-Hosted
2+
3+
on:
4+
release:
5+
types: [published]
6+
7+
jobs:
8+
build-and-push:
9+
name: Build and Push Docker Images for Self-Hosted
10+
runs-on: ubuntu-latest
11+
permissions:
12+
contents: read
13+
packages: write
14+
15+
steps:
16+
- name: Checkout Repository
17+
uses: actions/[email protected]
18+
19+
- name: Capture Release Version
20+
run: echo "RELEASE_VERSION=${{ github.event.release.tag_name }}" >> $GITHUB_ENV
21+
22+
- name: Configure AWS Credentials
23+
uses: aws-actions/[email protected]
24+
with:
25+
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
26+
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
27+
aws-region: ${{ secrets.AWS_REGION }}
28+
29+
- name: Set up Environment File
30+
uses: ./.github/actions/setup-env
31+
with:
32+
parameters: "WEB_NODE_ENV WEB_HOSTNAME_API WEB_HOSTNAME_BILLING WEB_JWT_SECRET_KEY WEB_NEXTAUTH_SECRET NEXTAUTH_URL WEB_CONNECTION_SLACK GLOBAL_JIRA_CLIENT_ID GLOBAL_JIRA_REDIRECT_URL WEB_JIRA_SCOPES GLOBAL_GITHUB_CLIENT_ID GLOBAL_GITHUB_REDIRECT_URL WEB_GITHUB_INSTALL_URL GITHUB_CLIENT_SECRET GLOBAL_GITLAB_CLIENT_ID GLOBAL_GITLAB_REDIRECT_URL WEB_GITLAB_SCOPES WEB_GITLAB_OAUTH_URL GLOBAL_GITLAB_CLIENT_SECRET WEB_TERMS_AND_CONDITIONS GLOBAL_SLACK_HOSTNAME GLOBAL_DISCORD_HOSTNAME WEB_DISCORD_HOSTNAME AZURE_REPOS_HOSTNAME WEB_OAUTH_GITLAB_CLIENT_ID WEB_OAUTH_GITLAB_CLIENT_SECRET WEB_OAUTH_GITHUB_CLIENT_ID WEB_OAUTH_GITHUB_CLIENT_SECRET WEB_ANALYTICS_HOSTNAME WEB_ANALYTICS_SECRET WEB_SUPPORT_DOCS_URL WEB_SUPPORT_DISCORD_INVITE_URL WEB_SUPPORT_TALK_TO_FOUNDER_URL"
33+
34+
- name: Set up Docker Buildx
35+
uses: docker/[email protected]
36+
37+
- name: Login to GitHub Container Registry
38+
uses: docker/[email protected]
39+
with:
40+
registry: ghcr.io
41+
username: ${{ github.actor }}
42+
password: ${{ secrets.GITHUB_TOKEN }}
43+
44+
- name: Extract Docker Metadata
45+
id: meta
46+
uses: docker/[email protected]
47+
with:
48+
images: ghcr.io/${{ github.repository_owner }}/kodus-web
49+
tags: |
50+
type=semver,pattern={{version}}
51+
type=raw,value=latest
52+
53+
- name: Build and Push Docker Images
54+
uses: docker/[email protected]
55+
with:
56+
context: .
57+
file: ./DockerFiles/Dockerfile.prod
58+
push: true
59+
tags: ${{ steps.meta.outputs.tags }}
60+
labels: ${{ steps.meta.outputs.labels }}
61+
platforms: linux/amd64,linux/arm64
62+
build-args: |
63+
API_CLOUD_MODE=false
64+
65+
- name: Notify Discord on Success
66+
if: success()
67+
uses: sarisia/[email protected]
68+
with:
69+
webhook: ${{ secrets.DISCORD_WEBHOOK }}
70+
content: ":tada: A imagem Docker versão `${{ env.RELEASE_VERSION }}` foi construída e enviada com sucesso para o GitHub Container Registry (Self-Hosted)."
71+
title: "Build e Push: kodus-web (Self-Hosted)"
72+
username: "GitHub Actions"
73+
color: 0x00FF00
74+
75+
- name: Notify Discord on Failure
76+
if: failure()
77+
uses: sarisia/[email protected]
78+
with:
79+
webhook: ${{ secrets.DISCORD_WEBHOOK }}
80+
content: ":x: Falha ao construir ou enviar a imagem Docker `${{ env.RELEASE_VERSION }}` para o GitHub Container Registry (Self-Hosted). Verifique os logs para mais detalhes."
81+
title: "Build e Push: kodus-web (Self-Hosted)"
82+
username: "GitHub Actions"
83+
color: 0xFF0000

Diff for: .github/workflows/deploy-to-prod.yml

+97
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
name: Deploy Manual to Production Server
2+
3+
on:
4+
workflow_dispatch:
5+
inputs:
6+
image_tag:
7+
description: "Tag da imagem Docker para deploy. Se vazio, será usada a última publicada no ECR."
8+
required: false
9+
10+
jobs:
11+
deploy:
12+
name: Deploy to Server
13+
runs-on: ubuntu-latest
14+
steps:
15+
- name: Determine Image Tag
16+
id: define-image
17+
env:
18+
AWS_REGION: ${{ secrets.AWS_REGION }}
19+
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
20+
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
21+
run: |
22+
IMAGE_TAG_INPUT="${{ github.event.inputs.image_tag }}"
23+
if [ -n "$IMAGE_TAG_INPUT" ]; then
24+
echo "Verificando se a imagem com tag '$IMAGE_TAG_INPUT' existe no ECR..."
25+
IMAGE_EXISTS=$(aws ecr describe-images \
26+
--repository-name kodus-web-prod \
27+
--region $AWS_REGION \
28+
--query "imageDetails[?contains(imageTags, '$IMAGE_TAG_INPUT')]" \
29+
--output text)
30+
if [ -z "$IMAGE_EXISTS" ]; then
31+
echo "Imagem com a tag '$IMAGE_TAG_INPUT' não encontrada no ECR."
32+
exit 1
33+
fi
34+
echo "Usando tag: $IMAGE_TAG_INPUT"
35+
echo "IMAGE_TAG=$IMAGE_TAG_INPUT" >> $GITHUB_ENV
36+
else
37+
echo "Buscando a tag mais recente no ECR..."
38+
LAST_TAG=$(aws ecr describe-images \
39+
--repository-name kodus-web-prod \
40+
--region $AWS_REGION \
41+
--query "sort_by(imageDetails, &imagePushedAt)[-1].imageTags[0]" \
42+
--output text)
43+
if [ -z "$LAST_TAG" ]; then
44+
echo "Nenhuma imagem encontrada no ECR."
45+
exit 1
46+
fi
47+
echo "Última tag encontrada: $LAST_TAG"
48+
echo "IMAGE_TAG=$LAST_TAG" >> $GITHUB_ENV
49+
fi
50+
51+
- name: Get Runner IP
52+
run: |
53+
ip=$(curl -s https://ipinfo.io/ip)
54+
echo "::add-mask::$ip"
55+
echo "runner_ip=$ip" >> $GITHUB_ENV
56+
57+
- name: Add Runner IP to Security Group
58+
run: |
59+
aws ec2 authorize-security-group-ingress \
60+
--group-id ${{ secrets.AWS_SECURITY_GROUP }} \
61+
--protocol tcp --port 22 \
62+
--cidr ${{ env.runner_ip }}/32 > /dev/null 2>&1
63+
env:
64+
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
65+
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
66+
AWS_DEFAULT_REGION: ${{ secrets.AWS_REGION }}
67+
68+
- name: Deploy Application on EC2
69+
uses: appleboy/[email protected]
70+
with:
71+
host: ${{ secrets.AWS_PROD_HOST }}
72+
username: ${{ secrets.AWS_PROD_USERNAME }}
73+
key: ${{ secrets.AWS_PROD_KEY_SSH }}
74+
script: |
75+
cd ~/kodus-web
76+
./start-web-app.sh prod ${{ env.IMAGE_TAG }} ${{ github.ref }}
77+
78+
- name: Remove Runner IP from Security Group
79+
if: always()
80+
run: |
81+
aws ec2 revoke-security-group-ingress \
82+
--group-id ${{ secrets.AWS_SECURITY_GROUP }} \
83+
--protocol tcp --port 22 \
84+
--cidr ${{ env.runner_ip }}/32 > /dev/null 2>&1
85+
env:
86+
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
87+
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
88+
AWS_DEFAULT_REGION: ${{ secrets.AWS_REGION }}
89+
90+
- name: Notify Discord on Success
91+
if: success()
92+
uses: sarisia/[email protected]
93+
with:
94+
webhook: ${{ secrets.DISCORD_WEBHOOK }}
95+
status: ${{ job.status }}
96+
content: ":tada: Deploy realizado com sucesso com a imagem `${{ env.IMAGE_TAG }}`!"
97+
title: "Deploy Prod:"

0 commit comments

Comments
 (0)