diff --git a/.github/workflows/build-and-push-dev.yml b/.github/workflows/build-and-push-dev.yml new file mode 100644 index 0000000..4426230 --- /dev/null +++ b/.github/workflows/build-and-push-dev.yml @@ -0,0 +1,59 @@ +name: Build and Push Docker Image (DEV) + +on: + workflow_dispatch: + push: + branches: + - dev + +jobs: + build-and-push: + runs-on: ubuntu-latest + permissions: + contents: read + packages: write + outputs: + container_sha: ${{ github.sha }} + registry_url: ${{ steps.registry.outputs.url }} + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Set registry URL + id: registry + run: | + if [ "${{ github.server_url }}" = "https://github.com" ]; then + echo "url=ghcr.io" >> $GITHUB_OUTPUT + else + echo "url=${{ github.server_url }}" | sed 's|https://||' >> $GITHUB_OUTPUT + fi + + - name: Set up QEMU + uses: docker/setup-qemu-action@v3 + + - name: Log in to Container Registry + uses: docker/login-action@v3 + with: + registry: ${{ steps.registry.outputs.url }} + username: ${{ github.actor }} + password: ${{ secrets.PACKAGE_TOKEN || secrets.GITHUB_TOKEN }} + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Build and push multi-arch Docker image + uses: docker/build-push-action@v5 + with: + context: . + push: true + platforms: linux/amd64,linux/arm64 + tags: | + ${{ steps.registry.outputs.url }}/${{ github.repository }}:dev + ${{ steps.registry.outputs.url }}/${{ github.repository }}:${{ github.sha }} + build-args: | + COMMIT_SHA=${{ github.sha }} + cache-from: type=registry,ref=${{ steps.registry.outputs.url }}/${{ github.repository }}:buildcache-dev + cache-to: type=registry,ref=${{ steps.registry.outputs.url }}/${{ github.repository }}:buildcache-dev,mode=max + + labels: org.opencontainers.image.source=${{ github.server_url }}/${{ github.repository }} diff --git a/.github/workflows/nomad-deploy-dev.yml b/.github/workflows/nomad-deploy-dev.yml new file mode 100644 index 0000000..2e1b848 --- /dev/null +++ b/.github/workflows/nomad-deploy-dev.yml @@ -0,0 +1,56 @@ +name: Deploy to Nomad (DEV) + +on: + workflow_run: + workflows: ["Build and Push Docker Image (DEV)"] # Must match your build workflow name exactly + types: + - completed + workflow_dispatch: # Allows manual triggering for testing + inputs: + container_sha: + description: 'Container SHA to deploy (leave empty for latest commit)' + required: false + type: string + +jobs: + nomad: + runs-on: ubuntu-latest + name: Deploy to Nomad (DEV) + # Only run if the build workflow succeeded + if: ${{ github.event.workflow_run.conclusion == 'success' || github.event_name == 'workflow_dispatch' }} + + steps: + # 1. Checkout Code + - name: Checkout Repository + uses: actions/checkout@v4 + + # 2. Install Nomad CLI + - name: Setup Nomad CLI + uses: hashicorp/setup-nomad@main + with: + version: '1.10.0' # Use your desired version or remove for 'latest' + + # 3. Determine container version to deploy + - name: Set Container Version + id: container_version + run: | + if [ "${{ github.event_name }}" = "workflow_dispatch" ] && [ -n "${{ inputs.container_sha }}" ]; then + echo "sha=${{ inputs.container_sha }}" >> $GITHUB_OUTPUT + elif [ "${{ github.event_name }}" = "workflow_run" ]; then + echo "sha=${{ github.event.workflow_run.head_sha }}" >> $GITHUB_OUTPUT + else + echo "sha=${{ github.sha }}" >> $GITHUB_OUTPUT + fi + + # 4. Deploy the Nomad Job + - name: Deploy Nomad Job + id: deploy + env: + # REQUIRED: Set the Nomad server address + NOMAD_ADDR: http://nomad.service.dc1.consul:4646 + run: | + echo "Deploying container version: ${{ steps.container_version.outputs.sha }}" + nomad status + nomad job run + -var="container_version=${{ steps.container_version.outputs.sha }}" + foodplanner-dev.nomad diff --git a/foodplanner-dev.nomad b/foodplanner-dev.nomad new file mode 100644 index 0000000..f0d2265 --- /dev/null +++ b/foodplanner-dev.nomad @@ -0,0 +1,59 @@ +variable "container_version" { + default = "dev" +} + +job "foodplanner-dev" { + datacenters = ["dc1"] + + type = "service" + + group "app" { + count = 1 + + network { + port "http" { + to = 8999 + } + } + + service { + name = "foodplanner-dev" + port = "http" + + check { + type = "http" + path = "/" + interval = "10s" + timeout = "2s" + } + } + + + task "app" { + driver = "docker" + + config { + image = "ghcr.io/sstent/foodplanner:${var.container_version}" + ports = ["http"] + } + env { + DATABASE_URL = "postgresql://postgres:postgres@master.postgres.service.dc1.consul/meal_planner_dev" + + } + resources { + cpu = 500 + memory = 1024 + } + + # Restart policy + restart { + attempts = 3 + interval = "10m" + delay = "15s" + mode = "fail" + } + } + + + } +}