Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
109 commits
Select commit Hold shift + click to select a range
0ac7ef7
fix: deprecation warning for web_console in development
pdl May 22, 2025
3e75128
chore: fix a bug where db restores would sometimes fail due to failur…
pdl May 22, 2025
66c6a1d
chore: fix db_trim tasks
pdl May 23, 2025
b31edbf
chore: interim docker-compose for side-by-side work on pg10, pg17
pdl May 23, 2025
c88a35f
chore: install postgres 17 client in Dockerfile
pdl Jun 9, 2025
5a72162
pin ruby/kamal version for kamal deploy
leonardow-unep-wcmc Jul 25, 2025
8f2eb43
pin nodejs version, and optimise Dockefile, the image size down from …
leonardow-unep-wcmc Jul 25, 2025
162b1ac
config.hosts and ALLOWED_HOSTS only use in local docker development.
leonardow-unep-wcmc Jul 25, 2025
5d8da22
mailer config can't use Rails credentials: 1) should migrate to ENV s…
leonardow-unep-wcmc Jul 25, 2025
a0fd60c
Things that can't raise error, when running assets:precompile without…
leonardow-unep-wcmc Jul 25, 2025
c3d3be0
Production Dockerfile and .dockerignore
leonardow-unep-wcmc Jul 25, 2025
d353f2b
Align ENV name with DevOps
leonardow-unep-wcmc Jul 25, 2025
c950332
sidekiq admin username/password move to credentials. Was nginx .htpas…
leonardow-unep-wcmc Jul 25, 2025
92d816a
Remove the bundle install command from the entrypoint. In staging and…
leonardow-unep-wcmc Jul 25, 2025
acb3d4d
kamal 2 config
leonardow-unep-wcmc Jul 25, 2025
19ba0c9
add sidekiq healthcheck script
leonardow-unep-wcmc Jul 25, 2025
ed76285
nodejs only use for assets:precompile, but somehow it broken if not a…
leonardow-unep-wcmc Jul 25, 2025
60e88d3
No longer need to remove the pid file in production mode, only need f…
leonardow-unep-wcmc Jul 25, 2025
36d46f8
fix production config, to serve assets from puma
leonardow-unep-wcmc Jul 25, 2025
95ad590
add remove puma pid file in docker compose for development only
leonardow-unep-wcmc Aug 1, 2025
c6d05d2
add redis cache port in compose
leonardow-unep-wcmc Aug 1, 2025
db16764
Update Kamal deploy configuration
leonardow-unep-wcmc Mar 17, 2026
7092abd
Configure Kamal v2 staging deployment for proxmox
ruand-wcmc Mar 18, 2026
088a762
Add Kamal v2 GitHub Actions workflows
ruand-wcmc Mar 18, 2026
7662ecd
Fix workflows: staging-only, trigger on staging branch push
ruand-wcmc Mar 18, 2026
d889885
Fix workflows: staging-only, trigger on staging branch push
ruand-wcmc Mar 18, 2026
3327452
Pass dummy registry creds to satisfy kamal-v2-setup action check
ruand-wcmc Mar 18, 2026
e128b75
Pass dummy registry creds to satisfy kamal-v2-setup action check
ruand-wcmc Mar 18, 2026
37dd6b4
Map SAPI_DATABASE_* to generic names required by kamal-v2-setup action
ruand-wcmc Mar 18, 2026
53d2b7a
Map SAPI_DATABASE_* to generic names required by kamal-v2-setup action
ruand-wcmc Mar 18, 2026
5620b10
Fix kamal setup: inline steps, prefixed secrets, corrected image and …
ruand-wcmc Mar 18, 2026
e43fe3e
Sync kamal workflow files from staging branch
ruand-wcmc Mar 18, 2026
a43d2f0
Fix deploy Ruby version to 3.4.9 to match Gemfile
ruand-wcmc Mar 18, 2026
c23a85c
Sync deploy Ruby version fix to master
ruand-wcmc Mar 18, 2026
45a069d
Remove invalid healthcheck key from job role in deploy.staging.yml
ruand-wcmc Mar 18, 2026
a4741ee
Sync deploy.staging.yml fix to master
ruand-wcmc Mar 18, 2026
9ded962
Add ruby/setup-ruby step to kamal-setup workflow
ruand-wcmc Mar 18, 2026
00012d0
Sync kamal-setup ruby fix to master
ruand-wcmc Mar 18, 2026
e66992d
Fix kamal setup path and disable auto-deploy until setup complete
ruand-wcmc Mar 18, 2026
73996a8
Sync workflow fixes to master
ruand-wcmc Mar 18, 2026
e21a738
Fix SSL config to use kamal v2 certificate_pem/private_key_pem secrets
ruand-wcmc Mar 18, 2026
1929e88
Sync SSL config fix to master
ruand-wcmc Mar 18, 2026
786ab5e
Use localhost:5555 local registry instead of Harbour (no auth needed)
ruand-wcmc Mar 18, 2026
6a4970b
Use localhost:5555 local registry instead of Harbour (no auth needed)
ruand-wcmc Mar 18, 2026
e4c211d
Add buildx setup and remote builder on server for localhost:5555 regi…
ruand-wcmc Mar 18, 2026
cb3e94a
Add buildx setup and remote builder on server for localhost:5555 regi…
ruand-wcmc Mar 18, 2026
33255ee
Add CERTIFICATE_PEM and PRIVATE_KEY_PEM to kamal-setup env
ruand-wcmc Mar 18, 2026
96c2a78
Add CERTIFICATE_PEM and PRIVATE_KEY_PEM to kamal-setup env
ruand-wcmc Mar 18, 2026
9b2a613
Add Dockerfile.staging with puma CMD; wire into deploy.staging.yml
ruand-wcmc Mar 18, 2026
798a267
Add Dockerfile.staging with puma CMD; wire into deploy.staging.yml
ruand-wcmc Mar 18, 2026
e6813d3
Enable auto-deploy on staging branch push
ruand-wcmc Mar 19, 2026
3748643
Enable auto-deploy on staging branch push
ruand-wcmc Mar 19, 2026
8da02ea
Add staging.speciesplus.net Cloudflare tunnel host to kamal-proxy
ruand-wcmc Mar 19, 2026
7bea977
Remove staging.speciesplus.net from kamal-proxy — Cloudflare routes t…
ruand-wcmc Mar 19, 2026
04e0dc3
Remove stale server.pid in entrypoint to prevent crash-restart loop
ruand-wcmc Mar 19, 2026
528d27c
chore: upgrade Rails from 7.1.3.4 to 7.2.3.1 (Gemfile only)
pdl Apr 7, 2026
8a4a4dc
chore: bundle upgrade rails to 7.2 and acts-as-taggable-on
pdl Apr 8, 2026
b0ecec8
chore: bundle exec rails app:update (to Rails 7.2)
pdl Apr 8, 2026
f4a4901
chore: Rails 7.2 changes informed by railsdiff and FastRuby and offic…
pdl Apr 8, 2026
8815168
chore: more dependency upgrades, to fix a sprockets build issue
pdl Apr 8, 2026
5fdd94d
chore: upgrade target version in .rubocop.yml
pdl Apr 8, 2026
3dddf49
chore: add Rails 7.2 upgrade to changelog
pdl Apr 8, 2026
bad866e
fix: Open Sans is not loading after sprockets upgrade
pdl Apr 9, 2026
0c6886d
chore: Upgrade Ruby to 3.4.9
pdl Apr 8, 2026
95b496c
chore: update bundler version
pdl Apr 9, 2026
fbd719f
chore: upgrade rails to 8.0.5
pdl Apr 9, 2026
b860fcb
chore: remove 0_new_framework_defaults_7_2.rb
pdl Apr 9, 2026
530a03f
chore: run rails app:update for rails 8.0
pdl Apr 9, 2026
4693456
chore: do not include active_storage migrations
pdl Apr 9, 2026
5f8ccf9
chore: apply more changes from https://railsdiff.org/7.2.3.1/8.0.5
pdl Apr 9, 2026
16f06c1
chore: bump defaults to 8.0
pdl Apr 9, 2026
1efaf15
chore: upgrade Rails from 8.0.5 to 8.1.3, acts-as-taggable-on, bundle…
pdl Apr 10, 2026
f0a0bc5
chore: for 8.1.3, run "bundle exec rails app:update"
pdl Apr 10, 2026
64fcdd3
chore: changes per https://railsdiff.org/8.0.5/8.1.3
pdl Apr 10, 2026
5e7ca78
chore: remove unusual character
pdl Apr 10, 2026
e2e276c
chore: set config.load_defaults to 8.1
pdl Apr 10, 2026
6b7b629
chore: set RuboCop TargetRailsVersion to 8.1
pdl Apr 10, 2026
9f93102
chore: upgrade sidekiq to 7.3.10
pdl Apr 10, 2026
b87475c
chore: upgrade sidekiq to 8.1.2
pdl Apr 10, 2026
1756ab3
chore: various other dependency upgrades
pdl Apr 10, 2026
13bf5d8
refactor: prefer params.expect(...) over params.require(...).permit(...)
pdl Apr 10, 2026
51eb160
chore: rubocop
pdl Apr 13, 2026
314f587
Merge remote-tracking branch 'origin/chore/upgrade-postgres' into ref…
pdl Apr 15, 2026
b41620f
Merge DevOps changes into Rails upgrade branch
pdl Apr 15, 2026
89efdf0
chore: merge into single Dockerfile
pdl Apr 15, 2026
27fd3bd
Merge branch 'staging' into chimera/upgrade-rails-devops
pdl Apr 15, 2026
4b115f2
Fix RUBY_VERSION build arg to 3.4.9; remove Dockerfile.deploy from ba…
ruand-wcmc Apr 16, 2026
2fe120e
fix: use consistent ruby version, and target the right docker branch
pdl Apr 16, 2026
998f651
Some fixes for tests
pdl Apr 16, 2026
ef49619
fix: force test env in rspec
pdl Apr 16, 2026
1f6be2d
fix: document batches tests
pdl Apr 17, 2026
2ff1f5b
fix: remove debugger statement
pdl Apr 20, 2026
54972aa
fix: deprecation of ActiveSupport::Multibyte::Chars (mb_chars no long…
pdl Apr 16, 2026
53b7bdc
chore: upgrade non-rails dependencies
pdl Apr 16, 2026
adea786
chore: updated CHANGELOG
pdl Apr 16, 2026
4d48633
remove gitkeep files
pdl Apr 16, 2026
6189e48
chore: attempting to get staging deploy working again
pdl Apr 16, 2026
d7fbba0
fix: staging runtime
pdl Apr 16, 2026
ce9023f
chore: more startup tweaks to get staging working
pdl Apr 16, 2026
ee27b3f
fix: hopefully adding BUNDLE_WITHOUT=development will do it
pdl Apr 16, 2026
7dba8e7
fix: Benchmark gem is no longer provided by Rails
pdl Apr 22, 2026
8bf7a9a
chore: lmodern no longer available on Ubuntu 22, use mlmodern
pdl Apr 23, 2026
e3c1c35
fix: revert unintended changes to CORS initialiser
pdl Apr 24, 2026
83e7a7f
chore: use new staging url in mailer credentials
pdl Apr 27, 2026
6abb1eb
fix: eu_country_date_query
pdl Apr 17, 2026
6ecc338
chore: permit CITES checklist url to be used for CORS requests
pdl Apr 27, 2026
a37abd6
fix: Job arguments to DownloadWorker must be native JSON types (not A…
pdl Apr 27, 2026
cc4ddb4
fix: use as_json instead of to_h, to avoid errors during serialisatio…
pdl May 1, 2026
e219183
fix: another attempt to squash ActiveSupport::Duration bug
pdl May 1, 2026
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
54 changes: 52 additions & 2 deletions .dockerignore
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,12 @@
# Ignore bundler config.
/.bundle

# Ignore all environment files (except templates).
# Ignore all environment files
/.env*
!/.env*.erb

# Ignore Kamal files.
/config/deploy*.yml
/.kamal

# Ignore all default key files.
/config/master.key
Expand Down Expand Up @@ -45,3 +48,50 @@
# Ignore Docker-related files
/.dockerignore
/Dockerfile*

# SAPI
/coverage
/rdoc
/private
/public/system
/public/downloads/*.pdf
#LaTeX
/public/latex/*.aux
/public/latex/*.out
/public/latex/*.log
/public/latex/*.gz
/public/latex/index.pdf
/public/latex/history.pdf
/public/sitemap*

#checklist downloads
/public/downloads/checklist/*.*

#exports csvs
/public/downloads/documents/*.csv
/public/downloads/quotas/*.csv
/public/downloads/cites_listings/*.csv
/public/downloads/cites_suspensions/*.csv
/public/downloads/eu_listings/*.csv
/public/downloads/eu_decisions/*.csv
/public/downloads/cms_listings/*.csv
/public/downloads/checklist/*.pdf
/public/downloads/checklist/*.csv
/public/downloads/checklist/*.json
/public/downloads/taxon_concepts_names/*.csv
/public/downloads/synonyms_and_trade_names/*.csv
/public/downloads/taxon_concepts_distributions/*.csv
/public/downloads/shipments/*.csv
/public/downloads/comptab/*.csv
/public/downloads/gross_exports/*.csv
/public/downloads/gross_imports/*.csv
/public/downloads/net_exports/*.csv
/public/downloads/net_imports/*.csv
/public/downloads/trade_download_stats/*.csv
/public/downloads/species_reference_output/*.csv
/public/downloads/standard_reference_output/*.csv
/public/downloads/common_names/*.csv
/public/downloads/iucn_mappings/*.csv
/public/downloads/cms_mappings/*.csv
/public/downloads/orphaned_taxon_concepts/*.csv
/public/uploads/*
158 changes: 158 additions & 0 deletions .github/workflows/deploy.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,158 @@
name: Deploy SAPI Rails API
on:
push:
branches:
- staging
workflow_dispatch:

jobs:
deploy:
runs-on: self-hosted
environment: staging
steps:
- name: Set workflow start time
run: |
echo "START_TIME=$(date -u +"%Y-%m-%dT%H:%M:%SZ")" >> $GITHUB_ENV

- uses: actions/checkout@v4

- name: Notify deployment start
id: notify-start
uses: unepwcmc/devops-actions/.github/actions/slack-notify@v1
with:
slack-bot-token: ${{ secrets.SLACK_BOT_TOKEN }}
slack-channel-id: ${{ secrets.SLACK_CHANNEL_ID }}
notification-type: started
action-type: Deploy
environment: staging
repository: ${{ github.repository }}
repository-url: ${{ github.server_url }}/${{ github.repository }}
action-run-url: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}
actor: ${{ github.actor }}
actor-url: ${{ github.server_url }}/${{ github.actor }}
workflow-name: ${{ github.workflow }}
run-id: ${{ github.run_id }}
commit-message: ${{ github.event.head_commit.message || 'Manual workflow trigger' }}
runner-name: ${{ runner.name }}
start-time: ${{ env.START_TIME }}

- name: Export and validate kamal secrets
shell: bash
env:
SECRETS_JSON: ${{ toJSON(secrets) }}
run: |
if [[ ! -f ".kamal/secrets-common" ]]; then
echo "Error: .kamal/secrets-common file not found."
exit 1
fi

temp_secrets="$(mktemp)"
trap 'rm -f "$temp_secrets"' EXIT
printf '%s' "$SECRETS_JSON" > "$temp_secrets"

needed_vars=()
while IFS= read -r line; do
trimmed="$(echo "$line" | tr -d '\r' | sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//')"
[[ -z "$trimmed" || "$trimmed" == \#* ]] && continue
[[ "$trimmed" != *=* ]] && continue

value="${trimmed#*=}"
value="${value#"${value%%[![:space:]]*}"}"
value="${value%"${value##*[![:space:]]}"}"

[[ "$value" != \$* ]] && continue
[[ "$value" == '$('* ]] && continue

if [[ "$value" == \$\{* ]]; then
if [[ "$value" =~ ^\$\{([A-Z0-9_]+) ]]; then
needed_vars+=("${BASH_REMATCH[1]}")
fi
elif [[ "$value" =~ ^\$([A-Z0-9_]+) ]]; then
needed_vars+=("${BASH_REMATCH[1]}")
fi
done < ".kamal/secrets-common"

IFS=$'\n' read -r -d '' -a unique_vars < <(printf '%s\n' "${needed_vars[@]}" | sort -u && printf '\0')

for var in "${unique_vars[@]}"; do
value=$(jq -r --arg key "$var" '.[$key] // empty' "$temp_secrets")
if [[ -z "$value" ]]; then
echo "Missing environment variable required in .kamal/secrets-common: ${var}" >&2
exit 1
fi

{
echo "${var}<<EOF"
echo "$value"
echo "EOF"
} >> "$GITHUB_ENV"
done

echo "✅ All required kamal secrets validated"

- name: Deploy with Kamal v2
uses: unepwcmc/devops-actions/.github/actions/kamal-v2.x-deploy@v1
with:
environment: staging
working-directory: .
env:
SSH_PRIVATE_KEY: ${{ secrets.SSH_PRIVATE_KEY }}

- name: Set workflow end time and calculate duration
if: always()
run: |
echo "END_TIME=$(date -u +"%Y-%m-%dT%H:%M:%SZ")" >> $GITHUB_ENV
if [[ -n "$START_TIME" ]]; then
start_timestamp=$(date -d "$START_TIME" +%s)
end_timestamp=$(date -d "$(date -u +"%Y-%m-%dT%H:%M:%SZ")" +%s)
duration=$((end_timestamp - start_timestamp))
echo "DEPLOYMENT_DURATION=${duration}" >> $GITHUB_ENV
else
echo "DEPLOYMENT_DURATION=0" >> $GITHUB_ENV
fi

- name: Notify deployment success
if: success()
uses: unepwcmc/devops-actions/.github/actions/slack-notify@v1
with:
slack-bot-token: ${{ secrets.SLACK_BOT_TOKEN }}
slack-channel-id: ${{ secrets.SLACK_CHANNEL_ID }}
notification-type: success
action-type: Deploy
environment: staging
repository: ${{ github.repository }}
repository-url: ${{ github.server_url }}/${{ github.repository }}
action-run-url: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}
actor: ${{ github.actor }}
actor-url: ${{ github.server_url }}/${{ github.actor }}
workflow-name: ${{ github.workflow }}
run-id: ${{ github.run_id }}
commit-message: ${{ github.event.head_commit.message || 'Manual workflow trigger' }}
runner-name: ${{ runner.name }}
start-time: ${{ env.START_TIME }}
end-time: ${{ env.END_TIME }}
deployment-duration: ${{ env.DEPLOYMENT_DURATION }}
update-message-ts: ${{ steps.notify-start.outputs.message-ts }}

- name: Notify deployment failure
if: failure()
uses: unepwcmc/devops-actions/.github/actions/slack-notify@v1
with:
slack-bot-token: ${{ secrets.SLACK_BOT_TOKEN }}
slack-channel-id: ${{ secrets.SLACK_CHANNEL_ID }}
notification-type: failure
action-type: Deploy
environment: staging
repository: ${{ github.repository }}
repository-url: ${{ github.server_url }}/${{ github.repository }}
action-run-url: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}
actor: ${{ github.actor }}
actor-url: ${{ github.server_url }}/${{ github.actor }}
workflow-name: ${{ github.workflow }}
run-id: ${{ github.run_id }}
commit-message: ${{ github.event.head_commit.message || 'Manual workflow trigger' }}
runner-name: ${{ runner.name }}
start-time: ${{ env.START_TIME }}
end-time: ${{ env.END_TIME }}
deployment-duration: ${{ env.DEPLOYMENT_DURATION }}
update-message-ts: ${{ steps.notify-start.outputs.message-ts }}
162 changes: 162 additions & 0 deletions .github/workflows/kamal-setup.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,162 @@
name: Kamal v2 SAPI Setup (One-time per Environment)
on:
workflow_dispatch:
inputs:
environment:
description: 'Environment to setup'
required: true
type: choice
options:
- staging
confirm:
description: 'Type "CONFIRM" to proceed with setup'
required: true
type: string

jobs:
validate-input:
runs-on: self-hosted
steps:
- name: Validate confirmation
run: |
if [[ "${{ github.event.inputs.confirm }}" != "CONFIRM" ]]; then
echo "❌ Setup cancelled. You must type 'CONFIRM' to proceed."
echo "⚠️ This is a one-time setup operation that will:"
echo " • Initialize Kamal v2 configuration for ${{ github.event.inputs.environment }}"
echo " • Set up Docker containers and services"
echo " • Configure the deployment infrastructure"
exit 1
fi
echo "✅ Setup confirmed for ${{ github.event.inputs.environment }} environment"

setup:
needs: validate-input
runs-on: self-hosted
environment: ${{ github.event.inputs.environment }}
env:
RAILS_MASTER_KEY: ${{ secrets.RAILS_MASTER_KEY }}
SAPI_DATABASE_HOST: ${{ secrets.SAPI_DATABASE_HOST }}
SAPI_DATABASE_NAME: ${{ secrets.SAPI_DATABASE_NAME }}
SAPI_DATABASE_USERNAME: ${{ secrets.SAPI_DATABASE_USERNAME }}
SAPI_DATABASE_PASSWORD: ${{ secrets.SAPI_DATABASE_PASSWORD }}
SAPI_DATABASE_PORT: ${{ secrets.SAPI_DATABASE_PORT }}
CAPTIVE_BREEDING_DATABASE_HOST: ${{ secrets.CAPTIVE_BREEDING_DATABASE_HOST }}
CAPTIVE_BREEDING_DATABASE_NAME: ${{ secrets.CAPTIVE_BREEDING_DATABASE_NAME }}
CAPTIVE_BREEDING_DATABASE_USERNAME: ${{ secrets.CAPTIVE_BREEDING_DATABASE_USERNAME }}
CAPTIVE_BREEDING_DATABASE_PASSWORD: ${{ secrets.CAPTIVE_BREEDING_DATABASE_PASSWORD }}
CAPTIVE_BREEDING_DATABASE_PORT: ${{ secrets.CAPTIVE_BREEDING_DATABASE_PORT }}
MAIL_USERNAME: ${{ secrets.MAIL_USERNAME }}
MAIL_PASSWORD: ${{ secrets.MAIL_PASSWORD }}
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
AWS_REGION: ${{ secrets.AWS_REGION }}
SAPI_SIDEKIQ_REDIS_URL: ${{ secrets.SAPI_SIDEKIQ_REDIS_URL }}
SAPI_SIDEKIQ_REDIS_CACHE_URL: ${{ secrets.SAPI_SIDEKIQ_REDIS_CACHE_URL }}
CERTIFICATE_PEM: ${{ secrets.CERTIFICATE_PEM }}
PRIVATE_KEY_PEM: ${{ secrets.PRIVATE_KEY_PEM }}
steps:
- name: Set workflow start time
run: |
echo "START_TIME=$(date -u +"%Y-%m-%dT%H:%M:%SZ")" >> $GITHUB_ENV

- uses: actions/checkout@v4

- name: Notify setup start
id: notify-start
uses: unepwcmc/devops-actions/.github/actions/slack-notify@v1
with:
slack-bot-token: ${{ secrets.SLACK_BOT_TOKEN }}
slack-channel-id: ${{ secrets.SLACK_CHANNEL_ID }}
notification-type: started
action-type: Setup
environment: ${{ github.event.inputs.environment }}
repository: ${{ github.repository }}
repository-url: ${{ github.server_url }}/${{ github.repository }}
action-run-url: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}
actor: ${{ github.actor }}
actor-url: ${{ github.server_url }}/${{ github.actor }}
workflow-name: ${{ github.workflow }}
run-id: ${{ github.run_id }}
commit-message: ${{ github.event.head_commit.message || 'Manual workflow trigger' }}
runner-name: ${{ runner.name }}
start-time: ${{ env.START_TIME }}

- name: Set up SSH agent
uses: webfactory/ssh-agent@v0.9.0
with:
ssh-private-key: ${{ secrets.SSH_PRIVATE_KEY }}

- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3

- name: Set up Ruby
uses: ruby/setup-ruby@v1
with:
working-directory: deploy
bundler-cache: false

- name: Install Kamal
working-directory: deploy
run: bundle install --quiet

- name: Run Kamal setup
run: BUNDLE_GEMFILE=deploy/Gemfile bundle exec kamal setup -d ${{ github.event.inputs.environment }}

- name: Set workflow end time and calculate duration
if: always()
run: |
echo "END_TIME=$(date -u +"%Y-%m-%dT%H:%M:%SZ")" >> $GITHUB_ENV
if [[ -n "$START_TIME" ]]; then
start_timestamp=$(date -d "$START_TIME" +%s)
end_timestamp=$(date -d "$(date -u +"%Y-%m-%dT%H:%M:%SZ")" +%s)
duration=$((end_timestamp - start_timestamp))
echo "DEPLOYMENT_DURATION=${duration}" >> $GITHUB_ENV
else
echo "DEPLOYMENT_DURATION=0" >> $GITHUB_ENV
fi

- name: Notify setup success
if: success()
uses: unepwcmc/devops-actions/.github/actions/slack-notify@v1
with:
slack-bot-token: ${{ secrets.SLACK_BOT_TOKEN }}
slack-channel-id: ${{ secrets.SLACK_CHANNEL_ID }}
notification-type: success
action-type: Setup
environment: ${{ github.event.inputs.environment }}
repository: ${{ github.repository }}
repository-url: ${{ github.server_url }}/${{ github.repository }}
action-run-url: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}
actor: ${{ github.actor }}
actor-url: ${{ github.server_url }}/${{ github.actor }}
workflow-name: ${{ github.workflow }}
run-id: ${{ github.run_id }}
commit-message: ${{ github.event.head_commit.message || 'Manual workflow trigger' }}
runner-name: ${{ runner.name }}
start-time: ${{ env.START_TIME }}
end-time: ${{ env.END_TIME }}
deployment-duration: ${{ env.DEPLOYMENT_DURATION }}
update-message-ts: ${{ steps.notify-start.outputs.message-ts }}

- name: Notify setup failure
if: failure()
uses: unepwcmc/devops-actions/.github/actions/slack-notify@v1
with:
slack-bot-token: ${{ secrets.SLACK_BOT_TOKEN }}
slack-channel-id: ${{ secrets.SLACK_CHANNEL_ID }}
notification-type: failure
action-type: Setup
environment: ${{ github.event.inputs.environment }}
repository: ${{ github.repository }}
repository-url: ${{ github.server_url }}/${{ github.repository }}
action-run-url: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}
actor: ${{ github.actor }}
actor-url: ${{ github.server_url }}/${{ github.actor }}
workflow-name: ${{ github.workflow }}
run-id: ${{ github.run_id }}
commit-message: ${{ github.event.head_commit.message || 'Manual workflow trigger' }}
runner-name: ${{ runner.name }}
start-time: ${{ env.START_TIME }}
end-time: ${{ env.END_TIME }}
deployment-duration: ${{ env.DEPLOYMENT_DURATION }}
update-message-ts: ${{ steps.notify-start.outputs.message-ts }}
Loading