SlideShare a Scribd company logo
Devops-ify your life
with Github Actions
@cortinico
Nicola Corti
Android Infra Engineer
@cortinico
🇮🇹🍕🕹🎤📸✈🏞
Nicola Corti
Android Infra Engineer
twitter.com/cortinico
🇮🇹🍕🕹🎤📸✈🏞 Slides are here :)
Continuous Integration
Continuous Integration
Pull Request MasterMaster
Build
Analyse
Test
Continuous Delivery
Master
Continuous Delivery
Master Candidate Release
Artifact
Deploy
Test
CI/CD Tools
Travis CI
Circle CI
Bitrise
TeamCity
Jenkins
Shift Remote: Mobile - Devops-ify your life with Github Actions - Nicola Corti (Spotify)
Shift Remote: Mobile - Devops-ify your life with Github Actions - Nicola Corti (Spotify)
Shift Remote: Mobile - Devops-ify your life with Github Actions - Nicola Corti (Spotify)
Shift Remote: Mobile - Devops-ify your life with Github Actions - Nicola Corti (Spotify)
Shift Remote: Mobile - Devops-ify your life with Github Actions - Nicola Corti (Spotify)
Shift Remote: Mobile - Devops-ify your life with Github Actions - Nicola Corti (Spotify)
Shift Remote: Mobile - Devops-ify your life with Github Actions - Nicola Corti (Spotify)
Shift Remote: Mobile - Devops-ify your life with Github Actions - Nicola Corti (Spotify)
Shift Remote: Mobile - Devops-ify your life with Github Actions - Nicola Corti (Spotify)
Workflows
build-workflow.yml
build-workflow.yml release-workflow.yml cleanup-workflow.yml
build-workflow.yml release-workflow.yml cleanup-workflow.yml
Triggers
build-workflow.yml release-workflow.yml cleanup-workflow.yml
Pull-request Push Comment Schedule
build-workflow.yml release-workflow.yml cleanup-workflow.yml
Pull-request Push Comment Schedule
build-workflow.yml release-workflow.yml cleanup-workflow.yml
Pull-request Push Comment Schedule
Gradle Gradle Lock Issue
build-workflow.yml release-workflow.yml cleanup-workflow.yml
Pull-request Push Comment Schedule
Gradle Gradle
Upload to
Bintray
Upload to
Sonatype
Lock Issue
name: Build
name: Build

on:

push:

branches:

- '*'
name: Build

on:

push:

branches:

- '*'

pull_request:

branches:

- '*'
name: Build

on:

push:

branches:

- '*'

pull_request:

branches:

- '*'

jobs:

gradle:
name: Build

on:

push:

branches:

- '*'

pull_request:

branches:

- '*'

jobs:

gradle:

runs-on: [ubuntu-latest]
name: Build

on:

push:

branches:

- '*'

pull_request:

branches:

- '*'

jobs:

gradle:

runs-on: [ubuntu-latest]

steps:

- name: Checkout Repo

uses: actions/checkout@v2
name: Build

on:

push:

branches:

- '*'

pull_request:

branches:

- '*'

jobs:

gradle:

runs-on: [ubuntu-latest]

steps:

- name: Checkout Repo

uses: actions/checkout@v2

- name: Build everything

run: ./gradlew assemble
name: Build

on:

push:

branches:

- '*'

pull_request:

branches:

- '*'

jobs:

gradle:

runs-on: [ubuntu-latest]

steps:

- name: Checkout Repo

uses: actions/checkout@v2

- name: Build everything

run: ./gradlew assemble
name: Build

on:

push:

branches:

- '*'

pull_request:

branches:

- '*'

jobs:

gradle:

runs-on: [ubuntu-latest]

steps:

- name: Checkout Repo

uses: actions/checkout@v2

- name: Build everything

run: ./gradlew assemble
github.com/AppIntro/AppIntro
github.com/AppIntro/AppIntro
jobs:

gradle:

runs-on: [ubuntu-latest]

steps:

- name: Checkout Repo

uses: actions/checkout@v2

- name: Run ktlint

run: ./gradlew ktlintCheck

- name: Run detekt

run: ./gradlew detekt

- name: Run all the tests

run: ./gradlew test

github.com/AppIntro/AppIntro
jobs:

gradle:

runs-on: [ubuntu-latest]

