From 8a80e58e547287eff22739f73684688d4530ecff Mon Sep 17 00:00:00 2001
From: Awiteb
Date: Sat, 16 Nov 2024 13:12:59 +0000
Subject: [PATCH] chore: Add CI/CD
Signed-off-by: Awiteb
---
.forgejo/ISSUE_TEMPLATE/bug.md | 32 +++++++
.forgejo/ISSUE_TEMPLATE/feature_request.md | 11 +++
.forgejo/pull_request_template.md | 19 ++++
.forgejo/workflows/cd.yml | 106 +++++++++++++++++++++
.forgejo/workflows/changelog.yml | 36 +++++++
.forgejo/workflows/ci.yml | 25 +++++
.forgejo/workflows/dco_checker.yml | 29 ++++++
.github/workflows/auto_close_pr.yml | 34 +++++++
8 files changed, 292 insertions(+)
create mode 100644 .forgejo/ISSUE_TEMPLATE/bug.md
create mode 100644 .forgejo/ISSUE_TEMPLATE/feature_request.md
create mode 100644 .forgejo/pull_request_template.md
create mode 100644 .forgejo/workflows/cd.yml
create mode 100644 .forgejo/workflows/changelog.yml
create mode 100644 .forgejo/workflows/ci.yml
create mode 100644 .forgejo/workflows/dco_checker.yml
create mode 100644 .github/workflows/auto_close_pr.yml
diff --git a/.forgejo/ISSUE_TEMPLATE/bug.md b/.forgejo/ISSUE_TEMPLATE/bug.md
new file mode 100644
index 0000000..9a3d378
--- /dev/null
+++ b/.forgejo/ISSUE_TEMPLATE/bug.md
@@ -0,0 +1,32 @@
+---
+name: Bug
+about: Create a bug report to help us improve forgejo-guardian
+title: "..."
+labels: ["Kind/Bug"]
+assignees: ""
+---
+
+## Checks
+
+- [ ] I added a descriptive title to this issue
+- [ ] I have searched Google for similar issues and couldn't find anything
+- [ ] I have read [the README](https://git.4rs.nl/awiteb/forgejo-guardian/src/branch/master/README.md) and still think this is a bug
+
+## Version
+
+
+
+forgejo-guardian version: `...`
+
+## Description
+
+
+
+## Expected behavior
+
+
+
+## Actual behavior
+
+
diff --git a/.forgejo/ISSUE_TEMPLATE/feature_request.md b/.forgejo/ISSUE_TEMPLATE/feature_request.md
new file mode 100644
index 0000000..96ee892
--- /dev/null
+++ b/.forgejo/ISSUE_TEMPLATE/feature_request.md
@@ -0,0 +1,11 @@
+---
+name: Feature request
+about: Suggest an idea for forgejo-guardian
+title: "..."
+labels: ["Kind/Feature"]
+assignees: ""
+---
+
+## Feature description
+
+
diff --git a/.forgejo/pull_request_template.md b/.forgejo/pull_request_template.md
new file mode 100644
index 0000000..3c61370
--- /dev/null
+++ b/.forgejo/pull_request_template.md
@@ -0,0 +1,19 @@
+## Summary
+
+
+
+### Related issue
+
+
+
+
+## Changes
+
+
+
+
+## Checklist
+- [ ] Added tests if applicable (for new features/regression/etc...)
+- [ ] Documentation
diff --git a/.forgejo/workflows/cd.yml b/.forgejo/workflows/cd.yml
new file mode 100644
index 0000000..da38678
--- /dev/null
+++ b/.forgejo/workflows/cd.yml
@@ -0,0 +1,106 @@
+name: CD
+
+on:
+ push:
+ tags:
+ - v[0-9]+.[0-9]+.[0-9]+
+ - v[0-9]+.[0-9]+.[0-9]+-rc.[0-9]+
+
+jobs:
+ build-assets:
+ runs-on: debian
+ strategy:
+ matrix:
+ target:
+ - x86_64-unknown-linux-gnu
+ - x86_64-unknown-linux-musl
+ - aarch64-unknown-linux-gnu
+ - aarch64-unknown-linux-musl
+ steps:
+ - uses: actions/checkout@v4
+ with:
+ ref: master
+ fetch-depth: 1
+ - uses: https://codeberg.org/awiteb/rust-action@v1.74
+ - name: Install musl-tools
+ run: |
+ apt-get update
+ apt-get install -y musl-tools
+ if: ${{ contains(matrix.target, 'musl') }}
+ - name: Install gcc-aarch64-linux-gnu linker
+ run: |
+ apt-get update
+ apt-get install -y gcc-aarch64-linux-gnu
+ if: ${{ contains(matrix.target, 'aarch64') }}
+ - name: Preparing the environment
+ run: |
+ BIN_NAME="$(echo $GITHUB_REPOSITORY | cut -d '/' -f 2)"
+ echo "BIN_NAME=$BIN_NAME" >> $GITHUB_ENV
+ mkdir -p release-dir
+ mkdir -p .cargo
+ echo 'target.aarch64-unknown-linux-gnu.linker = "aarch64-linux-gnu-gcc"' > .cargo/config.toml
+ echo 'target.aarch64-unknown-linux-musl.linker = "aarch64-linux-gnu-gcc"' >> .cargo/config.toml
+
+ - name: Install the target
+ run: rustup target install ${{ matrix.target }}
+
+ - name: Build the asset
+ run: |
+ TARGET=$(echo ${{ matrix.target }} | sed -e 's/-unknown//g' | sed -e 's/-pc//g')
+ APP_NAME="$BIN_NAME-$GITHUB_REF_NAME-$TARGET"
+ cargo clean
+ cargo build --release --target ${{ matrix.target }}
+ cp target/${{ matrix.target }}/release/$BIN_NAME release-dir/$APP_NAME
+ cd release-dir
+ test -f $APP_NAME && sha256sum $APP_NAME > $APP_NAME.sha256
+
+ # Upload the artifact, so it can be used in the release step
+ - uses: actions/upload-artifact@v3
+ with:
+ name: ${{ env.GITHUB_SHA }}-${{ env.GITHUB_RUN_NUMBER }}
+ path: ${{ env.GITHUB_WORKSPACE }}/release-dir
+
+ release:
+ needs: build-assets
+ runs-on: debian
+ steps:
+ - uses: actions/checkout@v4
+ with:
+ ref: master
+ fetch-depth: 0
+ fetch-tags: true
+ - uses: actions/download-artifact@v3
+ with:
+ name: ${{ env.GITHUB_SHA }}-${{ env.GITHUB_RUN_NUMBER }}
+ path: ${{ env.GITHUB_WORKSPACE }}/release-dir
+ - name: Install git-cliff
+ run: |
+ version="2.4.0"
+ wget "https://github.com/orhun/git-cliff/releases/download/v$version/git-cliff-$version-x86_64-unknown-linux-gnu.tar.gz"
+ tar -xvzf git-cliff-*.tar.gz
+ mv "git-cliff-$version/git-cliff" /usr/local/bin
+ rm -fr git-cliff-*
+ - name: Write changelog
+ run: |
+ git config user.name forgejo-actions
+ git config user.email forgejo-actions@noreply.localhost
+ echo 'TAG_CHANGELOG=$(if [[ $(git tag --sort=committerdate | tail -n 1) == *"-rc"* ]]; then git-cliff --strip all $(git tag --sort=committerdate | tail -n 2 | sed ":a; N; $!ba; s/\n/../g") | sed "s/## unreleased.*$//g"; else git-cliff -l --strip all | sed "s/^## \[.*$//g";fi)' | sed "s/\"/'/g" >> $GITHUB_ENV
+ if [[ $(git tag --sort=creatordate | tail -n 1) != *'-rc'* ]]; then
+ echo "The latest tag is not a release candidate, updating changelog for $GITHUB_REF_NAME"
+ git-cliff > CHANGELOG.md
+ git add CHANGELOG.md
+ git commit -m "Update changelog for $GITHUB_REF_NAME"
+ git push
+ echo "Changelog updated"
+ else
+ echo "The latest tag is a release candidate, not updating changelog"
+ fi
+ - name: Create Release
+ uses: actions/forgejo-release@v1
+ with:
+ direction: upload
+ url: https://git.4rs.nl
+ token: ${{ env.GITHUB_TOKEN }}
+ release-dir: release-dir
+ release-notes: ${{ env.TAG_CHANGELOG }}
+ prerelease: ${{ contains(env.GITHUB_REF_NAME, '-rc') }}
diff --git a/.forgejo/workflows/changelog.yml b/.forgejo/workflows/changelog.yml
new file mode 100644
index 0000000..fb67645
--- /dev/null
+++ b/.forgejo/workflows/changelog.yml
@@ -0,0 +1,36 @@
+name: Write changelog
+
+on:
+ push:
+ branches:
+ - 'master'
+
+jobs:
+ write-changelog:
+ runs-on: debian
+ steps:
+ - uses: actions/checkout@v4
+ with:
+ ref: master
+ fetch-depth: 0
+ fetch-tags: true
+ - name: Install git-cliff
+ run: |
+ version="2.4.0"
+ wget "https://github.com/orhun/git-cliff/releases/download/v$version/git-cliff-$version-x86_64-unknown-linux-gnu.tar.gz"
+ tar -xvzf git-cliff-*.tar.gz
+ mv "git-cliff-$version/git-cliff" /usr/local/bin
+ rm -fr git-cliff-*
+ - name: Write changelog
+ run: |
+ git config user.name forgejo-actions
+ git config user.email forgejo-actions@noreply.localhost
+ git-cliff > CHANGELOG.md
+ if [[ $(git status | grep --extended-regexp '^\s+modified:\s+CHANGELOG.md$') ]]; then
+ git add CHANGELOG.md
+ git commit -m "chore(changelog): Update changelog"
+ git push
+ echo "Changelog updated"
+ else
+ echo "No changes to changelog"
+ fi
diff --git a/.forgejo/workflows/ci.yml b/.forgejo/workflows/ci.yml
new file mode 100644
index 0000000..aafb5f0
--- /dev/null
+++ b/.forgejo/workflows/ci.yml
@@ -0,0 +1,25 @@
+name: Rust CI
+
+on:
+ push:
+ branches: [master]
+ pull_request:
+ branches: [master]
+
+jobs:
+ rust_ci:
+ name: Rust CI
+ runs-on: debian
+ steps:
+ - uses: actions/checkout@v4
+ - uses: https://codeberg.org/awiteb/rust-action@v1.81
+ - name: Check MSRV
+ run: cargo +1.81 build
+ - name: Build the source code
+ run: cargo build
+ - name: Check the code format
+ run: cargo fmt -- --check
+ - name: Run cargo-check
+ run: cargo check
+ - name: Run cargo-clippy
+ run: cargo clippy -- -D warnings
diff --git a/.forgejo/workflows/dco_checker.yml b/.forgejo/workflows/dco_checker.yml
new file mode 100644
index 0000000..9196cab
--- /dev/null
+++ b/.forgejo/workflows/dco_checker.yml
@@ -0,0 +1,29 @@
+name: DCO checker
+
+on:
+ pull_request:
+ branches: [master]
+ types: [opened, synchronize, reopened]
+
+jobs:
+ check:
+ name: DCO checker
+ runs-on: debian
+ steps:
+ - uses: actions/checkout@v4
+ with:
+ fetch-depth: 0
+ - name: DCO checker
+ run: |
+ commits=$(git rev-list origin/master..HEAD)
+ for commit in $commits; do
+ commit_subject=$(git show --quiet --format=%s $commit)
+ commit_sha=$(echo $commit | cut -c1-10)
+ echo "Checking commit $commit_sha \"$commit_subject\""
+ if ! git show --quiet --format=%B $commit | grep -q "Signed-off-by:"; then
+ author=$(git show --quiet --format=%an $commit)
+ echo "Commit $commit by $author is missing the 'Signed-off-by:' line"
+ exit 1
+ fi
+ done
+ echo "All commits have the 'Signed-off-by:' line."
diff --git a/.github/workflows/auto_close_pr.yml b/.github/workflows/auto_close_pr.yml
new file mode 100644
index 0000000..ed67ad5
--- /dev/null
+++ b/.github/workflows/auto_close_pr.yml
@@ -0,0 +1,34 @@
+name: Auto close PR
+
+on:
+ pull_request:
+ types: [opened, reopened]
+
+jobs:
+ close_pr:
+ name: Auto close PR
+ runs-on: ubuntu-latest
+ steps:
+ - name: Send close comment
+ run: |
+ curl -L \
+ -X POST \
+ -H "Accept: application/vnd.github+json" \
+ -H "Authorization: Bearer $PAT" \
+ -H "X-GitHub-Api-Version: 2022-11-28" \
+ https://api.github.com/repos/${{ github.repository }}/issues/${{ github.event.number }}/comments \
+ -d '{"body":"${{ env.BODY }}"}'
+ env:
+ PAT: ${{ secrets.PAT }}
+ BODY: This repository is mirror only and you cannot create a pull request for it. Please open your PR in https://git.4rs.nl/awiteb/forgejo-guardian
+ - name: Close the PR
+ run: |
+ curl -L \
+ -X PATCH \
+ -H "Accept: application/vnd.github+json" \
+ -H "Authorization: Bearer $PAT" \
+ -H "X-GitHub-Api-Version: 2022-11-28" \
+ https://api.github.com/repos/${{ github.repository }}/pulls/${{ github.event.number }} \
+ -d '{"state":"closed"}'
+ env:
+ PAT: ${{ secrets.PAT }}