This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
name: Deploy Node.js project to virtual machine | |
on: | |
push: | |
branches: | |
- feature/action-docker # 觸發條件改為推送到 docker 分支 | |
jobs: | |
deploy: | |
runs-on: ubuntu-latest | |
steps: | |
- name: Checkout code | |
uses: actions/checkout@v2 | |
- name: Install SSH key | |
uses: webfactory/[email protected] | |
with: | |
ssh-private-key: ${{ secrets.DEPLOY_SSH_KEY }} | |
- name: Create .env file | |
run: | | |
echo VARIABLE=${{ secrets.ENV_VARIABLE }} >> .env | |
# 可加入多個環境變數 | |
- name: Login to Docker Hub | |
uses: docker/login-action@v1 | |
with: | |
username: ${{ secrets.DOCKER_HUB_USERNAME }} | |
password: ${{ secrets.DOCKER_HUB_ACCESS_TOKEN }} | |
- name: Build and push Docker image | |
uses: docker/build-push-action@v2 | |
with: | |
context: . | |
push: true | |
tags: ${{ secrets.DOCKER_HUB_USERNAME }}/ironman-app-2023-amd64:latest # 使用你的 Docker Hub 使用者名稱和應用程式名稱 | |
- name: 更新 known_hosts 文件 # 步驟的名稱 | |
run: | # 將要執行的命令 | |
mkdir -p ~/.ssh # 在用戶的主目錄下創建 .ssh 目錄,如果該目錄已存在,則不會報錯 | |
ssh-keyscan ${{ secrets.HOST_NAME }} >> ~/.ssh/known_hosts # 從指定的主機獲取公鑰,並將其追加到 known_hosts 文件中 | |
# 請將 'hostname' 替換為你的服務器地址,例如 IP 地址或域名 | |
- name: Create directory if not exists # 確保資料夾是存在的 | |
run: ssh root@${{ secrets.HOST_NAME }} "mkdir -p ~/websample/node-env/" | |
- name: Transfer .env file # 上傳環境變數 | |
run: scp .env root@${{ secrets.HOST_NAME }}:~/websample/node-env/ | |
- name: Deploy to Docker | |
run: | | |
ssh root@${{ secrets.HOST_NAME }} ' | |
docker pull ${{ secrets.DOCKER_HUB_USERNAME }}/ironman-app-2023-amd64:latest | |
docker rm -f github-ac-sample || true | |
docker run -d -p 3003:3000 --name github-ac-sample --env-file /root/websample/node-env/.env ${{ secrets.DOCKER_HUB_USERNAME }}/ironman-app-2023-amd64:latest | |
' | |
# Docker 指令中,不能使用 `~` 路徑,建議替換為其他的絕對路徑名稱(此範例作為演示直接使用 `/root`) |