Introduce About Github Action
Abstract
The Gallery of github-actions pipelines, All scenarios to approaching and experience when I work on this platform
Documentation
Feature
- Github Action - Variables
- Github Action - Reuse workflows
- Github Actions - Triggering a workflow
- Github Actions - Controlling permissions for GITHUB_TOKEN
- Github Action - Control the concurrency of workflows and jobs
Deploy React application to Github Page
# Define name of Actions
name: Deploy the page to internet
# Trigger of Actions
# Read on: https://docs.github.com/en/actions/using-workflows/triggering-a-workflow
on:
pull_request:
branches:
- main
push:
branches:
- main
# Assigning permissions to jobs
# Read on: https://docs.github.com/en/actions/using-jobs/assigning-permissions-to-jobs
permissions:
contents: read
pages: write
id-token: write
# About concurrency
# Read on: https://docs.github.com/en/actions/using-jobs/using-concurrency
concurrency:
group: "pages"
cancel-in-progress: false
# Define job in a workflow
# Read on: https://docs.github.com/en/actions/using-jobs/using-jobs-in-a-workflow
jobs:
build:
runs-on: self-hosted
steps:
- uses: actions/checkout@v3
with:
fetch-depth: 0 # Fetch all history for git info
- uses: actions/setup-node@v3
with:
node-version: 18.14
- name: Install Dependencies
run: npm ci
- name: Build Application
run: npm build
- name: Upload artifact
uses: actions/upload-pages-artifact@v2
with:
path: public
deploy:
# Condition for running the job
if: github.ref == 'refs/heads/main'
needs: build
environment:
name: github-pages
url: ${{ steps.deployment.outputs.page_url }}
runs-on: self-hosted
steps:
- name: Deploy to GitHub Pages
id: deployment
uses: actions/deploy-pages@v2
Deploy React application to Azure SWA
name: Azure Static Web Apps CI/CD
on:
push:
branches:
- main
pull_request:
types: [opened, synchronize, reopened, closed]
branches:
- main
jobs:
build_and_deploy_job:
if: github.event_name == 'push' || (github.event_name == 'pull_request' && github.event.action != 'closed')
runs-on: ubuntu-latest
name: Build and Deploy Job
steps:
- uses: actions/checkout@v3
with:
fetch-depth: 0
- name: Build And Deploy
id: builddeploy
uses: Azure/static-web-apps-deploy@v1
with:
azure_static_web_apps_api_token: ${{ secrets.AZURE_STATIC_WEB_APPS_API_TOKEN }}
repo_token: ${{ secrets.GITHUB_TOKEN }} # Used for Github integrations (i.e. PR comments)
action: "upload"
###### Repository/Build Configurations - These values can be configured to match your app requirements. ######
# For more information regarding Static Web App workflow configurations, please visit: https://aka.ms/swaworkflowconfig
app_location: "/" # App source code path
api_location: "" # Api source code path - optional
output_location: "public" # Built app content directory - optional
###### End of Repository/Build Configurations ######
close_pull_request_job:
if: github.event_name == 'pull_request' && github.event.action == 'closed'
runs-on: ubuntu-latest
name: Close Pull Request Job
steps:
- name: Close Pull Request
id: closepullrequest
uses: Azure/static-web-apps-deploy@v1
with:
azure_static_web_apps_api_token: ${{ secrets.AZURE_STATIC_WEB_APPS_API_TOKEN }}
action: "close"
Build Mobile with Expo
You need to use eas.json
to configuration how can expo-cli
talk with your source code
{
"cli": {
"version": ">= 10.2.1"
},
"build": {
"development": {
"developmentClient": true,
"distribution": "internal"
},
"previewAndroid": {
"distribution": "internal",
"android": {
"buildType": "apk",
"env": {
"EXPO_PUBLIC_API_URL" : "https://xeusnguyen.xyz/"
}
}
},
"bundle": {
"android": {
"buildType": "app-bundle",
"gradleCommand": "app:bundleRelease",
"env": {
"EXPO_PUBLIC_API_URL" : "https://xeusnguyen.xyz/"
}
}
},
"previewApple": {
"ios": {
"env": {
"EXPO_PUBLIC_API_URL": "https://xeusnguyen.xyz/"
}
}
},
"production": {}
},
"submit": {
"production": {}
}
}
After define that you will have permission to use expo
inside your github-actions
Android
# Define name of Actions
name: Build and Release Android Applications
# Trigger of Actions by manually
# Read on: https://docs.github.com/en/actions/writing-workflows/choosing-when-your-workflow-runs/events-that-trigger-workflows#workflow_dispatch
on: workflow_dispatch
# Define job in a workflow
# Read on: https://docs.github.com/en/actions/using-jobs/using-jobs-in-a-workflow
jobs:
build_android:
runs-on: ubuntu-latest
env:
EXPO_TOKEN: ${{ secrets.EXPO_TOKEN }}
steps:
- uses: actions/checkout@v3
with:
fetch-depth: 0 # Fetch all history for git info
- uses: actions/setup-node@v3
with:
node-version: 18.20.2
- name: Install Dependencies
run: |
npm install
npm install -g eas-cli
npx eas --version
npx eas whoami
- name: Build Android Application
run: npx eas build -p android --profile previewAndroid --non-interactive
- name: Download Artifact from Expo
run: |
artifactURL=$(npx eas build:view --json | jq -r ".artifacts.buildUrl")
mkdir -p ./android
wget -q $artifactURL -O ./android/$(cat app.json | jq -r '(.expo.name + "." + .expo.version)').apk
- name: Upload artifact
uses: actions/upload-artifact@v4
with:
path: android
retention-days: 30
################################################
## Use for production, need account to permit ##
## Doc: https://docs.expo.dev/submit/android/ ##
################################################
# release-android:
# runs-on: ubuntu-latest
# needs: build_android
# env:
# EXPO_TOKEN: ${{ secrets.EXPO_TOKEN }}
# steps:
# - name: Bundle Application
# run: |
# npx eas build -p android --profile bundle --non-interactive
# - name: Release app to Google Play
# run: |
# # Current not have account, We will provide after
# # Doc: https://docs.expo.dev/tutorial/eas/android-production-build/
# echo "Release aab to Google Play"
IOS
# Define name of Actions
name: Build and Release IOS Applications
# Trigger of Actions by manually
# Read on: https://docs.github.com/en/actions/writing-workflows/choosing-when-your-workflow-runs/events-that-trigger-workflows#workflow_dispatch
on: workflow_dispatch
# Define job in a workflow
# Read on: https://docs.github.com/en/actions/using-jobs/using-jobs-in-a-workflow
jobs:
build_ios:
runs-on: ubuntu-latest
env:
EXPO_TOKEN: ${{ secrets.EXPO_TOKEN }}
steps:
- uses: actions/checkout@v3
with:
fetch-depth: 0 # Fetch all history for git info
- uses: actions/setup-node@v3
with:
node-version: 18.20.2
- name: Install Dependencies
run: |
npm install
npm install -g eas-cli
npx eas --version
npx eas whoami
- name: Build IOS Application
run: npx eas build -p ios --profile previewApple --non-interactive
- name: Download Artifact from Expo
run: |
artifactURL=$(npx eas build:view --json | jq -r ".artifacts.buildUrl")
mkdir -p ./ios
wget -q $artifactURL -O ./ios/$(cat app.json | jq -r '(.expo.name + "." + .expo.version)').ipa
- name: Upload artifact
uses: actions/upload-artifact@v4
with:
path: ios
retention-days: 30