Compare commits
12
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
6212c3b717 | ||
|
|
8ed3923c18 | ||
|
|
16d61c7dea | ||
|
|
303da88239 | ||
|
|
9f3db93f93 | ||
|
|
436cbfb2c6 | ||
|
|
cff8ba4b85 | ||
|
|
6c415c6382 | ||
|
|
e7dfef2ebc | ||
|
|
d0cb810bbe | ||
|
|
ffb31e7f33 | ||
|
|
6cc48b6fa5 |
@@ -17,19 +17,26 @@ jobs:
|
|||||||
name: CI
|
name: CI
|
||||||
runs-on: node
|
runs-on: node
|
||||||
steps:
|
steps:
|
||||||
- name: Install Node.js and Docker
|
- name: Install Docker and corepack
|
||||||
run: |
|
run: |
|
||||||
apt-get update
|
apt-get update
|
||||||
apt-get install -y nodejs docker.io
|
apt-get install -y docker.io
|
||||||
|
corepack enable
|
||||||
|
|
||||||
- name: Checkout code
|
- name: Checkout code
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Install pnpm via corepack
|
||||||
|
run: corepack install
|
||||||
|
|
||||||
- name: Install dependencies
|
- name: Install dependencies
|
||||||
run: npm install
|
run: pnpm install --ignore-scripts
|
||||||
|
|
||||||
- name: Run tests
|
- name: Run tests
|
||||||
run: npm test -- --run 2>&1 || echo "Tests completed"
|
run: pnpm test -- --run 2>&1 || echo "Tests completed"
|
||||||
|
|
||||||
|
- name: Build
|
||||||
|
run: pnpm run build
|
||||||
|
|
||||||
- name: Get short SHA
|
- name: Get short SHA
|
||||||
id: sha
|
id: sha
|
||||||
|
|||||||
@@ -1,2 +1,3 @@
|
|||||||
ignore-scripts=false
|
ignore-scripts=false
|
||||||
enable-pre-post-scripts=true
|
enable-pre-post-scripts=true
|
||||||
|
minimum-release-age=0
|
||||||
|
|||||||
@@ -117,7 +117,7 @@ export default function Header() {
|
|||||||
</div>
|
</div>
|
||||||
<div className="flex items-center justify-between">
|
<div className="flex items-center justify-between">
|
||||||
<a
|
<a
|
||||||
href="https://github.com/rockliang"
|
href="https://github.com/Riotpiaole"
|
||||||
target="_blank"
|
target="_blank"
|
||||||
rel="noopener noreferrer"
|
rel="noopener noreferrer"
|
||||||
className="text-sm text-gray-700 dark:text-gray-300 hover:text-blue-600 dark:hover:text-blue-400 flex-1"
|
className="text-sm text-gray-700 dark:text-gray-300 hover:text-blue-600 dark:hover:text-blue-400 flex-1"
|
||||||
@@ -125,7 +125,7 @@ export default function Header() {
|
|||||||
{t.header.contact.github}
|
{t.header.contact.github}
|
||||||
</a>
|
</a>
|
||||||
<button
|
<button
|
||||||
onClick={() => handleCopy('https://github.com/rockliang', 'GitHub')}
|
onClick={() => handleCopy('https://github.com/Riotpiaole', 'GitHub')}
|
||||||
className="text-xs px-2 py-1 rounded bg-gray-100 dark:bg-gray-800 text-gray-600 dark:text-gray-400 hover:bg-blue-100 dark:hover:bg-blue-900"
|
className="text-xs px-2 py-1 rounded bg-gray-100 dark:bg-gray-800 text-gray-600 dark:text-gray-400 hover:bg-blue-100 dark:hover:bg-blue-900"
|
||||||
>
|
>
|
||||||
{copied === 'GitHub' ? '✓' : t.header.contact.copy}
|
{copied === 'GitHub' ? '✓' : t.header.contact.copy}
|
||||||
@@ -133,7 +133,7 @@ export default function Header() {
|
|||||||
</div>
|
</div>
|
||||||
<div className="flex items-center justify-between">
|
<div className="flex items-center justify-between">
|
||||||
<a
|
<a
|
||||||
href="https://github.com/rockliang"
|
href="https://forgejo.riotpiao.com"
|
||||||
target="_blank"
|
target="_blank"
|
||||||
rel="noopener noreferrer"
|
rel="noopener noreferrer"
|
||||||
className="text-sm text-gray-700 dark:text-gray-300 hover:text-blue-600 dark:hover:text-blue-400 flex-1"
|
className="text-sm text-gray-700 dark:text-gray-300 hover:text-blue-600 dark:hover:text-blue-400 flex-1"
|
||||||
@@ -141,7 +141,7 @@ export default function Header() {
|
|||||||
{t.header.contact.privateGithub}
|
{t.header.contact.privateGithub}
|
||||||
</a>
|
</a>
|
||||||
<button
|
<button
|
||||||
onClick={() => handleCopy('https://github.com/rockliang', 'PrivateGithub')}
|
onClick={() => handleCopy('https://forgejo.riotpiao.com', 'PrivateGithub')}
|
||||||
className="text-xs px-2 py-1 rounded bg-gray-100 dark:bg-gray-800 text-gray-600 dark:text-gray-400 hover:bg-blue-100 dark:hover:bg-blue-900"
|
className="text-xs px-2 py-1 rounded bg-gray-100 dark:bg-gray-800 text-gray-600 dark:text-gray-400 hover:bg-blue-100 dark:hover:bg-blue-900"
|
||||||
>
|
>
|
||||||
{copied === 'PrivateGithub' ? '✓' : t.header.contact.copy}
|
{copied === 'PrivateGithub' ? '✓' : t.header.contact.copy}
|
||||||
@@ -314,7 +314,7 @@ export default function Header() {
|
|||||||
</div>
|
</div>
|
||||||
<div className="flex items-center justify-between">
|
<div className="flex items-center justify-between">
|
||||||
<a
|
<a
|
||||||
href="https://github.com/rockliang"
|
href="https://github.com/Riotpiaole"
|
||||||
target="_blank"
|
target="_blank"
|
||||||
rel="noopener noreferrer"
|
rel="noopener noreferrer"
|
||||||
className="text-sm text-gray-700 dark:text-gray-300 hover:text-blue-600 flex-1"
|
className="text-sm text-gray-700 dark:text-gray-300 hover:text-blue-600 flex-1"
|
||||||
@@ -322,7 +322,7 @@ export default function Header() {
|
|||||||
{t.header.contact.github}
|
{t.header.contact.github}
|
||||||
</a>
|
</a>
|
||||||
<button
|
<button
|
||||||
onClick={() => handleCopy('https://github.com/rockliang', 'GitHub')}
|
onClick={() => handleCopy('https://github.com/Riotpiaole', 'GitHub')}
|
||||||
className="text-xs px-2 py-1 rounded bg-gray-100 dark:bg-gray-700 text-gray-600 dark:text-gray-400 hover:bg-blue-100 dark:hover:bg-blue-900"
|
className="text-xs px-2 py-1 rounded bg-gray-100 dark:bg-gray-700 text-gray-600 dark:text-gray-400 hover:bg-blue-100 dark:hover:bg-blue-900"
|
||||||
>
|
>
|
||||||
{copied === 'GitHub' ? '✓' : t.header.contact.copy}
|
{copied === 'GitHub' ? '✓' : t.header.contact.copy}
|
||||||
@@ -330,7 +330,7 @@ export default function Header() {
|
|||||||
</div>
|
</div>
|
||||||
<div className="flex items-center justify-between">
|
<div className="flex items-center justify-between">
|
||||||
<a
|
<a
|
||||||
href="https://github.com/rockliang"
|
href="https://forgejo.riotpiao.com"
|
||||||
target="_blank"
|
target="_blank"
|
||||||
rel="noopener noreferrer"
|
rel="noopener noreferrer"
|
||||||
className="text-sm text-gray-700 dark:text-gray-300 hover:text-blue-600 flex-1"
|
className="text-sm text-gray-700 dark:text-gray-300 hover:text-blue-600 flex-1"
|
||||||
@@ -338,7 +338,7 @@ export default function Header() {
|
|||||||
{t.header.contact.privateGithub}
|
{t.header.contact.privateGithub}
|
||||||
</a>
|
</a>
|
||||||
<button
|
<button
|
||||||
onClick={() => handleCopy('https://github.com/rockliang', 'PrivateGithub')}
|
onClick={() => handleCopy('https://forgejo.riotpiao.com', 'PrivateGithub')}
|
||||||
className="text-xs px-2 py-1 rounded bg-gray-100 dark:bg-gray-700 text-gray-600 dark:text-gray-400 hover:bg-blue-100 dark:hover:bg-blue-900"
|
className="text-xs px-2 py-1 rounded bg-gray-100 dark:bg-gray-700 text-gray-600 dark:text-gray-400 hover:bg-blue-100 dark:hover:bg-blue-900"
|
||||||
>
|
>
|
||||||
{copied === 'PrivateGithub' ? '✓' : t.header.contact.copy}
|
{copied === 'PrivateGithub' ? '✓' : t.header.contact.copy}
|
||||||
|
|||||||
@@ -6,6 +6,9 @@ metadata:
|
|||||||
labels:
|
labels:
|
||||||
app.kubernetes.io/name: portfolio
|
app.kubernetes.io/name: portfolio
|
||||||
app.kubernetes.io/component: web
|
app.kubernetes.io/component: web
|
||||||
|
annotations:
|
||||||
|
argocd-image-updater.argoproj.io/image-list: portfolio=forgejo.riotpiao.com/rock/portfolio
|
||||||
|
argocd-image-updater.argoproj.io/portfolio.update-strategy: latest
|
||||||
spec:
|
spec:
|
||||||
replicas: 2
|
replicas: 2
|
||||||
selector:
|
selector:
|
||||||
|
|||||||
@@ -1,13 +1,22 @@
|
|||||||
apiVersion: kustomize.config.k8s.io/v1beta1
|
apiVersion: kustomize.config.k8s.io/v1beta1
|
||||||
kind: Kustomization
|
kind: Kustomization
|
||||||
namespace: portfolio
|
namespace: portfolio
|
||||||
|
|
||||||
resources:
|
resources:
|
||||||
- namespace.yaml
|
- namespace.yaml
|
||||||
- configmap.enc.yaml
|
|
||||||
- deployment.yaml
|
- deployment.yaml
|
||||||
- service.yaml
|
- service.yaml
|
||||||
- ingress.yaml
|
- ingress.yaml
|
||||||
|
|
||||||
# Decrypt secrets via SOPS before applying
|
# SOPS-encrypted secrets via ksops generator (ArgoCD repo-server plugin)
|
||||||
sops:
|
# ksops intercepts encrypted files, decrypts them, returns valid resources
|
||||||
version: 3
|
generatorOptions:
|
||||||
|
disableNameSuffixHash: true
|
||||||
|
|
||||||
|
generators:
|
||||||
|
- secret-generator.yaml
|
||||||
|
|
||||||
|
# ArgoCD Image Updater configuration - for tag updates
|
||||||
|
images:
|
||||||
|
- name: forgejo.riotpiao.com/rock/portfolio
|
||||||
|
newTag: latest
|
||||||
|
|||||||
@@ -0,0 +1,10 @@
|
|||||||
|
apiVersion: viaduct.ai/v1
|
||||||
|
kind: ksops
|
||||||
|
metadata:
|
||||||
|
name: portfolio-secrets-generator
|
||||||
|
annotations:
|
||||||
|
config.kubernetes.io/function: |
|
||||||
|
exec:
|
||||||
|
path: ksops
|
||||||
|
files:
|
||||||
|
- configmap.enc.yaml
|
||||||
@@ -12,6 +12,7 @@
|
|||||||
"keywords": [],
|
"keywords": [],
|
||||||
"author": "",
|
"author": "",
|
||||||
"license": "ISC",
|
"license": "ISC",
|
||||||
|
"packageManager": "[email protected]",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"framer-motion": "^11.0.0",
|
"framer-motion": "^11.0.0",
|
||||||
"lucide-react": "^1.41.0",
|
"lucide-react": "^1.41.0",
|
||||||
|
|||||||
Generated
+849
-747
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user