steps:

- name: Checkout Repo

uses: actions/checkout@v2

- name: Run ktlint

run: ./gradlew ktlintCheck

- name: Run detekt

run: ./gradlew detekt

- name: Run all the tests

run: ./gradlew test

github.com/AppIntro/AppIntro
jobs:

ktlint:

runs-on: [ubuntu-latest]

steps:

- name: Checkout Repo

uses: actions/checkout@v2

- name: Run ktlint

run: ./gradlew ktlintCheck

detekt:

runs-on: [ubuntu-latest]

steps:

- name: Checkout Repo

uses: actions/checkout@v2

- name: Run detekt

run: ./gradlew detekt

tests:

runs-on: [ubuntu-latest]

steps:

- name: Checkout Repo

uses: actions/checkout@v2

- name: Run all the tests

run: ./gradlew test
github.com/AppIntro/AppIntro
jobs:

ktlint:

runs-on: [ubuntu-latest]

steps:

- name: Checkout Repo

uses: actions/checkout@v2

- name: Run ktlint

run: ./gradlew ktlintCheck

detekt:

runs-on: [ubuntu-latest]

steps:

- name: Checkout Repo

uses: actions/checkout@v2

- name: Run detekt

run: ./gradlew detekt

tests:

runs-on: [ubuntu-latest]

steps:

- name: Checkout Repo

uses: actions/checkout@v2

- name: Run all the tests

run: ./gradlew test
github.com/AppIntro/AppIntro
jobs:

ktlint:

runs-on: [ubuntu-latest]

steps:

- name: Checkout Repo

uses: actions/checkout@v2

- name: Run ktlint

run: ./gradlew ktlintCheck

detekt:

runs-on: [ubuntu-latest]

steps:

- name: Checkout Repo

uses: actions/checkout@v2

- name: Run detekt

run: ./gradlew detekt

test:

runs-on: [ubuntu-latest]

steps:

- name: Checkout Repo

uses: actions/checkout@v2

- name: Run all the tests

run: ./gradlew test
github.com/AppIntro/AppIntro
github.com/detekt/detekt
github.com/detekt/detekt/
github.com/detekt/detekt/
jobs:

gradle:

if: ${{ !contains(github.event.head_commit.message, 'ci skip') }}
github.com/detekt/detekt/
jobs:

gradle:

if: ${{ !contains(github.event.head_commit.message, 'ci skip') }}

strategy:

fail-fast: false

matrix:

os: [ubuntu-latest, macos-latest, windows-latest]

jdk: [8, 11, 14]

runs-on: ${{ matrix.os }}
github.com/detekt/detekt/
jobs:

gradle:

if: ${{ !contains(github.event.head_commit.message, 'ci skip') }}

strategy:

fail-fast: false

matrix:

os: [ubuntu-latest, macos-latest, windows-latest]

jdk: [8, 11, 14]

runs-on: ${{ matrix.os }}
github.com/detekt/detekt/
jobs:

gradle:

if: ${{ !contains(github.event.head_commit.message, 'ci skip') }}

strategy:

fail-fast: false

matrix:

os: [ubuntu-latest, macos-latest, windows-latest]

jdk: [8, 11, 14]

runs-on: ${{ matrix.os }}

env:

GRADLE_OPTS: -Dorg.gradle.daemon=false

JDK_VERSION: ${{ matrix.jdk }}

steps:

- name: Checkout Repo

uses: actions/checkout@v2
github.com/detekt/detekt/
jobs:

gradle:

if: ${{ !contains(github.event.head_commit.message, 'ci skip') }}

strategy:

fail-fast: false

matrix:

os: [ubuntu-latest, macos-latest, windows-latest]

jdk: [8, 11, 14]

runs-on: ${{ matrix.os }}

env:

GRADLE_OPTS: -Dorg.gradle.daemon=false

JDK_VERSION: ${{ matrix.jdk }}

steps:

- name: Checkout Repo

uses: actions/checkout@v2
github.com/detekt/detekt/
jobs:

gradle:

if: ${{ !contains(github.event.head_commit.message, 'ci skip') }}

strategy:

fail-fast: false

matrix:

os: [ubuntu-latest, macos-latest, windows-latest]

jdk: [8, 11, 14]

runs-on: ${{ matrix.os }}

