Skip to content

Commit 9772e9c

Browse files
Create github release in release workflow
1 parent e7dfb8c commit 9772e9c

1 file changed

Lines changed: 140 additions & 13 deletions

File tree

.github/workflows/release-v2.yml

Lines changed: 140 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -23,36 +23,73 @@ env:
2323
DB_MIGRATION_SCRIPT: database_migration.sql
2424

2525
jobs:
26-
release:
26+
setup:
2727
runs-on: ubuntu-latest
28+
29+
outputs:
30+
imageTag: ${{ steps.setup-vars.outputs.IMAGE_TAG }}
31+
needsSemver: ${{ steps.setup-vars.outputs.NEEDS_SEMVER }}
32+
repositoryOwnerLC: ${{ steps.setup-vars.outputs.REPOSITORY_OWNER_LC }}
33+
repositoryName: ${{ steps.setup-vars.outputs.REPOSITORY_NAME }}
34+
2835
steps:
29-
- uses: actions/checkout@v4
30-
with:
31-
sparse-checkout: |
32-
docker/${{ env.COMPOSE_FILE_NAME }}
33-
sparse-checkout-cone-mode: false
36+
- name: Checkout
37+
uses: actions/checkout@v4
3438

3539
- name: Set up environment variables
40+
id: setup-vars
3641
run: |
42+
BRANCH_NAME_DASH=$(echo "${GITHUB_REF#refs/heads/}" | tr '/' '-')
43+
3744
# Set the image tag based on the branch name. If the branch is main, use "latest".
3845
# If the image tag is provided as an input, use that instead.
3946
if [ -z "$IMAGE_TAG_OVERRIDE" ]; then
4047
if [ "$GITHUB_REF" = "refs/heads/main" ]; then
4148
IMAGE_TAG=latest
4249
else
43-
IMAGE_TAG=$(echo "${GITHUB_REF#refs/heads/}" | tr '/' '-')
50+
IMAGE_TAG="$BRANCH_NAME_DASH"
4451
fi
4552
else
46-
IMAGE_TAG=$IMAGE_TAG_OVERRIDE
53+
IMAGE_TAG="$IMAGE_TAG_OVERRIDE"
54+
fi
55+
echo "IMAGE_TAG=$IMAGE_TAG" >> "$GITHUB_OUTPUT"
56+
57+
# If the image tag is "latest" or the branch name, flag it as needing semver.
58+
if [ "$IMAGE_TAG" = "latest" ]; then
59+
NEEDS_SEMVER=true
60+
elif [ "$IMAGE_TAG" = "$BRANCH_NAME_DASH" ]; then
61+
NEEDS_SEMVER=true
4762
fi
48-
echo "IMAGE_TAG=$IMAGE_TAG" >> "$GITHUB_ENV"
63+
echo "NEEDS_SEMVER: $NEEDS_SEMVER"
64+
echo "NEEDS_SEMVER=$NEEDS_SEMVER" >> "$GITHUB_OUTPUT"
4965
5066
# Set the repository name to lowercase
51-
REPOSITORY_NAME=$(echo $REPOSITORY_OWNER | tr '[:upper:]' '[:lower:]');
52-
echo "REPOSITORY_NAME=$REPOSITORY_NAME" >> "$GITHUB_ENV"
67+
REPOSITORY_OWNER_LC=$(echo $REPOSITORY_OWNER | tr '[:upper:]' '[:lower:]');
68+
echo "REPOSITORY_OWNER_LC=$REPOSITORY_OWNER_LC" >> "$GITHUB_OUTPUT"
69+
70+
# Extract the repository name from the repository env i.e. selfdocumentingcode/kattbot => kattbot
71+
REPOSITORY_NAME=${REPOSITORY##*/}
72+
echo "REPOSITORY_NAME=$REPOSITORY_NAME" >> "$GITHUB_OUTPUT"
5373
env:
5474
IMAGE_TAG_OVERRIDE: ${{ inputs.imageTag }}
5575
REPOSITORY_OWNER: ${{ github.repository_owner }}
76+
REPOSITORY: ${{ github.repository }}
77+
78+
release:
79+
runs-on: ubuntu-latest
80+
permissions:
81+
contents: read
82+
packages: write
83+
needs: setup
84+
env:
85+
IMAGE_TAG: ${{ needs.setup.outputs.imageTag }}
86+
REPOSITORY_OWNER_LC: ${{ needs.setup.outputs.repositoryOwnerLC }}
87+
steps:
88+
- uses: actions/checkout@v4
89+
with:
90+
sparse-checkout: |
91+
${{ env.COMPOSE_FILE_PATH_SRC }}
92+
sparse-checkout-cone-mode: false
5693

5794
- name: Upload compose.yml
5895
uses: appleboy/scp-action@v0.1.7
@@ -84,7 +121,7 @@ jobs:
84121
debug: ${{vars.ACTIONS_RUNNER_DEBUG}}
85122
script_stop: true
86123
script: |
87-
FULL_IMAGE_NAME="$REGISTRY/$REPOSITORY_NAME/$IMAGE_NAME:$IMAGE_TAG"
124+
FULL_IMAGE_NAME="$REGISTRY/$REPOSITORY_OWNER_LC/$IMAGE_NAME:$IMAGE_TAG"
88125
echo "Full image name: $FULL_IMAGE_NAME"
89126
90127
MIGRATIONS_CONTAINER_NAME="$COMPOSE_PROJECT_NAME-migrations"
@@ -128,7 +165,7 @@ jobs:
128165
envs: >-
129166
HOST_GATEWAY_IP,
130167
REGISTRY,
131-
REPOSITORY_NAME,
168+
REPOSITORY_OWNER_LC,
132169
IMAGE_NAME,
133170
IMAGE_TAG,
134171
COMPOSE_PROJECT_NAME,
@@ -141,3 +178,93 @@ jobs:
141178
BOT_TOKEN,
142179
OPENAI_API_KEY,
143180
DB_CONNECTION_STRING
181+
182+
create-release:
183+
runs-on: ubuntu-latest
184+
if: ${{ github.ref == 'refs/heads/main' }}
185+
permissions:
186+
packages: read
187+
contents: read
188+
needs: [setup, release]
189+
env:
190+
IMAGE_TAG: ${{ needs.setup.outputs.imageTag }}
191+
NEEDS_SEMVER: ${{ needs.setup.outputs.needsSemver }}
192+
REPOSITORY_NAME: ${{ needs.setup.outputs.repositoryName }}
193+
steps:
194+
- name: Checkout
195+
uses: actions/checkout@v4
196+
with:
197+
fetch-depth: 0
198+
199+
- name: GitHub Packages Admin
200+
id: package-info
201+
uses: selfdocumentingcode/ghaction-package-admin@v1.1
202+
with:
203+
ghtoken: ${{ github.token }}
204+
operation: listPackageVersions
205+
user: ${{ github.repository_owner }}
206+
package_type: container
207+
package_name: ${{ env.REPOSITORY_NAME }}
208+
include: metadata.container.tags[*] ${{ env.IMAGE_TAG }}
209+
slice: __NONE__ 1 # get the first item only
210+
211+
- name: Get container tags
212+
run: |
213+
echo "IMAGE_TAG: $IMAGE_TAG"
214+
echo "NEEDS_SEMVER: $NEEDS_SEMVER"
215+
216+
TAG_LIST=$(echo "$PACKAGE_INFO" | jq --raw-output '.[0].metadata.container.tags')
217+
echo "TAG_LIST: $TAG_LIST"
218+
219+
SHA_TAG=$(echo "$PACKAGE_INFO" | jq --raw-output '.[0].metadata.container.tags | map(select(startswith("sha"))) | .[0]')
220+
echo "SHA_TAG: $SHA_TAG"
221+
222+
# Exclude "sha-" prefix from SHA_TAG
223+
COMMIT_SHA=${SHA_TAG#"sha-"}
224+
echo "COMMIT_SHA: $COMMIT_SHA"
225+
echo "COMMIT_SHA=$COMMIT_SHA" >> $GITHUB_ENV
226+
227+
if [ "${NEEDS_SEMVER}" == "true" ]; then
228+
SEMVER_TAG=$(echo "$PACKAGE_INFO" | jq --raw-output '.[0].metadata.container.tags | map(select((startswith("sha") | not) and . != "${IMAGE_TAG}")) | .[0]')
229+
else
230+
SEMVER_TAG=${IMAGE_TAG}
231+
fi
232+
echo "SEMVER_TAG: $SEMVER_TAG"
233+
echo "SEMVER_TAG=$SEMVER_TAG" >> $GITHUB_ENV
234+
env:
235+
PACKAGE_INFO: ${{ steps.package-info.outputs.result_json_output }}
236+
237+
- name: Check if commit exists on current branch
238+
id: check_commit
239+
run: |
240+
BRANCH_NAME=${GITHUB_REF#refs/heads/}
241+
echo "BRANCH_NAME: $BRANCH_NAME"
242+
243+
if git branch --contains "$COMMIT_SHA" | grep -q "$BRANCH_NAME"; then
244+
echo "Commit $COMMIT_SHA exists on branch $BRANCH_NAME."
245+
else
246+
echo "Commit $COMMIT_SHA does not exist on $BRANCH_NAME."
247+
exit 1
248+
fi
249+
env:
250+
COMMIT_SHA: ${{ env.COMMIT_SHA }}
251+
252+
- uses: actions/create-github-app-token@v1
253+
id: app-token
254+
with:
255+
app-id: ${{ secrets.GH_APP_ID }}
256+
private-key: ${{ secrets.GH_APP_PRIVATE_KEY }}
257+
258+
- name: Create Release
259+
run: |
260+
gh release create $SEMVER_TAG \
261+
--target $COMMIT_SHA \
262+
--title $SEMVER_TAG \
263+
--draft \
264+
--repo $REPOSITORY
265+
env:
266+
GH_TOKEN: ${{ steps.app-token.outputs.token }}
267+
REPOSITORY: ${{ github.repository }}
268+
SEMVER_TAG: ${{ env.SEMVER_TAG }}
269+
COMMIT_SHA: ${{ env.COMMIT_SHA }}
270+

0 commit comments

Comments
 (0)