18 Commits

Author SHA1 Message Date
f98e7fab58 Updated wrong syntax for tags 2024-03-25 22:19:20 -05:00
a6295ba8fc Updated tags 2024-03-25 22:18:27 -05:00
fcc31c4db6 Updated registry name
Some checks failed
ci/woodpecker/tag/woodpecker Pipeline failed
2024-03-25 21:58:01 -05:00
4a64456875 Updated registry name
Some checks failed
ci/woodpecker/tag/woodpecker Pipeline failed
2024-03-25 21:43:54 -05:00
7f67a3b936 Set context
Some checks failed
ci/woodpecker/tag/woodpecker Pipeline failed
2024-03-21 23:47:21 -05:00
5ad3ebe40a Fixed Dockerfile path
Some checks failed
ci/woodpecker/push/woodpecker Pipeline was successful
ci/woodpecker/tag/woodpecker Pipeline failed
2024-03-21 23:41:36 -05:00
9d59359074 Attempting to fix error authentication to container
Some checks failed
ci/woodpecker/push/woodpecker Pipeline was successful
ci/woodpecker/tag/woodpecker Pipeline failed
2024-03-21 23:38:41 -05:00
c23ffc3fd8 Changed CI pipeline to accomodate non master tags
Some checks failed
ci/woodpecker/tag/woodpecker Pipeline failed
2024-03-21 23:33:10 -05:00
fe57aca2f7 Changed step name to attempt fix CI pipeline 2024-03-21 23:27:45 -05:00
e61e8fb898 Fixing CI error for Docker image deployment 2024-03-21 23:25:48 -05:00
afe04ec68b Added deploy step for API Dockerfile 2024-03-21 23:19:34 -05:00
445b33f852 Fixed wrong path for dotnet test
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
2024-03-21 23:15:55 -05:00
433a8d78a4 Temporarily removed deployment of Docker image
Some checks failed
ci/woodpecker/push/woodpecker Pipeline failed
2024-03-21 23:13:50 -05:00
fd2246391c Add sample pipeline for building API project 2024-03-21 23:12:23 -05:00
95ddb3236c Fixed issue with Web Docker image not getting proper environment variable substitution
As ReactJS does not seem to support reading environment variables from Docker runtime variables, we'll pull it instead from buildtime.
Also added copying of nginx config file in the Dockerfile
Modified API Dockerfile to accept WebUri for CORS, also removed duplicate setting of CORS in Program.cs
2024-03-21 21:01:58 -05:00
f1144d2cb9 Committing work for creating docker images of Web and API apps
Outstanding work include:
- Adding CI/CD workflow compatible with Woodpecker CI
- Figure out how to load runtime environment variables onto the API docker build process
2024-03-19 20:56:56 -05:00
0ca2a0e38c Added Dockerfile for API and Web apps 2023-03-29 22:56:42 -05:00
9b590bb4fa Moved projects to their own separate subdirectories 2023-03-27 21:48:25 -05:00
16 changed files with 40 additions and 170 deletions

1
.gitignore vendored
View File