env:

GRADLE_OPTS: -Dorg.gradle.daemon=false

JDK_VERSION: ${{ matrix.jdk }}

steps:

- name: Checkout Repo

uses: actions/checkout@v2

- name: Setup Java

uses: actions/setup-java@v1

with:

java-version: ${{ matrix.jdk }}
github.com/detekt/detekt/
jobs:

gradle:

if: ${{ !contains(github.event.head_commit.message, 'ci skip') }}

strategy:

fail-fast: false

matrix:

os: [ubuntu-latest, macos-latest, windows-latest]

jdk: [8, 11, 14]

runs-on: ${{ matrix.os }}

env:

GRADLE_OPTS: -Dorg.gradle.daemon=false

JDK_VERSION: ${{ matrix.jdk }}

steps:

- name: Checkout Repo

uses: actions/checkout@v2

- name: Setup Java

uses: actions/setup-java@v1

with:

java-version: ${{ matrix.jdk }}
Shift Remote: Mobile - Devops-ify your life with Github Actions - Nicola Corti (Spotify)
name: Release to Play Store

on:

push:

branches:

- release
name: Release to Play Store

on:

push:

branches:

- release

jobs:

gradle:

runs-on: ubuntu-latest

steps:

- uses: actions/checkout@v2

- name: Build with Gradle

run: ./gradlew bundleRelease
branches:

- release

jobs:

gradle:

runs-on: ubuntu-latest

steps:

- uses: actions/checkout@v2

- name: Build with Gradle

run: ./gradlew bundleRelease

- name: Sign Android release

uses: r0adkll/sign-android-release@v1

with:

# The directory to find your release to sign

releaseDirectory: app/build/outputs/bundle/release

signingKeyBase64: ${{ secrets.SIGNING_KEY }}

alias: ${{ secrets.ALIAS }}

keyStorePassword: ${{ secrets.KEY_STORE_PASSWORD }}

keyPassword: ${{ secrets.KEY_PASSWORD }}
branches:

- release

jobs:

gradle:

runs-on: ubuntu-latest

steps:

- uses: actions/checkout@v2

- name: Build with Gradle

run: ./gradlew bundleRelease

- name: Sign Android release

uses: r0adkll/sign-android-release@v1

with:

# The directory to find your release to sign

releaseDirectory: app/build/outputs/bundle/release

signingKeyBase64: ${{ secrets.SIGNING_KEY }}

alias: ${{ secrets.ALIAS }}

keyStorePassword: ${{ secrets.KEY_STORE_PASSWORD }}

keyPassword: ${{ secrets.KEY_PASSWORD }}
run: ./gradlew bundleRelease

- name: Sign Android release

uses: r0adkll/sign-android-release@v1

with:

# The directory to find your release to sign

releaseDirectory: app/build/outputs/bundle/release

signingKeyBase64: ${{ secrets.SIGNING_KEY }}

alias: ${{ secrets.ALIAS }}

keyStorePassword: ${{ secrets.KEY_STORE_PASSWORD }}

keyPassword: ${{ secrets.KEY_PASSWORD }}

- name: Upload Android Release to Play Store

uses: r0adkll/upload-google-play@v1.0.4

with:

serviceAccountJsonPlainText: ${{ secrets.SERVICE_ACCOUNT_JSON }}

packageName: it.gdgdevparty.sample

releaseFile: app/build/outputs/bundle/release/app-release.aab

track: beta
name: Release to Play Store

on:

push:

branches:

- release

jobs:

gradle:

runs-on: ubuntu-latest

steps:

- uses: actions/checkout@v2

- name: Build with Gradle

run: ./gradlew bundleRelease

- name: Sign Android release

uses: r0adkll/sign-android-release@v1

with:

# The directory to find your release to sign

releaseDirectory: app/build/outputs/bundle/release

signingKeyBase64: ${{ secrets.SIGNING_KEY }}

alias: ${{ secrets.ALIAS }}

keyStorePassword: ${{ secrets.KEY_STORE_PASSWORD }}

keyPassword: ${{ secrets.KEY_PASSWORD }}

- name: Upload Android Release to Play Store

uses: r0adkll/upload-google-play@v1.0.4

with:

serviceAccountJsonPlainText: ${{ secrets.SERVICE_ACCOUNT_JSON }}

