Update release pipeline for correct secret names and simplified ZIP naming #34

Merged
Copilot merged 7 commits from copilot/create-build-scripts-for-releases into main 2026-01-05 08:36:52 +00:00
6 changed files with 65 additions and 70 deletions

View File

@@ -483,7 +483,7 @@ else:
- name: Validate required secrets and variables - name: Validate required secrets and variables
env: env:
FTP_HOST: ${{ secrets.FTP_HOST }} FTP_SERVER: ${{ secrets.FTP_SERVER }}
FTP_USER: ${{ secrets.FTP_USER }} FTP_USER: ${{ secrets.FTP_USER }}
FTP_KEY: ${{ secrets.FTP_KEY }} FTP_KEY: ${{ secrets.FTP_KEY }}
FTP_PASSWORD: ${{ secrets.FTP_PASSWORD }} FTP_PASSWORD: ${{ secrets.FTP_PASSWORD }}
@@ -498,7 +498,7 @@ else:
missing=() missing=()
[ -n "${FTP_HOST:-}" ] || missing+=("FTP_HOST") [ -n "${FTP_SERVER:-}" ] || missing+=("FTP_SERVER")
[ -n "${FTP_USER:-}" ] || missing+=("FTP_USER") [ -n "${FTP_USER:-}" ] || missing+=("FTP_USER")
[ -n "${FTP_PATH:-}" ] || missing+=("FTP_PATH") [ -n "${FTP_PATH:-}" ] || missing+=("FTP_PATH")
@@ -643,7 +643,7 @@ else:
echo "```" echo "```"
} >> "${GITHUB_STEP_SUMMARY}" } >> "${GITHUB_STEP_SUMMARY}"
- name: Build Joomla/Dolibarr ZIP (platform-aware, src-only archive) - name: Build Joomla/Dolibarr ZIP (src-only archive)
id: build id: build
run: | run: |
set -euo pipefail set -euo pipefail
@@ -657,51 +657,46 @@ else:
DIST_DIR="${GITHUB_WORKSPACE}/dist" DIST_DIR="${GITHUB_WORKSPACE}/dist"
mkdir -p "${DIST_DIR}" mkdir -p "${DIST_DIR}"
# Detect platform and extension type using dedicated script # Determine suffix based on channel
if ! PLATFORM_INFO=$(python3 "${GITHUB_WORKSPACE}/scripts/release/detect_platform.py" "${GITHUB_WORKSPACE}/src"); then if [ "${CHANNEL}" = "rc" ]; then
echo "ERROR: Could not detect extension platform and type" >> "${GITHUB_STEP_SUMMARY}" SUFFIX="rc"
exit 1 else
SUFFIX="stable"
fi fi
if [ -z "${PLATFORM_INFO}" ]; then
echo "ERROR: Platform detection returned empty result" >> "${GITHUB_STEP_SUMMARY}"
exit 1
fi
PLATFORM="${PLATFORM_INFO%%|*}"
EXT_TYPE="${PLATFORM_INFO##*|}"
ZIP="${REPO_NAME}-${VERSION}-${CHANNEL}-${PLATFORM}-${EXT_TYPE}.zip" ZIP="${REPO_NAME}-${VERSION}-${SUFFIX}.zip"
# Create ZIP with development artifact exclusions # Create ZIP with development artifact exclusions
zip -r -X "${DIST_DIR}/${ZIP}" src \ # Zip only the contents of the src folder (not the src/ folder itself)
-x "src/**/.git/**" \ # This creates a ZIP with extension files at the root level for direct installation
-x "src/**/.github/**" \ cd src
-x "src/**/.DS_Store" \ zip -r -X "${DIST_DIR}/${ZIP}" . \
-x "src/**/__MACOSX/**" \ -x ".git/**" \
-x "src/**/node_modules/**" \ -x ".github/**" \
-x "src/**/vendor/**" \ -x ".DS_Store" \
-x "src/**/tests/**" \ -x "__MACOSX/**" \
-x "src/**/Tests/**" \ -x "node_modules/**" \
-x "src/**/.phpstan.cache/**" \ -x "vendor/**" \
-x "src/**/.psalm/**" \ -x "tests/**" \
-x "src/**/.rector/**" \ -x "Tests/**" \
-x "src/**/phpmd-cache/**" \ -x ".phpstan.cache/**" \
-x "src/**/.php-cs-fixer.cache" \ -x ".psalm/**" \
-x "src/**/.phplint-cache" \ -x ".rector/**" \
-x "src/**/*.log" -x "phpmd-cache/**" \
-x ".php-cs-fixer.cache" \
-x ".phplint-cache" \
-x "*.log"
cd ..
echo "zip_name=${ZIP}" >> "${GITHUB_OUTPUT}" echo "zip_name=${ZIP}" >> "${GITHUB_OUTPUT}"
echo "dist_dir=${DIST_DIR}" >> "${GITHUB_OUTPUT}" echo "dist_dir=${DIST_DIR}" >> "${GITHUB_OUTPUT}"
echo "platform=${PLATFORM}" >> "${GITHUB_OUTPUT}"
echo "ext_type=${EXT_TYPE}" >> "${GITHUB_OUTPUT}"
ZIP_BYTES="$(stat -c%s "${DIST_DIR}/${ZIP}")" ZIP_BYTES="$(stat -c%s "${DIST_DIR}/${ZIP}")"
{ {
echo "### Build report" echo "### Build report"
echo "```json" echo "```json"
echo "{\"repository\":\"${GITHUB_REPOSITORY}\",\"workflow\":\"${GITHUB_WORKFLOW}\",\"job\":\"${GITHUB_JOB}\",\"run/id\":${GITHUB_RUN_ID},\"run/number\":${GITHUB_RUN_NUMBER},\"run/attempt\":${GITHUB_RUN_ATTEMPT},\"run/url\":\"${GITHUB_SERVER_URL}/${GITHUB_REPOSITORY}/actions/runs/${GITHUB_RUN_ID}\",\"actor\":\"${GITHUB_ACTOR}\",\"sha\":\"${GITHUB_SHA}\",\"archive_policy\":\"src_only\",\"platform\":\"${PLATFORM}\",\"extension_type\":\"${EXT_TYPE}\",\"zip\":\"${DIST_DIR}/${ZIP}\",\"zip_bytes\":${ZIP_BYTES}}" echo "{\"repository\":\"${GITHUB_REPOSITORY}\",\"workflow\":\"${GITHUB_WORKFLOW}\",\"job\":\"${GITHUB_JOB}\",\"run/id\":${GITHUB_RUN_ID},\"run/number\":${GITHUB_RUN_NUMBER},\"run/attempt\":${GITHUB_RUN_ATTEMPT},\"run/url\":\"${GITHUB_SERVER_URL}/${GITHUB_REPOSITORY}/actions/runs/${GITHUB_RUN_ID}\",\"actor\":\"${GITHUB_ACTOR}\",\"sha\":\"${GITHUB_SHA}\",\"archive_policy\":\"src_only\",\"suffix\":\"${SUFFIX}\",\"zip\":\"${DIST_DIR}/${ZIP}\",\"zip_bytes\":${ZIP_BYTES}}"
echo "```" echo "```"
} >> "${GITHUB_STEP_SUMMARY}" } >> "${GITHUB_STEP_SUMMARY}"
@@ -725,7 +720,7 @@ else:
- name: Upload ZIP to SFTP (key-preferred, password-fallback, overwrite, verified) - name: Upload ZIP to SFTP (key-preferred, password-fallback, overwrite, verified)
id: sftp id: sftp
env: env:
FTP_HOST: ${{ secrets.FTP_HOST }} FTP_SERVER: ${{ secrets.FTP_SERVER }}
FTP_USER: ${{ secrets.FTP_USER }} FTP_USER: ${{ secrets.FTP_USER }}
FTP_KEY: ${{ secrets.FTP_KEY }} FTP_KEY: ${{ secrets.FTP_KEY }}
FTP_PASSWORD: ${{ secrets.FTP_PASSWORD }} FTP_PASSWORD: ${{ secrets.FTP_PASSWORD }}
@@ -741,7 +736,7 @@ else:
ZIP="${{ steps.build.outputs.zip_name }}" ZIP="${{ steps.build.outputs.zip_name }}"
DIST_DIR="${{ steps.build.outputs.dist_dir }}" DIST_DIR="${{ steps.build.outputs.dist_dir }}"
: "${FTP_HOST:?Missing secret FTP_HOST}" : "${FTP_SERVER:?Missing secret FTP_SERVER}"
: "${FTP_USER:?Missing secret FTP_USER}" : "${FTP_USER:?Missing secret FTP_USER}"
: "${FTP_PATH:?Missing secret FTP_PATH}" : "${FTP_PATH:?Missing secret FTP_PATH}"
@@ -753,9 +748,9 @@ else:
PORT="${FTP_PORT:-}" PORT="${FTP_PORT:-}"
if [ -n "${PORT}" ]; then if [ -n "${PORT}" ]; then
HOSTPORT="${FTP_HOST}:${PORT}" HOSTPORT="${FTP_SERVER}:${PORT}"
else else
HOSTPORT="${FTP_HOST}" HOSTPORT="${FTP_SERVER}"
fi fi
SUFFIX="${FTP_PATH_SUFFIX:-}" SUFFIX="${FTP_PATH_SUFFIX:-}"
@@ -786,7 +781,7 @@ else:
printf '{' printf '{'
printf '"protocol":"sftp",' printf '"protocol":"sftp",'
printf '"auth_mode":"%s",' "${AUTH_MODE}" printf '"auth_mode":"%s",' "${AUTH_MODE}"
printf '"host":"%s",' "${FTP_HOST}" printf '"host":"%s",' "${FTP_SERVER}"
printf '"port":"%s",' "${PORT:-default}" printf '"port":"%s",' "${PORT:-default}"
printf '"remote_path":"%s",' "${REMOTE_PATH}" printf '"remote_path":"%s",' "${REMOTE_PATH}"
printf '"overwrite":true,' printf '"overwrite":true,'
@@ -826,7 +821,7 @@ else:
fi fi
fi fi
ssh-keyscan -H "${FTP_HOST}" >> ~/.ssh/known_hosts ssh-keyscan -H "${FTP_SERVER}" >> ~/.ssh/known_hosts
if [ "${AUTH_MODE}" = "key" ]; then if [ "${AUTH_MODE}" = "key" ]; then
CONNECT="set sftp:connect-program 'ssh -a -x -i ~/.ssh/id_rsa -o PubkeyAuthentication=yes -o PasswordAuthentication=no'" CONNECT="set sftp:connect-program 'ssh -a -x -i ~/.ssh/id_rsa -o PubkeyAuthentication=yes -o PasswordAuthentication=no'"
@@ -840,7 +835,7 @@ else:
echo "Dry run enabled. Upload skipped." >> "${GITHUB_STEP_SUMMARY}" echo "Dry run enabled. Upload skipped." >> "${GITHUB_STEP_SUMMARY}"
echo "auth_mode=${AUTH_MODE}" >> "${GITHUB_OUTPUT}" echo "auth_mode=${AUTH_MODE}" >> "${GITHUB_OUTPUT}"
echo "remote_path=${REMOTE_PATH}" >> "${GITHUB_OUTPUT}" echo "remote_path=${REMOTE_PATH}" >> "${GITHUB_OUTPUT}"
echo "host=${FTP_HOST}" >> "${GITHUB_OUTPUT}" echo "host=${FTP_SERVER}" >> "${GITHUB_OUTPUT}"
echo "port=${PORT:-default}" >> "${GITHUB_OUTPUT}" echo "port=${PORT:-default}" >> "${GITHUB_OUTPUT}"
exit 0 exit 0
fi fi
@@ -877,13 +872,13 @@ else:
{ {
echo "### SFTP upload report" echo "### SFTP upload report"
echo "```json" echo "```json"
echo "{\"status\":\"ok\",\"protocol\":\"sftp\",\"auth_mode\":\"${AUTH_MODE}\",\"host\":\"${FTP_HOST}\",\"port\":\"${PORT:-default}\",\"remote_path\":\"${REMOTE_PATH}\",\"zip\":\"${ZIP}\",\"zip_bytes_local\":${ZIP_BYTES_LOCAL},\"overwrite\":true}" echo "{\"status\":\"ok\",\"protocol\":\"sftp\",\"auth_mode\":\"${AUTH_MODE}\",\"host\":\"${FTP_SERVER}\",\"port\":\"${PORT:-default}\",\"remote_path\":\"${REMOTE_PATH}\",\"zip\":\"${ZIP}\",\"zip_bytes_local\":${ZIP_BYTES_LOCAL},\"overwrite\":true}"
echo "```" echo "```"
} >> "${GITHUB_STEP_SUMMARY}" } >> "${GITHUB_STEP_SUMMARY}"
echo "auth_mode=${AUTH_MODE}" >> "${GITHUB_OUTPUT}" echo "auth_mode=${AUTH_MODE}" >> "${GITHUB_OUTPUT}"
echo "remote_path=${REMOTE_PATH}" >> "${GITHUB_OUTPUT}" echo "remote_path=${REMOTE_PATH}" >> "${GITHUB_OUTPUT}"
echo "host=${FTP_HOST}" >> "${GITHUB_OUTPUT}" echo "host=${FTP_SERVER}" >> "${GITHUB_OUTPUT}"
echo "port=${PORT:-default}" >> "${GITHUB_OUTPUT}" echo "port=${PORT:-default}" >> "${GITHUB_OUTPUT}"
- name: Create Git tag - name: Create Git tag