@ -248,4 +248,5 @@ yarn-debug.log*
yarn-error.log* yarn-error.log*
.env .env
Logs/* Logs/*
docker-compose.yml
*exclude* *exclude*

21
.woodpecker.yaml Normal file
View File

@ -0,0 +1,21 @@
steps:
- name: (YABA.API) Build and run tests
image: mcr.microsoft.com/dotnet/sdk:6.0
commands:
- dotnet build ./API
- dotnet test ./API
- name: (YABA.API) Deploy Docker Image (Non-Prod Branch)
when:
- event: tag
branch:
exclude: [master]
secrets: [gitea_yaba_registry_username, gitea_yaba_registry_password]
image: woodpeckerci/plugin-docker-buildx
settings:
repo: yaba/api
context: ./API
dockerfile: ./API/YABA.API/Dockerfile
tags: [${CI_COMMIT_TAG, gitea.iwanaga.moe/cjtibule/yaba/api}]
username: ${gitea_yaba_registry_username}
password: ${gitea_yaba_registry_password}
registry: gitea.iwanaga.moe

View File

@ -1,12 +0,0 @@
when:
- event: [push, pull_request, tag]
ref: [refs/tags/APIDEV-*, refs/tags/API-*, refs/heads/api/*]
steps:
- name: (YABA.API) Build and run tests
when:
- event: [push, pull_request, tag]
branch: [api/*]
image: mcr.microsoft.com/dotnet/sdk:6.0
commands:
- dotnet build ./API
- dotnet test ./API

View File

@ -1,36 +0,0 @@
when:
- event: tag
ref: [refs/tags/APIDEV-*, refs/tags/API-*]
steps:
- name: (YABA.API) Determining Docker image version number (dev)
when:
- ref: refs/tags/APIDEV-*
image: alpine:latest
commands:
- rm -f tags.txt
- echo ${CI_COMMIT_TAG} | sed -e "s/^APIDEV-//" >> tags.txt
- echo "latest-dev" >> tags.txt
- name: (YABA.API) Determining Docker image version number (prod)
image: alpine:latest
when:
- ref: refs/tags/API-*
commands:
- rm -f tags.txt
- echo ${CI_COMMIT_TAG} | sed -e "s/^API-//" >> tags.txt
- echo "latest" >> tags.txt
- name: (YABA.API) Package and Upload Docker Image
image: woodpeckerci/plugin-docker-buildx
settings:
repo: gitea.iwanaga.moe/cjtibule/yaba/api
context: ./API
dockerfile: ./API/YABA.API/Dockerfile
tags_file: tags.txt
platforms:
- linux/amd64
username:
from_secret: gitea_yaba_registry_username
password:
from_secret: gitea_yaba_registry_password
registry: gitea.iwanaga.moe
depends_on:
- api_build

View File

@ -1,52 +0,0 @@
when:
- event: tag
ref: [refs/tags/WEBDEV-*, refs/tags/WEB-*]
steps:
- name: (YABA.Web) Determining Docker image version number (dev)
when:
- ref: refs/tags/WEBDEV-*
image: alpine:latest
commands:
- rm -f tags.txt
- echo ${CI_COMMIT_TAG} | sed -e "s/^WEBDEV-//" >> tags.txt
- echo "latest-dev" >> tags.txt
- name: (YABA.Web) Determining Docker image version number (prod)
when:
- ref: refs/tags/WEB-*
image: alpine:latest
commands:
- rm -f tags.txt
- echo ${CI_COMMIT_TAG} | sed -e "s/^WEB-//" >> tags.txt
- echo "latest" >> tags.txt
- name: (YABA.Web) Package and Upload Docker Image (dev)
when:
- ref: refs/tags/WEBDEV-*
image: woodpeckerci/plugin-docker-buildx
settings:
repo: gitea.iwanaga.moe/cjtibule/yaba/web
context: ./Web
dockerfile: ./Web/Dockerfile
tags_file: tags.txt
username:
from_secret: gitea_yaba_registry_username
password:
from_secret: gitea_yaba_registry_password
registry: gitea.iwanaga.moe
build_args:
from_secret: DEV1_BUILDARGS
- name: (YABA.Web) Package and Upload Docker Image (prod)
when:
- ref: refs/tags/WEB-*
image: woodpeckerci/plugin-docker-buildx
settings:
repo: gitea.iwanaga.moe/cjtibule/yaba/web
context: ./Web
dockerfile: ./Web/Dockerfile
tags_file: tags.txt
username:
from_secret: gitea_yaba_registry_username
password:
from_secret: gitea_yaba_registry_password
registry: gitea.iwanaga.moe
build_args:
from_secret: PROD_BUILDARGS

View File

@ -6,16 +6,14 @@ EXPOSE 80
EXPOSE 443 EXPOSE 443
# Set environment variables # Set environment variables
ENV ASPNETCORE_Environment= ENV ASPNETCORE_Environment=Development
ENV ASPNETCORE_Authentication__Auth0__ClientId= ENV ASPNETCORE_Authentication__Auth0__ClientId=
ENV ASPNETCORE_Authentication__Auth0__ClientSecret= ENV ASPNETCORE_Authentication__Auth0__ClientSecret=
ENV ASPNETCORE_Authentication__Auth0__Domain= ENV ASPNETCORE_Authentication__Auth0__Domain=
ENV ASPNETCORE_Authentication__Auth0__Identifier= ENV ASPNETCORE_Authentication__Auth0__Identifier=
ENV ASPNETCORE_ConnectionStrings__YABAReadOnlyDbConnectionString= ENV ASPNETCORE_ConnectionStrings__YABAReadOnlyDbConnectionString=
ENV ASPNETCORE_ConnectionStrings__YABAReadWriteDbConnectionString= ENV ASPNETCORE_ConnectionStrings__YABAReadWriteDbConnectionString=
ENV WebClient__Url= ENV ASPNETCORE_WebClient__Url=
ENV Serilog__WriteTo__1__Args__Uri=
ENV Serilog__WriteTo__1__Args__Labels__1__Value=
FROM mcr.microsoft.com/dotnet/sdk:6.0-alpine AS build FROM mcr.microsoft.com/dotnet/sdk:6.0-alpine AS build
WORKDIR /src WORKDIR /src

View File

@ -2,7 +2,6 @@
using YABA.API.Extensions; using YABA.API.Extensions;
using YABA.Common.Extensions; using YABA.Common.Extensions;
using YABA.Common.Lookups; using YABA.Common.Lookups;
using YABA.Common.Utils;
using YABA.Service.Interfaces; using YABA.Service.Interfaces;
namespace YABA.API.Middlewares namespace YABA.API.Middlewares
@ -32,7 +31,7 @@ namespace YABA.API.Middlewares
userId = registedUser.Id; userId = registedUser.Id;
} }
httpContext.User.Identities.FirstOrDefault().AddClaim(new Claim(ClaimsLookup.UserId.GetClaimName(EnvironmentUtils.IsDevelopmentEnvironment()), userId.ToString())); httpContext.User.Identities.FirstOrDefault().AddClaim(new Claim(ClaimsLookup.UserId.GetClaimName(), userId.ToString()));
} }
} }

View File

@ -97,7 +97,7 @@ var app = builder.Build();
// Run database migrations // Run database migrations
using (var scope = app.Services.CreateScope()) using (var scope = app.Services.CreateScope())
{ {
var yabaDbContext = scope.ServiceProvider.GetRequiredService<YABABaseContext>(); var yabaDbContext = scope.ServiceProvider.GetRequiredService<YABAReadWriteContext>();
yabaDbContext.Database.Migrate(); yabaDbContext.Database.Migrate();
} }

View File

@ -4,13 +4,11 @@ namespace YABA.Common.Attributes
{ {
public class ClaimNameAttribute : Attribute public class ClaimNameAttribute : Attribute
{ {
public string DevClaimName { get; private set; } public string Name { get; private set; }
public string ProdClaimName { get; private set; }
public ClaimNameAttribute(string devClaimName, string prodClaimName) public ClaimNameAttribute(string name)
{ {
this.DevClaimName = devClaimName; this.Name = name;
ProdClaimName = prodClaimName;
} }
} }
} }

View File

@ -28,9 +28,9 @@ namespace YABA.Common.Extensions
return enumValue.GetAttribute<DisplayAttribute>().Name; return enumValue.GetAttribute<DisplayAttribute>().Name;
} }
public static string GetClaimName(this ClaimsLookup claimLookup, bool isDevelopmentEnvironment) public static string GetClaimName(this ClaimsLookup claimLookup)
{ {
return isDevelopmentEnvironment ? claimLookup.GetAttribute<ClaimNameAttribute>().DevClaimName : claimLookup.GetAttribute<ClaimNameAttribute>().ProdClaimName; return claimLookup.GetAttribute<ClaimNameAttribute>().Name;
} }
public static bool IsCrudResultSuccessful(this CrudResultLookup importStatusLookup) => SuccessfulCrudStatuses.Contains(importStatusLookup); public static bool IsCrudResultSuccessful(this CrudResultLookup importStatusLookup) => SuccessfulCrudStatuses.Contains(importStatusLookup);

View File

@ -1,8 +1,6 @@
using System; using System.Security.Claims;
using System.Security.Claims;
using System.Security.Principal; using System.Security.Principal;
using YABA.Common.Lookups; using YABA.Common.Lookups;
using YABA.Common.Utils;
namespace YABA.Common.Extensions namespace YABA.Common.Extensions
{ {
@ -14,7 +12,7 @@ namespace YABA.Common.Extensions
public static string GetCustomClaim(this IIdentity identity, ClaimsLookup claim) public static string GetCustomClaim(this IIdentity identity, ClaimsLookup claim)
{ {
var claimsIdentity = identity as ClaimsIdentity; var claimsIdentity = identity as ClaimsIdentity;
return claimsIdentity.FindFirst(claim.GetClaimName(EnvironmentUtils.IsDevelopmentEnvironment()))?.Value.ToString(); return claimsIdentity.FindFirst(claim.GetClaimName())?.Value.ToString();
} }
} }
} }

View File

@ -4,19 +4,19 @@ namespace YABA.Common.Lookups
{ {
public enum ClaimsLookup public enum ClaimsLookup
{ {
[ClaimName("https://auth.dev.iwanaga.moe/api/auth_provider_id", "https://auth.iwanaga.moe/api/auth_provider_id")] [ClaimNameAttribute("https://dev.iwanaga.moe/api/auth_provider_id")]
AuthProviderId = 1, AuthProviderId = 1,
[ClaimName("https://auth.dev.iwanaga.moe/api/email_address", "https://auth.iwanaga.moe/api/email_address")] [ClaimNameAttribute("https://dev.iwanaga.moe/api/email_address")]
UserEmail = 2, UserEmail = 2,
[ClaimName("https://auth.dev.iwanaga.moe/api/email_verified", "https://auth.iwanaga.moe/api/email_verified")] [ClaimNameAttribute("https://dev.iwanaga.moe/api/email_verified")]
IsEmailConfirmed = 3, IsEmailConfirmed = 3,
[ClaimName("https://auth.dev.iwanaga.moe/api/username", "https://auth.iwanaga.moe/api/username")] [ClaimNameAttribute("https://dev.iwanaga.moe/api/username")]
Username = 4, Username = 4,
[ClaimName("https://auth.dev.iwanaga.moe/api/id", "https://auth.iwanaga.moe/api/id")] [ClaimNameAttribute("https://dev.iwanaga.moe/api/id")]
UserId = 5 UserId = 5
} }
} }

View File

@ -1,9 +0,0 @@
using System;
namespace YABA.Common.Utils
{
public static class EnvironmentUtils
{
public static bool IsDevelopmentEnvironment() => Environment.GetEnvironmentVariable("ASPNETCORE_Environment") == "Development";
}
}

View File

@ -1,5 +1,6 @@
server { server {
listen 80; listen 80;
server_name localhost;
root /usr/share/nginx/html; root /usr/share/nginx/html;
index index.html; index index.html;
location / { location / {

View File

@ -2,6 +2,7 @@
"name": "yaba-web", "name": "yaba-web",
"version": "0.1.0", "version": "0.1.0",
"private": true, "private": true,
"homepage": ".",
"dependencies": { "dependencies": {
"@auth0/auth0-react": "^2.0.0", "@auth0/auth0-react": "^2.0.0",
"@testing-library/jest-dom": "^5.16.5", "@testing-library/jest-dom": "^5.16.5",

View File

@ -1,38 +0,0 @@
version: "3"
services:
web:
build:
context: ./Web
dockerfile: Dockerfile
args:
REACT_APP_API_BASE_URL: http://localhost:32270/api
REACT_APP_AUTH0_DOMAIN: iwanaga-dev.us.auth0.com
REACT_APP_AUTH0_CLIENT_ID: ${AUTH0_CLIENT_ID}
REACT_APP_AUTH0_CALLBACK_URL: http://localhost:32271/redirect
REACT_APP_AUTH0_AUDIENCE: https://yaba.dev.iwanaga.moe
container_name: yaba_web
restart: unless-stopped
ports:
- 32271:80
depends_on:
- api
api:
build:
context: ./API
dockerfile: YABA.API/Dockerfile
args:
MODE: Debug
container_name: yaba_api
ports:
- 32270:80
environment:
ASPNETCORE_Environment: Development
ASPNETCORE_Authentication__Auth0__ClientId: ${AUTH0_CLIENT_ID}
ASPNETCORE_Authentication__Auth0__ClientSecret: ${AUTH0_CLIENT_SECRET}
ASPNETCORE_Authentication__Auth0__Domain: iwanaga-dev.us.auth0.com
ASPNETCORE_Authentication__Auth0__Identifier: https://yaba.dev.iwanaga.moe
ASPNETCORE_ConnectionStrings__YABAReadOnlyDbConnectionString: ${RO_CONNECTION_STRING}
ASPNETCORE_ConnectionStrings__YABAReadWriteDbConnectionString: ${RW_CONNECTION_STRING}
WebClient__Url: http://localhost:32271
Serilog__WriteTo__1__Args__Uri: https://loki.iwanaga.moe
Serilog__WriteTo__1__Args__Labels__1__Value: localhost