packageName: it.gdgdevparty.sample

releaseFile: app/build/outputs/bundle/release/app-release.aab

track: beta
Let’s devops-ify
something!
@cortinico

More Related Content

PDF
PDF
Velocity London - Chaos Engineering Bootcamp
PDF
Instrumentación de entrega continua con Gitlab
PDF
Git Anti-Patterns: How To Mess Up With Git and Love it Again
PDF
Developing in the Fastlane -> How LookLive uses Fastlane to automate and spee...
PPTX
Optimizing Spring Boot apps for Docker
PDF
Git and GitHub - The beginning
PDF
The Bash Dashboard (Or: How to Use Bash for Data Analysis)
Velocity London - Chaos Engineering Bootcamp
Instrumentación de entrega continua con Gitlab
Git Anti-Patterns: How To Mess Up With Git and Love it Again
Developing in the Fastlane -> How LookLive uses Fastlane to automate and spee...
Optimizing Spring Boot apps for Docker
Git and GitHub - The beginning
The Bash Dashboard (Or: How to Use Bash for Data Analysis)

What's hot (20)

PDF
Wuff: Building Eclipse Applications and Plugins with Gradle
PDF
Serving Pull Requests with Jenkins
KEY
Matt Gauger - Git & Github web414 December 2010
PDF
Gretty: Managing Web Containers with Gradle
KEY
Git Distributed Version Control System
KEY
Gittalk
PDF
The End of the world as we know it - AKA your last NullPointerException $1B b...
PDF
Deploying TYPO3 Neos websites using Surf
PDF
LetSwift 2017 - 토스 iOS 앱의 개발/배포 환경
PDF
Recovering From Git Mistakes - Nina Zakharenko
PDF
Let the contribution begin
ODP
Continuous integration with Git & CI Joe
PPT
Testing of javacript
PPT
Open Source Collaboration With Git And Git Hub
PDF
Meetup live code_wear_2015
PDF
Introduction to Git
KEY
Git Basics Philips
PPTX
Introduction to Gitea with Drone
PDF
git fail --force (make it up with your pull requests)
ODP
Openstack contribution process
Wuff: Building Eclipse Applications and Plugins with Gradle
Serving Pull Requests with Jenkins
Matt Gauger - Git & Github web414 December 2010
Gretty: Managing Web Containers with Gradle
Git Distributed Version Control System
Gittalk
The End of the world as we know it - AKA your last NullPointerException $1B b...
Deploying TYPO3 Neos websites using Surf
LetSwift 2017 - 토스 iOS 앱의 개발/배포 환경
Recovering From Git Mistakes - Nina Zakharenko
Let the contribution begin
Continuous integration with Git & CI Joe
Testing of javacript
Open Source Collaboration With Git And Git Hub
Meetup live code_wear_2015
Introduction to Git
Git Basics Philips
Introduction to Gitea with Drone
git fail --force (make it up with your pull requests)
Openstack contribution process
Ad

Similar to Shift Remote: Mobile - Devops-ify your life with Github Actions - Nicola Corti (Spotify) (20)