View File

@@ -30,7 +30,7 @@ env:
ALLOWED_SFTP_PROTOCOLS: sftp ALLOWED_SFTP_PROTOCOLS: sftp
# Release policy # Release policy
RELEASE_REQUIRED_VARS: FTP_HOST,FTP_USER,FTP_PATH RELEASE_REQUIRED_VARS: FTP_SERVER,FTP_USER,FTP_PATH
RELEASE_OPTIONAL_VARS: FTP_KEY,FTP_PASSWORD,FTP_PROTOCOL,FTP_PORT,FTP_PATH_SUFFIX RELEASE_OPTIONAL_VARS: FTP_KEY,FTP_PASSWORD,FTP_PROTOCOL,FTP_PORT,FTP_PATH_SUFFIX
# Scripts governance policy # Scripts governance policy
@@ -125,7 +125,7 @@ jobs:
- name: Guardrails release vars - name: Guardrails release vars
env: env:
PROFILE_RAW: ${{ github.event.inputs.profile }} PROFILE_RAW: ${{ github.event.inputs.profile }}
FTP_HOST: ${{ secrets.FTP_HOST }} FTP_SERVER: ${{ secrets.FTP_SERVER }}
FTP_USER: ${{ secrets.FTP_USER }} FTP_USER: ${{ secrets.FTP_USER }}
FTP_KEY: ${{ secrets.FTP_KEY }} FTP_KEY: ${{ secrets.FTP_KEY }}
FTP_PASSWORD: ${{ secrets.FTP_PASSWORD }} FTP_PASSWORD: ${{ secrets.FTP_PASSWORD }}
@@ -236,7 +236,7 @@ jobs:
- name: Guardrails SFTP connectivity - name: Guardrails SFTP connectivity
env: env:
PROFILE_RAW: ${{ github.event.inputs.profile }} PROFILE_RAW: ${{ github.event.inputs.profile }}
FTP_HOST: ${{ secrets.FTP_HOST }} FTP_SERVER: ${{ secrets.FTP_SERVER }}
FTP_USER: ${{ secrets.FTP_USER }} FTP_USER: ${{ secrets.FTP_USER }}
FTP_KEY: ${{ secrets.FTP_KEY }} FTP_KEY: ${{ secrets.FTP_KEY }}
FTP_PASSWORD: ${{ secrets.FTP_PASSWORD }} FTP_PASSWORD: ${{ secrets.FTP_PASSWORD }}
@@ -288,7 +288,7 @@ jobs:
printf '%s\n' '### SFTP connectivity' printf '%s\n' '### SFTP connectivity'
printf '%s\n' '| Control | Value |' printf '%s\n' '| Control | Value |'
printf '%s\n' '|---|---|' printf '%s\n' '|---|---|'
printf '%s\n' "| Host | ${FTP_HOST} |" printf '%s\n' "| Host | ${FTP_SERVER} |"
printf '%s\n' "| User | ${FTP_USER} |" printf '%s\n' "| User | ${FTP_USER} |"
printf '%s\n' "| Port | ${port} |" printf '%s\n' "| Port | ${port} |"
printf '%s\n' "| Auth | ${auth_method} |" printf '%s\n' "| Auth | ${auth_method} |"
@@ -319,11 +319,11 @@ jobs:
ssh-keygen -p -P "${FTP_PASSWORD}" -N '' -f "${key_file}" >/dev/null ssh-keygen -p -P "${FTP_PASSWORD}" -N '' -f "${key_file}" >/dev/null
fi fi
printf '%s' "${sftp_cmds}" | sftp "${sftp_v_opt[@]}" -oBatchMode=yes -oStrictHostKeyChecking=no -P "${port}" -i "${key_file}" "${FTP_USER}@${FTP_HOST}" >/tmp/sftp_check.log 2>&1 printf '%s' "${sftp_cmds}" | sftp "${sftp_v_opt[@]}" -oBatchMode=yes -oStrictHostKeyChecking=no -P "${port}" -i "${key_file}" "${FTP_USER}@${FTP_SERVER}" >/tmp/sftp_check.log 2>&1
sftp_rc=$? sftp_rc=$?
elif [ -n "${FTP_PASSWORD:-}" ]; then elif [ -n "${FTP_PASSWORD:-}" ]; then
command -v sshpass >/dev/null 2>&1 || (sudo apt-get update -qq && sudo apt-get install -y sshpass >/dev/null) command -v sshpass >/dev/null 2>&1 || (sudo apt-get update -qq && sudo apt-get install -y sshpass >/dev/null)
printf '%s' "${sftp_cmds}" | sshpass -p "${FTP_PASSWORD}" sftp "${sftp_v_opt[@]}" -oBatchMode=no -oStrictHostKeyChecking=no -P "${port}" "${FTP_USER}@${FTP_HOST}" >/tmp/sftp_check.log 2>&1 printf '%s' "${sftp_cmds}" | sshpass -p "${FTP_PASSWORD}" sftp "${sftp_v_opt[@]}" -oBatchMode=no -oStrictHostKeyChecking=no -P "${port}" "${FTP_USER}@${FTP_SERVER}" >/tmp/sftp_check.log 2>&1
sftp_rc=$? sftp_rc=$?
else else
{ {

View File

@@ -193,7 +193,7 @@ on:
required: true required: true
type: string type: string
secrets: secrets:
FTP_HOST: FTP_SERVER:
required: true required: true
FTP_USER: FTP_USER:
required: true required: true
@@ -246,7 +246,7 @@ jobs:
### Secrets to Configure ### Secrets to Configure
**In .github-private repository:** **In .github-private repository:**
- Deployment credentials (FTP_HOST, FTP_USER, FTP_KEY, etc.) - Deployment credentials (FTP_SERVER, FTP_USER, FTP_KEY, etc.)
- API tokens for external services - API tokens for external services
- Signing keys - Signing keys
@@ -481,7 +481,7 @@ If issues arise during migration:
``` ```
Organization Level (Settings > Secrets and Variables) Organization Level (Settings > Secrets and Variables)
├── Secrets ├── Secrets
│ ├── FTP_HOST (inherited by all repos) │ ├── FTP_SERVER (inherited by all repos)
│ ├── FTP_USER (inherited by all repos) │ ├── FTP_USER (inherited by all repos)
│ ├── FTP_KEY (inherited by all repos) │ ├── FTP_KEY (inherited by all repos)
│ ├── FTP_PASSWORD (inherited by all repos) │ ├── FTP_PASSWORD (inherited by all repos)

View File

@@ -75,7 +75,7 @@ This checklist guides the migration of CI/CD workflows from individual repositor
## Phase 3: Secrets and Variables Setup ## Phase 3: Secrets and Variables Setup
### Organization-Level Secrets ### Organization-Level Secrets
- [ ] Migrate FTP_HOST to organization secrets - [ ] Migrate FTP_SERVER to organization secrets
- [ ] Migrate FTP_USER to organization secrets - [ ] Migrate FTP_USER to organization secrets
- [ ] Migrate FTP_KEY to organization secrets (if used) - [ ] Migrate FTP_KEY to organization secrets (if used)
- [ ] Migrate FTP_PASSWORD to organization secrets (if used) - [ ] Migrate FTP_PASSWORD to organization secrets (if used)
@@ -406,13 +406,13 @@ fi
- name: Pre-Deployment Validation - name: Pre-Deployment Validation
run: | run: |
# Verify deployment prerequisites # Verify deployment prerequisites
if [ -z "${{ secrets.FTP_HOST }}" ]; then if [ -z "${{ secrets.FTP_SERVER }}" ]; then
echo "❌ FTP_HOST not configured" echo "❌ FTP_SERVER not configured"
exit 1 exit 1
fi fi
# Test connectivity # Test connectivity
nc -zv ${{ secrets.FTP_HOST }} 22 || exit 1 nc -zv ${{ secrets.FTP_SERVER }} 22 || exit 1
# Verify artifact exists # Verify artifact exists
if [ ! -f deployment.zip ]; then if [ ! -f deployment.zip ]; then
@@ -428,7 +428,7 @@ fi
- name: Backup Current Deployment - name: Backup Current Deployment
run: | run: |
# Create backup of current deployment # Create backup of current deployment
ssh ${{ secrets.FTP_USER }}@${{ secrets.FTP_HOST }} \ ssh ${{ secrets.FTP_USER }}@${{ secrets.FTP_SERVER }} \
"cd ${{ secrets.FTP_PATH }} && tar -czf backup-$(date +%Y%m%d-%H%M%S).tar.gz ." "cd ${{ secrets.FTP_PATH }} && tar -czf backup-$(date +%Y%m%d-%H%M%S).tar.gz ."
echo "✅ Backup created" echo "✅ Backup created"
@@ -437,9 +437,9 @@ fi
id: deploy id: deploy
run: | run: |
# Deploy new version # Deploy new version
scp deployment.zip ${{ secrets.FTP_USER }}@${{ secrets.FTP_HOST }}:${{ secrets.FTP_PATH }}/ scp deployment.zip ${{ secrets.FTP_USER }}@${{ secrets.FTP_SERVER }}:${{ secrets.FTP_PATH }}/
ssh ${{ secrets.FTP_USER }}@${{ secrets.FTP_HOST }} \ ssh ${{ secrets.FTP_USER }}@${{ secrets.FTP_SERVER }} \
"cd ${{ secrets.FTP_PATH }} && unzip -o deployment.zip" "cd ${{ secrets.FTP_PATH }} && unzip -o deployment.zip"
echo "✅ Deployment successful" echo "✅ Deployment successful"
@@ -465,10 +465,10 @@ fi
echo "⚠️ Deployment failed, rolling back..." echo "⚠️ Deployment failed, rolling back..."
# Restore from backup # Restore from backup
BACKUP=$(ssh ${{ secrets.FTP_USER }}@${{ secrets.FTP_HOST }} \ BACKUP=$(ssh ${{ secrets.FTP_USER }}@${{ secrets.FTP_SERVER }} \
"cd ${{ secrets.FTP_PATH }} && ls -t backup-*.tar.gz | head -1") "cd ${{ secrets.FTP_PATH }} && ls -t backup-*.tar.gz | head -1")
ssh ${{ secrets.FTP_USER }}@${{ secrets.FTP_HOST }} \ ssh ${{ secrets.FTP_USER }}@${{ secrets.FTP_SERVER }} \
"cd ${{ secrets.FTP_PATH }} && tar -xzf $BACKUP" "cd ${{ secrets.FTP_PATH }} && tar -xzf $BACKUP"
echo "✅ Rollback completed" echo "✅ Rollback completed"
@@ -1102,7 +1102,7 @@ fi
echo "=== Checking Secret Access ===" echo "=== Checking Secret Access ==="
SECRETS=( SECRETS=(
"FTP_HOST" "FTP_SERVER"
"FTP_USER" "FTP_USER"
"FTP_PASSWORD" "FTP_PASSWORD"
"FTP_PATH" "FTP_PATH"

View File

@@ -292,7 +292,7 @@ on:
type: string type: string
default: 'joomla' default: 'joomla'
secrets: secrets:
FTP_HOST: FTP_SERVER:
required: true required: true
FTP_USER: FTP_USER:
required: true required: true
@@ -425,7 +425,7 @@ on:
type: boolean type: boolean
default: false default: false
secrets: secrets:
FTP_HOST: FTP_SERVER:
required: true required: true
FTP_USER: FTP_USER:
required: true required: true
@@ -506,7 +506,7 @@ jobs:
# Upload via SFTP # Upload via SFTP
lftp -c " lftp -c "
set sftp:auto-confirm yes; set sftp:auto-confirm yes;
open sftp://${{ secrets.FTP_USER }}:${{ secrets.FTP_PASSWORD }}@${{ secrets.FTP_HOST }}; open sftp://${{ secrets.FTP_USER }}:${{ secrets.FTP_PASSWORD }}@${{ secrets.FTP_SERVER }};
cd ${{ secrets.FTP_PATH }}; cd ${{ secrets.FTP_PATH }};
put deployment.tar.gz; put deployment.tar.gz;
quit quit
@@ -703,7 +703,7 @@ on:
required: true required: true
type: string type: string
secrets: secrets:
FTP_HOST: FTP_SERVER:
required: true required: true
FTP_USER: FTP_USER:
required: true required: true
@@ -1010,7 +1010,7 @@ on:
type: boolean type: boolean
default: false default: false
secrets: secrets:
FTP_HOST: FTP_SERVER:
required: true required: true
FTP_USER: FTP_USER:
required: true required: true
@@ -1179,7 +1179,7 @@ gh secret set ACTIONS_RUNNER_DEBUG --body "true"
echo '${{ toJson(inputs) }}' echo '${{ toJson(inputs) }}'
echo "=== Secrets (names only) ===" echo "=== Secrets (names only) ==="
echo "FTP_HOST: ${{ secrets.FTP_HOST != '' && 'SET' || 'NOT SET' }}" echo "FTP_SERVER: ${{ secrets.FTP_SERVER != '' && 'SET' || 'NOT SET' }}"
``` ```
### Common Error Patterns and Solutions ### Common Error Patterns and Solutions

View File

@@ -355,7 +355,7 @@ git push origin --delete dev/03.05.00
#### "Missing required secrets" #### "Missing required secrets"
Go to repository Settings → Secrets and variables → Actions, and add: Go to repository Settings → Secrets and variables → Actions, and add:
- `FTP_HOST` - `FTP_SERVER`
- `FTP_USER` - `FTP_USER`
- `FTP_KEY` or `FTP_PASSWORD` - `FTP_KEY` or `FTP_PASSWORD`
- `FTP_PATH` - `FTP_PATH`