From 7dce64c6215c7e63cddaafec0b6d1c8a867cccdf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jyri=20H=C3=B6gman?= Date: Thu, 11 Apr 2024 18:27:51 +0300 Subject: [PATCH] Fix tests & modify GHA workflows Pipeline to test, build and deploy server to the ECS cluster --- .github/workflows/build_server.yaml | 80 +++++++++---------------- .github/workflows/workflow_server.yaml | 61 +++++++++++++++++++ Cargo.lock | 82 +++++++++++++------------- server/Cargo.lock | 42 ++++++------- server/Cargo.toml | 3 +- server/Dockerfile | 14 +++-- server/src/tests/service_tests.rs | 4 +- worker/Cargo.toml | 3 +- 8 files changed, 166 insertions(+), 123 deletions(-) create mode 100644 .github/workflows/workflow_server.yaml diff --git a/.github/workflows/build_server.yaml b/.github/workflows/build_server.yaml index fd710ac..40cc27e 100644 --- a/.github/workflows/build_server.yaml +++ b/.github/workflows/build_server.yaml @@ -1,75 +1,53 @@ name: "Build server" on: - push: - branches: - - main - pull_request: - branches: - - main + workflow_call: jobs: - quality: - name: Quality Checks - runs-on: ubuntu-latest - steps: - - name: Checkout - uses: actions/checkout@v4 - - - name: Check formatting - run: cargo fmt --all --check - - - name: Lint - run: cargo clippy --all-targets --all-features -- -D warnings - - - name: Audit - uses: rustsec/audit-check@v1.4.1 - with: - token: ${{ secrets.GITHUB_TOKEN }} - build: - needs: quality - runs-on: ubuntu-latest name: "Build and push to ECR" + runs-on: ubuntu-latest steps: - name: Checkout uses: actions/checkout@v4 - name: Configure AWS Credentials - uses: aws-actions/configure-aws-credentials@v1 + 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: ${{ secrets.AWS_REGION }} + aws-region: ${{ vars.AWS_REGION }} - name: Login to Amazon ECR - id: login-ecr - uses: aws-actions/amazon-ecr-login@v1 + id: login-ecr-public + uses: aws-actions/amazon-ecr-login@v2 + with: + registry-type: public - name: Build, tag, and push image to Amazon ECR env: - ECR_REGISTRY: ${{ steps.login-ecr.outputs.registry }} - ECR_REPOSITORY: waterheater-calc - IMAGE_TAG: latest + REGISTRY: ${{ steps.login-ecr-public.outputs.registry }} + REGISTRY_ALIAS: ${{ vars.REGISTRY_ALIAS }} + REPOSITORY: waterheater-calc run: | - docker build -t $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG -f server/Dockerfile server - docker push $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG + docker build -t $REGISTRY/$REGISTRY_ALIAS/$REPOSITORY:latest -f server/Dockerfile . + docker push $REGISTRY/$REGISTRY_ALIAS/$REPOSITORY:latest - # deploy: - # name: Update ECS instances with new image - # needs: build - # runs-on: ubuntu-latest - # steps: - # - name: Checkout Repository - # uses: actions/checkout@v2 + deploy: + name: Update ECS instances with new image + needs: build + runs-on: ubuntu-latest + steps: + - name: Checkout Repository + uses: actions/checkout@v4 - # - name: Configure AWS Credentials - # uses: aws-actions/configure-aws-credentials@v1 - # with: - # aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }} - # aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} - # aws-region: ${{ secrets.AWS_REGION }} + - 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: ${{ vars.AWS_REGION }} - # - name: Update ECS Service - # run: | - # aws ecs update-service --cluster ${{ secrets.ECS_CLUSTER }} --service ${{ secrets.ECS_SERVICE } --force-new-deployment + - name: Update ECS Service + run: | + aws ecs update-service --cluster ${{ secrets.ECS_CLUSTER }} --service ${{ secrets.ECS_SERVICE }} --force-new-deployment diff --git a/.github/workflows/workflow_server.yaml b/.github/workflows/workflow_server.yaml new file mode 100644 index 0000000..62f4d40 --- /dev/null +++ b/.github/workflows/workflow_server.yaml @@ -0,0 +1,61 @@ +name: Server workflow + +on: + push: + branches: + - "**" + paths: + - ".github/workflows/workflow_server.yaml" + - ".github/workflows/build_server.yaml" + - "server/src/**" + - "server/Cargo.toml" + - "server/Cargo.lock" + - "server/Dockerfile" + - "Cargo.toml" + - "Cargo.lock" + workflow_dispatch: + +jobs: + quality: + name: Quality Checks for Server + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Check formatting + run: cargo fmt --package server --all --check + + - name: Lint + run: cargo clippy --package server --all-targets --all-features -- -D warnings + + - name: Audit + uses: rustsec/audit-check@v1.4.1 + with: + token: ${{ secrets.GITHUB_TOKEN }} + + build: + name: "Build" + needs: quality + uses: ./.github/workflows/build_server.yaml + secrets: inherit + + deploy: + if: ${{ github.ref_name == 'main' }} + name: Update ECS instances with new image + needs: build + runs-on: ubuntu-latest + steps: + - name: Checkout Repository + uses: actions/checkout@v2 + + - name: Configure AWS Credentials + uses: aws-actions/configure-aws-credentials@v1 + with: + aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }} + aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} + aws-region: ${{ vars.AWS_REGION }} + + - name: Update ECS Service + run: | + aws ecs update-service --cluster ${{ secrets.ECS_CLUSTER }} --service ${{ secrets.ECS_SERVICE }} --force-new-deployment diff --git a/Cargo.lock b/Cargo.lock index e96dc58..e031a05 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2052,6 +2052,27 @@ dependencies = [ "serde", ] +[[package]] +name = "server" +version = "0.1.0" +dependencies = [ + "anyhow", + "aws-config", + "aws-sdk-dynamodb", + "aws-sdk-ssm", + "axum", + "chrono", + "chrono-tz", + "reqwest", + "serde", + "serde_dynamo", + "serde_json", + "thiserror", + "tokio", + "tower_governor", + "tracing-subscriber", +] + [[package]] name = "sha2" version = "0.10.8" @@ -2625,47 +2646,6 @@ version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "af190c94f2773fdb3729c55b007a722abb5384da03bc0986df4c289bf5567e96" -[[package]] -name = "waterheater-calc" -version = "0.1.0" -dependencies = [ - "anyhow", - "aws-config", - "aws-sdk-dynamodb", - "aws-sdk-ssm", - "axum", - "chrono", - "chrono-tz", - "reqwest", - "serde", - "serde_dynamo", - "serde_json", - "thiserror", - "tokio", - "tower_governor", - "tracing-subscriber", -] - -[[package]] -name = "waterheater-calc-worker" -version = "0.1.0" -dependencies = [ - "anyhow", - "aws-config", - "aws-sdk-dynamodb", - "aws_lambda_events", - "chrono", - "chrono-tz", - "lambda_runtime", - "openssl", - "reqwest", - "serde", - "serde_json", - "thiserror", - "tokio", - "url", -] - [[package]] name = "web-sys" version = "0.3.69" @@ -2849,6 +2829,26 @@ dependencies = [ "windows-sys 0.48.0", ] +[[package]] +name = "worker" +version = "0.1.0" +dependencies = [ + "anyhow", + "aws-config", + "aws-sdk-dynamodb", + "aws_lambda_events", + "chrono", + "chrono-tz", + "lambda_runtime", + "openssl", + "reqwest", + "serde", + "serde_json", + "thiserror", + "tokio", + "url", +] + [[package]] name = "xmlparser" version = "0.13.6" diff --git a/server/Cargo.lock b/server/Cargo.lock index 1804338..28baa0a 100644 --- a/server/Cargo.lock +++ b/server/Cargo.lock @@ -1903,6 +1903,27 @@ dependencies = [ "serde", ] +[[package]] +name = "server" +version = "0.1.0" +dependencies = [ + "anyhow", + "aws-config", + "aws-sdk-dynamodb", + "aws-sdk-ssm", + "axum", + "chrono", + "chrono-tz", + "reqwest", + "serde", + "serde_dynamo", + "serde_json", + "thiserror", + "tokio", + "tower_governor", + "tracing-subscriber", +] + [[package]] name = "sha2" version = "0.10.8" @@ -2448,27 +2469,6 @@ version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "af190c94f2773fdb3729c55b007a722abb5384da03bc0986df4c289bf5567e96" -[[package]] -name = "waterheater-calc" -version = "0.1.0" -dependencies = [ - "anyhow", - "aws-config", - "aws-sdk-dynamodb", - "aws-sdk-ssm", - "axum", - "chrono", - "chrono-tz", - "reqwest", - "serde", - "serde_dynamo", - "serde_json", - "thiserror", - "tokio", - "tower_governor", - "tracing-subscriber", -] - [[package]] name = "web-sys" version = "0.3.69" diff --git a/server/Cargo.toml b/server/Cargo.toml index d632aa2..7e3ea12 100644 --- a/server/Cargo.toml +++ b/server/Cargo.toml @@ -1,7 +1,8 @@ [package] -name = "waterheater-calc" +name = "server" version = "0.1.0" edition = "2021" +target-dir = "./target" [dependencies] axum = "0.7.5" diff --git a/server/Dockerfile b/server/Dockerfile index 8032cea..eaad0e5 100644 --- a/server/Dockerfile +++ b/server/Dockerfile @@ -6,15 +6,17 @@ WORKDIR /app RUN apt-get update RUN apt-get install -y pkg-config openssl libssl-dev -COPY . . - -RUN cargo build --release +COPY ./server/ ./server/ +COPY ./worker/ ./worker/ +COPY Cargo.toml . +COPY Cargo.lock . +RUN cd server && cargo build -p server --release FROM debian:bullseye-slim AS final RUN apt-get update && apt-get install -y ca-certificates pkg-config openssl libssl-dev curl && update-ca-certificates -WORKDIR /app -COPY --from=build /app/target/release/waterheater-calc . +WORKDIR /app/server +COPY --from=build /app/target/release/server . ARG UID=10001 RUN adduser \ @@ -30,6 +32,6 @@ RUN chown -R appuser:appuser /app && chmod -R 755 /app USER appuser -CMD ["/app/waterheater-calc"] +CMD ["/app/server/server"] EXPOSE 8001 diff --git a/server/src/tests/service_tests.rs b/server/src/tests/service_tests.rs index 88cbd6a..9a07a71 100644 --- a/server/src/tests/service_tests.rs +++ b/server/src/tests/service_tests.rs @@ -79,7 +79,7 @@ fn test_get_filtered_pricing_cross_midnight() { #[test] fn test_calculate_cheapest_start_time() { - let pricing_data = vec![ + let pricing_data = [ create_pricing_with_hour(22, 0.1), create_pricing_with_hour(23, 0.2), create_pricing_with_hour(0, 0.3), @@ -107,7 +107,7 @@ fn test_calculate_cheapest_start_time() { #[test] fn test_calculate_cheapest_start_time_before_midnight() { - let pricing_data = vec![ + let pricing_data = [ create_pricing_with_hour_and_day(22, 9, 4.722), create_pricing_with_hour_and_day(23, 9, 4.078), create_pricing_with_hour_and_day(0, 10, 0.619), diff --git a/worker/Cargo.toml b/worker/Cargo.toml index 28b7515..0ea12f7 100644 --- a/worker/Cargo.toml +++ b/worker/Cargo.toml @@ -1,7 +1,8 @@ [package] -name = "waterheater-calc-worker" +name = "worker" version = "0.1.0" edition = "2021" +target-dir = "./target" [dependencies] aws_lambda_events = { version = "0.15.0", default-features = false, features = [