PDF
JUGUtrecht2023 - GithubActions
PDF
KCDC_2022_GitHubActions_slide-share.pdf
PDF
My "Perfect" Toolchain Setup for Grails Projects
PDF
DevOps Fest 2020. Alexey Golub. GitHub Actions in action
PDF
F3X12 FLOW3 Project Lifecycle
PDF
Gitlab and Lingvokot
PDF
Making the most of your gradle build - Greach 2017
PDF
Making the most of your gradle build - Gr8Conf 2017
PDF
DWX 2023 - GitHub Actions für Azure-DevOps-Pipelines-Benutzer
PDF
GitHub Actions in action
KEY
Building cloud-tools-for-netflix-code mash2012
PDF
iOS build that scales
PDF
Introduction to GitHub Actions
PDF
DevOps Service | Mindtree
PDF
Deploying to DigitalOcean With GitHub Actions
PDF
BASTA! 2022 - GitHub Actions für Nutzer der Azure DevOps Pipelines
PPTX
GITHUB_ACTIONS_CICD_OVERVIEW_FOR_BEGINNERS
PPTX
Github Action 開始簡易入門 DevOps,自動化你的專案 (LearnWeb Taiwan Meetup #15)
PDF
Why your build matters
PDF
GitHubActionGitHubActionGitHubAction.pdf
JUGUtrecht2023 - GithubActions
KCDC_2022_GitHubActions_slide-share.pdf
My "Perfect" Toolchain Setup for Grails Projects
DevOps Fest 2020. Alexey Golub. GitHub Actions in action
F3X12 FLOW3 Project Lifecycle
Gitlab and Lingvokot
Making the most of your gradle build - Greach 2017
Making the most of your gradle build - Gr8Conf 2017
DWX 2023 - GitHub Actions für Azure-DevOps-Pipelines-Benutzer
GitHub Actions in action
Building cloud-tools-for-netflix-code mash2012
iOS build that scales
Introduction to GitHub Actions
DevOps Service | Mindtree
Deploying to DigitalOcean With GitHub Actions
BASTA! 2022 - GitHub Actions für Nutzer der Azure DevOps Pipelines
GITHUB_ACTIONS_CICD_OVERVIEW_FOR_BEGINNERS
Github Action 開始簡易入門 DevOps,自動化你的專案 (LearnWeb Taiwan Meetup #15)
Why your build matters
GitHubActionGitHubActionGitHubAction.pdf
Ad

More from Shift Conference (20)

PDF
Shift Remote: AI: How Does Face Recognition Work (ars futura)
PDF
Shift Remote: AI: Behind the scenes development in an AI company - Matija Ili...
PDF
Shift Remote: AI: Smarter AI with analytical graph databases - Victor Lee (Ti...
PDF
Shift Remote: DevOps: Devops with Azure Devops and Github - Juarez Junior (Mi...
PDF
Shift Remote: DevOps: Autodesks research into digital twins for AEC - Kean W...
PPTX
Shift Remote: DevOps: When metrics are not enough, and everyone is on-call - ...
PDF
Shift Remote: DevOps: Modern incident management with opsgenie - Kristijan L...
PDF
Shift Remote: DevOps: Gitlab ci hands-on experience - Ivan Rimac (Barrage)
PDF
Shift Remote: DevOps: DevOps Heroes - Adding Advanced Automation to your Tool...
PDF
Shift Remote: DevOps: An (Un)expected Journey - Zeljko Margeta (RBA)
PDF
Shift Remote: Game Dev - Localising Mobile Games - Marta Kunic (Nanobit)
PDF
Shift Remote: Game Dev - Challenges Introducing Open Source to the Games Indu...
PDF
Shift Remote: Game Dev - Ghost in the Machine: Authorial Voice in System Desi...
PDF
Shift Remote: Game Dev - Building Better Worlds with Game Culturalization - K...
PPTX
Shift Remote: Game Dev - Open Match: An Open Source Matchmaking Framework - J...
PDF
Shift Remote: Game Dev - Designing Inside the Box - Fernando Reyes Medina (34...
PDF
Shift Remote: Mobile - Efficiently Building Native Frameworks for Multiple Pl...
PDF
Shift Remote: Mobile - Introduction to MotionLayout on Android - Denis Fodor ...
PPTX
Shift Remote: WEB - GraphQL and React – Quick Start - Dubravko Bogovic (Infobip)
PDF
Shift Remote: WEB - The Features of WebXR Beyond Virtual Reality - Ada Rose C...
Shift Remote: AI: How Does Face Recognition Work (ars futura)
Shift Remote: AI: Behind the scenes development in an AI company - Matija Ili...
Shift Remote: AI: Smarter AI with analytical graph databases - Victor Lee (Ti...
Shift Remote: DevOps: Devops with Azure Devops and Github - Juarez Junior (Mi...
Shift Remote: DevOps: Autodesks research into digital twins for AEC - Kean W...
Shift Remote: DevOps: When metrics are not enough, and everyone is on-call - ...
Shift Remote: DevOps: Modern incident management with opsgenie - Kristijan L...
Shift Remote: DevOps: Gitlab ci hands-on experience - Ivan Rimac (Barrage)
Shift Remote: DevOps: DevOps Heroes - Adding Advanced Automation to your Tool...
Shift Remote: DevOps: An (Un)expected Journey - Zeljko Margeta (RBA)
Shift Remote: Game Dev - Localising Mobile Games - Marta Kunic (Nanobit)
Shift Remote: Game Dev - Challenges Introducing Open Source to the Games Indu...
Shift Remote: Game Dev - Ghost in the Machine: Authorial Voice in System Desi...
Shift Remote: Game Dev - Building Better Worlds with Game Culturalization - K...
Shift Remote: Game Dev - Open Match: An Open Source Matchmaking Framework - J...
Shift Remote: Game Dev - Designing Inside the Box - Fernando Reyes Medina (34...
Shift Remote: Mobile - Efficiently Building Native Frameworks for Multiple Pl...
Shift Remote: Mobile - Introduction to MotionLayout on Android - Denis Fodor ...
Shift Remote: WEB - GraphQL and React – Quick Start - Dubravko Bogovic (Infobip)
Shift Remote: WEB - The Features of WebXR Beyond Virtual Reality - Ada Rose C...

Recently uploaded (20)

PPTX
Introduction to Information and Communication Technology
PPTX
Funds Management Learning Material for Beg
PDF
APNIC Update, presented at PHNOG 2025 by Shane Hermoso
PPTX
SAP Ariba Sourcing PPT for learning material
PPTX
introduction about ICD -10 & ICD-11 ppt.pptx
PPTX
E -tech empowerment technologies PowerPoint
PPTX
Introuction about WHO-FIC in ICD-10.pptx
PPTX
Module 1 - Cyber Law and Ethics 101.pptx
PDF
Tenda Login Guide: Access Your Router in 5 Easy Steps
PDF
WebRTC in SignalWire - troubleshooting media negotiation
PDF
The New Creative Director: How AI Tools for Social Media Content Creation Are...
PDF
SASE Traffic Flow - ZTNA Connector-1.pdf
PDF
An introduction to the IFRS (ISSB) Stndards.pdf
PPTX
CHE NAA, , b,mn,mblblblbljb jb jlb ,j , ,C PPT.pptx
PDF
💰 𝐔𝐊𝐓𝐈 𝐊𝐄𝐌𝐄𝐍𝐀𝐍𝐆𝐀𝐍 𝐊𝐈𝐏𝐄𝐑𝟒𝐃 𝐇𝐀𝐑𝐈 𝐈𝐍𝐈 𝟐𝟎𝟐𝟓 💰
PDF
Automated vs Manual WooCommerce to Shopify Migration_ Pros & Cons.pdf
PPTX
Power Point - Lesson 3_2.pptx grad school presentation
PPTX
international classification of diseases ICD-10 review PPT.pptx
PPT
isotopes_sddsadsaadasdasdasdasdsa1213.ppt
PDF
FINAL CALL-6th International Conference on Networks & IOT (NeTIOT 2025)
Introduction to Information and Communication Technology
Funds Management Learning Material for Beg
APNIC Update, presented at PHNOG 2025 by Shane Hermoso
SAP Ariba Sourcing PPT for learning material
introduction about ICD -10 & ICD-11 ppt.pptx
E -tech empowerment technologies PowerPoint
Introuction about WHO-FIC in ICD-10.pptx
Module 1 - Cyber Law and Ethics 101.pptx
Tenda Login Guide: Access Your Router in 5 Easy Steps
WebRTC in SignalWire - troubleshooting media negotiation
The New Creative Director: How AI Tools for Social Media Content Creation Are...
SASE Traffic Flow - ZTNA Connector-1.pdf
An introduction to the IFRS (ISSB) Stndards.pdf
CHE NAA, , b,mn,mblblblbljb jb jlb ,j , ,C PPT.pptx
💰 𝐔𝐊𝐓𝐈 𝐊𝐄𝐌𝐄𝐍𝐀𝐍𝐆𝐀𝐍 𝐊𝐈𝐏𝐄𝐑𝟒𝐃 𝐇𝐀𝐑𝐈 𝐈𝐍𝐈 𝟐𝟎𝟐𝟓 💰
Automated vs Manual WooCommerce to Shopify Migration_ Pros & Cons.pdf
Power Point - Lesson 3_2.pptx grad school presentation
international classification of diseases ICD-10 review PPT.pptx
isotopes_sddsadsaadasdasdasdasdsa1213.ppt
FINAL CALL-6th International Conference on Networks & IOT (NeTIOT 2025)

Shift Remote: Mobile - Devops-ify your life with Github Actions - Nicola Corti (Spotify)