Aller au contenu principal

Actions du Marketplace


Table des matières

  1. Comprendre les actions
  2. Actions officielles
  3. Actions populaires
  4. Créer une action
  5. Bonnes pratiques
  6. Exercices pratiques


1 - Comprendre les actions

Qu'est-ce qu'une action ?

Une action est un bloc réutilisable de code qui effectue une tâche spécifique.

Types d'actions

TypeLangageFichierUsage
JavaScriptNode.jsaction.ymlRapide, cross-platform
DockerAnyDockerfileEnvironnement isolé
CompositeYAMLaction.ymlAssemblage de steps

Syntaxe uses

steps:
# Action du Marketplace
- uses: actions/checkout@v4

# Avec version spécifique
- uses: actions/setup-[email protected]

# Avec SHA (plus sécurisé)
- uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608

# Action locale
- uses: ./.github/actions/my-action

# Action d'un autre repo
- uses: owner/repo/path@ref
Versioning

Utilisez des tags (@v4) pour la stabilité, ou des SHA pour la sécurité maximale.

🔝 Retour à la table des matières



2 - Actions officielles

actions/checkout

- uses: actions/checkout@v4
with:
# Branche/ref à checkout
ref: main

# Profondeur de l'historique (0 = tout)
fetch-depth: 0

# Token pour repos privés
token: ${{ secrets.PAT }}

# Submodules
submodules: recursive

# Autre repo
repository: owner/repo
path: other-repo

actions/setup-node

- uses: actions/setup-node@v4
with:
node-version: '18' # Version
node-version-file: '.nvmrc' # Depuis fichier
cache: 'npm' # Cache npm/yarn/pnpm
registry-url: 'https://npm.pkg.github.com'

actions/cache

- uses: actions/cache@v4
with:
path: |
~/.npm
node_modules
key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }}
restore-keys: |
${{ runner.os }}-node-

actions/upload-artifact / download-artifact

# Upload
- uses: actions/upload-artifact@v4
with:
name: build-output
path: dist/
retention-days: 5

# Download
- uses: actions/download-artifact@v4
with:
name: build-output
path: ./dist

Autres actions officielles

ActionUsage
actions/setup-pythonPython
actions/setup-javaJava
actions/setup-goGo
actions/setup-dotnet.NET
actions/github-scriptAPI GitHub
actions/labelerAuto-labeling PR

🔝 Retour à la table des matières



3 - Actions populaires

Docker

# Login Docker Hub
- uses: docker/login-action@v3
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}

# Build et push
- uses: docker/build-push-action@v5
with:
context: .
push: true
tags: user/app:latest
cache-from: type=gha
cache-to: type=gha,mode=max

AWS

- uses: aws-actions/configure-aws-credentials@v4
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
aws-region: us-east-1

- uses: aws-actions/amazon-ecr-login@v2

- uses: aws-actions/amazon-ecs-deploy-task-definition@v1
with:
task-definition: task-definition.json
service: my-service
cluster: my-cluster

Notifications

# Slack
- uses: slackapi/slack-github-action@v1
with:
channel-id: 'C0123456789'
slack-message: "Build ${{ job.status }}"
env:
SLACK_BOT_TOKEN: ${{ secrets.SLACK_BOT_TOKEN }}

# Discord
- uses: sarisia/actions-status-discord@v1
with:
webhook: ${{ secrets.DISCORD_WEBHOOK }}
status: ${{ job.status }}

Code Quality

# SonarCloud
- uses: SonarSource/sonarcloud-github-action@master
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}

# CodeQL (sécurité)
- uses: github/codeql-action/init@v3
with:
languages: javascript, python

- uses: github/codeql-action/analyze@v3

Release

# Semantic Release
- uses: cycjimmy/semantic-release-action@v4
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
NPM_TOKEN: ${{ secrets.NPM_TOKEN }}

# Create Release
- uses: softprops/action-gh-release@v1
with:
files: dist/*.zip
generate_release_notes: true

🔝 Retour à la table des matières



4 - Créer une action

Action Composite

# .github/actions/setup-project/action.yml
name: 'Setup Project'
description: 'Setup Node.js project with cache'

inputs:
node-version:
description: 'Node.js version'
required: false
default: '18'

outputs:
cache-hit:
description: 'Cache was hit'
value: ${{ steps.cache.outputs.cache-hit }}

runs:
using: 'composite'
steps:
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: ${{ inputs.node-version }}

- name: Cache dependencies
id: cache
uses: actions/cache@v4
with:
path: node_modules
key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }}

- name: Install dependencies
if: steps.cache.outputs.cache-hit != 'true'
shell: bash
run: npm ci

Utiliser l'action locale

# .github/workflows/ci.yml
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4

- name: Setup Project
uses: ./.github/actions/setup-project
with:
node-version: '20'

- run: npm run build

Action JavaScript

// index.js
const core = require('@actions/core');
const github = require('@actions/github');

async function run() {
try {
const name = core.getInput('name');
console.log(`Hello ${name}!`);

core.setOutput('greeting', `Hello ${name}!`);
} catch (error) {
core.setFailed(error.message);
}
}

run();
# action.yml
name: 'Hello Action'
description: 'Say hello'
inputs:
name:
description: 'Name to greet'
required: true
outputs:
greeting:
description: 'The greeting'
runs:
using: 'node20'
main: 'dist/index.js'

🔝 Retour à la table des matières



5 - Bonnes pratiques

Sécurité

# ✅ Bon : Version avec SHA
- uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608

# ⚠️ Acceptable : Tag majeur
- uses: actions/checkout@v4

# ❌ Mauvais : Branche (peut changer)
- uses: actions/checkout@main

Vérifier les permissions

# Minimal permissions
permissions:
contents: read

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

Évaluer une action

CritèreVérifier
AuteurOrganisation vérifiée ?
StarsPopularité
UpdatesMaintenance active ?
IssuesProblèmes connus ?
CodeOpen source ? Lisible ?

🔝 Retour à la table des matières



6 - Exercices pratiques

Exercice 1 : Setup Node avec cache

Créez un workflow avec setup-node et cache :

Solution
name: Build

on: push

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

- uses: actions/setup-node@v4
with:
node-version: '18'
cache: 'npm'

- run: npm ci
- run: npm run build

Exercice 2 : Action composite

Créez une action qui fait checkout + setup-node :

Solution
# .github/actions/setup/action.yml
name: 'Setup'
runs:
using: 'composite'
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: '18'
cache: 'npm'
- run: npm ci
shell: bash

Quiz

Q1. Quelle est la méthode la plus sécurisée pour référencer une action ?

Réponse

Par SHA du commit : uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608

🔝 Retour à la table des matières



Points clés à retenir

  • Marketplace : +15000 actions disponibles
  • Actions officielles : actions/* sont maintenues par GitHub
  • Utiliser des tags ou SHA pour le versioning
  • Composite actions : facile à créer en YAML
  • Vérifier la sécurité avant d'utiliser une action tierce
  • Permissions minimales : principe du moindre privilège

🔝 Retour à la table des matières


← Chapitre précédent | Chapitre suivant : Variables et secrets →