Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
34 commits
Select commit Hold shift + click to select a range
7256309
minor: fix variable name
specificlanguage Mar 6, 2024
daeb998
minor: fix branch deployment
specificlanguage Mar 6, 2024
4e6863e
minor: Fix repository variable name
specificlanguage Mar 6, 2024
49a12b3
minor: Fix ECS variable names
specificlanguage Mar 6, 2024
1482380
minor: fix return variable
specificlanguage Mar 6, 2024
2f8b31a
minor: change task definition for .env variables
specificlanguage Mar 7, 2024
6fa1c74
minor: update task definition for cpus, log configuration
specificlanguage Mar 7, 2024
a2d3fe8
minor: add environment variables in workflow, aws logs group
specificlanguage Mar 7, 2024
decb214
minor: remove env variables
specificlanguage Mar 7, 2024
756a503
minor: change container name
specificlanguage Mar 7, 2024
5de4b06
minor: change container name
specificlanguage Mar 7, 2024
76f49f5
minor: ignore if environment variables were not retrieved
specificlanguage Mar 7, 2024
a0a403f
minor: update task definition
specificlanguage Mar 7, 2024
c7c6c8e
feat: Remove deploying task definition from ECS
specificlanguage Mar 7, 2024
1ffc271
feat: Add deploying task definition from ECS, but for scheduled tasks…
specificlanguage Mar 7, 2024
32ec6a4
minor: Removing faulty & unneeded fields from the task definition
specificlanguage Mar 7, 2024
0b204a3
feat: Add handling for games of unknown type
specificlanguage Mar 7, 2024
8f41fff
feat: Add handling for postponed/cancelled games
specificlanguage Mar 7, 2024
662d0c1
feat: Add handling for postponed/cancelled games
specificlanguage Mar 8, 2024
0f7d23b
feat: Cover all possible game codes for MLB
specificlanguage Mar 9, 2024
3872e5b
fix: First letter of code
specificlanguage Mar 9, 2024
c34e32d
fix: Add expiry time for postponed games
specificlanguage Mar 9, 2024
527acd7
chore: Remove AWS and deploy through Google Cloud instead
specificlanguage Mar 28, 2024
5fe490b
fix: Change SQL queries to correctly trigger
specificlanguage Mar 29, 2024
65da6a5
feat: Retrieve the day's schedule from MLB instead of database
specificlanguage Apr 3, 2024
2ad77f7
feat: Extra postponement checks
specificlanguage Apr 3, 2024
f1a12b5
feat: Database pruning on startup
specificlanguage Apr 5, 2024
f84e6cf
fix: Cache current status responses for longer
specificlanguage Apr 6, 2024
a547cad
fix: Finished games are now updated correctly
specificlanguage Apr 8, 2024
09e9a8d
Revert "chore: Remove AWS and deploy through Google Cloud instead"
specificlanguage Apr 11, 2024
4156261
fix: time zone issues
specificlanguage Apr 14, 2024
377c461
fix: time zone date issues
specificlanguage Apr 15, 2024
c536c95
fix(current status): time zone date issues
specificlanguage Apr 16, 2024
ef7f78f
fix(timezones?): Force time zone to be Eastern in docker container
specificlanguage Apr 16, 2024
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
61 changes: 24 additions & 37 deletions .aws/task-definition.json
Original file line number Diff line number Diff line change
@@ -1,62 +1,49 @@
{
"taskDefinitionArn": "arn:aws:ecs:us-east-1:798380260115:task-definition/PickemLiveStats:4",
"containerDefinitions": [
{
"name": "pickem",
"image": "798380260115.dkr.ecr.us-east-1.amazonaws.com/pickemlivestats",
"cpu": 0,
"image": "798380260115.dkr.ecr.us-east-1.amazonaws.com/pickemlivestats:5de4b0690a72a92f6ba5d2420a2936209f695509",
"cpu": 256,
"memory": 512,
"portMappings": [],
"essential": true,
"environment": [],
"environmentFiles": [
"environmentFiles": [],
"mountPoints": [],
"volumesFrom": [],
"secrets": [
{
"value": "arn:aws:s3:::pickem-environment-bucket/dev-livestats.env",
"type": "s3"
"name": "DATABASE_URL",
"valueFrom": "arn:aws:secretsmanager:us-east-1:798380260115:secret:PickemLiveStats/dev-BfVBxS:DATABASE_URL::"
},
{
"name": "REDIS_URL",
"valueFrom": "arn:aws:secretsmanager:us-east-1:798380260115:secret:PickemLiveStats/dev-BfVBxS:REDIS_URL::"
}
],
"mountPoints": [],
"volumesFrom": [],
"logConfiguration": {
"logDriver": "awslogs",
"options": {
"awslogs-create-group": "true",
"awslogs-group": "pickem-livestats-dev",
"awslogs-region": "us-east-1",
"awslogs-stream-prefix": "dev-stats"
},
"secretOptions": []
},
"systemControls": []
}
],
"family": "PickemLiveStats",
"taskRoleArn": "arn:aws:iam::798380260115:role/ecsTaskExecutionRole",
"executionRoleArn": "arn:aws:iam::798380260115:role/ecsTaskExecutionRole",
"networkMode": "awsvpc",
"revision": 4,
"volumes": [],
"status": "ACTIVE",
"requiresAttributes": [
{
"name": "com.amazonaws.ecs.capability.ecr-auth"
},
{
"name": "ecs.capability.env-files.s3"
},
{
"name": "ecs.capability.execution-role-ecr-pull"
},
{
"name": "com.amazonaws.ecs.capability.docker-remote-api.1.18"
},
{
"name": "ecs.capability.task-eni"
}
],
"placementConstraints": [],
"compatibilities": [
"EC2",
"FARGATE"
],
"requiresCompatibilities": [
"FARGATE"
],
"cpu": "256",
"memory": "512",
"runtimePlatform": {
"cpuArchitecture": "X86_64",
"operatingSystemFamily": "LINUX"
},
"registeredAt": "2024-03-06T22:12:24.591Z",
"registeredBy": "arn:aws:iam::798380260115:root",
"tags": []
}
62 changes: 62 additions & 0 deletions .github/workflows/deploy_dev.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
name: Deploy to ECR
run-name: Run ${{ github.run_id }} deploying to ECR
on:
push:
branches:
- dev

env:
AWS_REGION: us-east-1
AWS_ACCOUNT_ID: ${{ secrets.AWS_ACCOUNT_ID }}
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
ECR_REPOSITORY: ${{ secrets.ECR_REPOSITORY }}
CONTAINER_NAME: "pickem"
ECS_CLUSTER: PickemLiveStats-Dev


jobs:
deploy:
name: Deploy to ECR
runs-on: ubuntu-latest
environment: development

steps:
- name: Checkout
uses: actions/checkout@v4

- name: Configure AWS Credentials
uses: aws-actions/configure-aws-credentials@v4
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
aws-region: ${{ env.AWS_REGION }}

- name: Login to Amazon ECR
id: login-ecr
uses: aws-actions/amazon-ecr-login@v2

- name: Build, tag, and push image to Amazon ECR
id: build-image
env:
ECR_REGISTRY: ${{ steps.login-ecr.outputs.registry }}
ECR_REPOSITORY: ${{ secrets.ECR_REPOSITORY }}
IMAGE_TAG: ${{ github.sha }}
run: |
docker build -t $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG .
docker push $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG
echo "image=$ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG" >> $GITHUB_OUTPUT

- name: Fill new image ID in Amazon ECS task definition
id: fill-task-def
uses: aws-actions/amazon-ecs-render-task-definition@v1
with:
task-definition: .aws/task-definition.json
container-name: ${{ env.CONTAINER_NAME }}
image: ${{ steps.build-image.outputs.image }}

- name: Deploy to Amazon ECS
uses: airfordable/ecs-deploy-task-definition-to-scheduled-task@v2.0.0
with:
cluster: ${{ env.ECS_CLUSTER }}
task-definition: ${{ steps.fill-task-def.outputs.task-definition }}
19 changes: 4 additions & 15 deletions .github/workflows/deploy.yml → .github/workflows/deploy_prod.yml
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@

name: Deploy to ECR
run-name: Run ${{ github.run_id }} deploying to ECR
on:
Expand All @@ -10,10 +11,9 @@ env:
AWS_ACCOUNT_ID: ${{ secrets.AWS_ACCOUNT_ID }}
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
ECR_REPO: ${{ secrets.ECR_REPO }}
ECR_REPOSITORY: ${{ secrets.ECR_REPOSITORY }}
CONTAINER_NAME: "pickem"
ECS_SERVICE: PickemLiveStats
ECS_CLUSTER: PickemLiveStats-Dev
ECS_CLUSTER: PickemLiveStats-Prod


jobs:
Expand Down Expand Up @@ -41,7 +41,7 @@ jobs:
id: build-image
env:
ECR_REGISTRY: ${{ steps.login-ecr.outputs.registry }}
ECR_REPOSITORY: ${{ secrets.ECR_REPO }}
ECR_REPOSITORY: ${{ secrets.ECR_REPOSITORY }}
IMAGE_TAG: ${{ github.sha }}
run: |
docker build -t $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG .
Expand All @@ -55,14 +55,3 @@ jobs:
task-definition: .aws/task-definition.json
container-name: my-container
image: ${{ steps.build-image.outputs.image }}


- name: Deploy ECS task definition
uses: aws-actions/amazon-ecs-deploy-task-definition@v1
with:
task-definition: ${{ steps.fill-task-def.outputs.new-task-definition }}
service: my-service
cluster: my-cluster
wait-for-service-stability: true


2 changes: 2 additions & 0 deletions Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -14,4 +14,6 @@ COPY . .
RUN go build -v -o /usr/local/bin/main ./...
ENV DATABASE_URL=$DATABASE_URL
ENV REDIS_URL=$REDIS_URL
ENV TZ="America/New_York"
RUN ls -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
CMD ["main"]
81 changes: 81 additions & 0 deletions batch.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
package main

import (
"context"
"log/slog"
"os"
"strconv"
"strings"
"time"
)

func BatchUpdateTime(client *DatabaseClient) {
rows, err := client.db.Query(
context.Background(),
`SELECT id, "homeTeam_id", "awayTeam_id", date FROM games WHERE date = $1`,
time.Now().Format("2006-01-02"))
if err != nil {
slog.Error("Could not obtain games for today...")
slog.Error(err.Error())
os.Exit(1)
}

for rows.Next() {
var game Game
err := rows.Scan(&game.ID, &game.HomeTeam_ID, &game.AwayTeam_ID, &game.Date)
if err != nil {
slog.Error("Could not scan game...")
slog.Error(err.Error())
os.Exit(1)
}
gameData, err := getGameData(game.ID)
if err != nil {
slog.Error("Could not obtain game data...")
slog.Error(err.Error())
os.Exit(1)
}
gameStats, err := getGameStats(gameData)
if err != nil {
slog.Error("Could not obtain game stats...")
slog.Error(err.Error())
os.Exit(1)
}
datetime, err := unwrap(gameStats, "datetime")
if err != nil {
slog.Error("Could not unwrap datetime...")
slog.Error(err.Error())
os.Exit(1)
}
startTime, err := time.Parse("2006-01-02T15:04:05Z", datetime["dateTime"].(string))
if err != nil {
slog.Error("Could not parse start time...")
slog.Error(err.Error())
os.Exit(1)
}

client.db.Exec(context.Background(),
`UPDATE games SET date = CURRENT_DATE, "startTimeUTC" = $2 WHERE id = $3`, startTime, game.ID)
}
rows.Close()
}

func BatchResolveJobs(client *DatabaseClient) {
keys, err := client.redisClient.Keys(context.Background(), "game:*").Result()
if err != nil {
return
}

for _, key := range keys {
gameID, err := strconv.Atoi(strings.Split(key, ":")[1])
if err != nil {
slog.Error("Could not convert key to integer...")
slog.Error(err.Error())
os.Exit(1)
}

// Update all items once upon startup, if scheduled then expires within 24 hours.
handleGameStats(gameID, databaseClient)

}

}
19 changes: 14 additions & 5 deletions database.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import (
"log/slog"
"os"
"sync"
"time"
)

type DatabaseClient struct {
Expand All @@ -18,11 +19,11 @@ type DatabaseClient struct {
}

func NewDatabaseClient() *DatabaseClient {
dotEnvErr := godotenv.Load()
if dotEnvErr != nil {
slog.Error("Error loading .env file, exiting")
os.Exit(1)
}
godotenv.Load()
//if dotEnvErr != nil {
// slog.Error("Error loading .env file, exiting")
// os.Exit(1)
//}

// Connect to database
connStr := os.Getenv("DATABASE_URL")
Expand Down Expand Up @@ -52,3 +53,11 @@ func NewDatabaseClient() *DatabaseClient {
}

}

func UpdateTime(client *DatabaseClient, gameID int, newStartTime time.Time) {
localTime := newStartTime.In(time.Local)
_, err := client.db.Exec(context.Background(), `UPDATE games SET date = $1, "startTimeUTC" = $2 WHERE id = $3`, localTime, newStartTime, gameID)
if err != nil {
slog.Error(err.Error())
}
}
Loading