chore(ci): use Forgejo build and CDN publishing
All checks were successful
Build MapleDeploy Coolify Image / build (push) Successful in 37s
All checks were successful
Build MapleDeploy Coolify Image / build (push) Successful in 37s
This commit is contained in:
parent
9788faf6b1
commit
3e29b3fff5
19 changed files with 109 additions and 2046 deletions
109
.forgejo/workflows/build.yml
Normal file
109
.forgejo/workflows/build.yml
Normal file
|
|
@ -0,0 +1,109 @@
|
||||||
|
name: Build MapleDeploy Coolify Image
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches: [mapledeploy]
|
||||||
|
paths-ignore:
|
||||||
|
- "*.md"
|
||||||
|
- ".github/**"
|
||||||
|
|
||||||
|
env:
|
||||||
|
REGISTRY: forgejo.mapledeploy.ca
|
||||||
|
CDN_STORAGE_ZONE: coolify-update
|
||||||
|
CDN_PULL_ZONE_ID: "5338895"
|
||||||
|
CDN_BASE_URL: https://updates.mapledeploy.ca
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Get version
|
||||||
|
id: version
|
||||||
|
run: |
|
||||||
|
# Match both "'version' => '4.3.12'" and "'version' => env('COOLIFY_VERSION') ?: '4.3.12'"
|
||||||
|
# (greedy .* means the capture takes the last quoted string on the line)
|
||||||
|
BASE_VERSION=$(sed -n "s/.*'version' => .*'\([^']*\)'.*/\1/p" config/constants.php | head -1)
|
||||||
|
if [ -z "$BASE_VERSION" ]; then
|
||||||
|
echo "ERROR: could not extract base version from config/constants.php" >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
TIMESTAMP=$(date -u +%Y%m%d%H%M)
|
||||||
|
VERSION="${BASE_VERSION}.${TIMESTAMP}"
|
||||||
|
HELPER_VERSION=$(sed -n "s/.*'helper_version' => '\([^']*\)'.*/\1/p" config/constants.php)
|
||||||
|
REALTIME_VERSION=$(sed -n "s/.*'realtime_version' => '\([^']*\)'.*/\1/p" config/constants.php)
|
||||||
|
echo "VERSION=${VERSION}" >> "$GITHUB_OUTPUT"
|
||||||
|
echo "HELPER_VERSION=${HELPER_VERSION}" >> "$GITHUB_OUTPUT"
|
||||||
|
echo "REALTIME_VERSION=${REALTIME_VERSION}" >> "$GITHUB_OUTPUT"
|
||||||
|
echo "Building version: ${VERSION} (helper: ${HELPER_VERSION}, realtime: ${REALTIME_VERSION})"
|
||||||
|
|
||||||
|
- name: Login to Forgejo registry
|
||||||
|
run: |
|
||||||
|
echo "${{ secrets.FORGEJO_TOKEN }}" | docker login ${{ env.REGISTRY }} -u ${{ github.repository_owner }} --password-stdin
|
||||||
|
|
||||||
|
- name: Build image
|
||||||
|
run: |
|
||||||
|
DOCKER_BUILDKIT=1 docker build -f docker/production/Dockerfile \
|
||||||
|
--build-arg MAPLEDEPLOY_VERSION=${{ steps.version.outputs.VERSION }} \
|
||||||
|
-t ${{ env.REGISTRY }}/${{ github.repository }}:${{ steps.version.outputs.VERSION }} \
|
||||||
|
-t ${{ env.REGISTRY }}/${{ github.repository }}:latest \
|
||||||
|
.
|
||||||
|
|
||||||
|
- name: Push image
|
||||||
|
run: |
|
||||||
|
docker push ${{ env.REGISTRY }}/${{ github.repository }}:${{ steps.version.outputs.VERSION }}
|
||||||
|
docker push ${{ env.REGISTRY }}/${{ github.repository }}:latest
|
||||||
|
|
||||||
|
- name: Generate versions.json
|
||||||
|
run: |
|
||||||
|
cat > versions.json <<EOF
|
||||||
|
{
|
||||||
|
"coolify": {
|
||||||
|
"v4": {
|
||||||
|
"version": "${{ steps.version.outputs.VERSION }}"
|
||||||
|
},
|
||||||
|
"helper": {
|
||||||
|
"version": "${{ steps.version.outputs.HELPER_VERSION }}"
|
||||||
|
},
|
||||||
|
"realtime": {
|
||||||
|
"version": "${{ steps.version.outputs.REALTIME_VERSION }}"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
EOF
|
||||||
|
echo "Generated versions.json:"
|
||||||
|
cat versions.json
|
||||||
|
|
||||||
|
- name: Install curl
|
||||||
|
run: apk add --no-cache curl
|
||||||
|
|
||||||
|
- name: Upload artifacts to Bunny CDN
|
||||||
|
run: |
|
||||||
|
STORAGE_URL="https://storage.bunnycdn.com/${{ env.CDN_STORAGE_ZONE }}/coolify"
|
||||||
|
|
||||||
|
upload() {
|
||||||
|
local file="$1"
|
||||||
|
local dest="$2"
|
||||||
|
echo "Uploading ${file} -> ${dest}"
|
||||||
|
curl -fsSL -X PUT "${STORAGE_URL}/${dest}" \
|
||||||
|
-H "AccessKey: ${{ secrets.BUNNY_CDN_STORAGE_KEY }}" \
|
||||||
|
-H "Content-Type: application/octet-stream" \
|
||||||
|
--data-binary @"${file}"
|
||||||
|
}
|
||||||
|
|
||||||
|
upload versions.json versions.json
|
||||||
|
upload scripts/upgrade.sh upgrade.sh
|
||||||
|
upload scripts/upgrade-postgres.sh upgrade-postgres.sh
|
||||||
|
upload docker-compose.yml docker-compose.yml
|
||||||
|
upload docker-compose.prod.yml docker-compose.prod.yml
|
||||||
|
upload .env.production .env.production
|
||||||
|
|
||||||
|
echo "All artifacts uploaded."
|
||||||
|
|
||||||
|
- name: Purge CDN cache
|
||||||
|
run: |
|
||||||
|
curl -fsSL -X POST "https://api.bunny.net/pullzone/${{ env.CDN_PULL_ZONE_ID }}/purgeCache" \
|
||||||
|
-H "AccessKey: ${{ secrets.BUNNY_API_KEY }}" \
|
||||||
|
-H "Content-Type: application/json"
|
||||||
|
echo "CDN cache purged."
|
||||||
|
|
@ -1,22 +0,0 @@
|
||||||
name: Lock closed Issues, Discussions, and PRs
|
|
||||||
|
|
||||||
on:
|
|
||||||
schedule:
|
|
||||||
- cron: '0 1 * * *'
|
|
||||||
|
|
||||||
permissions:
|
|
||||||
issues: write
|
|
||||||
discussions: write
|
|
||||||
pull-requests: write
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
lock-threads:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- name: Lock threads after 30 days of inactivity
|
|
||||||
uses: dessant/lock-threads@89ae32b08ed1a541efecbab17912962a5e38981c # v6.0.2
|
|
||||||
with:
|
|
||||||
github-token: ${{ secrets.GITHUB_TOKEN }}
|
|
||||||
issue-inactive-days: '30'
|
|
||||||
discussion-inactive-days: '30'
|
|
||||||
pr-inactive-days: '30'
|
|
||||||
182
.github/workflows/chore-manage-pr-branch.yaml
vendored
182
.github/workflows/chore-manage-pr-branch.yaml
vendored
|
|
@ -1,182 +0,0 @@
|
||||||
name: Manage PR Branch
|
|
||||||
|
|
||||||
# Runs *after* the "PR Quality" workflow finishes. This is required because
|
|
||||||
# PR Quality may close a PR that fails its checks, so we must wait for it to
|
|
||||||
# complete before deciding whether to retarget the PR's base branch.
|
|
||||||
on:
|
|
||||||
workflow_run:
|
|
||||||
workflows: ["PR Quality"]
|
|
||||||
types:
|
|
||||||
- completed
|
|
||||||
|
|
||||||
permissions:
|
|
||||||
contents: read
|
|
||||||
pull-requests: write
|
|
||||||
|
|
||||||
concurrency:
|
|
||||||
group: manage-pr-branch-${{ github.event.workflow_run.head_sha }}
|
|
||||||
cancel-in-progress: true
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
manage-branch:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- name: Retarget PR base branch based on category
|
|
||||||
uses: actions/github-script@v7
|
|
||||||
with:
|
|
||||||
script: |
|
|
||||||
const run = context.payload.workflow_run;
|
|
||||||
|
|
||||||
// Branch routing based on the "Category" section of the PR body.
|
|
||||||
// Bug fixes and one-click service changes ship in patch releases -> main.
|
|
||||||
// Everything else (features, improvements) -> next.
|
|
||||||
const MAIN_BRANCH = 'main';
|
|
||||||
const NEXT_BRANCH = 'next';
|
|
||||||
|
|
||||||
// Maintainers/collaborators are trusted to pick their own base branch.
|
|
||||||
const EXEMPT_ASSOCIATIONS = new Set(['OWNER', 'MEMBER', 'COLLABORATOR']);
|
|
||||||
|
|
||||||
// Resolve the open PR from the triggering run.
|
|
||||||
//
|
|
||||||
// PR Quality runs on `pull_request_target`, so `run.head_sha` is the
|
|
||||||
// *base* branch tip, not the PR head — a commit-based lookup finds
|
|
||||||
// nothing. Instead match on the source branch (`head_branch`) and its
|
|
||||||
// owner (`head_repository.owner.login`), which uniquely identify the PR
|
|
||||||
// via the `owner:branch` head filter. This also works for forked PRs,
|
|
||||||
// where `workflow_run.pull_requests` is empty.
|
|
||||||
const headOwner = run.head_repository?.owner?.login;
|
|
||||||
const headBranch = run.head_branch;
|
|
||||||
|
|
||||||
let prRef;
|
|
||||||
if (headOwner && headBranch) {
|
|
||||||
const { data: openPrs } = await github.rest.pulls.list({
|
|
||||||
owner: context.repo.owner,
|
|
||||||
repo: context.repo.repo,
|
|
||||||
state: 'open',
|
|
||||||
head: `${headOwner}:${headBranch}`,
|
|
||||||
per_page: 100,
|
|
||||||
});
|
|
||||||
prRef = openPrs[0];
|
|
||||||
}
|
|
||||||
|
|
||||||
// Fallback: same-repo PRs may also be resolvable by commit association.
|
|
||||||
if (!prRef) {
|
|
||||||
const { data: associated } = await github.rest.repos.listPullRequestsAssociatedWithCommit({
|
|
||||||
owner: context.repo.owner,
|
|
||||||
repo: context.repo.repo,
|
|
||||||
commit_sha: run.head_sha,
|
|
||||||
});
|
|
||||||
prRef = associated.find(pr => pr.state === 'open');
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!prRef) {
|
|
||||||
core.info('No open PR associated with this run (possibly closed by PR Quality). Skipping.');
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Fetch the full PR to get an up-to-date body, base ref, and state.
|
|
||||||
const { data: pr } = await github.rest.pulls.get({
|
|
||||||
owner: context.repo.owner,
|
|
||||||
repo: context.repo.repo,
|
|
||||||
pull_number: prRef.number,
|
|
||||||
});
|
|
||||||
|
|
||||||
if (pr.state !== 'open') {
|
|
||||||
core.info(`PR #${pr.number} is not open. Skipping.`);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Skip PRs opened by owners/members/collaborators — they choose their own base.
|
|
||||||
if (EXEMPT_ASSOCIATIONS.has(pr.author_association)) {
|
|
||||||
core.info(`PR #${pr.number} author association is ${pr.author_association}. Skipping.`);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Skip if a maintainer has already changed the base branch manually.
|
|
||||||
const timeline = await github.paginate(github.rest.issues.listEventsForTimeline, {
|
|
||||||
owner: context.repo.owner,
|
|
||||||
repo: context.repo.repo,
|
|
||||||
issue_number: pr.number,
|
|
||||||
per_page: 100,
|
|
||||||
});
|
|
||||||
|
|
||||||
const baseChanges = timeline.filter(e => e.event === 'base_ref_changed');
|
|
||||||
for (const change of baseChanges) {
|
|
||||||
const actor = change.actor?.login;
|
|
||||||
if (!actor) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
const { data: perm } = await github.rest.repos.getCollaboratorPermissionLevel({
|
|
||||||
owner: context.repo.owner,
|
|
||||||
repo: context.repo.repo,
|
|
||||||
username: actor,
|
|
||||||
});
|
|
||||||
// admin/maintain/write => trusted maintainer.
|
|
||||||
if (['admin', 'maintain', 'write'].includes(perm.permission)) {
|
|
||||||
core.info(`Base branch was changed manually by ${actor} (${perm.permission}). Skipping.`);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
} catch (error) {
|
|
||||||
core.info(`Could not resolve permission for ${actor}: ${error.message}`);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Parse the checked category checkboxes from the PR body.
|
|
||||||
const body = pr.body ?? '';
|
|
||||||
const checked = [];
|
|
||||||
const checkboxRegex = /^\s*-\s*\[([ xX])\]\s*(.+?)\s*$/gm;
|
|
||||||
let match;
|
|
||||||
while ((match = checkboxRegex.exec(body)) !== null) {
|
|
||||||
if (match[1].toLowerCase() === 'x') {
|
|
||||||
checked.push(match[2].toLowerCase());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const includesAny = (labels) => labels.some(label => checked.some(c => c.includes(label)));
|
|
||||||
|
|
||||||
const mainCategories = ['bug fix', 'adding new one click service', 'fixing or updating existing one click service'];
|
|
||||||
const nextCategories = ['improvement', 'new feature'];
|
|
||||||
|
|
||||||
const wantsMain = includesAny(mainCategories);
|
|
||||||
const wantsNext = includesAny(nextCategories);
|
|
||||||
|
|
||||||
if (!wantsMain && !wantsNext) {
|
|
||||||
core.info('No category selected in the PR body. Skipping.');
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// If categories from both groups are checked, prefer next: features and
|
|
||||||
// improvements can only be released from the development branch.
|
|
||||||
const targetBranch = wantsNext ? NEXT_BRANCH : MAIN_BRANCH;
|
|
||||||
|
|
||||||
if (pr.base.ref === targetBranch) {
|
|
||||||
core.info(`PR #${pr.number} already targets ${targetBranch}. Nothing to do.`);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
const previousBranch = pr.base.ref;
|
|
||||||
|
|
||||||
await github.rest.pulls.update({
|
|
||||||
owner: context.repo.owner,
|
|
||||||
repo: context.repo.repo,
|
|
||||||
pull_number: pr.number,
|
|
||||||
base: targetBranch,
|
|
||||||
});
|
|
||||||
|
|
||||||
await github.rest.issues.createComment({
|
|
||||||
owner: context.repo.owner,
|
|
||||||
repo: context.repo.repo,
|
|
||||||
issue_number: pr.number,
|
|
||||||
body: [
|
|
||||||
`Based on the selected category, this PR's base branch was automatically changed from \`${previousBranch}\` to \`${targetBranch}\`.`,
|
|
||||||
'',
|
|
||||||
targetBranch === MAIN_BRANCH
|
|
||||||
? 'Bug fixes and one-click service changes target `main`.'
|
|
||||||
: 'New features and improvements target `next`.',
|
|
||||||
'',
|
|
||||||
'If you believe this is incorrect, please let a maintainer know.',
|
|
||||||
].join('\n'),
|
|
||||||
});
|
|
||||||
|
|
||||||
core.info(`Retargeted PR #${pr.number}: ${previousBranch} -> ${targetBranch}.`);
|
|
||||||
|
|
@ -1,32 +0,0 @@
|
||||||
name: Manage Stale Issues and PRs
|
|
||||||
|
|
||||||
on:
|
|
||||||
schedule:
|
|
||||||
- cron: '0 2 * * *'
|
|
||||||
|
|
||||||
permissions:
|
|
||||||
issues: write
|
|
||||||
pull-requests: write
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
manage-stale:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- name: Manage stale issues and PRs
|
|
||||||
uses: actions/stale@v9
|
|
||||||
id: stale
|
|
||||||
with:
|
|
||||||
stale-issue-message: 'This issue will be automatically closed in a few days if no response is received. Please provide an update with the requested information.'
|
|
||||||
stale-pr-message: 'This pull request requires attention. If no changes or response is received within the next few days, it will be automatically closed. Please update your PR or leave a comment with the requested information.'
|
|
||||||
close-issue-message: 'This issue has been automatically closed due to inactivity.'
|
|
||||||
close-pr-message: 'Thank you for your contribution. Due to inactivity, this PR was automatically closed. If you would like to continue working on this change in the future, feel free to reopen this PR or submit a new one.'
|
|
||||||
days-before-stale: 14
|
|
||||||
days-before-close: 7
|
|
||||||
stale-issue-label: '⏱︎ Stale'
|
|
||||||
stale-pr-label: '⏱︎ Stale'
|
|
||||||
only-labels: '💤 Waiting for feedback, 💤 Waiting for changes'
|
|
||||||
remove-stale-when-updated: true
|
|
||||||
operations-per-run: 100
|
|
||||||
labels-to-remove-when-unstale: '⏱︎ Stale, 💤 Waiting for feedback, 💤 Waiting for changes'
|
|
||||||
close-issue-reason: 'not_planned'
|
|
||||||
exempt-all-milestones: false
|
|
||||||
52
.github/workflows/chore-pr-comments.yml
vendored
52
.github/workflows/chore-pr-comments.yml
vendored
|
|
@ -1,52 +0,0 @@
|
||||||
name: Add comment based on label
|
|
||||||
on:
|
|
||||||
pull_request_target:
|
|
||||||
types:
|
|
||||||
- labeled
|
|
||||||
|
|
||||||
permissions:
|
|
||||||
pull-requests: write
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
add-comment:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
strategy:
|
|
||||||
matrix:
|
|
||||||
include:
|
|
||||||
- label: "⚙️ Service"
|
|
||||||
body: |
|
|
||||||
Hi @${{ github.event.pull_request.user.login }}! 👋
|
|
||||||
|
|
||||||
It appears to us that you are either adding a new service or making changes to an existing one.
|
|
||||||
We kindly ask you to also review and update the **Coolify Documentation** to include this new service or it's new configuration needs.
|
|
||||||
This will help ensure that our documentation remains accurate and up-to-date for all users.
|
|
||||||
|
|
||||||
Coolify Docs Repository: https://github.com/coollabsio/coolify-docs
|
|
||||||
How to Contribute a new Service to the Docs: https://coolify.io/docs/get-started/contribute/service#adding-a-new-service-template-to-the-coolify-documentation
|
|
||||||
- label: "🛠️ Feature"
|
|
||||||
body: |
|
|
||||||
Hi @${{ github.event.pull_request.user.login }}! 👋
|
|
||||||
|
|
||||||
It appears to us that you are adding a new feature to Coolify.
|
|
||||||
We kindly ask you to also update the **Coolify Documentation** to include information about this new feature.
|
|
||||||
This will help ensure that our documentation remains accurate and up-to-date for all users.
|
|
||||||
|
|
||||||
Coolify Docs Repository: https://github.com/coollabsio/coolify-docs
|
|
||||||
How to Contribute to the Docs: https://coolify.io/docs/get-started/contribute/documentation
|
|
||||||
# - label: "✨ Enhancement"
|
|
||||||
# body: |
|
|
||||||
# It appears to us that you are making an enhancement to Coolify.
|
|
||||||
# We kindly ask you to also review and update the Coolify Documentation to include information about this enhancement if applicable.
|
|
||||||
# This will help ensure that our documentation remains accurate and up-to-date for all users.
|
|
||||||
steps:
|
|
||||||
- name: Add comment
|
|
||||||
if: >-
|
|
||||||
(github.event.label.name == matrix.label || github.event.label.name == '📑 Waiting for Docs PR')
|
|
||||||
&& contains(github.event.pull_request.labels.*.name, matrix.label)
|
|
||||||
&& contains(github.event.pull_request.labels.*.name, '📑 Waiting for Docs PR')
|
|
||||||
run: gh pr comment "$NUMBER" --body "$BODY"
|
|
||||||
env:
|
|
||||||
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
||||||
GH_REPO: ${{ github.repository }}
|
|
||||||
NUMBER: ${{ github.event.pull_request.number }}
|
|
||||||
BODY: ${{ matrix.body }}
|
|
||||||
37
.github/workflows/claude.yml
vendored
37
.github/workflows/claude.yml
vendored
|
|
@ -1,37 +0,0 @@
|
||||||
name: Claude Code
|
|
||||||
|
|
||||||
on:
|
|
||||||
issue_comment:
|
|
||||||
types: [created]
|
|
||||||
pull_request_review_comment:
|
|
||||||
types: [created]
|
|
||||||
issues:
|
|
||||||
types: [opened, assigned]
|
|
||||||
pull_request_review:
|
|
||||||
types: [submitted]
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
claude:
|
|
||||||
if: |
|
|
||||||
(github.event_name == 'issue_comment' && contains(github.event.comment.body, '@claude')) ||
|
|
||||||
(github.event_name == 'pull_request_review_comment' && contains(github.event.comment.body, '@claude')) ||
|
|
||||||
(github.event_name == 'pull_request_review' && contains(github.event.review.body, '@claude')) ||
|
|
||||||
(github.event_name == 'issues' && (contains(github.event.issue.body, '@claude') || contains(github.event.issue.title, '@claude')))
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
permissions:
|
|
||||||
contents: write
|
|
||||||
pull-requests: write
|
|
||||||
issues: write
|
|
||||||
id-token: write
|
|
||||||
steps:
|
|
||||||
- name: Checkout repository
|
|
||||||
uses: actions/checkout@v4
|
|
||||||
with:
|
|
||||||
fetch-depth: 1
|
|
||||||
|
|
||||||
- name: Run Claude Code
|
|
||||||
id: claude
|
|
||||||
uses: anthropics/claude-code-action@v1
|
|
||||||
with:
|
|
||||||
claude_code_oauth_token: ${{ secrets.CLAUDE_CODE_OAUTH_TOKEN }}
|
|
||||||
claude_args: '--model opus'
|
|
||||||
22
.github/workflows/cleanup-ghcr-untagged.yml
vendored
22
.github/workflows/cleanup-ghcr-untagged.yml
vendored
|
|
@ -1,22 +0,0 @@
|
||||||
name: Cleanup Untagged GHCR Images
|
|
||||||
|
|
||||||
on:
|
|
||||||
workflow_dispatch:
|
|
||||||
|
|
||||||
permissions:
|
|
||||||
packages: write
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
cleanup-all-packages:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
strategy:
|
|
||||||
matrix:
|
|
||||||
package: ['coolify', 'coolify-helper', 'coolify-realtime', 'coolify-testing-host']
|
|
||||||
steps:
|
|
||||||
- name: Delete untagged ${{ matrix.package }} images
|
|
||||||
uses: actions/delete-package-versions@v5
|
|
||||||
with:
|
|
||||||
package-name: ${{ matrix.package }}
|
|
||||||
package-type: 'container'
|
|
||||||
min-versions-to-keep: 0
|
|
||||||
delete-only-untagged-versions: 'true'
|
|
||||||
117
.github/workflows/coolify-helper-next.yml
vendored
117
.github/workflows/coolify-helper-next.yml
vendored
|
|
@ -1,117 +0,0 @@
|
||||||
name: Coolify Helper Image Development
|
|
||||||
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
branches: [ "next" ]
|
|
||||||
paths:
|
|
||||||
- .github/workflows/coolify-helper-next.yml
|
|
||||||
- docker/coolify-helper/Dockerfile
|
|
||||||
|
|
||||||
permissions:
|
|
||||||
contents: read
|
|
||||||
packages: write
|
|
||||||
|
|
||||||
env:
|
|
||||||
GITHUB_REGISTRY: ghcr.io
|
|
||||||
DOCKER_REGISTRY: docker.io
|
|
||||||
IMAGE_NAME: "coollabsio/coolify-helper"
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
build-push:
|
|
||||||
strategy:
|
|
||||||
matrix:
|
|
||||||
include:
|
|
||||||
- arch: amd64
|
|
||||||
platform: linux/amd64
|
|
||||||
runner: ubuntu-24.04
|
|
||||||
- arch: aarch64
|
|
||||||
platform: linux/aarch64
|
|
||||||
runner: ubuntu-24.04-arm
|
|
||||||
runs-on: ${{ matrix.runner }}
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v5
|
|
||||||
with:
|
|
||||||
persist-credentials: false
|
|
||||||
|
|
||||||
- name: Login to ${{ env.GITHUB_REGISTRY }}
|
|
||||||
uses: docker/login-action@v3
|
|
||||||
with:
|
|
||||||
registry: ${{ env.GITHUB_REGISTRY }}
|
|
||||||
username: ${{ github.actor }}
|
|
||||||
password: ${{ secrets.GITHUB_TOKEN }}
|
|
||||||
|
|
||||||
- name: Login to ${{ env.DOCKER_REGISTRY }}
|
|
||||||
uses: docker/login-action@v3
|
|
||||||
with:
|
|
||||||
registry: ${{ env.DOCKER_REGISTRY }}
|
|
||||||
username: ${{ secrets.DOCKERHUB_USERNAME }}
|
|
||||||
password: ${{ secrets.DOCKERHUB_TOKEN }}
|
|
||||||
|
|
||||||
- name: Get Version
|
|
||||||
id: version
|
|
||||||
run: |
|
|
||||||
echo "VERSION=$(docker run --rm -v "$(pwd):/app" -w /app php:8.2-alpine3.16 php bootstrap/getHelperVersion.php)"|xargs >> $GITHUB_OUTPUT
|
|
||||||
|
|
||||||
- name: Build and Push Image (${{ matrix.arch }})
|
|
||||||
uses: docker/build-push-action@v6
|
|
||||||
with:
|
|
||||||
context: .
|
|
||||||
file: docker/coolify-helper/Dockerfile
|
|
||||||
platforms: ${{ matrix.platform }}
|
|
||||||
push: true
|
|
||||||
tags: |
|
|
||||||
${{ env.DOCKER_REGISTRY }}/${{ env.IMAGE_NAME }}:${{ steps.version.outputs.VERSION }}-next-${{ matrix.arch }}
|
|
||||||
${{ env.GITHUB_REGISTRY }}/${{ env.IMAGE_NAME }}:${{ steps.version.outputs.VERSION }}-next-${{ matrix.arch }}
|
|
||||||
labels: |
|
|
||||||
coolify.managed=true
|
|
||||||
|
|
||||||
merge-manifest:
|
|
||||||
runs-on: ubuntu-24.04
|
|
||||||
needs: build-push
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v5
|
|
||||||
with:
|
|
||||||
persist-credentials: false
|
|
||||||
|
|
||||||
- uses: docker/setup-buildx-action@v3
|
|
||||||
|
|
||||||
- name: Login to ${{ env.GITHUB_REGISTRY }}
|
|
||||||
uses: docker/login-action@v3
|
|
||||||
with:
|
|
||||||
registry: ${{ env.GITHUB_REGISTRY }}
|
|
||||||
username: ${{ github.actor }}
|
|
||||||
password: ${{ secrets.GITHUB_TOKEN }}
|
|
||||||
|
|
||||||
- name: Login to ${{ env.DOCKER_REGISTRY }}
|
|
||||||
uses: docker/login-action@v3
|
|
||||||
with:
|
|
||||||
registry: ${{ env.DOCKER_REGISTRY }}
|
|
||||||
username: ${{ secrets.DOCKERHUB_USERNAME }}
|
|
||||||
password: ${{ secrets.DOCKERHUB_TOKEN }}
|
|
||||||
|
|
||||||
- name: Get Version
|
|
||||||
id: version
|
|
||||||
run: |
|
|
||||||
echo "VERSION=$(docker run --rm -v "$(pwd):/app" -w /app php:8.2-alpine3.16 php bootstrap/getHelperVersion.php)"|xargs >> $GITHUB_OUTPUT
|
|
||||||
|
|
||||||
- name: Create & publish manifest on ${{ env.GITHUB_REGISTRY }}
|
|
||||||
run: |
|
|
||||||
docker buildx imagetools create \
|
|
||||||
${{ env.GITHUB_REGISTRY }}/${{ env.IMAGE_NAME }}:${{ steps.version.outputs.VERSION }}-next-amd64 \
|
|
||||||
${{ env.GITHUB_REGISTRY }}/${{ env.IMAGE_NAME }}:${{ steps.version.outputs.VERSION }}-next-aarch64 \
|
|
||||||
--tag ${{ env.GITHUB_REGISTRY }}/${{ env.IMAGE_NAME }}:${{ steps.version.outputs.VERSION }}-next \
|
|
||||||
--tag ${{ env.GITHUB_REGISTRY }}/${{ env.IMAGE_NAME }}:next
|
|
||||||
|
|
||||||
- name: Create & publish manifest on ${{ env.DOCKER_REGISTRY }}
|
|
||||||
run: |
|
|
||||||
docker buildx imagetools create \
|
|
||||||
${{ env.DOCKER_REGISTRY }}/${{ env.IMAGE_NAME }}:${{ steps.version.outputs.VERSION }}-next-amd64 \
|
|
||||||
${{ env.DOCKER_REGISTRY }}/${{ env.IMAGE_NAME }}:${{ steps.version.outputs.VERSION }}-next-aarch64 \
|
|
||||||
--tag ${{ env.DOCKER_REGISTRY }}/${{ env.IMAGE_NAME }}:${{ steps.version.outputs.VERSION }}-next \
|
|
||||||
--tag ${{ env.DOCKER_REGISTRY }}/${{ env.IMAGE_NAME }}:next
|
|
||||||
|
|
||||||
- uses: sarisia/actions-status-discord@v1
|
|
||||||
if: always()
|
|
||||||
with:
|
|
||||||
webhook: ${{ secrets.DISCORD_WEBHOOK_DEV_RELEASE_CHANNEL }}
|
|
||||||
|
|
||||||
161
.github/workflows/coolify-helper.yml
vendored
161
.github/workflows/coolify-helper.yml
vendored
|
|
@ -1,161 +0,0 @@
|
||||||
name: Coolify Helper Image
|
|
||||||
|
|
||||||
on:
|
|
||||||
workflow_dispatch:
|
|
||||||
push:
|
|
||||||
branches: [ "main" ]
|
|
||||||
paths:
|
|
||||||
- .github/workflows/coolify-helper.yml
|
|
||||||
- docker/coolify-helper/Dockerfile
|
|
||||||
|
|
||||||
permissions:
|
|
||||||
contents: read
|
|
||||||
packages: write
|
|
||||||
|
|
||||||
env:
|
|
||||||
GITHUB_REGISTRY: ghcr.io
|
|
||||||
DOCKER_REGISTRY: docker.io
|
|
||||||
IMAGE_NAME: "coollabsio/coolify-helper"
|
|
||||||
|
|
||||||
concurrency:
|
|
||||||
group: ${{ github.workflow }}-${{ github.ref }}
|
|
||||||
cancel-in-progress: false
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
check-version:
|
|
||||||
runs-on: ubuntu-24.04
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v5
|
|
||||||
with:
|
|
||||||
persist-credentials: false
|
|
||||||
|
|
||||||
- uses: docker/setup-buildx-action@v3
|
|
||||||
|
|
||||||
- name: Login to ${{ env.GITHUB_REGISTRY }}
|
|
||||||
uses: docker/login-action@v3
|
|
||||||
with:
|
|
||||||
registry: ${{ env.GITHUB_REGISTRY }}
|
|
||||||
username: ${{ github.actor }}
|
|
||||||
password: ${{ secrets.GITHUB_TOKEN }}
|
|
||||||
|
|
||||||
- name: Login to ${{ env.DOCKER_REGISTRY }}
|
|
||||||
uses: docker/login-action@v3
|
|
||||||
with:
|
|
||||||
registry: ${{ env.DOCKER_REGISTRY }}
|
|
||||||
username: ${{ secrets.DOCKERHUB_USERNAME }}
|
|
||||||
password: ${{ secrets.DOCKERHUB_TOKEN }}
|
|
||||||
|
|
||||||
- name: Ensure version is not published
|
|
||||||
run: |
|
|
||||||
BASE_VERSION=$(docker run --rm -v "$(pwd):/app" -w /app php:8.2-alpine3.16 php bootstrap/getHelperVersion.php)
|
|
||||||
VERSION="${BASE_VERSION}"
|
|
||||||
for registry in "${DOCKER_REGISTRY}" "${GITHUB_REGISTRY}"; do
|
|
||||||
IMAGE="${registry}/${IMAGE_NAME}:${VERSION}"
|
|
||||||
if output=$(docker buildx imagetools inspect "$IMAGE" 2>&1); then
|
|
||||||
echo "::error::Version $VERSION already exists in $registry"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
if ! grep -Eqi 'manifest unknown|not found|no such manifest' <<< "$output"; then
|
|
||||||
echo "::error::Could not verify $IMAGE: $output"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
echo "Version $VERSION is available in both registries"
|
|
||||||
|
|
||||||
build-push:
|
|
||||||
needs: check-version
|
|
||||||
strategy:
|
|
||||||
matrix:
|
|
||||||
include:
|
|
||||||
- arch: amd64
|
|
||||||
platform: linux/amd64
|
|
||||||
runner: ubuntu-24.04
|
|
||||||
- arch: aarch64
|
|
||||||
platform: linux/aarch64
|
|
||||||
runner: ubuntu-24.04-arm
|
|
||||||
runs-on: ${{ matrix.runner }}
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v5
|
|
||||||
with:
|
|
||||||
persist-credentials: false
|
|
||||||
|
|
||||||
- name: Login to ${{ env.GITHUB_REGISTRY }}
|
|
||||||
uses: docker/login-action@v3
|
|
||||||
with:
|
|
||||||
registry: ${{ env.GITHUB_REGISTRY }}
|
|
||||||
username: ${{ github.actor }}
|
|
||||||
password: ${{ secrets.GITHUB_TOKEN }}
|
|
||||||
|
|
||||||
- name: Login to ${{ env.DOCKER_REGISTRY }}
|
|
||||||
uses: docker/login-action@v3
|
|
||||||
with:
|
|
||||||
registry: ${{ env.DOCKER_REGISTRY }}
|
|
||||||
username: ${{ secrets.DOCKERHUB_USERNAME }}
|
|
||||||
password: ${{ secrets.DOCKERHUB_TOKEN }}
|
|
||||||
|
|
||||||
- name: Get Version
|
|
||||||
id: version
|
|
||||||
run: |
|
|
||||||
echo "VERSION=$(docker run --rm -v "$(pwd):/app" -w /app php:8.2-alpine3.16 php bootstrap/getHelperVersion.php)"|xargs >> $GITHUB_OUTPUT
|
|
||||||
|
|
||||||
- name: Build and Push Image (${{ matrix.arch }})
|
|
||||||
uses: docker/build-push-action@v6
|
|
||||||
with:
|
|
||||||
context: .
|
|
||||||
file: docker/coolify-helper/Dockerfile
|
|
||||||
platforms: ${{ matrix.platform }}
|
|
||||||
push: true
|
|
||||||
tags: |
|
|
||||||
${{ env.DOCKER_REGISTRY }}/${{ env.IMAGE_NAME }}:${{ steps.version.outputs.VERSION }}-${{ matrix.arch }}
|
|
||||||
${{ env.GITHUB_REGISTRY }}/${{ env.IMAGE_NAME }}:${{ steps.version.outputs.VERSION }}-${{ matrix.arch }}
|
|
||||||
labels: |
|
|
||||||
coolify.managed=true
|
|
||||||
merge-manifest:
|
|
||||||
runs-on: ubuntu-24.04
|
|
||||||
needs: build-push
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v5
|
|
||||||
with:
|
|
||||||
persist-credentials: false
|
|
||||||
|
|
||||||
- uses: docker/setup-buildx-action@v3
|
|
||||||
|
|
||||||
- name: Login to ${{ env.GITHUB_REGISTRY }}
|
|
||||||
uses: docker/login-action@v3
|
|
||||||
with:
|
|
||||||
registry: ${{ env.GITHUB_REGISTRY }}
|
|
||||||
username: ${{ github.actor }}
|
|
||||||
password: ${{ secrets.GITHUB_TOKEN }}
|
|
||||||
|
|
||||||
- name: Login to ${{ env.DOCKER_REGISTRY }}
|
|
||||||
uses: docker/login-action@v3
|
|
||||||
with:
|
|
||||||
registry: ${{ env.DOCKER_REGISTRY }}
|
|
||||||
username: ${{ secrets.DOCKERHUB_USERNAME }}
|
|
||||||
password: ${{ secrets.DOCKERHUB_TOKEN }}
|
|
||||||
|
|
||||||
- name: Get Version
|
|
||||||
id: version
|
|
||||||
run: |
|
|
||||||
echo "VERSION=$(docker run --rm -v "$(pwd):/app" -w /app php:8.2-alpine3.16 php bootstrap/getHelperVersion.php)"|xargs >> $GITHUB_OUTPUT
|
|
||||||
|
|
||||||
- name: Create & publish manifest on ${{ env.GITHUB_REGISTRY }}
|
|
||||||
run: |
|
|
||||||
docker buildx imagetools create \
|
|
||||||
${{ env.GITHUB_REGISTRY }}/${{ env.IMAGE_NAME }}:${{ steps.version.outputs.VERSION }}-amd64 \
|
|
||||||
${{ env.GITHUB_REGISTRY }}/${{ env.IMAGE_NAME }}:${{ steps.version.outputs.VERSION }}-aarch64 \
|
|
||||||
--tag ${{ env.GITHUB_REGISTRY }}/${{ env.IMAGE_NAME }}:${{ steps.version.outputs.VERSION }} \
|
|
||||||
--tag ${{ env.GITHUB_REGISTRY }}/${{ env.IMAGE_NAME }}:latest
|
|
||||||
|
|
||||||
- name: Create & publish manifest on ${{ env.DOCKER_REGISTRY }}
|
|
||||||
run: |
|
|
||||||
docker buildx imagetools create \
|
|
||||||
${{ env.DOCKER_REGISTRY }}/${{ env.IMAGE_NAME }}:${{ steps.version.outputs.VERSION }}-amd64 \
|
|
||||||
${{ env.DOCKER_REGISTRY }}/${{ env.IMAGE_NAME }}:${{ steps.version.outputs.VERSION }}-aarch64 \
|
|
||||||
--tag ${{ env.DOCKER_REGISTRY }}/${{ env.IMAGE_NAME }}:${{ steps.version.outputs.VERSION }} \
|
|
||||||
--tag ${{ env.DOCKER_REGISTRY }}/${{ env.IMAGE_NAME }}:latest
|
|
||||||
|
|
||||||
- uses: sarisia/actions-status-discord@v1
|
|
||||||
if: always()
|
|
||||||
with:
|
|
||||||
webhook: ${{ secrets.DISCORD_WEBHOOK_PROD_RELEASE_CHANNEL }}
|
|
||||||
152
.github/workflows/coolify-next-build.yml
vendored
152
.github/workflows/coolify-next-build.yml
vendored
|
|
@ -1,152 +0,0 @@
|
||||||
name: Build Coolify Next
|
|
||||||
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
branches: [next]
|
|
||||||
paths-ignore:
|
|
||||||
- .github/workflows/coolify-helper.yml
|
|
||||||
- .github/workflows/coolify-helper-next.yml
|
|
||||||
- .github/workflows/coolify-realtime.yml
|
|
||||||
- .github/workflows/coolify-realtime-next.yml
|
|
||||||
- .github/workflows/pr-quality.yaml
|
|
||||||
- docker/coolify-helper/Dockerfile
|
|
||||||
- docker/coolify-realtime/Dockerfile
|
|
||||||
- docker/testing-host/Dockerfile
|
|
||||||
- templates/**
|
|
||||||
- CHANGELOG.md
|
|
||||||
|
|
||||||
permissions:
|
|
||||||
contents: read
|
|
||||||
packages: write
|
|
||||||
|
|
||||||
concurrency:
|
|
||||||
group: coolify-next-build
|
|
||||||
cancel-in-progress: false
|
|
||||||
|
|
||||||
env:
|
|
||||||
GITHUB_REGISTRY: ghcr.io
|
|
||||||
DOCKER_REGISTRY: docker.io
|
|
||||||
IMAGE_NAME: coollabsio/coolify
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
prepare:
|
|
||||||
runs-on: ubuntu-24.04
|
|
||||||
outputs:
|
|
||||||
rc_version: ${{ steps.version.outputs.rc_version }}
|
|
||||||
short_sha: ${{ steps.version.outputs.short_sha }}
|
|
||||||
version: ${{ steps.version.outputs.version }}
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v5
|
|
||||||
with:
|
|
||||||
persist-credentials: false
|
|
||||||
|
|
||||||
- name: Resolve next version
|
|
||||||
id: version
|
|
||||||
run: |
|
|
||||||
RC_VERSION=$(jq -r '.coolify.nightly.version' versions.json)
|
|
||||||
if [[ ! "${RC_VERSION}" =~ ^[0-9]+\.[0-9]+-rc\.[0-9]+$ ]]; then
|
|
||||||
echo "Invalid next RC version: ${RC_VERSION}"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
SHORT_SHA="${GITHUB_SHA::7}"
|
|
||||||
VERSION="${RC_VERSION}.${SHORT_SHA}"
|
|
||||||
echo "rc_version=${RC_VERSION}" >> "$GITHUB_OUTPUT"
|
|
||||||
echo "short_sha=${SHORT_SHA}" >> "$GITHUB_OUTPUT"
|
|
||||||
echo "version=${VERSION}" >> "$GITHUB_OUTPUT"
|
|
||||||
|
|
||||||
build:
|
|
||||||
needs: prepare
|
|
||||||
strategy:
|
|
||||||
matrix:
|
|
||||||
include:
|
|
||||||
- arch: amd64
|
|
||||||
platform: linux/amd64
|
|
||||||
runner: ubuntu-24.04
|
|
||||||
- arch: aarch64
|
|
||||||
platform: linux/aarch64
|
|
||||||
runner: ubuntu-24.04-arm
|
|
||||||
runs-on: ${{ matrix.runner }}
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v5
|
|
||||||
with:
|
|
||||||
persist-credentials: false
|
|
||||||
|
|
||||||
- uses: docker/setup-buildx-action@v3
|
|
||||||
|
|
||||||
- name: Login to ${{ env.GITHUB_REGISTRY }}
|
|
||||||
uses: docker/login-action@v3
|
|
||||||
with:
|
|
||||||
registry: ${{ env.GITHUB_REGISTRY }}
|
|
||||||
username: ${{ github.actor }}
|
|
||||||
password: ${{ secrets.GITHUB_TOKEN }}
|
|
||||||
|
|
||||||
- name: Login to ${{ env.DOCKER_REGISTRY }}
|
|
||||||
uses: docker/login-action@v3
|
|
||||||
with:
|
|
||||||
registry: ${{ env.DOCKER_REGISTRY }}
|
|
||||||
username: ${{ secrets.DOCKERHUB_USERNAME }}
|
|
||||||
password: ${{ secrets.DOCKERHUB_TOKEN }}
|
|
||||||
|
|
||||||
- name: Build and push next image (${{ matrix.arch }})
|
|
||||||
uses: docker/build-push-action@v6
|
|
||||||
with:
|
|
||||||
context: .
|
|
||||||
file: docker/production/Dockerfile
|
|
||||||
platforms: ${{ matrix.platform }}
|
|
||||||
push: true
|
|
||||||
build-args: |
|
|
||||||
COOLIFY_VERSION=${{ needs.prepare.outputs.version }}
|
|
||||||
tags: |
|
|
||||||
${{ env.GITHUB_REGISTRY }}/${{ env.IMAGE_NAME }}:next-build-${{ needs.prepare.outputs.short_sha }}-${{ matrix.arch }}
|
|
||||||
${{ env.DOCKER_REGISTRY }}/${{ env.IMAGE_NAME }}:next-build-${{ needs.prepare.outputs.short_sha }}-${{ matrix.arch }}
|
|
||||||
|
|
||||||
publish:
|
|
||||||
needs: [prepare, build]
|
|
||||||
runs-on: ubuntu-24.04
|
|
||||||
steps:
|
|
||||||
- uses: docker/setup-buildx-action@v3
|
|
||||||
|
|
||||||
- name: Login to ${{ env.GITHUB_REGISTRY }}
|
|
||||||
uses: docker/login-action@v3
|
|
||||||
with:
|
|
||||||
registry: ${{ env.GITHUB_REGISTRY }}
|
|
||||||
username: ${{ github.actor }}
|
|
||||||
password: ${{ secrets.GITHUB_TOKEN }}
|
|
||||||
|
|
||||||
- name: Login to ${{ env.DOCKER_REGISTRY }}
|
|
||||||
uses: docker/login-action@v3
|
|
||||||
with:
|
|
||||||
registry: ${{ env.DOCKER_REGISTRY }}
|
|
||||||
username: ${{ secrets.DOCKERHUB_USERNAME }}
|
|
||||||
password: ${{ secrets.DOCKERHUB_TOKEN }}
|
|
||||||
|
|
||||||
- name: Publish next manifest on ${{ env.GITHUB_REGISTRY }}
|
|
||||||
env:
|
|
||||||
REGISTRY: ${{ env.GITHUB_REGISTRY }}
|
|
||||||
SHA: ${{ needs.prepare.outputs.short_sha }}
|
|
||||||
VERSION: ${{ needs.prepare.outputs.version }}
|
|
||||||
run: |
|
|
||||||
IMAGE="${REGISTRY}/${IMAGE_NAME}"
|
|
||||||
SOURCE="next-build-${SHA}"
|
|
||||||
docker buildx imagetools create \
|
|
||||||
"${IMAGE}:${SOURCE}-amd64" \
|
|
||||||
"${IMAGE}:${SOURCE}-aarch64" \
|
|
||||||
--tag "${IMAGE}:sha-${SHA}" \
|
|
||||||
--tag "${IMAGE}:${VERSION}" \
|
|
||||||
--tag "${IMAGE}:next"
|
|
||||||
|
|
||||||
- name: Publish next manifest on ${{ env.DOCKER_REGISTRY }}
|
|
||||||
env:
|
|
||||||
REGISTRY: ${{ env.DOCKER_REGISTRY }}
|
|
||||||
SHA: ${{ needs.prepare.outputs.short_sha }}
|
|
||||||
VERSION: ${{ needs.prepare.outputs.version }}
|
|
||||||
run: |
|
|
||||||
IMAGE="${REGISTRY}/${IMAGE_NAME}"
|
|
||||||
SOURCE="next-build-${SHA}"
|
|
||||||
docker buildx imagetools create \
|
|
||||||
"${IMAGE}:${SOURCE}-amd64" \
|
|
||||||
"${IMAGE}:${SOURCE}-aarch64" \
|
|
||||||
--tag "${IMAGE}:sha-${SHA}" \
|
|
||||||
--tag "${IMAGE}:${VERSION}" \
|
|
||||||
--tag "${IMAGE}:next"
|
|
||||||
304
.github/workflows/coolify-rc-release.yml
vendored
304
.github/workflows/coolify-rc-release.yml
vendored
|
|
@ -1,304 +0,0 @@
|
||||||
name: Release Coolify RC
|
|
||||||
run-name: ${{ inputs.tag }}
|
|
||||||
|
|
||||||
on:
|
|
||||||
workflow_dispatch:
|
|
||||||
inputs:
|
|
||||||
tag:
|
|
||||||
description: Existing draft prerelease tag (for example, v4.4-rc.1)
|
|
||||||
required: true
|
|
||||||
type: string
|
|
||||||
|
|
||||||
permissions: {}
|
|
||||||
|
|
||||||
concurrency:
|
|
||||||
group: coolify-rc-release
|
|
||||||
cancel-in-progress: false
|
|
||||||
|
|
||||||
env:
|
|
||||||
GITHUB_REGISTRY: ghcr.io
|
|
||||||
DOCKER_REGISTRY: docker.io
|
|
||||||
IMAGE_NAME: coollabsio/coolify
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
validate:
|
|
||||||
runs-on: ubuntu-24.04
|
|
||||||
permissions:
|
|
||||||
contents: write
|
|
||||||
outputs:
|
|
||||||
release_id: ${{ steps.draft.outputs.release_id }}
|
|
||||||
version: ${{ steps.version.outputs.version }}
|
|
||||||
steps:
|
|
||||||
- name: Reject releases outside next
|
|
||||||
if: ${{ github.ref != 'refs/heads/next' }}
|
|
||||||
run: |
|
|
||||||
echo "RC releases must run from the next branch, not ${{ github.ref }}."
|
|
||||||
exit 1
|
|
||||||
|
|
||||||
- uses: actions/checkout@v5
|
|
||||||
with:
|
|
||||||
fetch-depth: 0
|
|
||||||
persist-credentials: false
|
|
||||||
|
|
||||||
- name: Validate version
|
|
||||||
id: version
|
|
||||||
env:
|
|
||||||
TAG_NAME: ${{ inputs.tag }}
|
|
||||||
run: |
|
|
||||||
if [[ ! "${TAG_NAME}" =~ ^v[0-9]+\.[0-9]+-rc\.[0-9]+$ ]]; then
|
|
||||||
echo "Unsupported RC tag: ${TAG_NAME}"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
VERSION="${TAG_NAME#v}"
|
|
||||||
CONFIG_VERSION=$(jq -r '.coolify.nightly.version' versions.json)
|
|
||||||
if [[ "${CONFIG_VERSION}" != "${VERSION}" ]]; then
|
|
||||||
echo "RC tag ${VERSION} does not match nightly version ${CONFIG_VERSION}."
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo "version=${VERSION}" >> "$GITHUB_OUTPUT"
|
|
||||||
|
|
||||||
- name: Validate and pin draft prerelease
|
|
||||||
id: draft
|
|
||||||
uses: actions/github-script@v8
|
|
||||||
env:
|
|
||||||
TAG_NAME: ${{ inputs.tag }}
|
|
||||||
with:
|
|
||||||
script: |
|
|
||||||
const releases = await github.paginate(github.rest.repos.listReleases, {
|
|
||||||
owner: context.repo.owner,
|
|
||||||
repo: context.repo.repo,
|
|
||||||
per_page: 100,
|
|
||||||
});
|
|
||||||
const release = releases.find((candidate) => candidate.tag_name === process.env.TAG_NAME);
|
|
||||||
|
|
||||||
if (!release) {
|
|
||||||
core.setFailed(`Create a draft prerelease for ${process.env.TAG_NAME} before running this workflow.`);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (!release.draft) {
|
|
||||||
core.setFailed(`Release ${process.env.TAG_NAME} must still be a draft.`);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (!release.prerelease) {
|
|
||||||
core.setFailed(`RC release ${process.env.TAG_NAME} must be marked as a prerelease.`);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (!release.body?.trim()) {
|
|
||||||
core.setFailed(`Draft prerelease ${process.env.TAG_NAME} must contain reviewed release notes.`);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
|
||||||
await github.rest.git.getRef({
|
|
||||||
owner: context.repo.owner,
|
|
||||||
repo: context.repo.repo,
|
|
||||||
ref: `tags/${process.env.TAG_NAME}`,
|
|
||||||
});
|
|
||||||
core.setFailed(`Git tag ${process.env.TAG_NAME} already exists.`);
|
|
||||||
return;
|
|
||||||
} catch (error) {
|
|
||||||
if (error.status !== 404) throw error;
|
|
||||||
}
|
|
||||||
|
|
||||||
await github.rest.repos.updateRelease({
|
|
||||||
owner: context.repo.owner,
|
|
||||||
repo: context.repo.repo,
|
|
||||||
release_id: release.id,
|
|
||||||
tag_name: process.env.TAG_NAME,
|
|
||||||
target_commitish: context.sha,
|
|
||||||
prerelease: true,
|
|
||||||
});
|
|
||||||
core.setOutput('release_id', release.id);
|
|
||||||
|
|
||||||
build:
|
|
||||||
needs: validate
|
|
||||||
permissions:
|
|
||||||
contents: read
|
|
||||||
packages: write
|
|
||||||
strategy:
|
|
||||||
matrix:
|
|
||||||
include:
|
|
||||||
- arch: amd64
|
|
||||||
platform: linux/amd64
|
|
||||||
runner: ubuntu-24.04
|
|
||||||
- arch: aarch64
|
|
||||||
platform: linux/aarch64
|
|
||||||
runner: ubuntu-24.04-arm
|
|
||||||
runs-on: ${{ matrix.runner }}
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v5
|
|
||||||
with:
|
|
||||||
persist-credentials: false
|
|
||||||
|
|
||||||
- uses: docker/setup-buildx-action@v3
|
|
||||||
|
|
||||||
- name: Login to ${{ env.GITHUB_REGISTRY }}
|
|
||||||
uses: docker/login-action@v3
|
|
||||||
with:
|
|
||||||
registry: ${{ env.GITHUB_REGISTRY }}
|
|
||||||
username: ${{ github.actor }}
|
|
||||||
password: ${{ secrets.GITHUB_TOKEN }}
|
|
||||||
|
|
||||||
- name: Login to ${{ env.DOCKER_REGISTRY }}
|
|
||||||
uses: docker/login-action@v3
|
|
||||||
with:
|
|
||||||
registry: ${{ env.DOCKER_REGISTRY }}
|
|
||||||
username: ${{ secrets.DOCKERHUB_USERNAME }}
|
|
||||||
password: ${{ secrets.DOCKERHUB_TOKEN }}
|
|
||||||
|
|
||||||
- name: Build and push RC image (${{ matrix.arch }})
|
|
||||||
uses: docker/build-push-action@v6
|
|
||||||
with:
|
|
||||||
context: .
|
|
||||||
file: docker/production/Dockerfile
|
|
||||||
platforms: ${{ matrix.platform }}
|
|
||||||
push: true
|
|
||||||
build-args: |
|
|
||||||
COOLIFY_VERSION=${{ needs.validate.outputs.version }}
|
|
||||||
tags: |
|
|
||||||
${{ env.GITHUB_REGISTRY }}/${{ env.IMAGE_NAME }}:rc-release-${{ needs.validate.outputs.version }}-${{ github.sha }}-${{ matrix.arch }}
|
|
||||||
${{ env.DOCKER_REGISTRY }}/${{ env.IMAGE_NAME }}:rc-release-${{ needs.validate.outputs.version }}-${{ github.sha }}-${{ matrix.arch }}
|
|
||||||
|
|
||||||
revalidate:
|
|
||||||
needs: [validate, build]
|
|
||||||
runs-on: ubuntu-24.04
|
|
||||||
permissions:
|
|
||||||
contents: write
|
|
||||||
steps:
|
|
||||||
- name: Revalidate draft prerelease
|
|
||||||
uses: actions/github-script@v8
|
|
||||||
env:
|
|
||||||
RELEASE_ID: ${{ needs.validate.outputs.release_id }}
|
|
||||||
TAG_NAME: ${{ inputs.tag }}
|
|
||||||
with:
|
|
||||||
script: |
|
|
||||||
const releaseId = Number(process.env.RELEASE_ID);
|
|
||||||
const { data: release } = await github.rest.repos.getRelease({
|
|
||||||
owner: context.repo.owner,
|
|
||||||
repo: context.repo.repo,
|
|
||||||
release_id: releaseId,
|
|
||||||
});
|
|
||||||
|
|
||||||
if (release.tag_name !== process.env.TAG_NAME || !release.draft || !release.prerelease) {
|
|
||||||
core.setFailed(`Draft prerelease ${process.env.TAG_NAME} changed while the images were building.`);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (!release.body?.trim()) {
|
|
||||||
core.setFailed(`Draft prerelease ${process.env.TAG_NAME} no longer contains release notes.`);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (release.target_commitish !== context.sha) {
|
|
||||||
core.setFailed(`Draft prerelease ${process.env.TAG_NAME} no longer targets ${context.sha}.`);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
|
||||||
await github.rest.git.getRef({
|
|
||||||
owner: context.repo.owner,
|
|
||||||
repo: context.repo.repo,
|
|
||||||
ref: `tags/${process.env.TAG_NAME}`,
|
|
||||||
});
|
|
||||||
core.setFailed(`Git tag ${process.env.TAG_NAME} was created while the images were building.`);
|
|
||||||
} catch (error) {
|
|
||||||
if (error.status !== 404) throw error;
|
|
||||||
}
|
|
||||||
|
|
||||||
publish:
|
|
||||||
needs: [validate, build, revalidate]
|
|
||||||
runs-on: ubuntu-24.04
|
|
||||||
permissions:
|
|
||||||
contents: write
|
|
||||||
packages: write
|
|
||||||
steps:
|
|
||||||
- uses: docker/setup-buildx-action@v3
|
|
||||||
|
|
||||||
- name: Login to ${{ env.GITHUB_REGISTRY }}
|
|
||||||
uses: docker/login-action@v3
|
|
||||||
with:
|
|
||||||
registry: ${{ env.GITHUB_REGISTRY }}
|
|
||||||
username: ${{ github.actor }}
|
|
||||||
password: ${{ secrets.GITHUB_TOKEN }}
|
|
||||||
|
|
||||||
- name: Login to ${{ env.DOCKER_REGISTRY }}
|
|
||||||
uses: docker/login-action@v3
|
|
||||||
with:
|
|
||||||
registry: ${{ env.DOCKER_REGISTRY }}
|
|
||||||
username: ${{ secrets.DOCKERHUB_USERNAME }}
|
|
||||||
password: ${{ secrets.DOCKERHUB_TOKEN }}
|
|
||||||
|
|
||||||
- name: Publish RC and next on ${{ env.GITHUB_REGISTRY }}
|
|
||||||
env:
|
|
||||||
REGISTRY: ${{ env.GITHUB_REGISTRY }}
|
|
||||||
VERSION: ${{ needs.validate.outputs.version }}
|
|
||||||
run: |
|
|
||||||
IMAGE="${REGISTRY}/${IMAGE_NAME}"
|
|
||||||
SOURCE="rc-release-${VERSION}-${GITHUB_SHA}"
|
|
||||||
docker buildx imagetools create \
|
|
||||||
"${IMAGE}:${SOURCE}-amd64" \
|
|
||||||
"${IMAGE}:${SOURCE}-aarch64" \
|
|
||||||
--tag "${IMAGE}:${VERSION}" \
|
|
||||||
--tag "${IMAGE}:next"
|
|
||||||
|
|
||||||
- name: Publish RC and next on ${{ env.DOCKER_REGISTRY }}
|
|
||||||
env:
|
|
||||||
REGISTRY: ${{ env.DOCKER_REGISTRY }}
|
|
||||||
VERSION: ${{ needs.validate.outputs.version }}
|
|
||||||
run: |
|
|
||||||
IMAGE="${REGISTRY}/${IMAGE_NAME}"
|
|
||||||
SOURCE="rc-release-${VERSION}-${GITHUB_SHA}"
|
|
||||||
docker buildx imagetools create \
|
|
||||||
"${IMAGE}:${SOURCE}-amd64" \
|
|
||||||
"${IMAGE}:${SOURCE}-aarch64" \
|
|
||||||
--tag "${IMAGE}:${VERSION}" \
|
|
||||||
--tag "${IMAGE}:next"
|
|
||||||
|
|
||||||
- name: Publish reviewed draft prerelease
|
|
||||||
uses: actions/github-script@v8
|
|
||||||
env:
|
|
||||||
RELEASE_ID: ${{ needs.validate.outputs.release_id }}
|
|
||||||
TAG_NAME: ${{ inputs.tag }}
|
|
||||||
with:
|
|
||||||
script: |
|
|
||||||
const releaseId = Number(process.env.RELEASE_ID);
|
|
||||||
const { data: release } = await github.rest.repos.getRelease({
|
|
||||||
owner: context.repo.owner,
|
|
||||||
repo: context.repo.repo,
|
|
||||||
release_id: releaseId,
|
|
||||||
});
|
|
||||||
|
|
||||||
if (release.tag_name !== process.env.TAG_NAME || !release.draft || !release.prerelease) {
|
|
||||||
core.setFailed(`Draft prerelease ${process.env.TAG_NAME} changed while the images were building.`);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (!release.body?.trim()) {
|
|
||||||
core.setFailed(`Draft prerelease ${process.env.TAG_NAME} no longer contains release notes.`);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (release.target_commitish !== context.sha) {
|
|
||||||
core.setFailed(`Draft prerelease ${process.env.TAG_NAME} no longer targets ${context.sha}.`);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
|
||||||
await github.rest.git.getRef({
|
|
||||||
owner: context.repo.owner,
|
|
||||||
repo: context.repo.repo,
|
|
||||||
ref: `tags/${process.env.TAG_NAME}`,
|
|
||||||
});
|
|
||||||
core.setFailed(`Git tag ${process.env.TAG_NAME} was created while the images were building.`);
|
|
||||||
return;
|
|
||||||
} catch (error) {
|
|
||||||
if (error.status !== 404) throw error;
|
|
||||||
}
|
|
||||||
|
|
||||||
await github.rest.repos.updateRelease({
|
|
||||||
owner: context.repo.owner,
|
|
||||||
repo: context.repo.repo,
|
|
||||||
release_id: Number(process.env.RELEASE_ID),
|
|
||||||
tag_name: process.env.TAG_NAME,
|
|
||||||
target_commitish: context.sha,
|
|
||||||
prerelease: true,
|
|
||||||
draft: false,
|
|
||||||
});
|
|
||||||
120
.github/workflows/coolify-realtime-next.yml
vendored
120
.github/workflows/coolify-realtime-next.yml
vendored
|
|
@ -1,120 +0,0 @@
|
||||||
name: Coolify Realtime Development
|
|
||||||
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
branches: [ "next" ]
|
|
||||||
paths:
|
|
||||||
- .github/workflows/coolify-realtime-next.yml
|
|
||||||
- docker/coolify-realtime/Dockerfile
|
|
||||||
- docker/coolify-realtime/terminal-server.js
|
|
||||||
- docker/coolify-realtime/package.json
|
|
||||||
- docker/coolify-realtime/package-lock.json
|
|
||||||
- docker/coolify-realtime/soketi-entrypoint.sh
|
|
||||||
|
|
||||||
permissions:
|
|
||||||
contents: read
|
|
||||||
packages: write
|
|
||||||
|
|
||||||
env:
|
|
||||||
GITHUB_REGISTRY: ghcr.io
|
|
||||||
DOCKER_REGISTRY: docker.io
|
|
||||||
IMAGE_NAME: "coollabsio/coolify-realtime"
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
build-push:
|
|
||||||
strategy:
|
|
||||||
matrix:
|
|
||||||
include:
|
|
||||||
- arch: amd64
|
|
||||||
platform: linux/amd64
|
|
||||||
runner: ubuntu-24.04
|
|
||||||
- arch: aarch64
|
|
||||||
platform: linux/aarch64
|
|
||||||
runner: ubuntu-24.04-arm
|
|
||||||
runs-on: ${{ matrix.runner }}
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v5
|
|
||||||
with:
|
|
||||||
persist-credentials: false
|
|
||||||
|
|
||||||
- name: Login to ${{ env.GITHUB_REGISTRY }}
|
|
||||||
uses: docker/login-action@v3
|
|
||||||
with:
|
|
||||||
registry: ${{ env.GITHUB_REGISTRY }}
|
|
||||||
username: ${{ github.actor }}
|
|
||||||
password: ${{ secrets.GITHUB_TOKEN }}
|
|
||||||
|
|
||||||
- name: Login to ${{ env.DOCKER_REGISTRY }}
|
|
||||||
uses: docker/login-action@v3
|
|
||||||
with:
|
|
||||||
registry: ${{ env.DOCKER_REGISTRY }}
|
|
||||||
username: ${{ secrets.DOCKERHUB_USERNAME }}
|
|
||||||
password: ${{ secrets.DOCKERHUB_TOKEN }}
|
|
||||||
|
|
||||||
- name: Get Version
|
|
||||||
id: version
|
|
||||||
run: |
|
|
||||||
echo "VERSION=$(docker run --rm -v "$(pwd):/app" -w /app php:8.2-alpine3.16 php bootstrap/getRealtimeVersion.php)"|xargs >> $GITHUB_OUTPUT
|
|
||||||
|
|
||||||
- name: Build and Push Image (${{ matrix.arch }})
|
|
||||||
uses: docker/build-push-action@v6
|
|
||||||
with:
|
|
||||||
context: .
|
|
||||||
file: docker/coolify-realtime/Dockerfile
|
|
||||||
platforms: ${{ matrix.platform }}
|
|
||||||
push: true
|
|
||||||
tags: |
|
|
||||||
${{ env.DOCKER_REGISTRY }}/${{ env.IMAGE_NAME }}:${{ steps.version.outputs.VERSION }}-next-${{ matrix.arch }}
|
|
||||||
${{ env.GITHUB_REGISTRY }}/${{ env.IMAGE_NAME }}:${{ steps.version.outputs.VERSION }}-next-${{ matrix.arch }}
|
|
||||||
labels: |
|
|
||||||
coolify.managed=true
|
|
||||||
|
|
||||||
merge-manifest:
|
|
||||||
runs-on: ubuntu-24.04
|
|
||||||
needs: build-push
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v5
|
|
||||||
with:
|
|
||||||
persist-credentials: false
|
|
||||||
|
|
||||||
- uses: docker/setup-buildx-action@v3
|
|
||||||
|
|
||||||
- name: Login to ${{ env.GITHUB_REGISTRY }}
|
|
||||||
uses: docker/login-action@v3
|
|
||||||
with:
|
|
||||||
registry: ${{ env.GITHUB_REGISTRY }}
|
|
||||||
username: ${{ github.actor }}
|
|
||||||
password: ${{ secrets.GITHUB_TOKEN }}
|
|
||||||
|
|
||||||
- name: Login to ${{ env.DOCKER_REGISTRY }}
|
|
||||||
uses: docker/login-action@v3
|
|
||||||
with:
|
|
||||||
registry: ${{ env.DOCKER_REGISTRY }}
|
|
||||||
username: ${{ secrets.DOCKERHUB_USERNAME }}
|
|
||||||
password: ${{ secrets.DOCKERHUB_TOKEN }}
|
|
||||||
|
|
||||||
- name: Get Version
|
|
||||||
id: version
|
|
||||||
run: |
|
|
||||||
echo "VERSION=$(docker run --rm -v "$(pwd):/app" -w /app php:8.2-alpine3.16 php bootstrap/getRealtimeVersion.php)"|xargs >> $GITHUB_OUTPUT
|
|
||||||
|
|
||||||
- name: Create & publish manifest on ${{ env.GITHUB_REGISTRY }}
|
|
||||||
run: |
|
|
||||||
docker buildx imagetools create \
|
|
||||||
${{ env.GITHUB_REGISTRY }}/${{ env.IMAGE_NAME }}:${{ steps.version.outputs.VERSION }}-next-amd64 \
|
|
||||||
${{ env.GITHUB_REGISTRY }}/${{ env.IMAGE_NAME }}:${{ steps.version.outputs.VERSION }}-next-aarch64 \
|
|
||||||
--tag ${{ env.GITHUB_REGISTRY }}/${{ env.IMAGE_NAME }}:${{ steps.version.outputs.VERSION }}-next \
|
|
||||||
--tag ${{ env.GITHUB_REGISTRY }}/${{ env.IMAGE_NAME }}:next
|
|
||||||
|
|
||||||
- name: Create & publish manifest on ${{ env.DOCKER_REGISTRY }}
|
|
||||||
run: |
|
|
||||||
docker buildx imagetools create \
|
|
||||||
${{ env.DOCKER_REGISTRY }}/${{ env.IMAGE_NAME }}:${{ steps.version.outputs.VERSION }}-next-amd64 \
|
|
||||||
${{ env.DOCKER_REGISTRY }}/${{ env.IMAGE_NAME }}:${{ steps.version.outputs.VERSION }}-next-aarch64 \
|
|
||||||
--tag ${{ env.DOCKER_REGISTRY }}/${{ env.IMAGE_NAME }}:${{ steps.version.outputs.VERSION }}-next \
|
|
||||||
--tag ${{ env.DOCKER_REGISTRY }}/${{ env.IMAGE_NAME }}:next
|
|
||||||
|
|
||||||
- uses: sarisia/actions-status-discord@v1
|
|
||||||
if: always()
|
|
||||||
with:
|
|
||||||
webhook: ${{ secrets.DISCORD_WEBHOOK_DEV_RELEASE_CHANNEL }}
|
|
||||||
161
.github/workflows/coolify-realtime.yml
vendored
161
.github/workflows/coolify-realtime.yml
vendored
|
|
@ -1,161 +0,0 @@
|
||||||
name: Coolify Realtime
|
|
||||||
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
branches: [ "main" ]
|
|
||||||
paths:
|
|
||||||
- .github/workflows/coolify-realtime.yml
|
|
||||||
- docker/coolify-realtime/**
|
|
||||||
|
|
||||||
permissions:
|
|
||||||
contents: read
|
|
||||||
packages: write
|
|
||||||
|
|
||||||
env:
|
|
||||||
GITHUB_REGISTRY: ghcr.io
|
|
||||||
DOCKER_REGISTRY: docker.io
|
|
||||||
IMAGE_NAME: "coollabsio/coolify-realtime"
|
|
||||||
|
|
||||||
concurrency:
|
|
||||||
group: ${{ github.workflow }}-${{ github.ref }}
|
|
||||||
cancel-in-progress: false
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
check-version:
|
|
||||||
runs-on: ubuntu-24.04
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v5
|
|
||||||
with:
|
|
||||||
persist-credentials: false
|
|
||||||
|
|
||||||
- uses: docker/setup-buildx-action@v3
|
|
||||||
|
|
||||||
- name: Login to ${{ env.GITHUB_REGISTRY }}
|
|
||||||
uses: docker/login-action@v3
|
|
||||||
with:
|
|
||||||
registry: ${{ env.GITHUB_REGISTRY }}
|
|
||||||
username: ${{ github.actor }}
|
|
||||||
password: ${{ secrets.GITHUB_TOKEN }}
|
|
||||||
|
|
||||||
- name: Login to ${{ env.DOCKER_REGISTRY }}
|
|
||||||
uses: docker/login-action@v3
|
|
||||||
with:
|
|
||||||
registry: ${{ env.DOCKER_REGISTRY }}
|
|
||||||
username: ${{ secrets.DOCKERHUB_USERNAME }}
|
|
||||||
password: ${{ secrets.DOCKERHUB_TOKEN }}
|
|
||||||
|
|
||||||
- name: Ensure version is not published
|
|
||||||
run: |
|
|
||||||
BASE_VERSION=$(docker run --rm -v "$(pwd):/app" -w /app php:8.2-alpine3.16 php bootstrap/getRealtimeVersion.php)
|
|
||||||
VERSION="${BASE_VERSION}"
|
|
||||||
for registry in "${DOCKER_REGISTRY}" "${GITHUB_REGISTRY}"; do
|
|
||||||
IMAGE="${registry}/${IMAGE_NAME}:${VERSION}"
|
|
||||||
if output=$(docker buildx imagetools inspect "$IMAGE" 2>&1); then
|
|
||||||
echo "::error::Version $VERSION already exists in $registry"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
if ! grep -Eqi 'manifest unknown|not found|no such manifest' <<< "$output"; then
|
|
||||||
echo "::error::Could not verify $IMAGE: $output"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
echo "Version $VERSION is available in both registries"
|
|
||||||
|
|
||||||
build-push:
|
|
||||||
needs: check-version
|
|
||||||
strategy:
|
|
||||||
matrix:
|
|
||||||
include:
|
|
||||||
- arch: amd64
|
|
||||||
platform: linux/amd64
|
|
||||||
runner: ubuntu-24.04
|
|
||||||
- arch: aarch64
|
|
||||||
platform: linux/aarch64
|
|
||||||
runner: ubuntu-24.04-arm
|
|
||||||
runs-on: ${{ matrix.runner }}
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v5
|
|
||||||
with:
|
|
||||||
persist-credentials: false
|
|
||||||
|
|
||||||
- name: Login to ${{ env.GITHUB_REGISTRY }}
|
|
||||||
uses: docker/login-action@v3
|
|
||||||
with:
|
|
||||||
registry: ${{ env.GITHUB_REGISTRY }}
|
|
||||||
username: ${{ github.actor }}
|
|
||||||
password: ${{ secrets.GITHUB_TOKEN }}
|
|
||||||
|
|
||||||
- name: Login to ${{ env.DOCKER_REGISTRY }}
|
|
||||||
uses: docker/login-action@v3
|
|
||||||
with:
|
|
||||||
registry: ${{ env.DOCKER_REGISTRY }}
|
|
||||||
username: ${{ secrets.DOCKERHUB_USERNAME }}
|
|
||||||
password: ${{ secrets.DOCKERHUB_TOKEN }}
|
|
||||||
|
|
||||||
- name: Get Version
|
|
||||||
id: version
|
|
||||||
run: |
|
|
||||||
echo "VERSION=$(docker run --rm -v "$(pwd):/app" -w /app php:8.2-alpine3.16 php bootstrap/getRealtimeVersion.php)"|xargs >> $GITHUB_OUTPUT
|
|
||||||
|
|
||||||
- name: Build and Push Image (${{ matrix.arch }})
|
|
||||||
uses: docker/build-push-action@v6
|
|
||||||
with:
|
|
||||||
context: .
|
|
||||||
file: docker/coolify-realtime/Dockerfile
|
|
||||||
platforms: ${{ matrix.platform }}
|
|
||||||
push: true
|
|
||||||
tags: |
|
|
||||||
${{ env.DOCKER_REGISTRY }}/${{ env.IMAGE_NAME }}:${{ steps.version.outputs.VERSION }}-${{ matrix.arch }}
|
|
||||||
${{ env.GITHUB_REGISTRY }}/${{ env.IMAGE_NAME }}:${{ steps.version.outputs.VERSION }}-${{ matrix.arch }}
|
|
||||||
labels: |
|
|
||||||
coolify.managed=true
|
|
||||||
|
|
||||||
merge-manifest:
|
|
||||||
runs-on: ubuntu-24.04
|
|
||||||
needs: build-push
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v5
|
|
||||||
with:
|
|
||||||
persist-credentials: false
|
|
||||||
|
|
||||||
- uses: docker/setup-buildx-action@v3
|
|
||||||
|
|
||||||
- name: Login to ${{ env.GITHUB_REGISTRY }}
|
|
||||||
uses: docker/login-action@v3
|
|
||||||
with:
|
|
||||||
registry: ${{ env.GITHUB_REGISTRY }}
|
|
||||||
username: ${{ github.actor }}
|
|
||||||
password: ${{ secrets.GITHUB_TOKEN }}
|
|
||||||
|
|
||||||
- name: Login to ${{ env.DOCKER_REGISTRY }}
|
|
||||||
uses: docker/login-action@v3
|
|
||||||
with:
|
|
||||||
registry: ${{ env.DOCKER_REGISTRY }}
|
|
||||||
username: ${{ secrets.DOCKERHUB_USERNAME }}
|
|
||||||
password: ${{ secrets.DOCKERHUB_TOKEN }}
|
|
||||||
|
|
||||||
- name: Get Version
|
|
||||||
id: version
|
|
||||||
run: |
|
|
||||||
echo "VERSION=$(docker run --rm -v "$(pwd):/app" -w /app php:8.2-alpine3.16 php bootstrap/getRealtimeVersion.php)"|xargs >> $GITHUB_OUTPUT
|
|
||||||
|
|
||||||
- name: Create & publish manifest on ${{ env.GITHUB_REGISTRY }}
|
|
||||||
run: |
|
|
||||||
docker buildx imagetools create \
|
|
||||||
${{ env.GITHUB_REGISTRY }}/${{ env.IMAGE_NAME }}:${{ steps.version.outputs.VERSION }}-amd64 \
|
|
||||||
${{ env.GITHUB_REGISTRY }}/${{ env.IMAGE_NAME }}:${{ steps.version.outputs.VERSION }}-aarch64 \
|
|
||||||
--tag ${{ env.GITHUB_REGISTRY }}/${{ env.IMAGE_NAME }}:${{ steps.version.outputs.VERSION }} \
|
|
||||||
--tag ${{ env.GITHUB_REGISTRY }}/${{ env.IMAGE_NAME }}:latest
|
|
||||||
|
|
||||||
- name: Create & publish manifest on ${{ env.DOCKER_REGISTRY }}
|
|
||||||
run: |
|
|
||||||
docker buildx imagetools create \
|
|
||||||
${{ env.DOCKER_REGISTRY }}/${{ env.IMAGE_NAME }}:${{ steps.version.outputs.VERSION }}-amd64 \
|
|
||||||
${{ env.DOCKER_REGISTRY }}/${{ env.IMAGE_NAME }}:${{ steps.version.outputs.VERSION }}-aarch64 \
|
|
||||||
--tag ${{ env.DOCKER_REGISTRY }}/${{ env.IMAGE_NAME }}:${{ steps.version.outputs.VERSION }} \
|
|
||||||
--tag ${{ env.DOCKER_REGISTRY }}/${{ env.IMAGE_NAME }}:latest
|
|
||||||
|
|
||||||
- uses: sarisia/actions-status-discord@v1
|
|
||||||
if: always()
|
|
||||||
with:
|
|
||||||
webhook: ${{ secrets.DISCORD_WEBHOOK_PROD_RELEASE_CHANNEL }}
|
|
||||||
259
.github/workflows/coolify-release.yml
vendored
259
.github/workflows/coolify-release.yml
vendored
|
|
@ -1,259 +0,0 @@
|
||||||
name: Release Coolify Stable
|
|
||||||
run-name: ${{ inputs.tag }}
|
|
||||||
|
|
||||||
on:
|
|
||||||
workflow_dispatch:
|
|
||||||
inputs:
|
|
||||||
tag:
|
|
||||||
description: Existing draft release tag (for example, v4.3.1)
|
|
||||||
required: true
|
|
||||||
type: string
|
|
||||||
|
|
||||||
permissions: {}
|
|
||||||
|
|
||||||
concurrency:
|
|
||||||
group: coolify-fix-release
|
|
||||||
cancel-in-progress: false
|
|
||||||
|
|
||||||
env:
|
|
||||||
GITHUB_REGISTRY: ghcr.io
|
|
||||||
DOCKER_REGISTRY: docker.io
|
|
||||||
IMAGE_NAME: coollabsio/coolify
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
validate:
|
|
||||||
runs-on: ubuntu-24.04
|
|
||||||
permissions:
|
|
||||||
contents: write
|
|
||||||
outputs:
|
|
||||||
release_id: ${{ steps.draft.outputs.release_id }}
|
|
||||||
version: ${{ steps.version.outputs.version }}
|
|
||||||
steps:
|
|
||||||
- name: Reject releases outside the production branch
|
|
||||||
if: ${{ github.ref_name != 'main' }}
|
|
||||||
run: |
|
|
||||||
echo "Stable releases must run from main, not ${{ github.ref_name }}."
|
|
||||||
exit 1
|
|
||||||
|
|
||||||
- uses: actions/checkout@v5
|
|
||||||
with:
|
|
||||||
fetch-depth: 0
|
|
||||||
persist-credentials: false
|
|
||||||
|
|
||||||
- name: Validate version
|
|
||||||
id: version
|
|
||||||
env:
|
|
||||||
TAG_NAME: ${{ inputs.tag }}
|
|
||||||
run: |
|
|
||||||
if [[ ! "${TAG_NAME}" =~ ^v[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
|
|
||||||
echo "Unsupported fix release tag: ${TAG_NAME}"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
VERSION="${TAG_NAME#v}"
|
|
||||||
CONFIG_VERSION=$(docker run --rm -v "$(pwd):/app" -w /app php:8.2-alpine3.16 php bootstrap/getVersion.php)
|
|
||||||
|
|
||||||
if [[ "${CONFIG_VERSION}" != "${VERSION}" ]]; then
|
|
||||||
echo "Release tag ${VERSION} does not match config version ${CONFIG_VERSION}."
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo "version=${VERSION}" >> "$GITHUB_OUTPUT"
|
|
||||||
|
|
||||||
- name: Validate and pin draft release
|
|
||||||
id: draft
|
|
||||||
uses: actions/github-script@v8
|
|
||||||
env:
|
|
||||||
TAG_NAME: ${{ inputs.tag }}
|
|
||||||
with:
|
|
||||||
script: |
|
|
||||||
const releases = await github.paginate(github.rest.repos.listReleases, {
|
|
||||||
owner: context.repo.owner,
|
|
||||||
repo: context.repo.repo,
|
|
||||||
per_page: 100,
|
|
||||||
});
|
|
||||||
const release = releases.find((candidate) => candidate.tag_name === process.env.TAG_NAME);
|
|
||||||
|
|
||||||
if (!release) {
|
|
||||||
core.setFailed(`Create a draft release for ${process.env.TAG_NAME} before running this workflow.`);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (!release.draft) {
|
|
||||||
core.setFailed(`Release ${process.env.TAG_NAME} must still be a draft.`);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (release.prerelease) {
|
|
||||||
core.setFailed(`Fix release ${process.env.TAG_NAME} cannot be marked as a prerelease.`);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (!release.body?.trim()) {
|
|
||||||
core.setFailed(`Draft release ${process.env.TAG_NAME} must contain reviewed release notes.`);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
|
||||||
await github.rest.git.getRef({
|
|
||||||
owner: context.repo.owner,
|
|
||||||
repo: context.repo.repo,
|
|
||||||
ref: `tags/${process.env.TAG_NAME}`,
|
|
||||||
});
|
|
||||||
core.setFailed(`Git tag ${process.env.TAG_NAME} already exists.`);
|
|
||||||
return;
|
|
||||||
} catch (error) {
|
|
||||||
if (error.status !== 404) throw error;
|
|
||||||
}
|
|
||||||
|
|
||||||
await github.rest.repos.updateRelease({
|
|
||||||
owner: context.repo.owner,
|
|
||||||
repo: context.repo.repo,
|
|
||||||
release_id: release.id,
|
|
||||||
tag_name: process.env.TAG_NAME,
|
|
||||||
target_commitish: context.sha,
|
|
||||||
});
|
|
||||||
core.setOutput('release_id', release.id);
|
|
||||||
|
|
||||||
build:
|
|
||||||
needs: validate
|
|
||||||
permissions:
|
|
||||||
contents: read
|
|
||||||
packages: write
|
|
||||||
strategy:
|
|
||||||
matrix:
|
|
||||||
include:
|
|
||||||
- arch: amd64
|
|
||||||
platform: linux/amd64
|
|
||||||
runner: ubuntu-24.04
|
|
||||||
- arch: aarch64
|
|
||||||
platform: linux/aarch64
|
|
||||||
runner: ubuntu-24.04-arm
|
|
||||||
runs-on: ${{ matrix.runner }}
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v5
|
|
||||||
with:
|
|
||||||
persist-credentials: false
|
|
||||||
|
|
||||||
- uses: docker/setup-buildx-action@v3
|
|
||||||
|
|
||||||
- name: Login to ${{ env.GITHUB_REGISTRY }}
|
|
||||||
uses: docker/login-action@v3
|
|
||||||
with:
|
|
||||||
registry: ${{ env.GITHUB_REGISTRY }}
|
|
||||||
username: ${{ github.actor }}
|
|
||||||
password: ${{ secrets.GITHUB_TOKEN }}
|
|
||||||
|
|
||||||
- name: Login to ${{ env.DOCKER_REGISTRY }}
|
|
||||||
uses: docker/login-action@v3
|
|
||||||
with:
|
|
||||||
registry: ${{ env.DOCKER_REGISTRY }}
|
|
||||||
username: ${{ secrets.DOCKERHUB_USERNAME }}
|
|
||||||
password: ${{ secrets.DOCKERHUB_TOKEN }}
|
|
||||||
|
|
||||||
- name: Build and push release image (${{ matrix.arch }})
|
|
||||||
uses: docker/build-push-action@v6
|
|
||||||
with:
|
|
||||||
context: .
|
|
||||||
file: docker/production/Dockerfile
|
|
||||||
platforms: ${{ matrix.platform }}
|
|
||||||
push: true
|
|
||||||
build-args: |
|
|
||||||
COOLIFY_VERSION=${{ needs.validate.outputs.version }}
|
|
||||||
tags: |
|
|
||||||
${{ env.GITHUB_REGISTRY }}/${{ env.IMAGE_NAME }}:release-${{ needs.validate.outputs.version }}-${{ github.sha }}-${{ matrix.arch }}
|
|
||||||
${{ env.DOCKER_REGISTRY }}/${{ env.IMAGE_NAME }}:release-${{ needs.validate.outputs.version }}-${{ github.sha }}-${{ matrix.arch }}
|
|
||||||
|
|
||||||
publish:
|
|
||||||
needs: [validate, build]
|
|
||||||
runs-on: ubuntu-24.04
|
|
||||||
permissions:
|
|
||||||
contents: write
|
|
||||||
packages: write
|
|
||||||
steps:
|
|
||||||
- uses: docker/setup-buildx-action@v3
|
|
||||||
|
|
||||||
- name: Login to ${{ env.GITHUB_REGISTRY }}
|
|
||||||
uses: docker/login-action@v3
|
|
||||||
with:
|
|
||||||
registry: ${{ env.GITHUB_REGISTRY }}
|
|
||||||
username: ${{ github.actor }}
|
|
||||||
password: ${{ secrets.GITHUB_TOKEN }}
|
|
||||||
|
|
||||||
- name: Login to ${{ env.DOCKER_REGISTRY }}
|
|
||||||
uses: docker/login-action@v3
|
|
||||||
with:
|
|
||||||
registry: ${{ env.DOCKER_REGISTRY }}
|
|
||||||
username: ${{ secrets.DOCKERHUB_USERNAME }}
|
|
||||||
password: ${{ secrets.DOCKERHUB_TOKEN }}
|
|
||||||
|
|
||||||
- name: Publish version and latest on ${{ env.GITHUB_REGISTRY }}
|
|
||||||
env:
|
|
||||||
REGISTRY: ${{ env.GITHUB_REGISTRY }}
|
|
||||||
VERSION: ${{ needs.validate.outputs.version }}
|
|
||||||
run: |
|
|
||||||
IMAGE="${REGISTRY}/${IMAGE_NAME}"
|
|
||||||
SOURCE="release-${VERSION}-${GITHUB_SHA}"
|
|
||||||
docker buildx imagetools create \
|
|
||||||
"${IMAGE}:${SOURCE}-amd64" \
|
|
||||||
"${IMAGE}:${SOURCE}-aarch64" \
|
|
||||||
--tag "${IMAGE}:${VERSION}" \
|
|
||||||
--tag "${IMAGE}:latest"
|
|
||||||
|
|
||||||
- name: Publish version and latest on ${{ env.DOCKER_REGISTRY }}
|
|
||||||
env:
|
|
||||||
REGISTRY: ${{ env.DOCKER_REGISTRY }}
|
|
||||||
VERSION: ${{ needs.validate.outputs.version }}
|
|
||||||
run: |
|
|
||||||
IMAGE="${REGISTRY}/${IMAGE_NAME}"
|
|
||||||
SOURCE="release-${VERSION}-${GITHUB_SHA}"
|
|
||||||
docker buildx imagetools create \
|
|
||||||
"${IMAGE}:${SOURCE}-amd64" \
|
|
||||||
"${IMAGE}:${SOURCE}-aarch64" \
|
|
||||||
--tag "${IMAGE}:${VERSION}" \
|
|
||||||
--tag "${IMAGE}:latest"
|
|
||||||
|
|
||||||
- name: Publish reviewed draft release
|
|
||||||
uses: actions/github-script@v8
|
|
||||||
env:
|
|
||||||
RELEASE_ID: ${{ needs.validate.outputs.release_id }}
|
|
||||||
TAG_NAME: ${{ inputs.tag }}
|
|
||||||
with:
|
|
||||||
script: |
|
|
||||||
const releaseId = Number(process.env.RELEASE_ID);
|
|
||||||
const { data: release } = await github.rest.repos.getRelease({
|
|
||||||
owner: context.repo.owner,
|
|
||||||
repo: context.repo.repo,
|
|
||||||
release_id: releaseId,
|
|
||||||
});
|
|
||||||
|
|
||||||
if (release.tag_name !== process.env.TAG_NAME || !release.draft || release.prerelease) {
|
|
||||||
core.setFailed(`Draft release ${process.env.TAG_NAME} changed while the images were building.`);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (!release.body?.trim()) {
|
|
||||||
core.setFailed(`Draft release ${process.env.TAG_NAME} no longer contains release notes.`);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (release.target_commitish !== context.sha) {
|
|
||||||
core.setFailed(`Draft release ${process.env.TAG_NAME} no longer targets ${context.sha}.`);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
|
||||||
await github.rest.git.getRef({
|
|
||||||
owner: context.repo.owner,
|
|
||||||
repo: context.repo.repo,
|
|
||||||
ref: `tags/${process.env.TAG_NAME}`,
|
|
||||||
});
|
|
||||||
core.setFailed(`Git tag ${process.env.TAG_NAME} was created while the images were building.`);
|
|
||||||
return;
|
|
||||||
} catch (error) {
|
|
||||||
if (error.status !== 404) throw error;
|
|
||||||
}
|
|
||||||
|
|
||||||
await github.rest.repos.updateRelease({
|
|
||||||
owner: context.repo.owner,
|
|
||||||
repo: context.repo.repo,
|
|
||||||
release_id: Number(process.env.RELEASE_ID),
|
|
||||||
tag_name: process.env.TAG_NAME,
|
|
||||||
target_commitish: context.sha,
|
|
||||||
draft: false,
|
|
||||||
});
|
|
||||||
109
.github/workflows/coolify-sha-build.yml
vendored
109
.github/workflows/coolify-sha-build.yml
vendored
|
|
@ -1,109 +0,0 @@
|
||||||
name: Build Coolify (SHA)
|
|
||||||
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
branches: ["main"]
|
|
||||||
|
|
||||||
permissions:
|
|
||||||
contents: read
|
|
||||||
packages: write
|
|
||||||
|
|
||||||
env:
|
|
||||||
GITHUB_REGISTRY: ghcr.io
|
|
||||||
DOCKER_REGISTRY: docker.io
|
|
||||||
IMAGE_NAME: "coollabsio/coolify"
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
build-push:
|
|
||||||
outputs:
|
|
||||||
short_sha: ${{ steps.version.outputs.short_sha }}
|
|
||||||
strategy:
|
|
||||||
matrix:
|
|
||||||
include:
|
|
||||||
- arch: amd64
|
|
||||||
platform: linux/amd64
|
|
||||||
runner: ubuntu-24.04
|
|
||||||
- arch: aarch64
|
|
||||||
platform: linux/aarch64
|
|
||||||
runner: ubuntu-24.04-arm
|
|
||||||
runs-on: ${{ matrix.runner }}
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v5
|
|
||||||
with:
|
|
||||||
persist-credentials: false
|
|
||||||
|
|
||||||
- name: Resolve internal version
|
|
||||||
id: version
|
|
||||||
run: |
|
|
||||||
BASE_VERSION=$(docker run --rm -v "$(pwd):/app" -w /app php:8.2-alpine3.16 php bootstrap/getVersion.php)
|
|
||||||
echo "version=${BASE_VERSION}-dev.${GITHUB_SHA::9}" >> "$GITHUB_OUTPUT"
|
|
||||||
echo "short_sha=${GITHUB_SHA::7}" >> "$GITHUB_OUTPUT"
|
|
||||||
|
|
||||||
- name: Login to ${{ env.GITHUB_REGISTRY }}
|
|
||||||
uses: docker/login-action@v3
|
|
||||||
with:
|
|
||||||
registry: ${{ env.GITHUB_REGISTRY }}
|
|
||||||
username: ${{ github.actor }}
|
|
||||||
password: ${{ secrets.GITHUB_TOKEN }}
|
|
||||||
|
|
||||||
- name: Login to ${{ env.DOCKER_REGISTRY }}
|
|
||||||
uses: docker/login-action@v3
|
|
||||||
with:
|
|
||||||
registry: ${{ env.DOCKER_REGISTRY }}
|
|
||||||
username: ${{ secrets.DOCKERHUB_USERNAME }}
|
|
||||||
password: ${{ secrets.DOCKERHUB_TOKEN }}
|
|
||||||
|
|
||||||
- name: Build and Push Image (${{ matrix.arch }})
|
|
||||||
uses: docker/build-push-action@v6
|
|
||||||
with:
|
|
||||||
context: .
|
|
||||||
file: docker/production/Dockerfile
|
|
||||||
platforms: ${{ matrix.platform }}
|
|
||||||
push: true
|
|
||||||
build-args: |
|
|
||||||
COOLIFY_VERSION=${{ steps.version.outputs.version }}
|
|
||||||
tags: |
|
|
||||||
${{ env.DOCKER_REGISTRY }}/${{ env.IMAGE_NAME }}:sha-${{ steps.version.outputs.short_sha }}-${{ matrix.arch }}
|
|
||||||
${{ env.GITHUB_REGISTRY }}/${{ env.IMAGE_NAME }}:sha-${{ steps.version.outputs.short_sha }}-${{ matrix.arch }}
|
|
||||||
|
|
||||||
merge-manifest:
|
|
||||||
runs-on: ubuntu-24.04
|
|
||||||
needs: build-push
|
|
||||||
steps:
|
|
||||||
- uses: docker/setup-buildx-action@v3
|
|
||||||
|
|
||||||
- name: Login to ${{ env.GITHUB_REGISTRY }}
|
|
||||||
uses: docker/login-action@v3
|
|
||||||
with:
|
|
||||||
registry: ${{ env.GITHUB_REGISTRY }}
|
|
||||||
username: ${{ github.actor }}
|
|
||||||
password: ${{ secrets.GITHUB_TOKEN }}
|
|
||||||
|
|
||||||
- name: Login to ${{ env.DOCKER_REGISTRY }}
|
|
||||||
uses: docker/login-action@v3
|
|
||||||
with:
|
|
||||||
registry: ${{ env.DOCKER_REGISTRY }}
|
|
||||||
username: ${{ secrets.DOCKERHUB_USERNAME }}
|
|
||||||
password: ${{ secrets.DOCKERHUB_TOKEN }}
|
|
||||||
|
|
||||||
- name: Create & publish manifest on ${{ env.GITHUB_REGISTRY }}
|
|
||||||
env:
|
|
||||||
REGISTRY: ${{ env.GITHUB_REGISTRY }}
|
|
||||||
SHA: ${{ needs.build-push.outputs.short_sha }}
|
|
||||||
run: |
|
|
||||||
IMAGE="${REGISTRY}/${IMAGE_NAME}"
|
|
||||||
docker buildx imagetools create \
|
|
||||||
"${IMAGE}:sha-${SHA}-amd64" \
|
|
||||||
"${IMAGE}:sha-${SHA}-aarch64" \
|
|
||||||
--tag "${IMAGE}:sha-${SHA}"
|
|
||||||
|
|
||||||
- name: Create & publish manifest on ${{ env.DOCKER_REGISTRY }}
|
|
||||||
env:
|
|
||||||
REGISTRY: ${{ env.DOCKER_REGISTRY }}
|
|
||||||
SHA: ${{ needs.build-push.outputs.short_sha }}
|
|
||||||
run: |
|
|
||||||
IMAGE="${REGISTRY}/${IMAGE_NAME}"
|
|
||||||
docker buildx imagetools create \
|
|
||||||
"${IMAGE}:sha-${SHA}-amd64" \
|
|
||||||
"${IMAGE}:sha-${SHA}-aarch64" \
|
|
||||||
--tag "${IMAGE}:sha-${SHA}"
|
|
||||||
104
.github/workflows/coolify-testing-host.yml
vendored
104
.github/workflows/coolify-testing-host.yml
vendored
|
|
@ -1,104 +0,0 @@
|
||||||
name: Coolify Testing Host
|
|
||||||
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
branches: [ "next" ]
|
|
||||||
paths:
|
|
||||||
- .github/workflows/coolify-testing-host.yml
|
|
||||||
- docker/testing-host/Dockerfile
|
|
||||||
|
|
||||||
permissions:
|
|
||||||
contents: read
|
|
||||||
packages: write
|
|
||||||
|
|
||||||
env:
|
|
||||||
GITHUB_REGISTRY: ghcr.io
|
|
||||||
DOCKER_REGISTRY: docker.io
|
|
||||||
IMAGE_NAME: "coollabsio/coolify-testing-host"
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
build-push:
|
|
||||||
strategy:
|
|
||||||
matrix:
|
|
||||||
include:
|
|
||||||
- arch: amd64
|
|
||||||
platform: linux/amd64
|
|
||||||
runner: ubuntu-24.04
|
|
||||||
- arch: aarch64
|
|
||||||
platform: linux/aarch64
|
|
||||||
runner: ubuntu-24.04-arm
|
|
||||||
runs-on: ${{ matrix.runner }}
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v5
|
|
||||||
with:
|
|
||||||
persist-credentials: false
|
|
||||||
|
|
||||||
- name: Login to ${{ env.GITHUB_REGISTRY }}
|
|
||||||
uses: docker/login-action@v3
|
|
||||||
with:
|
|
||||||
registry: ${{ env.GITHUB_REGISTRY }}
|
|
||||||
username: ${{ github.actor }}
|
|
||||||
password: ${{ secrets.GITHUB_TOKEN }}
|
|
||||||
|
|
||||||
- name: Login to ${{ env.DOCKER_REGISTRY }}
|
|
||||||
uses: docker/login-action@v3
|
|
||||||
with:
|
|
||||||
registry: ${{ env.DOCKER_REGISTRY }}
|
|
||||||
username: ${{ secrets.DOCKERHUB_USERNAME }}
|
|
||||||
password: ${{ secrets.DOCKERHUB_TOKEN }}
|
|
||||||
|
|
||||||
- name: Build and Push Image (${{ matrix.arch }})
|
|
||||||
uses: docker/build-push-action@v6
|
|
||||||
with:
|
|
||||||
context: .
|
|
||||||
file: docker/testing-host/Dockerfile
|
|
||||||
platforms: ${{ matrix.platform }}
|
|
||||||
push: true
|
|
||||||
tags: |
|
|
||||||
${{ env.DOCKER_REGISTRY }}/${{ env.IMAGE_NAME }}:latest-${{ matrix.arch }}
|
|
||||||
${{ env.GITHUB_REGISTRY }}/${{ env.IMAGE_NAME }}:latest-${{ matrix.arch }}
|
|
||||||
labels: |
|
|
||||||
coolify.managed=true
|
|
||||||
|
|
||||||
merge-manifest:
|
|
||||||
runs-on: ubuntu-24.04
|
|
||||||
needs: build-push
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v5
|
|
||||||
with:
|
|
||||||
persist-credentials: false
|
|
||||||
|
|
||||||
- uses: docker/setup-buildx-action@v3
|
|
||||||
|
|
||||||
- name: Login to ${{ env.GITHUB_REGISTRY }}
|
|
||||||
uses: docker/login-action@v3
|
|
||||||
with:
|
|
||||||
registry: ${{ env.GITHUB_REGISTRY }}
|
|
||||||
username: ${{ github.actor }}
|
|
||||||
password: ${{ secrets.GITHUB_TOKEN }}
|
|
||||||
|
|
||||||
- name: Login to ${{ env.DOCKER_REGISTRY }}
|
|
||||||
uses: docker/login-action@v3
|
|
||||||
with:
|
|
||||||
registry: ${{ env.DOCKER_REGISTRY }}
|
|
||||||
username: ${{ secrets.DOCKERHUB_USERNAME }}
|
|
||||||
password: ${{ secrets.DOCKERHUB_TOKEN }}
|
|
||||||
|
|
||||||
- name: Create & publish manifest on ${{ env.GITHUB_REGISTRY }}
|
|
||||||
run: |
|
|
||||||
docker buildx imagetools create \
|
|
||||||
${{ env.GITHUB_REGISTRY }}/${{ env.IMAGE_NAME }}:latest-amd64 \
|
|
||||||
${{ env.GITHUB_REGISTRY }}/${{ env.IMAGE_NAME }}:latest-aarch64 \
|
|
||||||
--tag ${{ env.GITHUB_REGISTRY }}/${{ env.IMAGE_NAME }}:latest
|
|
||||||
|
|
||||||
- name: Create & publish manifest on ${{ env.DOCKER_REGISTRY }}
|
|
||||||
run: |
|
|
||||||
docker buildx imagetools create \
|
|
||||||
${{ env.DOCKER_REGISTRY }}/${{ env.IMAGE_NAME }}:latest-amd64 \
|
|
||||||
${{ env.DOCKER_REGISTRY }}/${{ env.IMAGE_NAME }}:latest-aarch64 \
|
|
||||||
--tag ${{ env.DOCKER_REGISTRY }}/${{ env.IMAGE_NAME }}:latest
|
|
||||||
|
|
||||||
- uses: sarisia/actions-status-discord@v1
|
|
||||||
if: always()
|
|
||||||
with:
|
|
||||||
webhook: ${{ secrets.DISCORD_WEBHOOK_DEV_RELEASE_CHANNEL }}
|
|
||||||
42
.github/workflows/generate-changelog.yml
vendored
42
.github/workflows/generate-changelog.yml
vendored
|
|
@ -1,42 +0,0 @@
|
||||||
name: Generate Changelog
|
|
||||||
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
branches: [ main ]
|
|
||||||
paths-ignore:
|
|
||||||
- .github/workflows/coolify-helper.yml
|
|
||||||
- .github/workflows/coolify-helper-next.yml
|
|
||||||
- .github/workflows/coolify-realtime.yml
|
|
||||||
- .github/workflows/coolify-realtime-next.yml
|
|
||||||
- .github/workflows/pr-quality.yaml
|
|
||||||
workflow_dispatch:
|
|
||||||
|
|
||||||
permissions:
|
|
||||||
contents: write
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
changelog:
|
|
||||||
name: Generate changelog
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- name: Checkout
|
|
||||||
uses: actions/checkout@v4
|
|
||||||
with:
|
|
||||||
fetch-depth: 0
|
|
||||||
|
|
||||||
- name: Generate changelog
|
|
||||||
uses: orhun/git-cliff-action@v4
|
|
||||||
with:
|
|
||||||
config: cliff.toml
|
|
||||||
args: --verbose
|
|
||||||
env:
|
|
||||||
OUTPUT: CHANGELOG.md
|
|
||||||
GITHUB_REPO: ${{ github.repository }}
|
|
||||||
|
|
||||||
- name: Commit
|
|
||||||
run: |
|
|
||||||
git config user.name 'github-actions[bot]'
|
|
||||||
git config user.email 'github-actions[bot]@users.noreply.github.com'
|
|
||||||
git add CHANGELOG.md
|
|
||||||
git commit -m "docs: update changelog"
|
|
||||||
git push https://${{ secrets.GITHUB_TOKEN }}@github.com/${GITHUB_REPOSITORY}.git HEAD:${GITHUB_REF_NAME}
|
|
||||||
108
.github/workflows/pr-quality.yaml
vendored
108
.github/workflows/pr-quality.yaml
vendored
|
|
@ -1,108 +0,0 @@
|
||||||
name: PR Quality
|
|
||||||
|
|
||||||
permissions:
|
|
||||||
contents: read
|
|
||||||
issues: read
|
|
||||||
pull-requests: write
|
|
||||||
|
|
||||||
on:
|
|
||||||
pull_request_target:
|
|
||||||
types: [opened, reopened]
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
pr-quality:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- uses: peakoss/anti-slop@v0
|
|
||||||
with:
|
|
||||||
# General Settings
|
|
||||||
max-failures: 4
|
|
||||||
|
|
||||||
# PR Branch Checks
|
|
||||||
allowed-target-branches: ""
|
|
||||||
blocked-target-branches: ""
|
|
||||||
allowed-source-branches: ""
|
|
||||||
blocked-source-branches: ""
|
|
||||||
|
|
||||||
# PR Quality Checks
|
|
||||||
max-negative-reactions: 0
|
|
||||||
require-maintainer-can-modify: true
|
|
||||||
|
|
||||||
# PR Title Checks
|
|
||||||
require-conventional-title: true
|
|
||||||
|
|
||||||
# PR Description Checks
|
|
||||||
require-description: true
|
|
||||||
max-description-length: 2500
|
|
||||||
max-emoji-count: 2
|
|
||||||
max-code-references: 5
|
|
||||||
require-linked-issue: false
|
|
||||||
blocked-terms: |
|
|
||||||
STRAWBERRY
|
|
||||||
🤖 Generated with Claude Code
|
|
||||||
Generated with Claude Code
|
|
||||||
blocked-issue-numbers: 8154
|
|
||||||
|
|
||||||
# PR Template Checks
|
|
||||||
require-pr-template: true
|
|
||||||
strict-pr-template-sections: "Contributor Agreement"
|
|
||||||
optional-pr-template-sections: "Issues,Preview"
|
|
||||||
max-additional-pr-template-sections: 2
|
|
||||||
|
|
||||||
# Commit Message Checks
|
|
||||||
max-commit-message-length: 500
|
|
||||||
require-conventional-commits: false
|
|
||||||
require-commit-author-match: true
|
|
||||||
blocked-commit-authors: ""
|
|
||||||
|
|
||||||
# File Checks
|
|
||||||
allowed-file-extensions: ""
|
|
||||||
allowed-paths: ""
|
|
||||||
blocked-paths: |
|
|
||||||
README.md
|
|
||||||
SECURITY.md
|
|
||||||
LICENSE
|
|
||||||
CODE_OF_CONDUCT.md
|
|
||||||
templates/service-templates-latest.json
|
|
||||||
templates/service-templates.json
|
|
||||||
require-final-newline: true
|
|
||||||
max-added-comments: 10
|
|
||||||
|
|
||||||
# User Checks
|
|
||||||
detect-spam-usernames: true
|
|
||||||
min-account-age: 30
|
|
||||||
max-daily-forks: 7
|
|
||||||
min-profile-completeness: 4
|
|
||||||
|
|
||||||
# Merge Checks
|
|
||||||
min-repo-merged-prs: 0
|
|
||||||
min-repo-merge-ratio: 0
|
|
||||||
min-global-merge-ratio: 30
|
|
||||||
global-merge-ratio-exclude-own: false
|
|
||||||
|
|
||||||
# Exemptions
|
|
||||||
exempt-draft-prs: false
|
|
||||||
exempt-bots: |
|
|
||||||
actions-user
|
|
||||||
dependabot[bot]
|
|
||||||
renovate[bot]
|
|
||||||
github-actions[bot]
|
|
||||||
exempt-users: ""
|
|
||||||
exempt-author-association: "OWNER,MEMBER,COLLABORATOR"
|
|
||||||
exempt-label: "quality/exempt"
|
|
||||||
exempt-pr-label: ""
|
|
||||||
exempt-all-milestones: false
|
|
||||||
exempt-all-pr-milestones: false
|
|
||||||
exempt-milestones: ""
|
|
||||||
exempt-pr-milestones: ""
|
|
||||||
|
|
||||||
# PR Success Actions
|
|
||||||
success-add-pr-labels: ""
|
|
||||||
|
|
||||||
# PR Failure Actions
|
|
||||||
failure-remove-pr-labels: ""
|
|
||||||
failure-remove-all-pr-labels: true
|
|
||||||
failure-add-pr-labels: "quality/rejected"
|
|
||||||
failure-pr-message: "This PR did not pass quality checks so it will be closed. If you believe this is a mistake please let us know."
|
|
||||||
close-pr: true
|
|
||||||
lock-pr: false
|
|
||||||
62
.github/workflows/sync-main-to-next.yml
vendored
62
.github/workflows/sync-main-to-next.yml
vendored
|
|
@ -1,62 +0,0 @@
|
||||||
name: Sync main to next
|
|
||||||
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
branches: [main]
|
|
||||||
workflow_dispatch:
|
|
||||||
|
|
||||||
permissions:
|
|
||||||
contents: write
|
|
||||||
pull-requests: write
|
|
||||||
|
|
||||||
concurrency:
|
|
||||||
group: sync-main-to-next
|
|
||||||
cancel-in-progress: false
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
sync:
|
|
||||||
name: Merge main into next
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- name: Checkout next
|
|
||||||
uses: actions/checkout@v5
|
|
||||||
with:
|
|
||||||
ref: next
|
|
||||||
fetch-depth: 0
|
|
||||||
|
|
||||||
- name: Merge main into next
|
|
||||||
env:
|
|
||||||
GH_TOKEN: ${{ github.token }}
|
|
||||||
run: |
|
|
||||||
git config user.name 'github-actions[bot]'
|
|
||||||
git config user.email '41898282+github-actions[bot]@users.noreply.github.com'
|
|
||||||
git fetch origin main next
|
|
||||||
|
|
||||||
if git merge --no-edit origin/main; then
|
|
||||||
git push origin HEAD:next
|
|
||||||
exit 0
|
|
||||||
fi
|
|
||||||
|
|
||||||
conflicts=$(git diff --name-only --diff-filter=U)
|
|
||||||
git merge --abort
|
|
||||||
|
|
||||||
if [ -z "$conflicts" ]; then
|
|
||||||
echo 'The merge failed without conflicts, so no pull request was created.'
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
sync_branch='automation/sync-main-to-next'
|
|
||||||
existing_pr=$(gh pr list --base next --head "$sync_branch" --state open --json url --jq '.[0].url')
|
|
||||||
if [ -n "$existing_pr" ]; then
|
|
||||||
echo "A main to next pull request already exists: $existing_pr"
|
|
||||||
else
|
|
||||||
git push --force origin origin/main:"refs/heads/$sync_branch"
|
|
||||||
gh pr create \
|
|
||||||
--base next \
|
|
||||||
--head "$sync_branch" \
|
|
||||||
--title 'chore: merge main into next' \
|
|
||||||
--body 'This pull request was created automatically because main could not be merged into next without conflicts. Resolve conflicts on this temporary branch; never update main with next.'
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo 'main could not be merged into next without conflicts.'
|
|
||||||
exit 1
|
|
||||||
Loading…
Reference in a new issue