# Github Action

## 1️⃣ GitHub Actions kya hai (simple)

GitHub Actions = **built-in CI/CD tool**

* Code push hote hi pipeline run
    
* Build, test, scan, deploy automate
    
* Jenkins ka cloud-native alternative (hosted runners available)
    

---

## 2️⃣ Core concepts (yeh yaad rakho)

### ✅ Workflow

Pipeline file  
Location:

```plaintext
.github/workflows/ci.yml
```

### ✅ Event (Trigger)

Kab pipeline chale:

* `push`
    
* `pull_request`
    
* `workflow_dispatch` (manual)
    

### ✅ Job

Workflow ke andar ek unit of work  
Example: build job, test job

### ✅ Runner

Machine jahan job chalega

* GitHub hosted: `ubuntu-latest`
    
* Self-hosted: apna Linux server
    

### ✅ Step

Job ke andar commands / actions

### ✅ Action

Pre-built reusable step  
Example:

* `actions/checkout`
    
* `setup-java`
    

---

## 3️⃣ Linux par GitHub Actions setup (Self-hosted Runner)

Agar tum apne EC2 / Ubuntu server par runner chalana chahte ho:

### Step 1: GitHub Repo → Settings → Actions → Runners → New self-hosted runner

### Step 2: Linux commands (example Ubuntu)

```plaintext
# create folder
mkdir actions-runner && cd actions-runner

# download runner
curl -o actions-runner-linux-x64.tar.gz -L https://github.com/actions/runner/releases/latest/download/actions-runner-linux-x64.tar.gz

# extract
tar xzf actions-runner-linux-x64.tar.gz

# configure
./config.sh --url https://github.com/<your-username>/<repo-name> --token <TOKEN>

# start runner
./run.sh
```

Runner online ho jaayega ✅

Background service ke liye:

```plaintext
sudo ./svc.sh install
sudo ./svc.sh start
```

---

## 4️⃣ First CI pipeline (Java + Maven example)

```plaintext
name: CI Pipeline

on:
  push:
    branches: [ "main" ]
  pull_request:
    branches: [ "main" ]
  workflow_dispatch:

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
      - name: Checkout Code
        uses: actions/checkout@v4

      - name: Setup Java
        uses: actions/setup-java@v4
        with:
          distribution: 'temurin'
          java-version: '21'

      - name: Build with Maven
        run: mvn clean install

      - name: Run Tests
        run: mvn test
```

---

## 5️⃣ Artifacts upload/download

```plaintext
      - name: Upload Artifact
        uses: actions/upload-artifact@v4
        with:
          name: app-war
          path: target/*.war
```

Download in next job:

```plaintext
  deploy:
    needs: build
    runs-on: ubuntu-latest
    steps:
      - uses: actions/download-artifact@v4
        with:
          name: app-war
```

---

## 6️⃣ Secrets & credentials (IMPORTANT)

### Add secrets:

Repo → Settings → Secrets and variables → Actions → New secret

Use in workflow:

```plaintext
      - name: Login
        run: echo "Token is ${{ secrets.MY_TOKEN }}"
```

Never hardcode passwords ❌

---

## 7️⃣ Docker build & push example

```plaintext
name: Docker CI

on: [push]

jobs:
  docker:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      - name: Login to DockerHub
        run: echo "${{ secrets.DOCKER_PASS }}" | docker login -u "${{ secrets.DOCKER_USER }}" --password-stdin

      - name: Build Image
        run: docker build -t myapp:latest .

      - name: Push Image
        run: docker tag myapp:latest mydockerhub/myapp:latest
      - run: docker push mydockerhub/myapp:latest
```

---

## 8️⃣ Matrix build (multiple versions test)

```plaintext
jobs:
  test:
    runs-on: ubuntu-latest
    strategy:
      matrix:
        java: [17, 21]
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-java@v4
        with:
          distribution: 'temurin'
          java-version: ${{ matrix.java }}
      - run: mvn test
```

---

## 9️⃣ Caching (fast builds)

```plaintext
      - name: Cache Maven
        uses: actions/cache@v4
        with:
          path: ~/.m2
          key: maven-${{ hashFiles('**/pom.xml') }}
```

---

## 🔟 Common mistakes

❌ Wrong YAML indentation  
❌ Secrets hardcode  
❌ Runner offline  
❌ Missing checkout step  
❌ Wrong branch trigger

---

## 1️⃣1️⃣ GitHub Actions vs Jenkins (short)

| GitHub Actions | Jenkins |
| --- | --- |
| Built-in | Need setup |
| YAML based | Groovy |
| Hosted runners | Self-hosted |
| Easy for GitHub | Powerful for enterprise |

---

## 1️⃣2️⃣ Real-world use cases

* CI pipeline for Java/Node
    
* Docker image build
    
* Deploy to EC2
    
* Terraform automation
    
* Nightly cron jobs
    
* PR quality checks
    

---

## 1️⃣3️⃣ Minimal template (copy-paste)

```plaintext
name: Basic CI

on: [push]

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - run: echo "CI running..."
```
